import {useMemo} from 'react'; import styled from '@emotion/styled'; import {urlEncode} from '@sentry/utils'; import {openAddToDashboardModal, openModal} from 'sentry/actionCreators/modal'; import {DropdownMenu} from 'sentry/components/dropdownMenu'; import {IconEllipsis} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {Organization} from 'sentry/types'; import {MetricDisplayType, MetricsQuery} from 'sentry/utils/metrics'; import {hasDDMFeature} from 'sentry/utils/metrics/features'; import {MRIToField, parseMRI} from 'sentry/utils/metrics/mri'; import useOrganization from 'sentry/utils/useOrganization'; import useRouter from 'sentry/utils/useRouter'; import {DashboardWidgetSource, WidgetType} from 'sentry/views/dashboards/types'; import {CreateAlertModal} from 'sentry/views/ddm/createAlertModal'; import {OrganizationContext} from 'sentry/views/organizationContext'; type ContextMenuProps = { displayType: MetricDisplayType; metricsQuery: MetricsQuery; }; export function MetricWidgetContextMenu({metricsQuery, displayType}: ContextMenuProps) { const organization = useOrganization(); const createAlert = useCreateAlert(organization, metricsQuery); const handleAddQueryToDashboard = useHandleAddQueryToDashboard( organization, metricsQuery, displayType ); if (!hasDDMFeature(organization)) { return null; } return ( , }} position="bottom-end" /> ); } function useHandleAddQueryToDashboard( organization: Organization, {projects, environments, datetime, op, mri, groupBy, query}: MetricsQuery, displayType?: MetricDisplayType ) { const router = useRouter(); const {start, end, period} = datetime; return useMemo(() => { if (!mri || !op) { return undefined; } const field = MRIToField(mri, op); const limit = !groupBy?.length ? 1 : 10; const widgetQuery = { name: '', aggregates: [field], columns: groupBy ?? [], fields: [field], conditions: query ?? '', orderby: '', }; const urlWidgetQuery = urlEncode({ ...widgetQuery, aggregates: field, fields: field, columns: groupBy?.join(',') ?? '', }); const widgetAsQueryParams = { source: DashboardWidgetSource.DDM, start, end, statsPeriod: period, defaultWidgetQuery: urlWidgetQuery, defaultTableColumns: [], defaultTitle: 'DDM Widget', environment: environments, displayType, project: projects, }; return () => openAddToDashboardModal({ organization, selection: { projects, environments, datetime, }, widget: { title: 'DDM Widget', displayType, widgetType: WidgetType.METRICS, limit, queries: [widgetQuery], }, router, widgetAsQueryParams, location: router.location, }); }, [ datetime, displayType, end, environments, groupBy, mri, op, organization, period, projects, query, router, start, ]); } function useCreateAlert(organization: Organization, metricsQuery: MetricsQuery) { return useMemo(() => { if ( !metricsQuery.mri || !metricsQuery.op || parseMRI(metricsQuery.mri)?.useCase !== 'custom' || !organization.access.includes('alerts:write') ) { return undefined; } return () => openModal(deps => ( )); }, [metricsQuery, organization]); } const StyledDropdownMenuControl = styled(DropdownMenu)` margin: ${space(1)}; `;