diff options
Diffstat (limited to 'server/sonar-web/src/main/js')
4 files changed, 107 insertions, 4 deletions
diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/App.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/App.tsx index 978feca7bba..34d6db3ebae 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/App.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/App.tsx @@ -28,7 +28,7 @@ import { PAGE_SIZE, Project } from './utils'; import ListFooter from '../../components/controls/ListFooter'; import Suggestions from '../../app/components/embed-docs-modal/Suggestions'; import { getComponents } from '../../api/components'; -import { Organization } from '../../app/types'; +import { Organization, Visibility } from '../../app/types'; import { toNotSoISOString } from '../../helpers/dates'; import { translate } from '../../helpers/l10n'; @@ -51,6 +51,7 @@ interface State { ready: boolean; selection: string[]; total: number; + visibility?: Visibility; } export default class App extends React.PureComponent<Props, State> { @@ -90,7 +91,8 @@ export default class App extends React.PureComponent<Props, State> { p: this.state.page !== 1 ? this.state.page : undefined, ps: PAGE_SIZE, q: this.state.query || undefined, - qualifiers: this.state.qualifiers + qualifiers: this.state.qualifiers, + visibility: this.state.visibility }; getComponents(parameters).then(r => { if (this.mounted) { @@ -132,6 +134,20 @@ export default class App extends React.PureComponent<Props, State> { ); }; + onVisibilityChanged = (newVisibility: Visibility | 'all') => { + this.setState( + { + ready: false, + page: 1, + provisioned: false, + query: '', + visibility: newVisibility === 'all' ? undefined : newVisibility, + selection: [] + }, + this.requestProjects + ); + }; + handleDateChanged = (analyzedBefore: Date | undefined) => this.setState({ ready: false, page: 1, analyzedBefore }, this.requestProjects); @@ -177,13 +193,14 @@ export default class App extends React.PureComponent<Props, State> { <Search analyzedBefore={this.state.analyzedBefore} - onAllSelected={this.onAllSelected} onAllDeselected={this.onAllDeselected} + onAllSelected={this.onAllSelected} onDateChanged={this.handleDateChanged} onDeleteProjects={this.requestProjects} onProvisionedChanged={this.onProvisionedChanged} onQualifierChanged={this.onQualifierChanged} onSearch={this.onSearch} + onVisibilityChanged={this.onVisibilityChanged} organization={this.props.organization} projects={this.state.projects} provisioned={this.state.provisioned} @@ -193,6 +210,7 @@ export default class App extends React.PureComponent<Props, State> { selection={this.state.selection} topLevelQualifiers={this.props.topLevelQualifiers} total={this.state.total} + visibility={this.state.visibility} /> <Projects diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx index 6e280bbdc81..205526b58aa 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx @@ -22,7 +22,7 @@ import { sortBy } from 'lodash'; import BulkApplyTemplateModal from './BulkApplyTemplateModal'; import DeleteModal from './DeleteModal'; import { QUALIFIERS_ORDER, Project } from './utils'; -import { Organization } from '../../app/types'; +import { Organization, Visibility } from '../../app/types'; import Checkbox from '../../components/controls/Checkbox'; import { translate } from '../../helpers/l10n'; import QualifierIcon from '../../components/icons-components/QualifierIcon'; @@ -40,6 +40,7 @@ export interface Props { onDeleteProjects: () => void; onProvisionedChanged: (provisioned: boolean) => void; onQualifierChanged: (qualifier: string) => void; + onVisibilityChanged: (qualifier: string) => void; onSearch: (query: string) => void; organization: Organization; projects: Project[]; @@ -50,6 +51,7 @@ export interface Props { selection: any[]; topLevelQualifiers: string[]; total: number; + visibility?: Visibility; } interface State { @@ -100,6 +102,8 @@ export default class Search extends React.PureComponent<Props, State> { handleQualifierChange = ({ value }: { value: string }) => this.props.onQualifierChanged(value); + handleVisibilityChange = ({ value }: { value: string }) => this.props.onVisibilityChanged(value); + renderCheckbox = () => { const isAllChecked = this.props.projects.length > 0 && this.props.selection.length === this.props.projects.length; @@ -148,6 +152,27 @@ export default class Search extends React.PureComponent<Props, State> { ); }; + renderVisibilityFilter = () => { + return ( + <td className="thin nowrap text-middle"> + <Select + className="input-small" + clearable={false} + disabled={!this.props.ready} + name="projects-visibility" + onChange={this.handleVisibilityChange} + options={[ + { value: 'all', label: translate('visibility.both') }, + { value: 'public', label: translate('visibility.public') }, + { value: 'private', label: translate('visibility.private') } + ]} + searchable={false} + value={this.props.visibility || 'all'} + /> + </td> + ); + }; + renderTypeFilter = () => this.props.qualifiers === 'TRK' ? ( <td className="thin nowrap text-middle"> @@ -192,6 +217,7 @@ export default class Search extends React.PureComponent<Props, State> { </td> {this.renderQualifierFilter()} {this.renderDateFilter()} + {this.renderVisibilityFilter()} {this.renderTypeFilter()} <td className="text-middle"> <SearchBox diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx index 4b0b3bcae64..f8081a89174 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx @@ -113,6 +113,7 @@ function shallowRender(props?: { [P in keyof Props]?: Props[P] }) { onProvisionedChanged={jest.fn()} onQualifierChanged={jest.fn()} onSearch={jest.fn()} + onVisibilityChanged={jest.fn()} organization={organization} projects={[]} provisioned={false} diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap index 544cef96516..4457cd20ade 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap @@ -93,6 +93,35 @@ exports[`render qualifiers filter 1`] = ` <td className="thin nowrap text-middle" > + <Select + className="input-small" + clearable={false} + disabled={false} + name="projects-visibility" + onChange={[Function]} + options={ + Array [ + Object { + "label": "visibility.both", + "value": "all", + }, + Object { + "label": "visibility.public", + "value": "public", + }, + Object { + "label": "visibility.private", + "value": "private", + }, + ] + } + searchable={false} + value="all" + /> + </td> + <td + className="thin nowrap text-middle" + > <Checkbox checked={false} className="link-checkbox-control" @@ -177,6 +206,35 @@ exports[`renders 1`] = ` <td className="thin nowrap text-middle" > + <Select + className="input-small" + clearable={false} + disabled={false} + name="projects-visibility" + onChange={[Function]} + options={ + Array [ + Object { + "label": "visibility.both", + "value": "all", + }, + Object { + "label": "visibility.public", + "value": "public", + }, + Object { + "label": "visibility.private", + "value": "private", + }, + ] + } + searchable={false} + value="all" + /> + </td> + <td + className="thin nowrap text-middle" + > <Checkbox checked={false} className="link-checkbox-control" |