From: Pascal Mugnier Date: Thu, 3 May 2018 09:56:05 +0000 (+0200) Subject: Fix SONAR-6691 X-Git-Tag: 7.5~1260 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2f7df43382ea068d0a9fcdcf9f7b2be58b78a628;p=sonarqube.git Fix SONAR-6691 --- diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/ChangeProjectsForm.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/ChangeProjectsForm.tsx index 408c5afa85d..dde79b6c7c0 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/ChangeProjectsForm.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/ChangeProjectsForm.tsx @@ -104,6 +104,7 @@ export default class ChangeProjectsForm extends React.PureComponent {
project.key)} labelAll={translate('quality_gates.projects.all')} labelSelected={translate('quality_gates.projects.with')} diff --git a/server/sonar-web/src/main/js/components/SelectList/SelectList.tsx b/server/sonar-web/src/main/js/components/SelectList/SelectList.tsx index c57fc9a7029..f1a0b2f7a48 100644 --- a/server/sonar-web/src/main/js/components/SelectList/SelectList.tsx +++ b/server/sonar-web/src/main/js/components/SelectList/SelectList.tsx @@ -31,6 +31,7 @@ export enum Filter { } interface Props { + allowBulkSelection?: boolean; elements: string[]; disabledElements?: string[]; labelSelected?: string; @@ -114,6 +115,7 @@ export default class SelectList extends React.PureComponent { />
{ +interface State { + loading: boolean; +} + +export default class SelectListListContainer extends React.PureComponent { + mounted = false; + state: State = { loading: false }; + + componentDidMount() { + this.mounted = true; + } + + componentWillUnmount() { + this.mounted = false; + } + + stopLoading = () => { + if (this.mounted) { + this.setState({ loading: false }); + } + }; + isDisabled = (element: string): boolean => { return this.props.disabledElements.includes(element); }; @@ -40,8 +65,42 @@ export default class SelectListListContainer extends React.PureComponent return this.props.selectedElements.includes(element); }; + handleBulkChange = (checked: boolean) => { + this.setState({ loading: true }); + if (checked) { + Promise.all(this.props.elements.map(element => this.props.onSelect(element))) + .then(this.stopLoading) + .catch(this.stopLoading); + } else { + Promise.all(this.props.selectedElements.map(element => this.props.onUnselect(element))) + .then(this.stopLoading) + .catch(this.stopLoading); + } + }; + + renderBulkSelector() { + const { elements, selectedElements } = this.props; + return ( + <> +
  • + 0} + disabled={this.state.loading} + onCheck={this.handleBulkChange} + thirdState={selectedElements.length > 0 && elements.length !== selectedElements.length}> + + {translate('update_key.bulk_update')} + + + +
  • +
  • + + ); + } + render() { - const { elements, filter } = this.props; + const { allowBulkSelection, elements, filter } = this.props; const filteredElements = elements.filter(element => { if (filter === Filter.All) { return true; @@ -53,6 +112,10 @@ export default class SelectListListContainer extends React.PureComponent return (
      + {allowBulkSelection && + elements.length > 0 && + filter === Filter.All && + this.renderBulkSelector()} {filteredElements.map(element => (