create.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import {Fragment} from 'react';
  2. import {browserHistory} from 'react-router';
  3. import styled from '@emotion/styled';
  4. import Breadcrumbs from 'sentry/components/breadcrumbs';
  5. import * as Layout from 'sentry/components/layouts/thirds';
  6. import {t} from 'sentry/locale';
  7. import {Organization} from 'sentry/types';
  8. import {normalizeUrl} from 'sentry/utils/withDomainRequired';
  9. import withOrganization from 'sentry/utils/withOrganization';
  10. import AsyncView from 'sentry/views/asyncView';
  11. import CronsFeedbackButton from './cronsFeedbackButton';
  12. import MonitorForm from './monitorForm';
  13. import {Monitor} from './types';
  14. type Props = AsyncView['props'] & {
  15. organization: Organization;
  16. };
  17. class CreateMonitor extends AsyncView<Props, AsyncView['state']> {
  18. getTitle() {
  19. return `Crons - ${this.orgSlug}`;
  20. }
  21. get orgSlug() {
  22. return this.props.organization.slug;
  23. }
  24. onSubmitSuccess = (data: Monitor) => {
  25. const url = normalizeUrl(`/organizations/${this.orgSlug}/crons/${data.id}/`);
  26. browserHistory.push(url);
  27. };
  28. renderBody() {
  29. return (
  30. <Fragment>
  31. <Layout.Header>
  32. <Layout.HeaderContent>
  33. <Breadcrumbs
  34. crumbs={[
  35. {
  36. label: t('Crons'),
  37. to: `/organizations/${this.orgSlug}/crons/`,
  38. },
  39. {
  40. label: t('Set Up Cron Monitor'),
  41. },
  42. ]}
  43. />
  44. <Layout.Title>{t('Set Up Cron Monitor')}</Layout.Title>
  45. </Layout.HeaderContent>
  46. <Layout.HeaderActions>
  47. <CronsFeedbackButton />
  48. </Layout.HeaderActions>
  49. </Layout.Header>
  50. <Layout.Body>
  51. <Layout.Main fullWidth>
  52. <HelpText>
  53. {t(
  54. `Sentry will tell you if your recurring jobs are running on schedule, failing, or succeeding.`
  55. )}
  56. </HelpText>
  57. <MonitorForm
  58. apiMethod="POST"
  59. apiEndpoint={`/organizations/${this.orgSlug}/monitors/`}
  60. onSubmitSuccess={this.onSubmitSuccess}
  61. submitLabel={t('Next Steps')}
  62. />
  63. </Layout.Main>
  64. </Layout.Body>
  65. </Fragment>
  66. );
  67. }
  68. }
  69. export default withOrganization(CreateMonitor);
  70. const HelpText = styled('p')`
  71. color: ${p => p.theme.subText};
  72. max-width: 760px;
  73. `;