diff options
author | Wouter Admiraal <wouter.admiraal@sonarsource.com> | 2021-08-19 12:49:11 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2021-08-20 20:03:09 +0000 |
commit | 6f17541395dcedb52fe54e7755be95f2e5941086 (patch) | |
tree | ce3d742aee2af87e018c193c97eea5e7fc81a4e5 /server/sonar-web/src/main/js/components/controls/SimpleModal.tsx | |
parent | 4ce76b5cde3ee915a6c45bfa452e0c7c61c642a5 (diff) | |
download | sonarqube-6f17541395dcedb52fe54e7755be95f2e5941086.tar.gz sonarqube-6f17541395dcedb52fe54e7755be95f2e5941086.zip |
SONAR-15297 Move all code from sonar-ui-common back to respective sonar-web folders
Diffstat (limited to 'server/sonar-web/src/main/js/components/controls/SimpleModal.tsx')
-rw-r--r-- | server/sonar-web/src/main/js/components/controls/SimpleModal.tsx | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/components/controls/SimpleModal.tsx b/server/sonar-web/src/main/js/components/controls/SimpleModal.tsx new file mode 100644 index 00000000000..4f95af38211 --- /dev/null +++ b/server/sonar-web/src/main/js/components/controls/SimpleModal.tsx @@ -0,0 +1,101 @@ +/* + * SonarQube + * Copyright (C) 2009-2021 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import * as React from 'react'; +import Modal, { ModalProps } from './Modal'; + +export interface ChildrenProps { + onCloseClick: (event?: React.SyntheticEvent<HTMLElement>) => void; + onFormSubmit: (event: React.SyntheticEvent<HTMLFormElement>) => void; + onSubmitClick: (event?: React.SyntheticEvent<HTMLElement>) => void; + submitting: boolean; +} + +interface Props extends ModalProps { + children: (props: ChildrenProps) => React.ReactNode; + header: string; + onClose: () => void; + onSubmit: () => void | Promise<void | Response>; +} + +interface State { + submitting: boolean; +} + +export default class SimpleModal extends React.Component<Props, State> { + mounted = false; + state: State = { submitting: false }; + + componentDidMount() { + this.mounted = true; + } + + componentWillUnmount() { + this.mounted = false; + } + + stopSubmitting = () => { + if (this.mounted) { + this.setState({ submitting: false }); + } + }; + + handleCloseClick = (event?: React.SyntheticEvent<HTMLElement>) => { + if (event) { + event.preventDefault(); + event.currentTarget.blur(); + } + this.props.onClose(); + }; + + handleFormSubmit = (event: React.SyntheticEvent<HTMLFormElement>) => { + event.preventDefault(); + this.submit(); + }; + + handleSubmitClick = (event?: React.SyntheticEvent<HTMLElement>) => { + if (event) { + event.preventDefault(); + event.currentTarget.blur(); + } + this.submit(); + }; + + submit = () => { + const result = this.props.onSubmit(); + if (result) { + this.setState({ submitting: true }); + result.then(this.stopSubmitting, this.stopSubmitting); + } + }; + + render() { + const { children, header, onClose, onSubmit, ...modalProps } = this.props; + return ( + <Modal contentLabel={header} onRequestClose={onClose} {...modalProps}> + {children({ + onCloseClick: this.handleCloseClick, + onFormSubmit: this.handleFormSubmit, + onSubmitClick: this.handleSubmitClick, + submitting: this.state.submitting + })} + </Modal> + ); + } +} |