ruleNameOwnerForm.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import FormField from 'sentry/components/forms/formField';
  4. import TeamSelector from 'sentry/components/forms/teamSelector';
  5. import TextField from 'sentry/components/forms/textField';
  6. import ListItem from 'sentry/components/list/listItem';
  7. import {Panel, PanelBody} from 'sentry/components/panels';
  8. import {t} from 'sentry/locale';
  9. import space from 'sentry/styles/space';
  10. import {Project, Team} from 'sentry/types';
  11. type Props = {
  12. disabled: boolean;
  13. hasAlertWizardV3: boolean;
  14. project: Project;
  15. };
  16. export default function RuleNameOwnerForm({disabled, project, hasAlertWizardV3}: Props) {
  17. const renderRuleName = () => (
  18. <StyledTextField
  19. data-test-id="alert-name"
  20. hasAlertWizardV3={hasAlertWizardV3}
  21. disabled={disabled}
  22. name="name"
  23. label={hasAlertWizardV3 ? null : t('Rule Name')}
  24. help={hasAlertWizardV3 ? null : t('Add a name so it’s easy to find later.')}
  25. placeholder={
  26. hasAlertWizardV3 ? t('Enter Alert Name') : t('Something really bad happened')
  27. }
  28. required
  29. flexibleControlStateSize
  30. />
  31. );
  32. const renderTeamSelect = () => (
  33. <StyledFormField
  34. hasAlertWizardV3={hasAlertWizardV3}
  35. extraMargin
  36. name="owner"
  37. label={hasAlertWizardV3 ? null : t('Team')}
  38. help={hasAlertWizardV3 ? null : t('The team that can edit this alert.')}
  39. disabled={disabled}
  40. flexibleControlStateSize
  41. >
  42. {({model}) => {
  43. const owner = model.getValue('owner');
  44. const ownerId = owner && owner.split(':')[1];
  45. return (
  46. <TeamSelector
  47. value={ownerId}
  48. project={project}
  49. onChange={({value}) => model.setValue('owner', value && `team:${value}`)}
  50. teamFilter={(team: Team) => team.isMember || team.id === ownerId}
  51. useId
  52. includeUnassigned
  53. disabled={disabled}
  54. />
  55. );
  56. }}
  57. </StyledFormField>
  58. );
  59. return hasAlertWizardV3 ? (
  60. <Fragment>
  61. <StyledListItem>{t('Establish ownership')}</StyledListItem>
  62. {renderRuleName()}
  63. {renderTeamSelect()}
  64. </Fragment>
  65. ) : (
  66. <Fragment>
  67. <StyledListItem>{t('Add a rule name and team')}</StyledListItem>
  68. <Panel>
  69. <PanelBody>
  70. {renderRuleName()}
  71. {renderTeamSelect()}
  72. </PanelBody>
  73. </Panel>
  74. </Fragment>
  75. );
  76. }
  77. const StyledListItem = styled(ListItem)`
  78. margin: ${space(2)} 0 ${space(1)} 0;
  79. font-size: ${p => p.theme.fontSizeExtraLarge};
  80. `;
  81. const StyledTextField = styled(TextField)<{hasAlertWizardV3: boolean}>`
  82. ${p =>
  83. p.hasAlertWizardV3 &&
  84. `
  85. border-bottom: none;
  86. padding: 0;
  87. & > div {
  88. padding: 0;
  89. width: 100%;
  90. }
  91. margin-bottom: ${space(1)};
  92. `}
  93. `;
  94. const StyledFormField = styled(FormField)<{
  95. hasAlertWizardV3: boolean;
  96. extraMargin?: boolean;
  97. }>`
  98. ${p =>
  99. p.hasAlertWizardV3 &&
  100. `
  101. padding: 0;
  102. & > div {
  103. padding: 0;
  104. width: 100%;
  105. }
  106. margin-bottom: ${p.extraMargin ? '60px' : space(1)};
  107. `}
  108. `;