client/app/pages/alert/AlertEdit.jsx (127 lines of code) (raw):
import React from "react";
import PropTypes from "prop-types";
import HelpTrigger from "@/components/HelpTrigger";
import DynamicComponent from "@/components/DynamicComponent";
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 AlertEdit extends React.Component {
_isMounted = false;
state = {
saving: false,
};
componentDidMount() {
this._isMounted = true;
}
componentWillUnmount() {
this._isMounted = false;
}
save = () => {
this.setState({ saving: true });
this.props.save().catch(() => {
if (this._isMounted) {
this.setState({ saving: false });
}
});
};
cancel = () => {
this.props.cancel();
};
render() {
const { alert, queryResult, pendingRearm, onNotificationTemplateChange, menuButton } = this.props;
const { onQuerySelected, onNameChange, onRearmChange, onCriteriaChange } = this.props;
const { query, name, options } = alert;
const { saving } = this.state;
return (
<>
<Title name={name} alert={alert} onChange={onNameChange} editMode>
<DynamicComponent name="AlertEdit.HeaderExtra" alert={alert} />
<Button className="m-r-5" onClick={() => this.cancel()}>
<i className="fa fa-times m-r-5" aria-hidden="true" />
Cancel
</Button>
<Button type="primary" onClick={() => this.save()}>
{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>
) : (
<>
<i className="fa fa-check m-r-5" aria-hidden="true" />
</>
)}
Save Changes
</Button>
{menuButton}
</Title>
<div className="bg-white tiled p-20">
<div className="d-flex">
<Form className="flex-fill">
<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>
</>
)}
</Form>
<div>
<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>
</div>
</>
);
}
}
AlertEdit.propTypes = {
alert: AlertType.isRequired,
queryResult: PropTypes.object, // eslint-disable-line react/forbid-prop-types,
pendingRearm: PropTypes.number,
menuButton: PropTypes.node.isRequired,
save: PropTypes.func.isRequired,
cancel: PropTypes.func.isRequired,
onQuerySelected: PropTypes.func.isRequired,
onNameChange: PropTypes.func.isRequired,
onCriteriaChange: PropTypes.func.isRequired,
onRearmChange: PropTypes.func.isRequired,
onNotificationTemplateChange: PropTypes.func.isRequired,
};
AlertEdit.defaultProps = {
queryResult: null,
pendingRearm: null,
};