aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js
diff options
context:
space:
mode:
Diffstat (limited to 'server/sonar-web/src/main/js')
-rw-r--r--server/sonar-web/src/main/js/apps/projectsManagement/App.tsx24
-rw-r--r--server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx28
-rw-r--r--server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx1
-rw-r--r--server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap58
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"