Skip to content
Snippets Groups Projects
Commit 9b9a1c07 authored by piotr.kupczyk@id.ethz.ch's avatar piotr.kupczyk@id.ethz.ch
Browse files

SSDM-13282 : Admin UI - improve error handling

parent b4acd43c
No related branches found
No related tags found
1 merge request!40SSDM-13578 : 2PT : Database and V3 Implementation - include the new AFS "free"...
......@@ -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() {
......
......@@ -387,5 +387,6 @@ export default class BrowserController {
if (onError) {
onError(error)
}
throw error
}
}
......@@ -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
}
}
......@@ -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,
......
......@@ -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 }) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment