From d2360972019ab5cb5f96ea5b140d559536f450d2 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Mon, 8 May 2017 16:24:35 -0600 Subject: [PATCH] Better expanding and aggregation control --- src/defaultProps.js | 8 ++++---- src/index.js | 34 +++++++++++++++++++------------- stories/OneHundredKRows.js | 4 ++-- stories/Pivoting.js | 4 ++-- stories/PivotingOptions.js | 14 ++++++++----- stories/PivotingSubComponents.js | 8 ++++---- 6 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/defaultProps.js b/src/defaultProps.js index 2f3583d..b13f879 100644 --- a/src/defaultProps.js +++ b/src/defaultProps.js @@ -168,12 +168,12 @@ export default { PivotValueComponent: ({subRows, value}) => ( {value} {subRows && `(${subRows.length})`} ), - PivotPreviewComponent: ({subRows, column}) => { - const previewValues = subRows.slice(0, 3).map((row, i) => ( - {row[column.id]}, + AggregateComponent: ({subRows, column}) => { + const previewValues = subRows.map((row, i) => ( + {row[column.id]}{i < subRows.length - 1 ? ', ' : ''} )) return ( - {previewValues}... + {previewValues} ) }, PivotComponent: undefined, // this is a computed default generated using diff --git a/src/index.js b/src/index.js index 4db0069..0486f6c 100644 --- a/src/index.js +++ b/src/index.js @@ -108,7 +108,7 @@ export default class ReactTable extends Methods(Lifecycle(Component)) { ResizerComponent, ExpanderComponent, PivotValueComponent, - PivotPreviewComponent, + AggregateComponent, // Data model resolvedData, allVisibleColumns, @@ -511,8 +511,17 @@ export default class ReactTable extends Methods(Lifecycle(Component)) { let isPreview let expandable + // Resolve Aggregate Renderer + const ResolvedAggregateComponent = column.aggregateRender || + !column.aggregate && AggregateComponent + // Is this column pivoted? if (pivotBy && column.pivot) { + // Make it expandable + expandable = true + interactionProps = { + onClick: onExpanderClick + } // Is this column a branch? isBranch = rowInfo.rowValues[pivotIDKey] === column.id && cellInfo.subRows @@ -520,10 +529,9 @@ export default class ReactTable extends Methods(Lifecycle(Component)) { isPreview = pivotBy.indexOf(column.id) >= pivotBy.indexOf(rowInfo.rowValues[pivotIDKey]) && cellInfo.subRows - // Resolve renderers + // Resolve Pivot Renderers const ResolvedExpanderComponent = column.expanderRender || ExpanderComponent const ResolvedPivotValueComponent = column.pivotValueRender || PivotValueComponent - const ResolvedPivotPreviewComponent = column.pivotPreviewRender || PivotPreviewComponent // Build the default PivotComponent const DefaultResolvedPivotComponent = props => (
@@ -541,24 +549,22 @@ export default class ReactTable extends Methods(Lifecycle(Component)) { value: row[pivotValKey], isExpanded }, cellInfo.rowValues[column.id]) - interactionProps = { - onClick: onExpanderClick - } - expandable = true } else if (isPreview) { // Show the pivot preview - resolvedCell = _.normalizeComponent(ResolvedPivotPreviewComponent, { + resolvedCell = _.normalizeComponent(ResolvedAggregateComponent, { ...cellInfo, value: cellInfo.rowValues[column.id], isExpanded }, cellInfo.rowValues[column.id]) - interactionProps = { - onClick: onExpanderClick - } - expandable = true } else { resolvedCell = null } + } else if (cellInfo.aggregated) { + resolvedCell = _.normalizeComponent(ResolvedAggregateComponent, { + ...cellInfo, + value: cellInfo.rowValues[column.id], + isExpanded + }, cellInfo.rowValues[column.id]) } // Expander onClick event @@ -572,8 +578,8 @@ export default class ReactTable extends Methods(Lifecycle(Component)) { } } } - - // Return regular cell + + // Return the cell return ( { header: 'Age', accessor: 'age', aggregate: vals => _.round(_.mean(vals)), - render: row => { - return {row.aggregated ? `${row.value} (avg)` : row.value} + aggregateRender: row => { + return {row.value} (avg) } }, { header: 'Visits', diff --git a/stories/Pivoting.js b/stories/Pivoting.js index ec44759..f565d67 100644 --- a/stories/Pivoting.js +++ b/stories/Pivoting.js @@ -31,8 +31,8 @@ export default () => { header: 'Age', accessor: 'age', aggregate: vals => _.round(_.mean(vals)), - render: row => { - return {row.aggregated ? `${row.value} (avg)` : row.value} + aggregateRender: row => { + return {row.value} (avg) } }, { header: 'Visits', diff --git a/stories/PivotingOptions.js b/stories/PivotingOptions.js index b3f42ec..0940d5a 100644 --- a/stories/PivotingOptions.js +++ b/stories/PivotingOptions.js @@ -32,17 +32,21 @@ export default () => { columns: [{ header: 'Age', accessor: 'age', - // aggregate: vals => { - // return _.round(_.mean(vals)) - // }, - render: row => { + aggregate: vals => { + return _.round(_.mean(vals)) + }, + aggregateRender: row => { console.log(row.value) - return {row.aggregated ? `${row.value} (avg)` : row.value} + return {row.value} (avg) } }, { header: 'Visits', accessor: 'visits', aggregate: vals => _.sum(vals), + // aggregateRender: row => { + // console.log(row.value) + // return {row.value} + // }, hideFilter: true }] }, { diff --git a/stories/PivotingSubComponents.js b/stories/PivotingSubComponents.js index 236efc2..acd4032 100644 --- a/stories/PivotingSubComponents.js +++ b/stories/PivotingSubComponents.js @@ -31,10 +31,10 @@ export default () => { header: 'Age', accessor: 'age', aggregate: vals => _.round(_.mean(vals)), - render: row => { - return {row.aggregated ? `${row.value} (avg)` : row.value} + aggregateRender: row => { + return {row.value} (avg) }, - filterMethod: (filter, row) => (filter.value == `${row[filter.id]} (avg)`) + filterMethod: (filter, row) => (filter.value === `${row[filter.id]} (avg)`) }, { header: 'Visits', accessor: 'visits', @@ -108,7 +108,7 @@ const columns = [{ render: row => { return {row.aggregated ? \`\${row.value} (avg)\` : row.value} }, - filterMethod: (filter, row) => (filter.value == \`\${row[filter.id]} (avg)\`) + filterMethod: (filter, row) => (filter.value == \`\${row[filter.id]} (avg)\`) }, { header: 'Visits', accessor: 'visits',