feat(xo-web/sorted-table): "valuePath" property (#3607)

Fixes #3606
This commit is contained in:
badrAZ 2018-10-30 09:42:13 +01:00 committed by Pierre Donias
parent 75b7726fca
commit de397b63c5
2 changed files with 25 additions and 7 deletions

View File

@ -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 />
component: PropTypes.func,
// itemRenderer: (item, userData) => <span />
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) => (
<td className={textAlign && `text-xs-${textAlign}`} key={key}>
{Component !== undefined ? (
<Component item={item} userData={userData} />
) : 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'
}

View File

@ -157,8 +157,7 @@ class JobsTable extends React.Component {
name: _('jobId'),
},
{
itemRenderer: _ => _.name,
sortCriteria: 'name',
valuePath: 'name',
name: _('jobName'),
default: true,
},