aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web
diff options
context:
space:
mode:
authorJeremy Davis <jeremy.davis@sonarsource.com>2021-04-15 17:52:40 +0200
committersonartech <sonartech@sonarsource.com>2021-04-20 20:03:46 +0000
commit56082756ff075c1ff55d8280954181dcb4ddc548 (patch)
treede91fde28664199f433b67a7c14a532b40c92df3 /server/sonar-web
parenta12c41da418594d9cf556ebfde3477d20e8ecef4 (diff)
downloadsonarqube-56082756ff075c1ff55d8280954181dcb4ddc548.tar.gz
sonarqube-56082756ff075c1ff55d8280954181dcb4ddc548.zip
SONAR-13906 Prevent ALM configuration modal from closing on click outside
Diffstat (limited to 'server/sonar-web')
-rw-r--r--server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionFormModalRenderer.tsx75
-rw-r--r--server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/AlmBindingDefinitionFormModalRenderer-test.tsx19
-rw-r--r--server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/__snapshots__/AlmBindingDefinitionFormModalRenderer-test.tsx.snap21
3 files changed, 62 insertions, 53 deletions
diff --git a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionFormModalRenderer.tsx b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionFormModalRenderer.tsx
index c3600b8bfe8..f6ec74d3180 100644
--- a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionFormModalRenderer.tsx
+++ b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionFormModalRenderer.tsx
@@ -19,9 +19,8 @@
*/
import * as React from 'react';
import { ResetButtonLink, SubmitButton } from 'sonar-ui-common/components/controls/buttons';
-import SimpleModal from 'sonar-ui-common/components/controls/SimpleModal';
+import Modal from 'sonar-ui-common/components/controls/Modal';
import { Alert } from 'sonar-ui-common/components/ui/Alert';
-import DeferredSpinner from 'sonar-ui-common/components/ui/DeferredSpinner';
import { translate } from 'sonar-ui-common/helpers/l10n';
export interface AlmBindingDefinitionFormModalProps {
@@ -31,7 +30,7 @@ export interface AlmBindingDefinitionFormModalProps {
help?: React.ReactNode;
isSecondInstance: boolean;
onCancel: () => void;
- onSubmit: () => void;
+ onSubmit: () => void | Promise<void | Response>;
}
export default function AlmBindingDefinitionFormModalRenderer(
@@ -40,43 +39,49 @@ export default function AlmBindingDefinitionFormModalRenderer(
const { action, children, help, isSecondInstance } = props;
const header = translate('settings.almintegration.form.header', action);
+ const handleSubmit = (event: React.SyntheticEvent<HTMLFormElement>) => {
+ event.preventDefault();
+ props.onSubmit();
+ };
+
return (
- <SimpleModal header={header} onClose={props.onCancel} onSubmit={props.onSubmit} size="medium">
- {({ onCloseClick, onFormSubmit, submitting }) => (
- <form className="views-form" onSubmit={onFormSubmit}>
- <div className="modal-head">
- <h2>{header}</h2>
- </div>
+ <Modal
+ contentLabel={header}
+ onRequestClose={props.onCancel}
+ shouldCloseOnOverlayClick={false}
+ size="medium">
+ <form className="views-form" onSubmit={handleSubmit}>
+ <div className="modal-head">
+ <h2>{header}</h2>
+ </div>
- <div className="modal-body modal-container">
- {isSecondInstance && action === 'create' && (
- <Alert className="big-spacer-bottom" variant="warning">
- {translate('settings.almintegration.form.second_instance_warning')}
- </Alert>
- )}
+ <div className="modal-body modal-container">
+ {isSecondInstance && action === 'create' && (
+ <Alert className="big-spacer-bottom" variant="warning">
+ {translate('settings.almintegration.form.second_instance_warning')}
+ </Alert>
+ )}
- <div className="display-flex-start">
- <div className="flex-1">{children}</div>
+ <div className="display-flex-start">
+ <div className="flex-1">{children}</div>
- {help ? (
- <Alert className="huge-spacer-left flex-1" variant="info">
- {help}
- </Alert>
- ) : (
- <div className="flex-1" />
- )}
- </div>
+ {help ? (
+ <Alert className="huge-spacer-left flex-1" variant="info">
+ {help}
+ </Alert>
+ ) : (
+ <div className="flex-1" />
+ )}
</div>
+ </div>
- <div className="modal-foot">
- <DeferredSpinner className="spacer-right" loading={submitting} />
- <SubmitButton disabled={submitting || !props.canSubmit()}>
- {translate('settings.almintegration.form.save')}
- </SubmitButton>
- <ResetButtonLink onClick={onCloseClick}>{translate('cancel')}</ResetButtonLink>
- </div>
- </form>
- )}
- </SimpleModal>
+ <div className="modal-foot">
+ <SubmitButton disabled={!props.canSubmit()}>
+ {translate('settings.almintegration.form.save')}
+ </SubmitButton>
+ <ResetButtonLink onClick={props.onCancel}>{translate('cancel')}</ResetButtonLink>
+ </div>
+ </form>
+ </Modal>
);
}
diff --git a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/AlmBindingDefinitionFormModalRenderer-test.tsx b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/AlmBindingDefinitionFormModalRenderer-test.tsx
index 4bf4263a6c1..6201ec060dc 100644
--- a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/AlmBindingDefinitionFormModalRenderer-test.tsx
+++ b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/AlmBindingDefinitionFormModalRenderer-test.tsx
@@ -19,14 +19,27 @@
*/
import { shallow } from 'enzyme';
import * as React from 'react';
+import { mockEvent } from '../../../../../helpers/testMocks';
import AlmBindingDefinitionFormModalRenderer, {
AlmBindingDefinitionFormModalProps
} from '../AlmBindingDefinitionFormModalRenderer';
it('should render correctly', () => {
- expect(shallowRender().dive()).toMatchSnapshot();
- expect(shallowRender({ help: <span>Help me</span> }).dive()).toMatchSnapshot('with help');
- expect(shallowRender({ isSecondInstance: true }).dive()).toMatchSnapshot('second instance');
+ expect(shallowRender()).toMatchSnapshot();
+ expect(shallowRender({ help: <span>Help me</span> })).toMatchSnapshot('with help');
+ expect(shallowRender({ isSecondInstance: true })).toMatchSnapshot('second instance');
+});
+
+it('should submit properly', () => {
+ const onSubmit = jest.fn().mockResolvedValue({});
+ const wrapper = shallowRender({ onSubmit });
+
+ const event: React.SyntheticEvent<HTMLFormElement> = mockEvent({ preventDefault: jest.fn() });
+
+ wrapper.find('form').simulate('submit', event);
+
+ expect(event.preventDefault).toBeCalled();
+ expect(onSubmit).toBeCalled();
});
function shallowRender(props: Partial<AlmBindingDefinitionFormModalProps> = {}) {
diff --git a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/__snapshots__/AlmBindingDefinitionFormModalRenderer-test.tsx.snap b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/__snapshots__/AlmBindingDefinitionFormModalRenderer-test.tsx.snap
index 3cf445a2f46..a5410979b1b 100644
--- a/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/__snapshots__/AlmBindingDefinitionFormModalRenderer-test.tsx.snap
+++ b/server/sonar-web/src/main/js/apps/settings/components/almIntegration/__tests__/__snapshots__/AlmBindingDefinitionFormModalRenderer-test.tsx.snap
@@ -4,6 +4,7 @@ exports[`should render correctly 1`] = `
<Modal
contentLabel="settings.almintegration.form.header.create"
onRequestClose={[MockFunction]}
+ shouldCloseOnOverlayClick={false}
size="medium"
>
<form
@@ -36,17 +37,13 @@ exports[`should render correctly 1`] = `
<div
className="modal-foot"
>
- <DeferredSpinner
- className="spacer-right"
- loading={false}
- />
<SubmitButton
disabled={true}
>
settings.almintegration.form.save
</SubmitButton>
<ResetButtonLink
- onClick={[Function]}
+ onClick={[MockFunction]}
>
cancel
</ResetButtonLink>
@@ -59,6 +56,7 @@ exports[`should render correctly: second instance 1`] = `
<Modal
contentLabel="settings.almintegration.form.header.create"
onRequestClose={[MockFunction]}
+ shouldCloseOnOverlayClick={false}
size="medium"
>
<form
@@ -97,17 +95,13 @@ exports[`should render correctly: second instance 1`] = `
<div
className="modal-foot"
>
- <DeferredSpinner
- className="spacer-right"
- loading={false}
- />
<SubmitButton
disabled={true}
>
settings.almintegration.form.save
</SubmitButton>
<ResetButtonLink
- onClick={[Function]}
+ onClick={[MockFunction]}
>
cancel
</ResetButtonLink>
@@ -120,6 +114,7 @@ exports[`should render correctly: with help 1`] = `
<Modal
contentLabel="settings.almintegration.form.header.create"
onRequestClose={[MockFunction]}
+ shouldCloseOnOverlayClick={false}
size="medium"
>
<form
@@ -157,17 +152,13 @@ exports[`should render correctly: with help 1`] = `
<div
className="modal-foot"
>
- <DeferredSpinner
- className="spacer-right"
- loading={false}
- />
<SubmitButton
disabled={true}
>
settings.almintegration.form.save
</SubmitButton>
<ResetButtonLink
- onClick={[Function]}
+ onClick={[MockFunction]}
>
cancel
</ResetButtonLink>