diff options
author | Stas Vilchik <vilchiks@gmail.com> | 2015-12-29 14:03:22 +0100 |
---|---|---|
committer | Stas Vilchik <vilchiks@gmail.com> | 2015-12-29 14:05:27 +0100 |
commit | 458d8b33149bed4e3b1c0e579555734ee1d27b02 (patch) | |
tree | 37d985dc4b9f5bdc23312e911418ba472900920b /server/sonar-web/src/main/js/apps/code | |
parent | 87e9d4629cadbd59bb57bbd9c092931b7dd124c0 (diff) | |
download | sonarqube-458d8b33149bed4e3b1c0e579555734ee1d27b02.tar.gz sonarqube-458d8b33149bed4e3b1c0e579555734ee1d27b02.zip |
SONAR-4004 handle failed requests
Diffstat (limited to 'server/sonar-web/src/main/js/apps/code')
3 files changed, 68 insertions, 6 deletions
diff --git a/server/sonar-web/src/main/js/apps/code/actions/index.js b/server/sonar-web/src/main/js/apps/code/actions/index.js index a68df6429b7..53437e244c8 100644 --- a/server/sonar-web/src/main/js/apps/code/actions/index.js +++ b/server/sonar-web/src/main/js/apps/code/actions/index.js @@ -26,6 +26,7 @@ export const SEARCH = 'SEARCH'; export const UPDATE_QUERY = 'UPDATE_QUERY'; export const START_FETCHING = 'START_FETCHING'; export const STOP_FETCHING = 'STOP_FETCHING'; +export const RAISE_ERROR = 'RAISE_ERROR'; export function initComponentAction (component, breadcrumbs = []) { @@ -67,6 +68,13 @@ export function stopFetching () { return { type: STOP_FETCHING }; } +export function raiseError (message) { + return { + type: RAISE_ERROR, + message + }; +} + function getPath (componentKey) { return '/' + encodeURIComponent(componentKey); @@ -107,6 +115,22 @@ let requestTree = (query, baseComponent, dispatch) => { }; requestTree = _.debounce(requestTree, 250); +async function getErrorMessage (response) { + switch (response.status) { + case 401: + return window.t('not_authorized'); + default: + try { + let json = await response.json(); + return json['err_msg'] || + (json.errors && _.pluck(json.errors, 'msg').join('. ')) || + window.t('default_error_message'); + } catch (e) { + return window.t('default_error_message'); + } + } +} + export function initComponent (componentKey, breadcrumbs) { return dispatch => { dispatch(startFetching()); @@ -125,7 +149,11 @@ export function browse (componentKey) { dispatch(browseAction(component, children, breadcrumbs)); }) .then(() => dispatch(pushPath(getPath(componentKey)))) - .then(() => dispatch(stopFetching())); + .then(() => dispatch(stopFetching())) + .catch(e => { + getErrorMessage(e.response) + .then(message => dispatch(raiseError(message))); + }); }; } diff --git a/server/sonar-web/src/main/js/apps/code/components/Code.js b/server/sonar-web/src/main/js/apps/code/components/Code.js index 2e54f46c955..53365d97d46 100644 --- a/server/sonar-web/src/main/js/apps/code/components/Code.js +++ b/server/sonar-web/src/main/js/apps/code/components/Code.js @@ -33,7 +33,15 @@ class Code extends Component { } render () { - const { fetching, baseComponent, components, breadcrumbs, sourceViewer, coverageMetric, searchResults } = this.props; + const { + fetching, + baseComponent, + components, + breadcrumbs, + sourceViewer, + coverageMetric, + searchResults, + errorMessage } = this.props; const shouldShowBreadcrumbs = Array.isArray(breadcrumbs) && breadcrumbs.length > 1; const shouldShowSearchResults = !!searchResults; const shouldShowSourceViewer = !!sourceViewer; @@ -55,6 +63,12 @@ class Code extends Component { <Search component={this.props.component}/> </header> + {errorMessage && ( + <div className="alert alert-danger"> + {errorMessage} + </div> + )} + {shouldShowBreadcrumbs && ( <Breadcrumbs breadcrumbs={breadcrumbs} diff --git a/server/sonar-web/src/main/js/apps/code/reducers/index.js b/server/sonar-web/src/main/js/apps/code/reducers/index.js index c177efd55fc..7ecd8fe27e9 100644 --- a/server/sonar-web/src/main/js/apps/code/reducers/index.js +++ b/server/sonar-web/src/main/js/apps/code/reducers/index.js @@ -1,6 +1,6 @@ import _ from 'underscore'; -import { INIT, BROWSE, SEARCH, UPDATE_QUERY, START_FETCHING, STOP_FETCHING } from '../actions'; +import { INIT, BROWSE, SEARCH, UPDATE_QUERY, START_FETCHING, STOP_FETCHING, RAISE_ERROR } from '../actions'; function hasSourceCode (component) { @@ -37,7 +37,8 @@ export const initialState = { searchResults: null, searchQuery: '', coverageMetric: null, - baseBreadcrumbs: [] + baseBreadcrumbs: [], + errorMessage: null }; @@ -55,15 +56,34 @@ export function current (state = initialState, action) { const breadcrumbs = action.breadcrumbs.slice(baseBreadcrumbsLength); const sourceViewer = hasSourceCode(action.component) ? action.component : null; - return { ...state, baseComponent, components, breadcrumbs, sourceViewer, searchResults: null, searchQuery: '' }; + return { + ...state, + baseComponent, + components, + breadcrumbs, + sourceViewer, + searchResults: null, + searchQuery: '', + errorMessage: null + }; case SEARCH: - return { ...state, searchResults: action.components }; + return { + ...state, + searchResults: action.components, + errorMessage: null + }; case UPDATE_QUERY: return { ...state, searchQuery: action.query }; case START_FETCHING: return { ...state, fetching: true }; case STOP_FETCHING: return { ...state, fetching: false }; + case RAISE_ERROR: + return { + ...state, + errorMessage: action.message, + fetching: false + }; default: return state; } |