import React, { Component } from "react"; import PropTypes from "prop-types"; import { action, observable } from "mobx"; import { observer } from "mobx-react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons/faPlus"; import { faUser } from "@fortawesome/free-solid-svg-icons/faUser"; import { faCommentDots } from "@fortawesome/free-solid-svg-icons/faCommentDots"; import { faUndoAlt } from "@fortawesome/free-solid-svg-icons/faUndoAlt"; import { faSearch } from "@fortawesome/free-solid-svg-icons/faSearch"; import { faChevronUp } from "@fortawesome/free-solid-svg-icons/faChevronUp"; import { faChevronDown } from "@fortawesome/free-solid-svg-icons/faChevronDown"; import { AlertStore } from "Stores/AlertStore"; import { SilenceFormStore, SilenceFormStage } from "Stores/SilenceFormStore"; import { Settings } from "Stores/Settings"; import { TooltipWrapper } from "Components/TooltipWrapper"; import { AlertManagerInput } from "./AlertManagerInput"; import { SilenceMatch } from "./SilenceMatch"; import { DateTimeSelect } from "./DateTimeSelect"; import { PayloadPreview } from "./PayloadPreview"; const IconInput = ({ type, autoComplete, icon, placeholder, value, onChange }) => (
); IconInput.propTypes = { type: PropTypes.string.isRequired, autoComplete: PropTypes.string.isRequired, icon: FontAwesomeIcon.propTypes.icon.isRequired, placeholder: PropTypes.string.isRequired, value: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired }; const SilenceForm = observer( class SilenceForm extends Component { static propTypes = { alertStore: PropTypes.instanceOf(AlertStore).isRequired, silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, settingsStore: PropTypes.instanceOf(Settings).isRequired }; // store preview visibility state here, by default preview is collapsed // and user needs to expand it previewCollapse = observable( { hidden: true, toggle() { this.hidden = !this.hidden; } }, { toggle: action.bound }, { name: "Silence preview collpase toggle" } ); componentDidMount() { const { silenceFormStore, settingsStore } = this.props; // reset startsAt & endsAt on every mount, unless we're editing a silence if (silenceFormStore.data.silenceID === null) { silenceFormStore.data.resetStartEnd(); } else { silenceFormStore.data.verifyStarEnd(); } if (silenceFormStore.data.matchers.length === 0) { silenceFormStore.data.addEmptyMatcher(); } if (silenceFormStore.data.author === "") { silenceFormStore.data.author = settingsStore.silenceFormConfig.config.author; } } addMore = action(event => { const { silenceFormStore } = this.props; event.preventDefault(); silenceFormStore.data.addEmptyMatcher(); }); onAuthorChange = action(event => { const { silenceFormStore } = this.props; silenceFormStore.data.author = event.target.value; }); onCommentChange = action(event => { const { silenceFormStore } = this.props; silenceFormStore.data.comment = event.target.value; }); handleSubmit = action(event => { const { silenceFormStore, settingsStore } = this.props; event.preventDefault(); settingsStore.silenceFormConfig.saveAuthor(silenceFormStore.data.author); if (silenceFormStore.data.isValid) silenceFormStore.data.currentStage = SilenceFormStage.Preview; silenceFormStore.data.wasValidated = true; }); render() { const { alertStore, silenceFormStore } = this.props; return (
{silenceFormStore.data.matchers.map(matcher => ( { silenceFormStore.data.deleteMatcher(matcher.id); }} showDelete={silenceFormStore.data.matchers.length > 1} isValid={!silenceFormStore.data.wasValidated} /> ))}
{silenceFormStore.data.silenceID === null ? null : ( )}
{this.previewCollapse.hidden ? null : ( )} ); } } ); export { SilenceForm };