import classNames from "classnames"; import PropTypes from "prop-types"; import React from "react"; import jQuery from "../../util/jquery"; class Modal extends React.Component { static propTypes = { title: PropTypes.string.isRequired, show: PropTypes.bool.isRequired, onSubmit: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, submitButtonType: PropTypes.string, submitButtonText: PropTypes.string, }; static defaultProps = { submitButtonType: "primary", submitButtonText: "Save", }; static idCounter = 0; /** * Local, up-to-date copy of modal visibility for time between close event and a props update (to prevent duplicate * close triggers). */ visible = false; constructor() { super(); this.id = "modal-" + Modal.idCounter++; } componentDidMount() { this.visible = this.props.show; this.openOrCloseModal(); // Trigger auto-focus jQuery("#" + this.id) .on("shown.bs.modal", function () { jQuery(this).find("input").first().focus(); }) .on("hide.bs.modal", () => { if (this.visible) { this.props.onCancel(); } }); } componentDidUpdate() { this.visible = this.props.show; this.openOrCloseModal(); } onSubmit() { if (this.visible) { this.props.onSubmit(); this.visible = false; this.closeModal(); } } onCancel() { if (this.visible) { this.props.onCancel(); this.visible = false; this.closeModal(); } } openModal() { jQuery("#" + this.id).modal("show"); } closeModal() { jQuery("#" + this.id).modal("hide"); } openOrCloseModal() { if (this.visible) { this.openModal(); } else { this.closeModal(); } } render() { return (