import {Component, Fragment} from 'react'; import {Observer} from 'mobx-react'; import Access from 'sentry/components/acl/access'; import Field from 'sentry/components/forms/field'; import NumberField from 'sentry/components/forms/fields/numberField'; import SelectField from 'sentry/components/forms/fields/selectField'; import TextField from 'sentry/components/forms/fields/textField'; import Form, {FormProps} from 'sentry/components/forms/form'; import FormModel from 'sentry/components/forms/model'; import {Panel, PanelBody, PanelHeader} from 'sentry/components/panels'; import TextCopyInput from 'sentry/components/textCopyInput'; import {t, tct} from 'sentry/locale'; import {PageFilters, Project, SelectValue} from 'sentry/types'; import withPageFilters from 'sentry/utils/withPageFilters'; import withProjects from 'sentry/utils/withProjects'; import {Monitor, MonitorConfig, MonitorTypes, ScheduleType} from './types'; const SCHEDULE_TYPES: SelectValue[] = [ {value: 'crontab', label: 'Crontab'}, {value: 'interval', label: 'Interval'}, ]; const DEFAULT_MONITOR_TYPE = 'cron_job'; const INTERVALS: SelectValue[] = [ {value: 'minute', label: 'minute(s)'}, {value: 'hour', label: 'hour(s)'}, {value: 'day', label: 'day(s)'}, {value: 'week', label: 'week(s)'}, {value: 'month', label: 'month(s)'}, {value: 'year', label: 'year(s)'}, ]; type Props = { apiEndpoint: string; apiMethod: FormProps['apiMethod']; onSubmitSuccess: FormProps['onSubmitSuccess']; projects: Project[]; selection: PageFilters; monitor?: Monitor; submitLabel?: string; }; type TransformedData = { config?: Partial; }; function transformData(_data: Record, model: FormModel) { return model.fields.toJSON().reduce((data, [k, v]) => { if (k.indexOf('config.') !== 0) { data[k] = v; return data; } if (!data.config) { data.config = {}; } if (k === 'config.schedule.frequency' || k === 'config.schedule.interval') { if (!Array.isArray(data.config.schedule)) { data.config.schedule = [null, null]; } } if (k === 'config.schedule.frequency') { data.config!.schedule![0] = parseInt(v as string, 10); } else if (k === 'config.schedule.interval') { data.config!.schedule![1] = v; } else { data.config[k.substr(7)] = v; } return data; }, {}); } class MonitorForm extends Component { form = new FormModel({transformData}); formDataFromConfig(type: MonitorTypes, config: MonitorConfig) { const rv = {}; switch (type) { case 'cron_job': rv['config.schedule_type'] = config.schedule_type; rv['config.checkin_margin'] = config.checkin_margin; rv['config.max_runtime'] = config.max_runtime; switch (config.schedule_type) { case 'interval': rv['config.schedule.frequency'] = config.schedule[0]; rv['config.schedule.interval'] = config.schedule[1]; break; case 'crontab': default: rv['config.schedule'] = config.schedule; } break; default: } return rv; } render() { const {monitor, submitLabel} = this.props; const selectedProjectId = this.props.selection.projects[0]; const selectedProject = selectedProjectId ? this.props.projects.find(p => p.id === selectedProjectId + '') : null; return ( {({hasAccess}) => (
{t('Details')} {monitor && (
{monitor.id}
)} p.isMember) .map(p => ({value: p.slug, label: p.slug}))} help={t('Associate your monitor with the appropriate project.')} required />
{t('Config')} {() => { switch (this.form.getValue('config.schedule_type')) { case 'crontab': return ( , } )} /> ); case 'interval': return ( ); default: return null; } }}
)}
); } } export default withPageFilters(withProjects(MonitorForm));