diff --git a/openbis_ng_ui/src/js/components/AppController.js b/openbis_ng_ui/src/js/components/AppController.js index 0c9546bf9356569e8bce50292672bf703b2c4c5b..26b06fbd9b4b44b325770904358c0c663f94628c 100644 --- a/openbis_ng_ui/src/js/components/AppController.js +++ b/openbis_ng_ui/src/js/components/AppController.js @@ -488,7 +488,11 @@ export class AppController { await this.context.setState({ settings: newSettings }) - await this._saveSettings(settingId, settingObject) + try { + await this._saveSettings(settingId, settingObject) + } catch (error) { + this.errorChange(error) + } } async _loadSettings() { diff --git a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js index 271cb71682cb9eeb3713702140f284becee4f50f..caadc2325841d3610fc28846e3c6692bded5bdf0 100644 --- a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js +++ b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js @@ -387,5 +387,6 @@ export default class BrowserController { if (onError) { onError(error) } + throw error } } diff --git a/openbis_ng_ui/src/js/components/common/grid/GridController.js b/openbis_ng_ui/src/js/components/common/grid/GridController.js index f1dd5d07edd500cd11de7666bd3f4bad895a4200..da869ebb8e6fc009cf2c1338a9610232ca973f7f 100644 --- a/openbis_ng_ui/src/js/components/common/grid/GridController.js +++ b/openbis_ng_ui/src/js/components/common/grid/GridController.js @@ -90,153 +90,158 @@ export default class GridController { } async load() { - const props = this.context.getProps() + try { + const props = this.context.getProps() - if ((props.rows && props.loadRows) || (!props.rows && !props.loadRows)) { - throw new Error( - 'Incorrect grid configuration. Please set "rows" or "loadRows" property.' - ) - } + if ((props.rows && props.loadRows) || (!props.rows && !props.loadRows)) { + throw new Error( + 'Incorrect grid configuration. Please set "rows" or "loadRows" property.' + ) + } - if ( - (props.columns && props.loadColumns) || - (!props.columns && !props.loadColumns) - ) { - throw new Error( - 'Incorrect grid configuration. Please set "columns" or "loadColumns" property.' - ) - } + if ( + (props.columns && props.loadColumns) || + (!props.columns && !props.loadColumns) + ) { + throw new Error( + 'Incorrect grid configuration. Please set "columns" or "loadColumns" property.' + ) + } - await this.context.setState(() => ({ - loading: true - })) + await this.context.setState(() => ({ + loading: true + })) - const state = this.context.getState() - const newState = { - ...state, - heights: {}, - loading: false, - loaded: true - } + const state = this.context.getState() + const newState = { + ...state, + heights: {}, + loading: false, + loaded: true + } - let settings = null + let settings = null - if (!state.loaded) { - settings = await this._loadSettings() - _.merge(newState, settings) - } + if (!state.loaded) { + settings = await this._loadSettings() + _.merge(newState, settings) + } - let result = {} + let result = {} - if (props.rows) { - result.rows = props.rows - result.totalCount = props.rows.length - result.local = true - } else if (props.loadRows) { - const columns = {} + if (props.rows) { + result.rows = props.rows + result.totalCount = props.rows.length + result.local = true + } else if (props.loadRows) { + const columns = {} - newState.allColumns.forEach(column => { - columns[column.name] = column - }) + newState.allColumns.forEach(column => { + columns[column.name] = column + }) - const loadedResult = await props.loadRows({ - columns: columns, - filterMode: newState.filterMode, - filters: newState.filters, - globalFilter: newState.globalFilter, - page: newState.page, - pageSize: newState.pageSize, - sortings: newState.sortings - }) - if (_.isArray(loadedResult)) { - result.rows = loadedResult - result.totalCount = loadedResult.length - result.local = true - } else { - result.rows = loadedResult.rows - result.totalCount = loadedResult.totalCount - result.local = false + const loadedResult = await props.loadRows({ + columns: columns, + filterMode: newState.filterMode, + filters: newState.filters, + globalFilter: newState.globalFilter, + page: newState.page, + pageSize: newState.pageSize, + sortings: newState.sortings + }) + + if (_.isArray(loadedResult)) { + result.rows = loadedResult + result.totalCount = loadedResult.length + result.local = true + } else { + result.rows = loadedResult.rows + result.totalCount = loadedResult.totalCount + result.local = false + } } - } - newState.local = result.local + newState.local = result.local - if (result.local) { - const { newAllColumns, newColumnsVisibility, newColumnsSorting } = - await this._loadColumns( - result.rows, - newState.columnsVisibility, - newState.columnsSorting - ) + if (result.local) { + const { newAllColumns, newColumnsVisibility, newColumnsSorting } = + await this._loadColumns( + result.rows, + newState.columnsVisibility, + newState.columnsSorting + ) - newState.allColumns = newAllColumns - newState.columnsVisibility = newColumnsVisibility - newState.columnsSorting = newColumnsSorting - - newState.allRows = result.rows - newState.filteredRows = this._filterRows( - newState.allRows, - newState.allColumns, - newState.columnsVisibility, - newState.filterMode, - newState.filters, - newState.globalFilter - ) - newState.sortedRows = this._sortRows( - newState.filteredRows, - newState.allColumns, - newState.sortings - ) - newState.totalCount = newState.filteredRows.length + newState.allColumns = newAllColumns + newState.columnsVisibility = newColumnsVisibility + newState.columnsSorting = newColumnsSorting - const pageCount = Math.max( - Math.ceil(newState.totalCount / newState.pageSize), - 1 - ) + newState.allRows = result.rows + newState.filteredRows = this._filterRows( + newState.allRows, + newState.allColumns, + newState.columnsVisibility, + newState.filterMode, + newState.filters, + newState.globalFilter + ) + newState.sortedRows = this._sortRows( + newState.filteredRows, + newState.allColumns, + newState.sortings + ) + newState.totalCount = newState.filteredRows.length - newState.page = Math.min(newState.page, pageCount - 1) - newState.rows = this._pageRows( - newState.sortedRows, - newState.page, - newState.pageSize - ) - } else { - newState.allRows = result.rows - newState.filteredRows = result.rows - newState.sortedRows = result.rows - newState.rows = result.rows - newState.totalCount = result.totalCount - - const pageCount = Math.max( - Math.ceil(result.totalCount / newState.pageSize), - 1 - ) - newState.page = Math.min(newState.page, pageCount - 1) + const pageCount = Math.max( + Math.ceil(newState.totalCount / newState.pageSize), + 1 + ) - const { newAllColumns, newColumnsVisibility, newColumnsSorting } = - await this._loadColumns( - newState.rows, - newState.columnsVisibility, - newState.columnsSorting + newState.page = Math.min(newState.page, pageCount - 1) + newState.rows = this._pageRows( + newState.sortedRows, + newState.page, + newState.pageSize + ) + } else { + newState.allRows = result.rows + newState.filteredRows = result.rows + newState.sortedRows = result.rows + newState.rows = result.rows + newState.totalCount = result.totalCount + + const pageCount = Math.max( + Math.ceil(result.totalCount / newState.pageSize), + 1 ) + newState.page = Math.min(newState.page, pageCount - 1) - newState.allColumns = newAllColumns - newState.columnsVisibility = newColumnsVisibility - newState.columnsSorting = newColumnsSorting - } + const { newAllColumns, newColumnsVisibility, newColumnsSorting } = + await this._loadColumns( + newState.rows, + newState.columnsVisibility, + newState.columnsSorting + ) - // do not update filters (this would override filter changes that a user could do while grid was loading) - delete newState.filters - delete newState.globalFilter + newState.allColumns = newAllColumns + newState.columnsVisibility = newColumnsVisibility + newState.columnsSorting = newColumnsSorting + } - await this.context.setState(newState) + // do not update filters (this would override filter changes that a user could do while grid was loading) + delete newState.filters + delete newState.globalFilter - if (!state.loaded) { - this.selectRow(props.selectedRowId) - this.multiselectRows(props.multiselectedRowIds) - } else { - this.selectRow(newState.selectedRow ? newState.selectedRow.id : null) - this.multiselectRows(Object.keys(newState.multiselectedRows)) + await this.context.setState(newState) + + if (!state.loaded) { + this.selectRow(props.selectedRowId) + this.multiselectRows(props.multiselectedRowIds) + } else { + this.selectRow(newState.selectedRow ? newState.selectedRow.id : null) + this.multiselectRows(Object.keys(newState.multiselectedRows)) + } + } catch (error) { + this._onError(error) } } @@ -1584,4 +1589,12 @@ export default class GridController { _split(str) { return str.split(' ').filter(token => !this._isEmpty(token)) } + + _onError(error) { + const { onError } = this.context.getProps() + if (onError) { + onError(error) + } + throw error + } } diff --git a/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx b/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx index 5788a990192821c7ef8a7e8838394c808fcc1006..ccadf20b2342f22d55d2d274888421739857ff45 100644 --- a/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx +++ b/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx @@ -28,6 +28,7 @@ export default class GridWithOpenbis extends React.PureComponent { {...this.props} loadSettings={this.loadSettings} onSettingsChange={this.onSettingsChange} + onError={this.onError} exportXLS={this.exportXLS} /> ) @@ -57,6 +58,10 @@ export default class GridWithOpenbis extends React.PureComponent { await AppController.getInstance().setSetting(settingsId, settings) } + async onError(error) { + await AppController.getInstance().errorChange(error) + } + async exportXLS({ exportedFilePrefix, exportedIds, diff --git a/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx b/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx index 938bf7d31c9433d6c6b313688908ec8eba6341aa..05955d098395a31fcb79767f364a92ad4b4ae73e 100644 --- a/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx +++ b/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx @@ -10,7 +10,6 @@ import DateRangeField from '@src/js/components/common/form/DateRangeField.jsx' import FormUtil from '@src/js/components/common/form/FormUtil.js' import EntityType from '@src/js/components/common/dto/EntityType.js' import HistoryGridContentCell from '@src/js/components/tools/common/HistoryGridContentCell.jsx' -import AppController from '@src/js/components/AppController.js' import openbis from '@src/js/services/openbis.js' import messages from '@src/js/common/messages.js' import date from '@src/js/common/date.js' @@ -24,11 +23,7 @@ class HistoryGrid extends React.PureComponent { } async load(params) { - try { - return await this.loadHistory(this.props.eventType, params) - } catch (error) { - AppController.getInstance().errorChange(error) - } + return await this.loadHistory(this.props.eventType, params) } async loadHistory(eventType, { filters, page, pageSize, sortings }) {