From 38dc0fa7eaa8112b9ca6fec9d3f0c809f83b2b19 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Mon, 13 Aug 2018 15:18:33 +0200 Subject: [PATCH] SONAR-11149 Fix issues facet filtering race condition --- .../main/js/apps/issues/components/App.tsx | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) 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()} + )}
); } -- 2.39.5