]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10050 Switch Issues/Effort in issues page when data is available
authorPascal Mugnier <pascal.mugnier@sonarsource.com>
Tue, 17 Apr 2018 10:11:11 +0000 (12:11 +0200)
committerSonarTech <sonartech@sonarsource.com>
Wed, 18 Apr 2018 18:20:53 +0000 (20:20 +0200)
21 files changed:
server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.js.snap
server/sonar-web/src/main/js/apps/issues/components/App.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/AuthorFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/CreationDateFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/DirectoryFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/LanguageFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/ModuleFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/ProjectFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/ResolutionFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/RuleFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/SeverityFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/StatusFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/TagFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/TypeFacet.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/__snapshots__/AssigneeFacet-test.tsx.snap
server/sonar-web/src/main/js/components/facet/FacetItem.tsx
server/sonar-web/src/main/js/components/facet/__tests__/FacetItem-test.tsx
server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItem-test.tsx.snap

index aad1591cb6766a4ff9bfc01a3bd27445b24b6585..64c9678aaefabc729563fb92706d433a30bf451a 100644 (file)
@@ -16,6 +16,7 @@ exports[`should display facet item list 1`] = `
       disabled={false}
       halfWidth={false}
       key="Reliability"
+      loading={false}
       name={
         <span
           id="measure-overview-Reliability-name"
@@ -46,6 +47,7 @@ exports[`should display facet item list 1`] = `
       disabled={false}
       halfWidth={false}
       key="new_bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
@@ -93,6 +95,7 @@ exports[`should display facet item list 1`] = `
       disabled={false}
       halfWidth={false}
       key="bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
@@ -150,6 +153,7 @@ exports[`should display facet item list with bugs selected 1`] = `
       disabled={false}
       halfWidth={false}
       key="Reliability"
+      loading={false}
       name={
         <span
           id="measure-overview-Reliability-name"
@@ -180,6 +184,7 @@ exports[`should display facet item list with bugs selected 1`] = `
       disabled={false}
       halfWidth={false}
       key="new_bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
@@ -227,6 +232,7 @@ exports[`should display facet item list with bugs selected 1`] = `
       disabled={false}
       halfWidth={false}
       key="bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
@@ -280,6 +286,7 @@ exports[`should not display subtitles of new measures if there is none 1`] = `
       disabled={false}
       halfWidth={false}
       key="Reliability"
+      loading={false}
       name={
         <span
           id="measure-overview-Reliability-name"
@@ -310,6 +317,7 @@ exports[`should not display subtitles of new measures if there is none 1`] = `
       disabled={false}
       halfWidth={false}
       key="bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
@@ -356,6 +364,7 @@ exports[`should not display subtitles of new measures if there is none, even on
       disabled={false}
       halfWidth={false}
       key="Reliability"
+      loading={false}
       name={
         <span
           id="measure-overview-Reliability-name"
@@ -386,6 +395,7 @@ exports[`should not display subtitles of new measures if there is none, even on
       disabled={false}
       halfWidth={false}
       key="new_bugs"
+      loading={false}
       name={
         <span
           className="big-spacer-left"
index 28a60d965e3f9657c80099c4904f8cfba31f2fab..3ab8f9023e86a3c3ab0c1f80bfd8f65a8be2ea67 100644 (file)
@@ -72,22 +72,21 @@ import Checkbox from '../../../components/controls/Checkbox';
 
 import '../styles.css';
 
+interface FetchIssuesPromise {
+  components: ReferencedComponent[];
+  facets: RawFacet[];
+  issues: Issue[];
+  languages: ReferencedLanguage[];
+  paging: Paging;
+  rules: { name: string }[];
+  users: ReferencedUser[];
+}
+
 interface Props {
   branchLike?: BranchLike;
   component?: Component;
   currentUser: CurrentUser;
-  fetchIssues: (
-    query: RawQuery,
-    requestOrganizations?: boolean
-  ) => Promise<{
-    components: ReferencedComponent[];
-    facets: RawFacet[];
-    issues: Issue[];
-    languages: ReferencedLanguage[];
-    paging: Paging;
-    rules: { name: string }[];
-    users: ReferencedUser[];
-  }>;
+  fetchIssues: (query: RawQuery, requestOrganizations?: boolean) => Promise<FetchIssuesPromise>;
   location: { pathname: string; query: RawQuery };
   myIssues?: boolean;
   onBranchesChange: () => void;
@@ -397,7 +396,11 @@ export default class App extends React.PureComponent<Props, State> {
     }
   };
 
-  fetchIssues = (additional: RawQuery, requestFacets = false, requestOrganizations = true) => {
+  fetchIssues = (
+    additional: RawQuery,
+    requestFacets = false,
+    requestOrganizations = true
+  ): Promise<FetchIssuesPromise> => {
     const { component, organization } = this.props;
     const { myIssues, openFacets, query } = this.state;
 
@@ -428,7 +431,10 @@ export default class App extends React.PureComponent<Props, State> {
       Object.assign(parameters, { assignees: '__me__' });
     }
 
-    return this.props.fetchIssues(parameters, requestOrganizations);
+    return this.props.fetchIssues(parameters, requestOrganizations).then(reponse => {
+      this.setState({ loading: false });
+      return reponse;
+    });
   };
 
   fetchFirstIssues() {
@@ -594,6 +600,7 @@ export default class App extends React.PureComponent<Props, State> {
   };
 
   handleFilterChange = (changes: Partial<Query>) => {
+    this.setState({ loading: true });
     this.context.router.push({
       pathname: this.props.location.pathname,
       query: {
@@ -854,6 +861,7 @@ export default class App extends React.PureComponent<Props, State> {
         <Sidebar
           component={component}
           facets={this.state.facets}
+          loading={this.state.loading}
           myIssues={this.state.myIssues}
           onFacetToggle={this.handleFacetToggle}
           onFilterChange={this.handleFilterChange}
index 7ad53a950e439e139383e2186305ff434ef97c73..77cae8a2d9c74bcc63c202dd8b8024fe3810bb76 100644 (file)
@@ -34,6 +34,7 @@ export interface Props {
   assignees: string[];
   component: Component | undefined;
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -164,6 +165,7 @@ export default class AssigneeFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.isAssigneeActive(assignee)}
             key={assignee}
+            loading={this.props.loading}
             name={this.getAssigneeName(assignee)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(assignee), this.props.facetMode)}
index 77398f0c231b9df0113547690a6c56316bef1fb6..a09a7e62a4299f9233aa22f0550d66be6dde2f60 100644 (file)
@@ -28,6 +28,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -78,6 +79,7 @@ export default class AuthorFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.authors.includes(author)}
             key={author}
+            loading={this.props.loading}
             name={author}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(author), this.props.facetMode)}
index df6dd15df91a2dc37319bf7423f89cfaffd97f42..5ba901f92e619c01e7963046d2d58903e1d5e07c 100644 (file)
@@ -41,6 +41,7 @@ interface Props {
   createdBefore: Date | undefined;
   createdInLast: string;
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -171,7 +172,7 @@ export default class CreationDateFacet extends React.PureComponent<Props> {
         createdBefore: endDate,
         tooltip,
         x: index,
-        y: stats[start]
+        y: this.props.loading ? 0 : stats[start]
       };
     });
 
@@ -225,6 +226,7 @@ export default class CreationDateFacet extends React.PureComponent<Props> {
       <div className="spacer-top issues-predefined-periods">
         <FacetItem
           active={!this.hasValue()}
+          loading={this.props.loading}
           name={translate('issues.facet.createdAt.all')}
           onClick={this.handlePeriodClick}
           value=""
@@ -232,6 +234,7 @@ export default class CreationDateFacet extends React.PureComponent<Props> {
         {component ? (
           <FacetItem
             active={sinceLeakPeriod}
+            loading={this.props.loading}
             name={translate('issues.leak_period')}
             onClick={this.handleLeakPeriodClick}
             value=""
@@ -240,18 +243,21 @@ export default class CreationDateFacet extends React.PureComponent<Props> {
           <>
             <FacetItem
               active={createdInLast === '1w'}
+              loading={this.props.loading}
               name={translate('issues.facet.createdAt.last_week')}
               onClick={this.handlePeriodClick}
               value="1w"
             />
             <FacetItem
               active={createdInLast === '1m'}
+              loading={this.props.loading}
               name={translate('issues.facet.createdAt.last_month')}
               onClick={this.handlePeriodClick}
               value="1m"
             />
             <FacetItem
               active={createdInLast === '1y'}
+              loading={this.props.loading}
               name={translate('issues.facet.createdAt.last_year')}
               onClick={this.handlePeriodClick}
               value="1y"
index 711b509a23504e461983ccc1b73b0d82cd0ad56c..bff7ef1c39127c086e8675aa6128bc7a10abe8b2 100644 (file)
@@ -31,6 +31,7 @@ import { collapsePath } from '../../../helpers/path';
 interface Props {
   directories: string[];
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -92,6 +93,7 @@ export default class DirectoryFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.directories.includes(directory)}
             key={directory}
+            loading={this.props.loading}
             name={this.renderName(directory)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(directory), this.props.facetMode)}
index c68d4be90c21c04befce3c4b2b378589b89b0a71..cb998d446987a219b34943e2b9b58cb7b70fadb4 100644 (file)
@@ -31,6 +31,7 @@ import { collapsePath } from '../../../helpers/path';
 interface Props {
   facetMode: string;
   files: string[];
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -96,6 +97,7 @@ export default class FileFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.files.includes(file)}
             key={file}
+            loading={this.props.loading}
             name={this.renderName(file)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(file), this.props.facetMode)}
index 1252b235f291f8406303bf28d7684ce293ad0d91..95d7cae343aceba6a17c6def5581221dc594e107 100644 (file)
@@ -29,12 +29,13 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  languages: string[];
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
-  stats: { [x: string]: number } | undefined;
   referencedLanguages: { [languageKey: string]: ReferencedLanguage };
-  languages: string[];
+  stats: { [x: string]: number } | undefined;
 }
 
 export default class LanguageFacet extends React.PureComponent<Props> {
@@ -90,6 +91,7 @@ export default class LanguageFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.languages.includes(language)}
             key={language}
+            loading={this.props.loading}
             name={this.getLanguageName(language)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(language), this.props.facetMode)}
index 7a48a6d71fed79e3992d0a1b15fbbb0e7cce5d0f..672678258e65cc4ed19027247b1ba755562cea97 100644 (file)
@@ -29,6 +29,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   modules: string[];
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
@@ -94,6 +95,7 @@ export default class ModuleFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.modules.includes(module)}
             key={module}
+            loading={this.props.loading}
             name={this.renderName(module)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(module), this.props.facetMode)}
index 6ae7aa5938d12765da5bfbcc16c4d030373d4c3f..675fdb92fb007ba7527842a659c79ed55e0852da 100644 (file)
@@ -34,6 +34,7 @@ import { translate } from '../../../helpers/l10n';
 interface Props {
   component: Component | undefined;
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -148,6 +149,7 @@ export default class ProjectFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.projects.includes(project)}
             key={project}
+            loading={this.props.loading}
             name={this.renderName(project)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(project), this.props.facetMode)}
index 0cf5930502bcfce482b2f55c0187d2b74301d734..911555a65731cf179b3a25b33acb1c1550ace98b 100644 (file)
@@ -28,6 +28,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -90,6 +91,7 @@ export default class ResolutionFacet extends React.PureComponent<Props> {
         disabled={stat === 0 && !active}
         halfWidth={true}
         key={resolution}
+        loading={this.props.loading}
         name={this.getFacetItemName(resolution)}
         onClick={this.handleItemClick}
         stat={formatFacetStat(stat, this.props.facetMode)}
index ff0edeaa4063b1bbeb5996816ae2dd619f8874fe..7cd4be14f7540f3b2812ddfd8ce7f4167a43b202 100644 (file)
@@ -31,6 +31,7 @@ import { translate } from '../../../helpers/l10n';
 interface Props {
   facetMode: string;
   languages: string[];
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -105,6 +106,7 @@ export default class RuleFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.rules.includes(rule)}
             key={rule}
+            loading={this.props.loading}
             name={this.getRuleName(rule)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(rule), this.props.facetMode)}
index 6c39c35aa76da97e5093ac4b03c32714e0883651..9b27208e74c16a1190113407dbaaf73decd116bb 100644 (file)
@@ -29,6 +29,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -74,6 +75,7 @@ export default class SeverityFacet extends React.PureComponent<Props> {
         disabled={stat === 0 && !active}
         halfWidth={true}
         key={severity}
+        loading={this.props.loading}
         name={<SeverityHelper severity={severity} />}
         onClick={this.handleItemClick}
         stat={formatFacetStat(stat, this.props.facetMode)}
index f1853e1337b0fbd1a7b2468fac65464d04cadbc9..c850ffa07507d00355bc12c9cbe8fdabc094e4ee 100644 (file)
@@ -39,6 +39,7 @@ import { Component } from '../../../app/types';
 export interface Props {
   component: Component | undefined;
   facets: { [facet: string]: Facet };
+  loading?: boolean;
   myIssues: boolean;
   onFacetToggle: (property: string) => void;
   onFilterChange: (changes: Partial<Query>) => void;
@@ -67,6 +68,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         <FacetMode facetMode={query.facetMode} onChange={this.props.onFilterChange} />
         <TypeFacet
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.types}
@@ -75,6 +77,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         />
         <SeverityFacet
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.severities}
@@ -83,6 +86,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         />
         <ResolutionFacet
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.resolutions}
@@ -92,6 +96,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         />
         <StatusFacet
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.statuses}
@@ -105,6 +110,7 @@ export default class Sidebar extends React.PureComponent<Props> {
           createdBefore={query.createdBefore}
           createdInLast={query.createdInLast}
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.createdAt}
@@ -114,6 +120,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         <RuleFacet
           facetMode={query.facetMode}
           languages={query.languages}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.rules}
@@ -125,6 +132,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         <TagFacet
           component={component}
           facetMode={query.facetMode}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.tags}
@@ -136,6 +144,7 @@ export default class Sidebar extends React.PureComponent<Props> {
           <ProjectFacet
             component={component}
             facetMode={query.facetMode}
+            loading={this.props.loading}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
             open={!!openFacets.projects}
@@ -148,6 +157,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         {displayModulesFacet && (
           <ModuleFacet
             facetMode={query.facetMode}
+            loading={this.props.loading}
             modules={query.modules}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
@@ -160,6 +170,7 @@ export default class Sidebar extends React.PureComponent<Props> {
           <DirectoryFacet
             directories={query.directories}
             facetMode={query.facetMode}
+            loading={this.props.loading}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
             open={!!openFacets.directories}
@@ -171,6 +182,7 @@ export default class Sidebar extends React.PureComponent<Props> {
           <FileFacet
             facetMode={query.facetMode}
             files={query.files}
+            loading={this.props.loading}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
             open={!!openFacets.files}
@@ -184,6 +196,7 @@ export default class Sidebar extends React.PureComponent<Props> {
             assignees={query.assignees}
             component={component}
             facetMode={query.facetMode}
+            loading={this.props.loading}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
             open={!!openFacets.assignees}
@@ -196,6 +209,7 @@ export default class Sidebar extends React.PureComponent<Props> {
           <AuthorFacet
             authors={query.authors}
             facetMode={query.facetMode}
+            loading={this.props.loading}
             onChange={this.props.onFilterChange}
             onToggle={this.props.onFacetToggle}
             open={!!openFacets.authors}
@@ -205,6 +219,7 @@ export default class Sidebar extends React.PureComponent<Props> {
         <LanguageFacet
           facetMode={query.facetMode}
           languages={query.languages}
+          loading={this.props.loading}
           onChange={this.props.onFilterChange}
           onToggle={this.props.onFacetToggle}
           open={!!openFacets.languages}
index 5985afc63342b2f9807e907fb50b18655de24da4..86e876d11c5c313b6e809c77440c5c342d6d1bc8 100644 (file)
@@ -28,6 +28,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -81,6 +82,7 @@ export default class StatusFacet extends React.PureComponent<Props> {
         disabled={stat === 0 && !active}
         halfWidth={true}
         key={status}
+        loading={this.props.loading}
         name={this.renderStatus(status)}
         onClick={this.handleItemClick}
         stat={formatFacetStat(stat, this.props.facetMode)}
index 2fc0c14ab66dba7c52200c0e210c2636952e367a..ba44ec51a2955efa19b37c3a4e52794c2597694b 100644 (file)
@@ -32,6 +32,7 @@ import { translate } from '../../../helpers/l10n';
 interface Props {
   component: Component | undefined;
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -107,6 +108,7 @@ export default class TagFacet extends React.PureComponent<Props> {
           <FacetItem
             active={this.props.tags.includes(tag)}
             key={tag}
+            loading={this.props.loading}
             name={this.renderTag(tag)}
             onClick={this.handleItemClick}
             stat={formatFacetStat(this.getStat(tag), this.props.facetMode)}
index b026c0af92dcc385a0f8d7cc9ff2b4f7f7b85c4a..146a6dbe6343e7f49a6f6b0cc1f3a41bdc4f9bc6 100644 (file)
@@ -29,6 +29,7 @@ import { translate } from '../../../helpers/l10n';
 
 interface Props {
   facetMode: string;
+  loading?: boolean;
   onChange: (changes: Partial<Query>) => void;
   onToggle: (property: string) => void;
   open: boolean;
@@ -73,6 +74,7 @@ export default class TypeFacet extends React.PureComponent<Props> {
         active={active}
         disabled={stat === 0 && !active}
         key={type}
+        loading={this.props.loading}
         name={
           <span>
             <IssueTypeIcon query={type} /> {translate('issue.type', type)}
index a0afcc2cf9a942bf858bdd716d96b880de51aeb4..1d183049d3d8b2e1ffe4b10624166b022d6cebde 100644 (file)
@@ -16,6 +16,7 @@ exports[`should render 1`] = `
       active={false}
       disabled={false}
       halfWidth={false}
+      loading={false}
       name="unassigned"
       onClick={[Function]}
       stat="5"
@@ -26,6 +27,7 @@ exports[`should render 1`] = `
       disabled={false}
       halfWidth={false}
       key="foo"
+      loading={false}
       name={
         <span>
           <Connect(Avatar)
@@ -46,6 +48,7 @@ exports[`should render 1`] = `
       disabled={false}
       halfWidth={false}
       key="bar"
+      loading={false}
       name="bar"
       onClick={[Function]}
       stat="7"
@@ -106,6 +109,7 @@ exports[`should select unassigned 1`] = `
       active={true}
       disabled={false}
       halfWidth={false}
+      loading={false}
       name="unassigned"
       onClick={[Function]}
       stat="5"
@@ -116,6 +120,7 @@ exports[`should select unassigned 1`] = `
       disabled={false}
       halfWidth={false}
       key="foo"
+      loading={false}
       name={
         <span>
           <Connect(Avatar)
@@ -136,6 +141,7 @@ exports[`should select unassigned 1`] = `
       disabled={false}
       halfWidth={false}
       key="bar"
+      loading={false}
       name="bar"
       onClick={[Function]}
       stat="7"
@@ -170,6 +176,7 @@ exports[`should select user 1`] = `
       active={false}
       disabled={false}
       halfWidth={false}
+      loading={false}
       name="unassigned"
       onClick={[Function]}
       stat="5"
@@ -180,6 +187,7 @@ exports[`should select user 1`] = `
       disabled={false}
       halfWidth={false}
       key="foo"
+      loading={false}
       name={
         <span>
           <Connect(Avatar)
@@ -200,6 +208,7 @@ exports[`should select user 1`] = `
       disabled={false}
       halfWidth={false}
       key="bar"
+      loading={false}
       name="bar"
       onClick={[Function]}
       stat="7"
index a960cb8af0ee20b3ee7172e4c1c6274f3a7bca2f..17f9a3c4b166fe3b718b084fe6762c2b51336832 100644 (file)
@@ -25,6 +25,7 @@ export interface Props {
   className?: string;
   disabled?: boolean;
   halfWidth?: boolean;
+  loading?: boolean;
   name: React.ReactNode;
   onClick: (x: string) => void;
   stat?: React.ReactNode;
@@ -34,7 +35,8 @@ export interface Props {
 export default class FacetItem extends React.PureComponent<Props> {
   static defaultProps = {
     disabled: false,
-    halfWidth: false
+    halfWidth: false,
+    loading: false
   };
 
   handleClick = (event: React.SyntheticEvent<HTMLAnchorElement>) => {
@@ -52,12 +54,16 @@ export default class FacetItem extends React.PureComponent<Props> {
     return this.props.disabled ? (
       <span className={className} data-facet={this.props.value}>
         <span className="facet-name">{this.props.name}</span>
-        {this.props.stat != null && <span className="facet-stat">{this.props.stat}</span>}
+        {this.props.stat != null && (
+          <span className="facet-stat">{this.props.loading ? '' : this.props.stat}</span>
+        )}
       </span>
     ) : (
       <a className={className} data-facet={this.props.value} href="#" onClick={this.handleClick}>
         <span className="facet-name">{this.props.name}</span>
-        {this.props.stat != null && <span className="facet-stat">{this.props.stat}</span>}
+        {this.props.stat != null && (
+          <span className="facet-stat">{this.props.loading ? '' : this.props.stat}</span>
+        )}
       </a>
     );
   }
index e16c5020383aa600f995e99960512ef6bc48529c..95c822c8eb39c4367a399a92df4324ada21a8f73 100644 (file)
@@ -34,6 +34,10 @@ it('should render stat', () => {
   expect(renderFacetItem({ stat: '13' })).toMatchSnapshot();
 });
 
+it('should loading stat', () => {
+  expect(renderFacetItem({ loading: true })).toMatchSnapshot();
+});
+
 it('should render disabled', () => {
   expect(renderFacetItem({ disabled: true })).toMatchSnapshot();
 });
index c0cf80746aa5a7fa3ec67e742a14e847369a9892..3044d7ddbbdbf99c06802df572017f72e6f60a95 100644 (file)
@@ -1,5 +1,20 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`should loading stat 1`] = `
+<a
+  className="facet search-navigator-facet"
+  data-facet="bar"
+  href="#"
+  onClick={[Function]}
+>
+  <span
+    className="facet-name"
+  >
+    foo
+  </span>
+</a>
+`;
+
 exports[`should render active 1`] = `
 <a
   className="facet search-navigator-facet active"