]> source.dussan.org Git - sonarqube.git/blob
873275c6990ef010b4eaa477970afbb431746a6c
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2023 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 import { ButtonPrimary, FlagMessage, Modal, Spinner } from 'design-system';
21 import * as React from 'react';
22 import { translate } from '../../../../helpers/l10n';
23 import {
24   AlmBindingDefinition,
25   AlmKeys,
26   AzureBindingDefinition,
27   BitbucketCloudBindingDefinition,
28   BitbucketServerBindingDefinition,
29   GithubBindingDefinition,
30   GitlabBindingDefinition,
31 } from '../../../../types/alm-settings';
32 import AzureForm from './AzureForm';
33 import BitbucketForm from './BitbucketForm';
34 import GithubForm from './GithubForm';
35 import GitlabForm from './GitlabForm';
36
37 export interface Props {
38   alm: AlmKeys;
39   isUpdate: boolean;
40   canSubmit: boolean;
41   onCancel: () => void;
42   onSubmit: () => void;
43   onFieldChange: (fieldId: keyof AlmBindingDefinition, value: string) => void;
44   formData: AlmBindingDefinition;
45   submitting: boolean;
46   bitbucketVariant?: AlmKeys.BitbucketServer | AlmKeys.BitbucketCloud;
47   onBitbucketVariantChange: (
48     bitbucketVariant: AlmKeys.BitbucketServer | AlmKeys.BitbucketCloud,
49   ) => void;
50   validationError?: string;
51 }
52
53 export default class AlmBindingDefinitionFormRenderer extends React.PureComponent<Readonly<Props>> {
54   renderForm = () => {
55     const { alm, formData, isUpdate, bitbucketVariant } = this.props;
56
57     switch (alm) {
58       case AlmKeys.GitLab:
59         return (
60           <GitlabForm
61             onFieldChange={this.props.onFieldChange}
62             formData={formData as GitlabBindingDefinition}
63           />
64         );
65       case AlmKeys.Azure:
66         return (
67           <AzureForm
68             onFieldChange={this.props.onFieldChange}
69             formData={formData as AzureBindingDefinition}
70           />
71         );
72       case AlmKeys.GitHub:
73         return (
74           <GithubForm
75             onFieldChange={this.props.onFieldChange}
76             formData={formData as GithubBindingDefinition}
77           />
78         );
79       case AlmKeys.BitbucketServer:
80         return (
81           <BitbucketForm
82             onFieldChange={this.props.onFieldChange}
83             formData={
84               formData as BitbucketServerBindingDefinition | BitbucketCloudBindingDefinition
85             }
86             isUpdate={isUpdate}
87             variant={bitbucketVariant}
88             onVariantChange={this.props.onBitbucketVariantChange}
89           />
90         );
91       default:
92         return null;
93     }
94   };
95
96   render() {
97     const { isUpdate, canSubmit, submitting, validationError } = this.props;
98     const header = translate('settings.almintegration.form.header', isUpdate ? 'edit' : 'create');
99     const FORM_ID = `settings.almintegration.form.${isUpdate ? 'edit' : 'create'}`;
100
101     const handleSubmit = (event: React.SyntheticEvent<HTMLFormElement>) => {
102       event.preventDefault();
103       this.props.onSubmit();
104     };
105
106     const formBody = (
107       <form id={FORM_ID} onSubmit={handleSubmit}>
108         {this.renderForm()}
109         {validationError && !canSubmit && (
110           <FlagMessage variant="error" className="sw-w-full">
111             <div>
112               <p>{translate('settings.almintegration.configuration_invalid')}</p>
113               <ul>
114                 <li>{validationError}</li>
115               </ul>
116             </div>
117           </FlagMessage>
118         )}
119       </form>
120     );
121
122     return (
123       <Modal
124         headerTitle={header}
125         isScrollable
126         onClose={this.props.onCancel}
127         body={formBody}
128         primaryButton={
129           <>
130             <Spinner loading={submitting} />
131             <ButtonPrimary
132               form={FORM_ID}
133               type="submit"
134               autoFocus
135               disabled={!canSubmit || submitting}
136             >
137               {translate('settings.almintegration.form.save')}
138             </ButtonPrimary>
139           </>
140         }
141         secondaryButtonLabel={translate('cancel')}
142       />
143     );
144   }
145 }