client/app/pages/alert/AlertNew.jsx (106 lines of code) (raw):

import React from "react"; import PropTypes from "prop-types"; import HelpTrigger from "@/components/HelpTrigger"; import { Alert as AlertType } from "@/components/proptypes"; import Form from "antd/lib/form"; import Button from "antd/lib/button"; import Title from "./components/Title"; import Criteria from "./components/Criteria"; import NotificationTemplate from "./components/NotificationTemplate"; import Rearm from "./components/Rearm"; import Query from "./components/Query"; import HorizontalFormItem from "./components/HorizontalFormItem"; export default class AlertNew extends React.Component { state = { saving: false, }; save = () => { this.setState({ saving: true }); this.props.save().catch(() => { this.setState({ saving: false }); }); }; render() { const { alert, queryResult, pendingRearm, onNotificationTemplateChange } = this.props; const { onQuerySelected, onNameChange, onRearmChange, onCriteriaChange } = this.props; const { query, name, options } = alert; const { saving } = this.state; return ( <> <Title alert={alert} name={name} onChange={onNameChange} editMode /> <div className="bg-white tiled p-20"> <div className="d-flex"> <Form className="flex-fill"> <div className="m-b-30"> Start by selecting the query that you would like to monitor using the search bar. <br /> Keep in mind that Alerts do not work with queries that use parameters. </div> <HorizontalFormItem label="Query"> <Query query={query} queryResult={queryResult} onChange={onQuerySelected} editMode /> </HorizontalFormItem> {queryResult && options && ( <> <HorizontalFormItem label="Trigger when" className="alert-criteria"> <Criteria columnNames={queryResult.getColumnNames()} resultValues={queryResult.getData()} alertOptions={options} onChange={onCriteriaChange} editMode /> </HorizontalFormItem> <HorizontalFormItem label="When triggered, send notification"> <Rearm value={pendingRearm || 0} onChange={onRearmChange} editMode /> </HorizontalFormItem> <HorizontalFormItem label="Template"> <NotificationTemplate alert={alert} query={query} columnNames={queryResult.getColumnNames()} resultValues={queryResult.getData()} subject={options.custom_subject} setSubject={subject => onNotificationTemplateChange({ custom_subject: subject })} body={options.custom_body} setBody={body => onNotificationTemplateChange({ custom_body: body })} /> </HorizontalFormItem> </> )} <HorizontalFormItem> <Button type="primary" onClick={this.save} disabled={!query} className="btn-create-alert"> {saving && ( <span role="status" aria-live="polite" aria-relevant="additions removals"> <i className="fa fa-spinner fa-pulse m-r-5" aria-hidden="true" /> <span className="sr-only">Saving...</span> </span> )} Create Alert </Button> </HorizontalFormItem> </Form> <HelpTrigger className="f-13" type="ALERT_SETUP"> Setup Instructions <i className="fa fa-question-circle" aria-hidden="true" /> <span className="sr-only">(help)</span> </HelpTrigger> </div> </div> </> ); } } AlertNew.propTypes = { alert: AlertType.isRequired, queryResult: PropTypes.object, // eslint-disable-line react/forbid-prop-types, pendingRearm: PropTypes.number, onQuerySelected: PropTypes.func.isRequired, save: PropTypes.func.isRequired, onNameChange: PropTypes.func.isRequired, onRearmChange: PropTypes.func.isRequired, onCriteriaChange: PropTypes.func.isRequired, onNotificationTemplateChange: PropTypes.func.isRequired, }; AlertNew.defaultProps = { queryResult: null, pendingRearm: null, };