From 032c8f3c2c3309732a196bd1d8c8118bb83e85bd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Tue, 13 Nov 2018 10:38:17 +0100 Subject: [PATCH] Rewrite settings encryption app to TS --- server/sonar-web/src/main/js/api/settings.ts | 14 +- .../src/main/js/app/styles/init/forms.css | 4 + .../{EncryptionApp.js => EncryptionApp.tsx} | 75 +++++---- .../encryption/EncryptionAppContainer.js | 38 ----- .../settings/encryption/EncryptionForm.js | 93 ----------- .../settings/encryption/EncryptionForm.tsx | 150 ++++++++++++++++++ .../encryption/GenerateSecretKeyForm.js | 74 --------- .../encryption/GenerateSecretKeyForm.tsx | 111 +++++++++++++ .../src/main/js/apps/settings/routes.ts | 2 +- .../settings/store/encryptionPage/actions.js | 77 --------- .../settings/store/encryptionPage/reducer.js | 31 ---- .../js/apps/settings/store/rootReducer.js | 5 - .../src/main/js/store/rootReducer.ts | 4 - .../resources/org/sonar/l10n/core.properties | 7 +- 14 files changed, 325 insertions(+), 360 deletions(-) rename server/sonar-web/src/main/js/apps/settings/encryption/{EncryptionApp.js => EncryptionApp.tsx} (51%) delete mode 100644 server/sonar-web/src/main/js/apps/settings/encryption/EncryptionAppContainer.js delete mode 100644 server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.js create mode 100644 server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.tsx delete mode 100644 server/sonar-web/src/main/js/apps/settings/encryption/GenerateSecretKeyForm.js create mode 100644 server/sonar-web/src/main/js/apps/settings/encryption/GenerateSecretKeyForm.tsx delete mode 100644 server/sonar-web/src/main/js/apps/settings/store/encryptionPage/actions.js delete mode 100644 server/sonar-web/src/main/js/apps/settings/store/encryptionPage/reducer.js diff --git a/server/sonar-web/src/main/js/api/settings.ts b/server/sonar-web/src/main/js/api/settings.ts index 6df408faa6b..2c0ad2d7210 100644 --- a/server/sonar-web/src/main/js/api/settings.ts +++ b/server/sonar-web/src/main/js/api/settings.ts @@ -41,7 +41,7 @@ export interface Definition { type: string; } -export function getDefinitions(component?: string): Promise { +export function getDefinitions(component?: string): Promise<{ definitions: Definition[] }> { return getJSON('/api/settings/list_definitions', { component }).then(r => r.definitions); } @@ -93,14 +93,14 @@ export function sendTestEmail(to: string, subject: string, message: string): Pro return post('/api/emails/send', { to, subject, message }); } -export function checkSecretKey(): Promise { - return getJSON('/api/settings/check_secret_key'); +export function checkSecretKey(): Promise<{ secretKeyAvailable: boolean }> { + return getJSON('/api/settings/check_secret_key').catch(throwGlobalError); } -export function generateSecretKey(): Promise { - return postJSON('/api/settings/generate_secret_key'); +export function generateSecretKey(): Promise<{ secretKey: string }> { + return postJSON('/api/settings/generate_secret_key').catch(throwGlobalError); } -export function encryptValue(value: string): Promise { - return postJSON('/api/settings/encrypt', { value }); +export function encryptValue(value: string): Promise<{ encryptedValue: string }> { + return postJSON('/api/settings/encrypt', { value }).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/app/styles/init/forms.css b/server/sonar-web/src/main/js/app/styles/init/forms.css index 4d9d83329fd..d68a4eb42d8 100644 --- a/server/sonar-web/src/main/js/app/styles/init/forms.css +++ b/server/sonar-web/src/main/js/app/styles/init/forms.css @@ -171,6 +171,10 @@ textarea.input-super-large { background-color: transparent !important; } +.input-clear { + background-color: transparent !important; +} + .input-code { font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: var(--smallFontSize); diff --git a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.js b/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.tsx similarity index 51% rename from server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.js rename to server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.tsx index 89f918dd457..441cecfa61d 100644 --- a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.js +++ b/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.tsx @@ -17,54 +17,75 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import React from 'react'; -import PropTypes from 'prop-types'; +import * as React from 'react'; import Helmet from 'react-helmet'; -import GenerateSecretKeyForm from './GenerateSecretKeyForm'; import EncryptionForm from './EncryptionForm'; +import GenerateSecretKeyForm from './GenerateSecretKeyForm'; +import DeferredSpinner from '../../../components/common/DeferredSpinner'; +import { checkSecretKey, generateSecretKey } from '../../../api/settings'; import { translate } from '../../../helpers/l10n'; -export default class EncryptionApp extends React.PureComponent { - static propTypes = { - loading: PropTypes.bool.isRequired, - secretKeyAvailable: PropTypes.bool, - secretKey: PropTypes.string, - encryptedValue: PropTypes.string, +interface State { + loading: boolean; + secretKey?: string; + secretKeyAvailable?: boolean; +} - checkSecretKey: PropTypes.func.isRequired, - generateSecretKey: PropTypes.func.isRequired, - encryptValue: PropTypes.func.isRequired, - startGeneration: PropTypes.func.isRequired - }; +export default class EncryptionApp extends React.PureComponent<{}, State> { + state: State = { loading: true }; + mounted = false; componentDidMount() { - this.props.checkSecretKey(); + this.mounted = true; + this.checkSecretKey(); + } + + componentWillUnmount() { + this.mounted = false; } + checkSecretKey = () => { + checkSecretKey().then( + ({ secretKeyAvailable }) => { + if (this.mounted) { + this.setState({ loading: false, secretKeyAvailable }); + } + }, + () => { + if (this.mounted) { + this.setState({ loading: false }); + } + } + ); + }; + + generateSecretKey = () => { + return generateSecretKey().then(({ secretKey }) => { + if (this.mounted) { + this.setState({ secretKey, secretKeyAvailable: false }); + } + }); + }; + render() { + const { loading, secretKey, secretKeyAvailable } = this.state; return (

{translate('property.category.security.encryption')}

- {this.props.loading && } +
- {!this.props.loading && - !this.props.secretKeyAvailable && ( + {!loading && + !secretKeyAvailable && ( )} - {this.props.secretKeyAvailable && ( - - )} + {secretKeyAvailable && }
); } diff --git a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionAppContainer.js b/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionAppContainer.js deleted file mode 100644 index 80c24b3527f..00000000000 --- a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionAppContainer.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2018 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 { connect } from 'react-redux'; -import EncryptionApp from './EncryptionApp'; -import { - checkSecretKey, - generateSecretKey, - encryptValue, - startGeneration -} from '../store/encryptionPage/actions'; -import { getSettingsAppEncryptionState } from '../../../store/rootReducer'; - -export default connect( - state => getSettingsAppEncryptionState(state), - { - checkSecretKey, - generateSecretKey, - encryptValue, - startGeneration - } -)(EncryptionApp); diff --git a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.js b/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.js deleted file mode 100644 index fef8d687609..00000000000 --- a/server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.js +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2018 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 React from 'react'; -import PropTypes from 'prop-types'; -import { translate } from '../../../helpers/l10n'; -import { SubmitButton } from '../../../components/ui/buttons'; - -export default class EncryptionForm extends React.PureComponent { - static propTypes = { - encryptedValue: PropTypes.string, - encryptValue: PropTypes.func.isRequired, - generateSecretKey: PropTypes.func.isRequired - }; - - state = { value: '' }; - - handleEncrypt(e) { - e.preventDefault(); - this.props.encryptValue(this.state.value); - } - - handleGenerateNewKey(e) { - e.preventDefault(); - this.props.generateSecretKey(); - } - - render() { - return ( -
-
{translate('encryption.form_intro')}
- -
this.handleEncrypt(e)}> -