create.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import type {RouteComponentProps} from 'sentry/types/legacyReactRouter';
  2. import type {Organization} from 'sentry/types/organization';
  3. import type {Project} from 'sentry/types/project';
  4. import {metric} from 'sentry/utils/analytics';
  5. import type EventView from 'sentry/utils/discover/eventView';
  6. import {decodeScalar} from 'sentry/utils/queryString';
  7. import normalizeUrl from 'sentry/utils/url/normalizeUrl';
  8. import {makeAlertsPathname} from 'sentry/views/alerts/pathnames';
  9. import {
  10. createDefaultRule,
  11. createRuleFromEventView,
  12. createRuleFromWizardTemplate,
  13. getAlertTimeWindow,
  14. } from 'sentry/views/alerts/rules/metric/constants';
  15. import type {WizardRuleTemplate} from 'sentry/views/alerts/wizard/options';
  16. import RuleForm from './ruleForm';
  17. type RouteParams = {
  18. projectId?: string;
  19. ruleId?: string;
  20. };
  21. type Props = {
  22. eventView: EventView | undefined;
  23. organization: Organization;
  24. project: Project;
  25. userTeamIds: string[];
  26. sessionId?: string;
  27. wizardTemplate?: WizardRuleTemplate;
  28. } & RouteComponentProps<RouteParams>;
  29. /**
  30. * Show metric rules form with an empty rule. Redirects to alerts list after creation.
  31. */
  32. function MetricRulesCreate(props: Props) {
  33. function handleSubmitSuccess(data: any) {
  34. const {organization, project, router} = props;
  35. const alertRuleId: string | undefined = data
  36. ? (data.id as string | undefined)
  37. : undefined;
  38. metric.endSpan({name: 'saveAlertRule'});
  39. const target = alertRuleId
  40. ? {
  41. pathname: makeAlertsPathname({
  42. path: `/rules/details/${alertRuleId}/`,
  43. organization,
  44. }),
  45. }
  46. : {
  47. pathname: makeAlertsPathname({
  48. path: `/rules/`,
  49. organization,
  50. }),
  51. query: {project: project.id},
  52. };
  53. router.push(normalizeUrl(target));
  54. }
  55. const {
  56. project,
  57. eventView,
  58. wizardTemplate,
  59. sessionId,
  60. userTeamIds,
  61. location,
  62. ...otherProps
  63. } = props;
  64. const defaultRule = eventView
  65. ? createRuleFromEventView(eventView)
  66. : wizardTemplate
  67. ? createRuleFromWizardTemplate(wizardTemplate)
  68. : createDefaultRule();
  69. const projectTeamIds = new Set(project.teams.map(({id}) => id));
  70. const defaultOwnerId = userTeamIds.find(id => projectTeamIds.has(id)) ?? null;
  71. defaultRule.owner = defaultOwnerId && `team:${defaultOwnerId}`;
  72. const environment = decodeScalar(location?.query?.environment) ?? null;
  73. const interval = decodeScalar(location?.query?.interval) ?? undefined;
  74. defaultRule.timeWindow = getAlertTimeWindow(interval) ?? defaultRule.timeWindow;
  75. return (
  76. <RuleForm
  77. onSubmitSuccess={handleSubmitSuccess}
  78. rule={{...defaultRule, environment, projects: [project.slug]}}
  79. sessionId={sessionId}
  80. project={project}
  81. userTeamIds={userTeamIds}
  82. eventView={eventView}
  83. location={location}
  84. {...otherProps}
  85. />
  86. );
  87. }
  88. export default MetricRulesCreate;