aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>2017-10-19 10:26:51 +0200
committerGrégoire Aubert <gregoire.aubert@sonarsource.com>2017-10-23 08:01:13 -0700
commit1dc612122fde774d7f8e3781b6020b535722ee32 (patch)
tree29de7a7671bde9ff2674c467d6b845e7f3ebac6a
parentcc18c716b7b930b7b93c94218e8947755b2dbe87 (diff)
downloadsonarqube-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.ts4
-rw-r--r--server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionForm.tsx14
-rw-r--r--server/sonar-web/src/main/js/apps/marketplace/components/LicenseEditionSet.tsx38
-rw-r--r--server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap2
-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;
}
}