]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11123 Avoid duplicate API call to api/organizations/search in org projects...
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>
Fri, 10 Aug 2018 13:01:30 +0000 (15:01 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 16 Aug 2018 07:45:57 +0000 (09:45 +0200)
server/sonar-web/src/main/js/api/components.ts
server/sonar-web/src/main/js/app/styles/init/icons.css
server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx
server/sonar-web/src/main/js/apps/projects/utils.ts

index c917f8a44601cda15380bf4dce513aab9186a9b1..f6e83e322b9ed4c3340542f59baa5b7411d3a345 100644 (file)
@@ -174,7 +174,12 @@ export interface Facet {
 
 export function searchProjects(
   data: RequestData
-): Promise<{ components: Component[]; facets: Facet[]; paging: Paging }> {
+): Promise<{
+  components: Component[];
+  facets: Facet[];
+  organizations: Array<{ key: string; name: string }>;
+  paging: Paging;
+}> {
   const url = '/api/components/search_projects';
   return getJSON(url, data);
 }
index 38d782a3a8a3f3ead1ac88ba67bebd6ec4954d33..8acdf0079e169abdaadfad6f23cad1f256c1d0ff 100644 (file)
@@ -68,6 +68,7 @@ a[class*=' icon-'] {
     box-shadow 0.4s ease;
 }
 
+.icon-checkbox:focus:before,
 .link-checkbox:focus:focus .icon-checkbox:before {
   box-shadow: 0 0 0 3px rgba(35, 106, 151, 0.25);
 }
index e0b234e235dc70f93e421f08497f950c374c89d8..2bf13b590b5148985e6c28078af0a576bb32523d 100644 (file)
@@ -118,11 +118,7 @@ export default class AllProjects extends React.PureComponent<Props, State> {
 
   fetchProjects = (query: any) => {
     this.setState({ loading: true, query });
-    fetchProjects(
-      query,
-      this.props.isFavorite,
-      this.props.organization && this.props.organization.key
-    ).then(response => {
+    fetchProjects(query, this.props.isFavorite, this.props.organization).then(response => {
       if (this.mounted) {
         this.setState({
           facets: response.facets,
@@ -139,20 +135,18 @@ export default class AllProjects extends React.PureComponent<Props, State> {
     const { pageIndex, projects, query } = this.state;
     if (pageIndex && projects && query) {
       this.setState({ loading: true });
-      fetchProjects(
-        query,
-        this.props.isFavorite,
-        this.props.organization && this.props.organization.key,
-        pageIndex + 1
-      ).then(response => {
-        if (this.mounted) {
-          this.setState({
-            loading: false,
-            pageIndex: pageIndex + 1,
-            projects: [...projects, ...response.projects]
-          });
-        }
-      }, this.stopLoading);
+      fetchProjects(query, this.props.isFavorite, this.props.organization, pageIndex + 1).then(
+        response => {
+          if (this.mounted) {
+            this.setState({
+              loading: false,
+              pageIndex: pageIndex + 1,
+              projects: [...projects, ...response.projects]
+            });
+          }
+        },
+        this.stopLoading
+      );
     }
   };
 
index 474b8d89e8ee50f060846a241c2ff8cc660b88af..61ea473403fbb8f4098a7fd7d52c18dc940358b4 100644 (file)
@@ -26,6 +26,7 @@ import { getOrganizations } from '../../api/organizations';
 import { searchProjects, Facet } from '../../api/components';
 import { getMeasuresForProjects } from '../../api/measures';
 import { isDiffMetric, getPeriodValue } from '../../helpers/measures';
+import { Organization } from '../../app/types';
 
 interface SortingOption {
   class?: string;
@@ -164,21 +165,25 @@ export function parseSorting(sort: string): { sortValue: string; sortDesc: boole
 export function fetchProjects(
   query: Query,
   isFavorite: boolean,
-  organization?: string,
+  organization: Organization | undefined,
   pageIndex = 1
 ) {
   const ps = query.view === 'visualizations' ? PAGE_SIZE_VISUALIZATIONS : PAGE_SIZE;
-  const data = convertToQueryData(query, isFavorite, organization, {
+  const data = convertToQueryData(query, isFavorite, organization && organization.key, {
     p: pageIndex > 1 ? pageIndex : undefined,
     ps,
     facets: defineFacets(query).join(),
     f: 'analysisDate,leakPeriodDate'
   });
-  return searchProjects(data).then(({ components, facets, paging }) => {
-    return Promise.all([
-      fetchProjectMeasures(components, query),
-      fetchProjectOrganizations(components)
-    ]).then(([measures, organizations]) => {
+  return searchProjects(data)
+    .then(response =>
+      Promise.all([
+        fetchProjectMeasures(response.components, query),
+        fetchProjectOrganizations(response.components, organization),
+        Promise.resolve(response)
+      ])
+    )
+    .then(([measures, organizations, { components, facets, paging }]) => {
       return {
         facets: getFacetsMap(facets),
         projects: components
@@ -201,7 +206,6 @@ export function fetchProjects(
         total: paging.total
       };
     });
-  });
 }
 
 function defineMetrics(query: Query): string[] {
@@ -254,7 +258,13 @@ function fetchProjectMeasures(projects: Array<{ key: string }>, query: Query) {
   return getMeasuresForProjects(projectKeys, metrics);
 }
 
-function fetchProjectOrganizations(projects: Array<{ organization: string }>) {
+function fetchProjectOrganizations(
+  projects: Array<{ organization: string }>,
+  organization: Organization | undefined
+) {
+  if (organization) {
+    return Promise.resolve([organization]);
+  }
   if (!projects.length) {
     return Promise.resolve([]);
   }