From: Grégoire Aubert Date: Mon, 13 Aug 2018 13:18:33 +0000 (+0200) Subject: SONAR-11149 Fix issues facet filtering race condition X-Git-Tag: 7.5~595 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=38dc0fa7eaa8112b9ca6fec9d3f0c809f83b2b19;p=sonarqube.git SONAR-11149 Fix issues facet filtering race condition --- diff --git a/server/sonar-web/src/main/js/apps/issues/components/App.tsx b/server/sonar-web/src/main/js/apps/issues/components/App.tsx index 20ccf52504f..446956be3eb 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/App.tsx @@ -115,6 +115,7 @@ export interface State { lastChecked?: string; loading: boolean; loadingFacets: { [key: string]: boolean }; + loadingMore: boolean; locationsNavigator: boolean; myIssues: boolean; openFacets: { [facet: string]: boolean }; @@ -148,6 +149,7 @@ export default class App extends React.PureComponent { issues: [], loading: true, loadingFacets: {}, + loadingMore: false, locationsNavigator: false, myIssues: props.myIssues || areMyIssuesSelected(props.location.query), openFacets: { severities: true, types: true }, @@ -455,12 +457,16 @@ export default class App extends React.PureComponent { }; fetchFirstIssues() { + const prevQuery = this.props.location.query; this.setState({ checked: [], loading: true }); return this.fetchIssues({}, true).then( ({ facets, issues, paging, ...other }) => { - if (this.mounted) { + if (this.mounted && areQueriesEqual(prevQuery, this.props.location.query)) { const openIssue = this.getOpenIssue(this.props, issues); - + let selected: string | undefined = undefined; + if (issues.length > 0) { + selected = openIssue ? openIssue.key : issues[0].key; + } this.setState(state => ({ facets: { ...state.facets, ...parseFacets(facets) }, loading: false, @@ -471,7 +477,7 @@ export default class App extends React.PureComponent { referencedLanguages: keyBy(other.languages, 'key'), referencedRules: keyBy(other.rules, 'key'), referencedUsers: keyBy(other.users, 'login'), - selected: issues.length > 0 ? (openIssue ? openIssue.key : issues[0].key) : undefined, + selected, selectedFlowIndex: undefined, selectedLocationIndex: undefined })); @@ -479,7 +485,7 @@ export default class App extends React.PureComponent { return issues; }, () => { - if (this.mounted) { + if (this.mounted && areQueriesEqual(prevQuery, this.props.location.query)) { this.setState({ loading: false }); } return []; @@ -518,12 +524,12 @@ export default class App extends React.PureComponent { const p = paging.pageIndex + 1; - this.setState({ loading: true }); + this.setState({ loadingMore: true }); this.fetchIssuesPage(p).then( response => { if (this.mounted) { this.setState(state => ({ - loading: false, + loadingMore: false, issues: [...state.issues, ...response.issues], paging: response.paging })); @@ -531,7 +537,7 @@ export default class App extends React.PureComponent { }, () => { if (this.mounted) { - this.setState({ loading: false }); + this.setState({ loadingMore: false }); } } ); @@ -918,7 +924,7 @@ export default class App extends React.PureComponent { } renderConciseIssuesList() { - const { issues, paging, query } = this.state; + const { issues, loadingMore, paging, query } = this.state; return (
@@ -944,6 +950,7 @@ export default class App extends React.PureComponent { )} @@ -967,7 +974,7 @@ export default class App extends React.PureComponent { renderList() { const { branchLike, component, currentUser, organization } = this.props; - const { issues, openIssue, paging, loading } = this.state; + const { issues, loading, loadingMore, openIssue, paging } = this.state; const selectedIndex = this.getSelectedIndex(); const selectedIssue = selectedIndex !== undefined ? issues[selectedIndex] : undefined; @@ -1006,7 +1013,12 @@ export default class App extends React.PureComponent { )} {paging.total > 0 && ( - + )} {noIssuesMessage} @@ -1041,23 +1053,21 @@ export default class App extends React.PureComponent { const { loading, openIssue } = this.state; return (
- - {openIssue ? ( - - ) : ( - this.renderList() - )} - + {openIssue ? ( + + ) : ( + {this.renderList()} + )}
); }