From de397b63c5cc215a08bd81124f52c7b9f802023a Mon Sep 17 00:00:00 2001 From: badrAZ Date: Tue, 30 Oct 2018 09:42:13 +0100 Subject: [PATCH] feat(xo-web/sorted-table): "valuePath" property (#3607) Fixes #3606 --- .../xo-web/src/common/sorted-table/index.js | 29 +++++++++++++++---- packages/xo-web/src/xo-app/backup-ng/index.js | 3 +- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/xo-web/src/common/sorted-table/index.js b/packages/xo-web/src/common/sorted-table/index.js index ef9e57fae..99d2b0a0a 100644 --- a/packages/xo-web/src/common/sorted-table/index.js +++ b/packages/xo-web/src/common/sorted-table/index.js @@ -18,6 +18,7 @@ import { filter, findIndex, forEach, + get as getProperty, isEmpty, isFunction, map, @@ -288,13 +289,24 @@ export default class SortedTable extends Component { .isRequired, columns: PropTypes.arrayOf( PropTypes.shape({ - component: PropTypes.func, default: PropTypes.bool, name: PropTypes.node, - itemRenderer: PropTypes.func, sortCriteria: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), sortOrder: PropTypes.string, textAlign: PropTypes.string, + + // for the cell render, you can use component or itemRenderer or valuePath + // + // item and userData will be injected in the component as props + // component: + component: PropTypes.func, + + // itemRenderer: (item, userData) => + itemRenderer: PropTypes.func, + + // the path to the value, it's also the sort criteria default value + // valuePath: 'a.b.c' + valuePath: PropTypes.string, }) ).isRequired, filterContainer: PropTypes.func, @@ -426,9 +438,10 @@ export default class SortedTable extends Component { ) ), createSelector( + () => this._getSelectedColumn().valuePath, () => this._getSelectedColumn().sortCriteria, this._getUserData, - (sortCriteria, userData) => + (valuePath, sortCriteria = valuePath, userData) => typeof sortCriteria === 'function' ? object => sortCriteria(object, userData) : sortCriteria @@ -748,10 +761,12 @@ export default class SortedTable extends Component { const columns = map( props.columns, - ({ component: Component, itemRenderer, textAlign }, key) => ( + ({ component: Component, itemRenderer, valuePath, textAlign }, key) => ( {Component !== undefined ? ( + ) : valuePath !== undefined ? ( + getProperty(item, valuePath) ) : ( itemRenderer(item, userData) )} @@ -950,7 +965,11 @@ export default class SortedTable extends Component { columnId={key} key={key} name={column.name} - sort={column.sortCriteria && this._sort} + sort={ + (column.sortCriteria !== undefined || + column.valuePath !== undefined) && + this._sort + } sortIcon={ state.selectedColumn === key ? state.sortOrder : 'sort' } diff --git a/packages/xo-web/src/xo-app/backup-ng/index.js b/packages/xo-web/src/xo-app/backup-ng/index.js index 5b6f8cdac..cfc482cfe 100644 --- a/packages/xo-web/src/xo-app/backup-ng/index.js +++ b/packages/xo-web/src/xo-app/backup-ng/index.js @@ -157,8 +157,7 @@ class JobsTable extends React.Component { name: _('jobId'), }, { - itemRenderer: _ => _.name, - sortCriteria: 'name', + valuePath: 'name', name: _('jobName'), default: true, },