import type { GridPlugin } from '@revolist/revogrid';
import {
type PivotConfigDimension,
type PivotConfig,
PivotPlugin,
} from '@revolist/revogrid-enterprise';
import {
commonAggregators,
ratingStarRenderer,
progressLineWithValueRenderer,
progressLineRenderer,
changeRenderer,
thresholdRenderer,
mergeCellProperties,
RowOddPlugin,
AdvanceFilterPlugin,
SameValueMergePlugin,
RowSelectPlugin,
FilterHeaderPlugin,
ColumnCollapsePlugin,
} from '@revolist/revogrid-pro';
export const PIVOT_PLUGINS: GridPlugin[] = [FilterHeaderPlugin, RowSelectPlugin, SameValueMergePlugin, PivotPlugin, AdvanceFilterPlugin, RowOddPlugin] as any[];
export const PIVOT_SHOWCASE_PLUGINS: GridPlugin[] = [
FilterHeaderPlugin,
RowSelectPlugin,
SameValueMergePlugin,
PivotPlugin,
ColumnCollapsePlugin,
AdvanceFilterPlugin,
RowOddPlugin,
] as any[];
export const ECOMMERCE_PIVOT: PivotConfig = {
dimensions: [
{
prop: 'Age',
columnType: 'integer',
size: 100,
sortable: true,
merge: true,
filterPlaceholder: 'Age?',
},
{
prop: 'Time',
columnType: 'time',
size: 100,
sortable: true,
merge: true,
columnProperties: (column) => {
if (column.children && column.name === '00:00') {
return {
highlight: true,
};
}
}
},
{
prop: 'City',
sortable: true,
merge: true,
filter: ['string', 'selection'],
order: 'asc',
},
{
prop: 'Gender',
filter: ['string', 'selection'],
sortable: true,
merge: true,
},
{
prop: 'Membership Type',
filter: ['string', 'selection'],
sortable: true,
merge: true,
},
{
prop: 'Total Spend',
sortable: true,
columnType: 'currency',
filter: ['number'],
filterPlaceholder: 'Total Spend?',
thresholds: [
{ value: 900, className: 'high' },
{ value: 600, className: 'medium' },
],
cellProperties: mergeCellProperties(thresholdRenderer, ({ value }) => ({
class: {
highlight: value > 20000,
'align-right': true,
},
})),
aggregators: {
sum: commonAggregators.sum,
avg: commonAggregators.avg,
min: commonAggregators.min,
max: commonAggregators.max,
},
},
{
name: 'Spend Change %',
prop: 'Spend Change (%)',
sortable: true,
filter: ['number'],
columnType: 'percent',
cellTemplate: changeRenderer,
},
{
name: 'Avg Rating',
prop: 'Average Rating',
filter: ['number', 'slider'],
filterPlaceholder: 'Avg Rating?',
sortable: true,
maxStars: 5,
maxValue: 5,
thresholds: [
{ value: 4, className: 'high' },
{ value: 3, className: 'medium' },
{ value: 0, className: 'low' },
],
cellParser: (model, column) => {
const value = model[column.prop];
if (Number(value)) {
return value.toFixed(2);
}
return value;
},
cellTemplate(...args) {
const column: PivotConfigDimension = args[1].column;
if (column.dimension === 'values') {
switch (column.aggregator) {
case 'star':
return ratingStarRenderer(...args);
case 'prg':
return progressLineRenderer(...args);
case 'prgvalue':
return progressLineWithValueRenderer(...args);
}
}
return args[1].value;
},
aggregators: {
prg: commonAggregators.avg,
star: commonAggregators.avg,
prgvalue: commonAggregators.avg,
},
},
{
prop: 'Discount Applied',
sortable: true,
merge: true,
filter: ['selection'],
},
],
rows: ['City', 'Age'],
columns: ['Time'],
values: [
{
prop: 'Total Spend',
aggregator: 'sum',
},
{
prop: 'Average Rating',
aggregator: 'prg',
},
],
hasConfigurator: true,
flatHeaders: false,
};
export const ECOMMERCE_SHOWCASE_PIVOT: PivotConfig = {
...ECOMMERCE_PIVOT,
rows: ['City', 'Membership Type'],
columns: ['Time', 'Discount Applied'],
values: [
{
prop: 'Total Spend',
aggregator: 'sum',
},
{
prop: 'Total Spend',
aggregator: 'avg',
},
{
prop: 'Average Rating',
aggregator: 'prgvalue',
},
],
filters: ['Gender', 'Membership Type', 'Discount Applied'],
collapsed: true,
groupAggregations: true,
columnCollapse: {
enabled: true,
collapsed: false,
aggregator: {
'Total Spend': 'sum',
'Average Rating': 'prgvalue',
},
placeholder: 'Group Total',
},
totals: {
subtotals: true,
grandTotal: true,
subtotalLabel: 'Subtotal',
grandTotalLabel: 'Grand Total',
},
};