From: Philippe Perrin Date: Mon, 11 Apr 2022 15:11:54 +0000 (+0200) Subject: SONAR-16240 Fix quality gate permission delegation search X-Git-Tag: 9.5.0.56709~252 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4d15c9cee11051d36cfa0e2bcfac2c89c97d7823;p=sonarqube.git SONAR-16240 Fix quality gate permission delegation search --- diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModal.tsx b/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModal.tsx index 2a2a7160b2c..741798c85a6 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModal.tsx +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModal.tsx @@ -25,6 +25,9 @@ import { QualityGate } from '../../../types/types'; import { UserBase } from '../../../types/users'; import QualityGatePermissionsAddModalRenderer from './QualityGatePermissionsAddModalRenderer'; +type Option = UserBase | Group; +export type OptionWithValue = Option & { value: string }; + interface Props { onClose: () => void; onSubmit: (selection: UserBase | Group) => void; @@ -33,9 +36,6 @@ interface Props { } interface State { - loading: boolean; - query: string; - searchResults: Array; selection?: UserBase | Group; } @@ -43,11 +43,7 @@ const DEBOUNCE_DELAY = 250; export default class QualityGatePermissionsAddModal extends React.Component { mounted = false; - state: State = { - loading: false, - query: '', - searchResults: [] - }; + state: State = {}; constructor(props: Props) { super(props); @@ -55,46 +51,26 @@ export default class QualityGatePermissionsAddModal extends React.Component { + handleSearch = (q: string, resolve: (options: OptionWithValue[]) => void) => { const { qualityGate } = this.props; - this.setState({ loading: true }); const queryParams: SearchPermissionsParameters = { gateName: qualityGate.name, - q: query, + q, selected: 'deselected' }; - try { - const [{ users }, { groups }] = await Promise.all([ - searchUsers(queryParams), - searchGroups(queryParams) - ]); - if (this.mounted) { - this.setState({ loading: false, searchResults: [...users, ...groups] }); - } - } catch { - if (this.mounted) { - this.setState({ loading: false }); - } - } - }; - - handleInputChange = (newQuery: string) => { - const { query } = this.state; - if (query !== newQuery) { - this.setState({ query: newQuery }); - this.handleSearch(newQuery); - } + Promise.all([searchUsers(queryParams), searchGroups(queryParams)]) + .then(([usersResponse, groupsResponse]) => [...usersResponse.users, ...groupsResponse.groups]) + .then(resolve) + .catch(() => resolve([])); }; handleSelection = (selection: UserBase | Group) => { @@ -111,16 +87,14 @@ export default class QualityGatePermissionsAddModal extends React.Component diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModalRenderer.tsx b/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModalRenderer.tsx index f848fae6065..dcd3fb8bc29 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModalRenderer.tsx +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/QualityGatePermissionsAddModalRenderer.tsx @@ -17,42 +17,37 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import { identity, omit } from 'lodash'; +import { omit } from 'lodash'; import * as React from 'react'; import { components, ControlProps, OptionProps, SingleValueProps } from 'react-select'; import { ResetButtonLink, SubmitButton } from '../../../components/controls/buttons'; import Modal from '../../../components/controls/Modal'; -import Select from '../../../components/controls/Select'; +import { SearchSelect } from '../../../components/controls/Select'; import GroupIcon from '../../../components/icons/GroupIcon'; import Avatar from '../../../components/ui/Avatar'; import { translate } from '../../../helpers/l10n'; import { Group, isUser } from '../../../types/quality-gates'; import { UserBase } from '../../../types/users'; +import { OptionWithValue } from './QualityGatePermissionsAddModal'; export interface QualityGatePermissionsAddModalRendererProps { onClose: () => void; - onInputChange: (query: string) => void; + handleSearch: (q: string, resolve: (options: OptionWithValue[]) => void) => void; + onSelection: (selection: OptionWithValue) => void; + selection?: UserBase | Group; onSubmit: (event: React.SyntheticEvent) => void; - onSelection: (selection: Option) => void; submitting: boolean; - loading: boolean; - searchResults: Array; - selection?: UserBase | Group; } -export type Option = (UserBase | Group) & { value: string }; - export default function QualityGatePermissionsAddModalRenderer( props: QualityGatePermissionsAddModalRendererProps ) { - const { loading, searchResults, selection, submitting } = props; + const { selection, submitting } = props; const header = translate('quality_gates.permissions.grant'); const noResultsText = translate('no_results'); - const options = searchResults.map(r => ({ ...r, value: getValue(r) })); - return (
@@ -62,24 +57,21 @@ export default function QualityGatePermissionsAddModalRenderer(
-
@@ -64,7 +62,7 @@ exports[`should render correctly: default 1`] = ` `; -exports[`should render correctly: query and results 1`] = ` +exports[`should render correctly: with selection and submitting 1`] = ` quality_gates.permissions.search - -
- -
- - add_verb - - - cancel - -
- - -`; - -exports[`should render correctly: submitting 1`] = ` - -
-

- quality_gates.permissions.grant -

-
-
-
-
- -