From: Pascal Mugnier Date: Wed, 9 May 2018 10:03:03 +0000 (+0200) Subject: Fix SONAR-10640 X-Git-Tag: 7.5~1154 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=877b9bedf61c2f8a7fd4885f9500d57b0da72be7;p=sonarqube.git Fix SONAR-10640 --- diff --git a/server/sonar-web/src/main/js/app/styles/components/modals.css b/server/sonar-web/src/main/js/app/styles/components/modals.css index 21d73c39a99..f8416e932de 100644 --- a/server/sonar-web/src/main/js/app/styles/components/modals.css +++ b/server/sonar-web/src/main/js/app/styles/components/modals.css @@ -167,6 +167,10 @@ ul.modal-head-metadata li { font-weight: bold; } +.modal-field .note { + line-height: var(--controlHeight); +} + .readonly-field { padding-top: 5px; margin-left: -5px; diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionButton.tsx b/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionButton.tsx index 48943131904..04e4133f191 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionButton.tsx +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionButton.tsx @@ -21,10 +21,13 @@ import * as React from 'react'; import ConditionModal from './ConditionModal'; import { Button } from '../../../components/ui/buttons'; import { translate } from '../../../helpers/l10n'; -import { Metric } from '../../../app/types'; +import { Metric, QualityGate, Condition } from '../../../app/types'; interface Props { metrics: Metric[]; + organization?: string; + onAddCondition: (condition: Condition) => void; + qualityGate: QualityGate; } interface State { @@ -61,7 +64,10 @@ export default class AddConditionButton extends React.PureComponent )} diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionSelect.tsx b/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionSelect.tsx index 8539232bb3f..9b9f416c3d3 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionSelect.tsx +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/AddConditionSelect.tsx @@ -25,27 +25,34 @@ import { Metric } from '../../../app/types'; interface Props { metrics: Metric[]; - onAddCondition: (metric: string) => void; + onAddCondition: (metric: Metric) => void; +} + +interface State { + value: number; } interface Option { disabled?: boolean; domain?: string; label: string; - value: string; + value: number; } -export default class AddConditionSelect extends React.PureComponent { - handleChange = (option: Option) => { - this.props.onAddCondition(option.value); +export default class AddConditionSelect extends React.PureComponent { + state = { value: -1 }; + + handleChange = ({ value }: Option) => { + this.setState({ value }); + this.props.onAddCondition(this.props.metrics[value]); }; render() { const { metrics } = this.props; const options: Option[] = sortBy( - metrics.map(metric => ({ - value: metric.key, + metrics.map((metric, index) => ({ + value: index, label: getLocalizedMetricName(metric), domain: metric.domain })), @@ -58,7 +65,7 @@ export default class AddConditionSelect extends React.PureComponent { const previous = index > 0 ? options[index - 1] : null; if (option.domain && (!previous || previous.domain !== option.domain)) { optionsWithDomains.push({ - value: option.domain, + value: 0, label: getLocalizedMetricDomain(option.domain), disabled: true }); @@ -72,6 +79,7 @@ export default class AddConditionSelect extends React.PureComponent { onChange={this.handleChange} options={optionsWithDomains} placeholder={translate('quality_gates.add_condition')} + value={this.state.value} /> ); } diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/Condition.tsx b/server/sonar-web/src/main/js/apps/quality-gates/components/Condition.tsx index 11a644c4692..7525fd4a9c3 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/Condition.tsx +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/Condition.tsx @@ -18,32 +18,28 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import * as React from 'react'; +import ConditionOperator from './ConditionOperator'; +import Period from './Period'; +import ConditionModal from './ConditionModal'; import DeleteConditionForm from './DeleteConditionForm'; -import ThresholdInput from './ThresholdInput'; -import { createCondition, updateCondition } from '../../../api/quality-gates'; import { Condition as ICondition, Metric, QualityGate } from '../../../app/types'; -import Checkbox from '../../../components/controls/Checkbox'; -import Select from '../../../components/controls/Select'; -import { Button, ResetButtonLink } from '../../../components/ui/buttons'; +import ActionsDropdown, { ActionsDropdownItem } from '../../../components/controls/ActionsDropdown'; import { translate, getLocalizedMetricName } from '../../../helpers/l10n'; -import { formatMeasure, isDiffMetric } from '../../../helpers/measures'; +import { formatMeasure } from '../../../helpers/measures'; interface Props { condition: ICondition; canEdit: boolean; metric: Metric; organization?: string; - onAddCondition: (metric: string) => void; - onError: (error: any) => void; onRemoveCondition: (Condition: ICondition) => void; - onResetError: () => void; onSaveCondition: (newCondition: ICondition, oldCondition: ICondition) => void; qualityGate: QualityGate; } interface State { - changed: boolean; error: string; + modal: boolean; op?: string; period?: number; warning: string; @@ -53,144 +49,28 @@ export default class Condition extends React.PureComponent { constructor(props: Props) { super(props); this.state = { - changed: false, period: props.condition.period, + modal: false, op: props.condition.op, warning: props.condition.warning || '', error: props.condition.error || '' }; } - getUpdatedCondition = () => { - const { metric } = this.props; - const data: ICondition = { - metric: metric.key, - op: metric.type === 'RATING' ? 'GT' : this.state.op, - warning: this.state.warning, - error: this.state.error - }; - - const { period } = this.state; - if (period && metric.type !== 'RATING') { - data.period = period; - } - - if (isDiffMetric(metric.key)) { - data.period = 1; - } - return data; - }; - - handleOperatorChange = ({ value }: any) => this.setState({ changed: true, op: value }); - - handlePeriodChange = (checked: boolean) => { - const period = checked ? 1 : undefined; - this.setState({ changed: true, period }); - }; - - handleWarningChange = (warning: string) => this.setState({ changed: true, warning }); - - handleErrorChange = (error: string) => this.setState({ changed: true, error }); - - handleSaveClick = () => { - const { qualityGate, organization } = this.props; - const data = this.getUpdatedCondition(); - createCondition({ gateId: qualityGate.id, organization, ...data }).then( - this.handleConditionResponse, - this.props.onError - ); - }; - - handleUpdateClick = () => { - const { condition, organization } = this.props; - const data: ICondition = { - id: condition.id, - ...this.getUpdatedCondition() - }; - - updateCondition({ organization, ...data }).then( - this.handleConditionResponse, - this.props.onError - ); - }; - - handleConditionResponse = (newCondition: ICondition) => { + handleUpdateCondition = (newCondition: ICondition) => { this.props.onSaveCondition(newCondition, this.props.condition); - this.props.onResetError(); - this.setState({ changed: false }); }; handleCancelClick = () => { this.props.onRemoveCondition(this.props.condition); }; - renderPeriodValue() { - const { condition, metric } = this.props; - const isLeakSelected = !!this.state.period; - const isRating = metric.type === 'RATING'; + handleOpenUpdate = () => this.setState({ modal: true }); - if (isDiffMetric(condition.metric)) { - return ( - {translate('quality_gates.condition.leak.unconditional')} - ); - } - - if (isRating) { - return {translate('quality_gates.condition.leak.never')}; - } - - return isLeakSelected - ? translate('quality_gates.condition.leak.yes') - : translate('quality_gates.condition.leak.no'); - } - - renderPeriod() { - const { condition, metric, canEdit } = this.props; - const isRating = metric.type === 'RATING'; - const isLeakSelected = !!this.state.period; - - if (isRating || isDiffMetric(condition.metric) || !canEdit) { - return this.renderPeriodValue(); - } - - return ; - } - - renderOperator() { - const { condition, canEdit, metric } = this.props; - - if (!canEdit && condition.op) { - return metric.type === 'RATING' - ? translate('quality_gates.operator', condition.op, 'rating') - : translate('quality_gates.operator', condition.op); - } - - if (metric.type === 'RATING') { - return {translate('quality_gates.operator.GT.rating')}; - } - - const operators = ['LT', 'GT', 'EQ', 'NE']; - const operatorOptions = operators.map(op => { - const label = translate('quality_gates.operator', op); - return { label, value: op }; - }); - - return ( - - ); + const operators = ['LT', 'GT', 'EQ', 'NE']; + const operatorOptions = operators.map(op => { + const label = translate('quality_gates.operator', op); + return { label, value: op }; + }); + + return ( +