diff options
author | Grégoire Aubert <gregoire.aubert@sonarsource.com> | 2017-10-19 10:26:51 +0200 |
---|---|---|
committer | Grégoire Aubert <gregoire.aubert@sonarsource.com> | 2017-10-23 08:01:13 -0700 |
commit | 1dc612122fde774d7f8e3781b6020b535722ee32 (patch) | |
tree | 29de7a7671bde9ff2674c467d6b845e7f3ebac6a | |
parent | cc18c716b7b930b7b93c94218e8947755b2dbe87 (diff) | |
download | sonarqube-1dc612122fde774d7f8e3781b6020b535722ee32.tar.gz sonarqube-1dc612122fde774d7f8e3781b6020b535722ee32.zip |
SONAR-9954 Add serverId and nloc query to the request license url
-rw-r--r-- | server/sonar-web/src/main/js/api/marketplace.ts | 4 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx | 14 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx | 38 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap | 2 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/components/common/DeferredSpinner.tsx (renamed from server/sonar-web/src/main/js/components/common/DeferredSpinner.js) | 49 |
5 files changed, 64 insertions, 43 deletions
diff --git a/server/sonar-web/src/main/js/api/marketplace.ts b/server/sonar-web/src/main/js/api/marketplace.ts index 30c801ae0f2..57ee9128883 100644 --- a/server/sonar-web/src/main/js/api/marketplace.ts +++ b/server/sonar-web/src/main/js/api/marketplace.ts @@ -65,6 +65,10 @@ export function getLicensePreview(data: { return postJSON('/api/editions/preview', data).catch(throwGlobalError); } +export function getFormData(): Promise<{ serverId: string; ncloc: number }> { + return getJSON('/api/editions/form_data').catch(throwGlobalError); +} + export function applyLicense(data: { license: string }): Promise<EditionStatus> { return postJSON('/api/editions/apply_license', data).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx index 857a40e4058..6971889135c 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx @@ -32,13 +32,13 @@ export interface Props { interface State { license: string; - loading: boolean; status?: string; + submitting: boolean; } export default class LicenseEditionForm extends React.PureComponent<Props, State> { mounted: boolean; - state: State = { license: '', loading: false }; + state: State = { license: '', submitting: false }; componentDidMount() { this.mounted = true; @@ -63,7 +63,7 @@ export default class LicenseEditionForm extends React.PureComponent<Props, State event.preventDefault(); const { license, status } = this.state; if (license && status && ['AUTOMATIC_INSTALL', 'NO_INSTALL'].includes(status)) { - this.setState({ loading: true }); + this.setState({ submitting: true }); applyLicense({ license }).then( editionStatus => { this.props.updateEditionStatus(editionStatus); @@ -71,7 +71,7 @@ export default class LicenseEditionForm extends React.PureComponent<Props, State }, () => { if (this.mounted) { - this.setState({ loading: false }); + this.setState({ submitting: false }); } } ); @@ -80,7 +80,7 @@ export default class LicenseEditionForm extends React.PureComponent<Props, State render() { const { edition } = this.props; - const { loading, status } = this.state; + const { submitting, status } = this.state; const header = translateWithParameters('marketplace.install_x', edition.name); return ( <Modal @@ -101,10 +101,10 @@ export default class LicenseEditionForm extends React.PureComponent<Props, State /> <footer className="modal-foot"> - {loading && <i className="spinner spacer-right" />} + {submitting && <i className="spinner spacer-right" />} {status && ['NO_INSTALL', 'AUTOMATIC_INSTALL'].includes(status) && ( - <button className="js-confirm" onClick={this.handleConfirmClick} disabled={loading}> + <button className="js-confirm" onClick={this.handleConfirmClick} disabled={submitting}> {status === 'NO_INSTALL' ? translate('save') : translate('marketplace.install')} </button> )} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx index 76cbc297483..86c29fc65e9 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx @@ -19,8 +19,10 @@ */ import * as React from 'react'; import * as classNames from 'classnames'; +import { stringify } from 'querystring'; import { debounce } from 'lodash'; -import { Edition, getLicensePreview } from '../../../api/marketplace'; +import { omitNil } from '../../../helpers/request'; +import { Edition, getFormData, getLicensePreview } from '../../../api/marketplace'; import { translate, translateWithParameters } from '../../../helpers/l10n'; export interface Props { @@ -33,8 +35,11 @@ export interface Props { interface State { license: string; licenseEdition?: Edition; - loading: boolean; previewStatus?: string; + formData?: { + serverId?: string; + ncloc?: number; + }; } export default class LicenseEditionSet extends React.PureComponent<Props, State> { @@ -42,12 +47,13 @@ export default class LicenseEditionSet extends React.PureComponent<Props, State> constructor(props: Props) { super(props); - this.state = { license: '', loading: false }; + this.state = { license: '' }; this.fetchLicensePreview = debounce(this.fetchLicensePreview, 100); } componentDidMount() { this.mounted = true; + this.fetchFormData(); } componentWillUnmount() { @@ -72,6 +78,28 @@ export default class LicenseEditionSet extends React.PureComponent<Props, State> } ); + fetchFormData = () => { + getFormData().then( + formData => { + if (this.mounted) { + this.setState({ formData }); + } + }, + () => {} + ); + }; + + getLicenseFormUrl = (edition: Edition) => { + let url = edition.request_license_link; + if (this.state.formData) { + const query = stringify(omitNil(this.state.formData)); + if (query) { + url += '?' + query; + } + } + return url; + }; + handleLicenseChange = (event: React.SyntheticEvent<HTMLTextAreaElement>) => { const license = event.currentTarget.value; if (license) { @@ -94,7 +122,7 @@ export default class LicenseEditionSet extends React.PureComponent<Props, State> return ( <div className={className}> {edition && ( - <label className="spacer-bottom" htmlFor="set-license"> + <label className="display-inline-block spacer-bottom" htmlFor="set-license"> {translateWithParameters('marketplace.enter_license_for_x', edition.name)} <em className="mandatory">*</em> </label> @@ -143,7 +171,7 @@ export default class LicenseEditionSet extends React.PureComponent<Props, State> {edition && ( <a className="display-inline-block spacer-top" - href={edition.request_license_link} + href={this.getLicenseFormUrl(edition)} target="_blank"> {translate('marketplace.i_need_a_license')} </a> diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap index 6ba3dd639b2..48c4cdecbf9 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap @@ -46,7 +46,7 @@ exports[`should correctly display status message after checking license 3`] = ` exports[`should display correctly 1`] = ` <div> <label - className="spacer-bottom" + className="display-inline-block spacer-bottom" htmlFor="set-license" > marketplace.enter_license_for_x.Foo diff --git a/server/sonar-web/src/main/js/components/common/DeferredSpinner.js b/server/sonar-web/src/main/js/components/common/DeferredSpinner.tsx index f638257ad79..a840e2ea6f5 100644 --- a/server/sonar-web/src/main/js/components/common/DeferredSpinner.js +++ b/server/sonar-web/src/main/js/components/common/DeferredSpinner.tsx @@ -17,38 +17,28 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import React from 'react'; -import classNames from 'classnames'; +import * as React from 'react'; +import * as classNames from 'classnames'; -/*:: -type Props = { - children?: React.Element<*>, - className?: string, - loading?: boolean, - timeout: number -}; -*/ +interface Props { + children?: JSX.Element; + className?: string; + loading?: boolean; + timeout: number; +} -/*:: -type State = { - showSpinner: boolean -}; -*/ +interface State { + showSpinner: boolean; +} -export default class DeferredSpinner extends React.PureComponent { - /*:: props: Props; */ - /*:: state: State; */ - /*:: timer: number; */ +export default class DeferredSpinner extends React.PureComponent<Props, State> { + timer: any; static defaultProps = { timeout: 100 }; - constructor(props /*: Props */) { - super(props); - this.state = { showSpinner: false }; - } + state: State = { showSpinner: false }; componentDidMount() { if (this.props.loading == null || this.props.loading === true) { @@ -56,7 +46,7 @@ export default class DeferredSpinner extends React.PureComponent { } } - componentWillReceiveProps(nextProps /*: Props */) { + componentWillReceiveProps(nextProps: Props) { if (this.props.loading === false && nextProps.loading === true) { this.stopTimer(); this.startTimer(); @@ -80,10 +70,9 @@ export default class DeferredSpinner extends React.PureComponent { }; render() { - return this.state.showSpinner ? ( - <i className={classNames('spinner', this.props.className)} /> - ) : ( - this.props.children || null - ); + if (this.state.showSpinner) { + return <i className={classNames('spinner', this.props.className)} />; + } + return (this.props.children as JSX.Element) || null; } } |