Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions static/app/actionCreators/modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import type {CreateReleaseIntegrationModalOptions} from 'sentry/components/modal
import type {DashboardWidgetQuerySelectorModalOptions} from 'sentry/components/modals/dashboardWidgetQuerySelectorModal';
import type {DataWidgetViewerModalOptions} from 'sentry/components/modals/dataWidgetViewerModal';
import type {SaveQueryModalProps} from 'sentry/components/modals/explore/saveQueryModal';
import type {GenerateDashboardFromSeerModalProps} from 'sentry/components/modals/generateDashboardFromSeerModal';
import type {ImportDashboardFromFileModalProps} from 'sentry/components/modals/importDashboardFromFileModal';
import type {InsightChartModalOptions} from 'sentry/components/modals/insightChartModal';
import type {InviteRow} from 'sentry/components/modals/inviteMembersModal/types';
Expand Down Expand Up @@ -274,17 +273,6 @@ export async function openImportDashboardFromFileModal(
});
}

export async function openGenerateDashboardFromSeerModal(
options: GenerateDashboardFromSeerModalProps
) {
const {default: Modal} =
await import('sentry/components/modals/generateDashboardFromSeerModal');

openModal(deps => <Modal {...deps} {...options} />, {
closeEvents: 'escape-key',
});
}

export async function openReprocessEventModal({
onClose,
...options
Expand Down
113 changes: 0 additions & 113 deletions static/app/components/modals/generateDashboardFromSeerModal.tsx

This file was deleted.

3 changes: 3 additions & 0 deletions static/app/utils/analytics/dashboardsAnalyticsEvents.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export type DashboardsEventParameters = {
'dashboards_manage.create.start': Record<string, unknown>;
'dashboards_manage.delete': {dashboard_id: number; view_type: DashboardsLayout};
'dashboards_manage.duplicate': {dashboard_id: number; view_type: DashboardsLayout};
'dashboards_manage.generate.start': Record<string, unknown>;
'dashboards_manage.paginate': Record<string, unknown>;
'dashboards_manage.search': Record<string, unknown>;
'dashboards_manage.templates.add': {
Expand Down Expand Up @@ -196,6 +197,8 @@ export const dashboardsEventMap: Record<DashboardsEventKey, string | null> = {
'dashboards_manage.change_sort': 'Dashboards Manager: Sort By Changed',
'dashboards_manage.change_view_type': 'Dashboards Manager: View Type Toggled',
'dashboards_manage.create.start': 'Dashboards Manager: Dashboard Create Started',
'dashboards_manage.generate.start':
'Dashboards Manager: Dashboard Seer Generate Started',
'dashboards_manage.delete': 'Dashboards Manager: Dashboard Deleted',
'dashboards_manage.duplicate': 'Dashboards Manager: Dashboard Duplicated',
'dashboards_manage.paginate': 'Dashboards Manager: Paginate',
Expand Down
3 changes: 2 additions & 1 deletion static/app/views/dashboards/createFromSeer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {fetchMutation, useApiQuery, useQueryClient} from 'sentry/utils/queryClie
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {CreateFromSeerLoading} from 'sentry/views/dashboards/createFromSeerLoading';
import {CreateFromSeerPrompt} from 'sentry/views/dashboards/createFromSeerPrompt';
import type {SeerExplorerResponse} from 'sentry/views/seerExplorer/hooks/useSeerExplorer';
import {makeSeerExplorerQueryKey} from 'sentry/views/seerExplorer/utils';

Expand Down Expand Up @@ -286,7 +287,7 @@ export default function CreateFromSeer() {
}

if (!seerRunId) {
return null;
return <CreateFromSeerPrompt />;
}

if (isLoading && !isUpdating) {
Expand Down
2 changes: 1 addition & 1 deletion static/app/views/dashboards/createFromSeerLoading.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export function CreateFromSeerLoading({blocks, seerRunId}: CreateFromSeerLoading
return (
<Layout.Page withPadding background="secondary">
<Flex direction="column" gap="lg" align="center" justify="center" flex="1">
<Flex direction="column" gap="sm" width="500px">
<Flex direction="column" gap="sm" width="640px">
<Heading as="h3">{t('Generating Dashboard')}</Heading>
<Text variant="muted">
{t('Stay on this page while we get this made for you')}
Expand Down
105 changes: 105 additions & 0 deletions static/app/views/dashboards/createFromSeerPrompt.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import {useCallback, useState} from 'react';

import {Button} from '@sentry/scraps/button';
import {Container, Flex} from '@sentry/scraps/layout';
import {Heading} from '@sentry/scraps/text';
import {TextArea} from '@sentry/scraps/textarea';

import {addErrorMessage} from 'sentry/actionCreators/indicator';
import * as Layout from 'sentry/components/layouts/thirds';
import {t} from 'sentry/locale';
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
import {fetchMutation} from 'sentry/utils/queryClient';
import {normalizeUrl} from 'sentry/utils/url/normalizeUrl';
import {useLocation} from 'sentry/utils/useLocation';
import {useNavigate} from 'sentry/utils/useNavigate';
import {useOrganization} from 'sentry/utils/useOrganization';

export function CreateFromSeerPrompt() {
const organization = useOrganization();
const location = useLocation();
const navigate = useNavigate();
const [prompt, setPrompt] = useState('');
const [isGenerating, setIsGenerating] = useState(false);

const handleGenerate = useCallback(async () => {
if (!prompt.trim()) {
return;
}

setIsGenerating(true);

try {
const url = getApiUrl('/organizations/$organizationIdOrSlug/dashboards/generate/', {
path: {
organizationIdOrSlug: organization.slug,
},
});
const response = await fetchMutation<{run_id: string}>({
url,
method: 'POST',
data: {prompt: prompt.trim()},
});

const runId = response.run_id;
if (!runId) {
addErrorMessage(t('Failed to start dashboard generation'));
setIsGenerating(false);
return;
}

navigate(
normalizeUrl({
pathname: `/organizations/${organization.slug}/dashboards/new/from-seer/`,
query: {...location.query, seerRunId: String(runId)},
})
);
} catch (error) {
setIsGenerating(false);
addErrorMessage(t('Failed to start dashboard generation'));
}
}, [prompt, organization.slug, location.query, navigate]);

return (
<Layout.Page withPadding background="secondary">
<Flex direction="column" gap="lg" align="center" justify="center" flex="1">
<Flex direction="column" gap="sm" width="640px">
<Heading as="h3">{t('Describe your Dashboard')}</Heading>
<Container paddingTop="lg">
<Flex
border="primary"
radius="md"
background="primary"
padding="lg"
direction="column"
gap="lg"
align="end"
>
<TextArea
placeholder={t(
'Add details like what you are looking for, important data points, or anything else...'
)}
rows={1}
autosize
autoFocus
style={{resize: 'none'}}
value={prompt}
onChange={e => setPrompt(e.target.value)}
disabled={isGenerating}
/>
<Container>
<Button
priority="primary"
onClick={handleGenerate}
disabled={isGenerating || !prompt.trim()}
>
{t('Generate')}
</Button>
</Container>
</Flex>
</Container>
</Flex>
</Flex>
</Layout.Page>
);
}
27 changes: 15 additions & 12 deletions static/app/views/dashboards/manage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@ import {Switch} from '@sentry/scraps/switch';

import {createDashboard} from 'sentry/actionCreators/dashboards';
import {addLoadingMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
import {
openGenerateDashboardFromSeerModal,
openImportDashboardFromFileModal,
} from 'sentry/actionCreators/modal';
import {openImportDashboardFromFileModal} from 'sentry/actionCreators/modal';
import Feature from 'sentry/components/acl/feature';
import {DropdownMenu} from 'sentry/components/dropdownMenu';
import ErrorBoundary from 'sentry/components/errorBoundary';
Expand Down Expand Up @@ -597,6 +594,17 @@ function ManageDashboards() {
);
}

function onGenerateDashboard() {
trackAnalytics('dashboards_manage.generate.start', {
organization,
});
Comment thread
cursor[bot] marked this conversation as resolved.
navigate(
normalizeUrl({
pathname: `/organizations/${organization.slug}/dashboards/new/from-seer/`,
})
);
}

return (
<Feature
organization={organization}
Expand Down Expand Up @@ -660,7 +668,7 @@ function ManageDashboards() {
items={[
{
key: 'create-dashboard',
label: t('Create Manually'),
label: t('Create dashboard manually'),
onAction: () => onCreate(),
disabled:
hasReachedDashboardLimit ||
Expand All @@ -671,16 +679,11 @@ function ManageDashboards() {
key: 'create-dashboard-agent',
label: (
<Flex gap="sm" align="center" as="span">
{t('Create with Agent')}
{t('Generate dashboard')}
<FeatureBadge type="experimental" />
</Flex>
),
onAction: () =>
openGenerateDashboardFromSeerModal({
organization,
location,
navigate,
}),
onAction: () => onGenerateDashboard(),
},
]}
trigger={triggerProps => (
Expand Down
Loading