hswidget
Version:
Helpful Scripts UI widgets
161 lines • 17.3 kB
JavaScript
import m from "mithril";
import { Widget } from './Widget';
import { Log } from 'hsutil';
const log = new Log('Pivot');
import { Collapsible } from './Collapsible';
import { formatLocale } from 'd3';
const locale = formatLocale({
decimal: ".",
thousands: " ",
grouping: [3],
currency: ['', 'TEUR']
});
const format = locale.format(',.0~f');
const pivots = {};
const sum = (acc, value) => (acc === undefined ? 0 : acc) + value;
const min = (acc, value) => Math.min(acc === undefined ? 1e99 : acc, value);
const max = (acc, value) => Math.max(acc === undefined ? -1e99 : acc, value);
const count = (acc, value) => {
acc = acc || {};
acc[value] = (acc[value] || 0) + 1;
return acc;
};
const unique = (acc, value) => {
acc = acc || {};
acc[value] = 1;
return acc;
};
const getValueAccessFn = (tableValueCol) => {
try {
let fn;
let col;
switch (tableValueCol.charAt(0)) {
case '<':
col = tableValueCol.slice(1);
fn = min;
break;
case '>':
col = tableValueCol.slice(1);
fn = max;
break;
case '@':
col = tableValueCol.slice(1);
fn = unique;
break;
case '#':
col = tableValueCol.slice(1);
fn = count;
break;
default:
col = tableValueCol;
fn = sum;
break;
}
return { fn: fn, name: col };
}
catch (e) {
log.error(e);
}
};
const getColAccessFn = (c, header) => {
const [valColName, valueAccess] = Object.entries(c)[0];
const valCol = header.indexOf(valColName);
if (valCol < 0)
log.warn(`could not find valueCol '${valColName}' in [${header.join(', ')}]`);
const cs = { gen: undefined, tableValueCol: valCol };
if (typeof valueAccess === 'function') {
cs.gen = valueAccess;
}
else {
const aggFn = getValueAccessFn(valueAccess);
const pivotCol = header.indexOf(aggFn.name);
cs.gen = (aggregators, value, col, rowData) => {
try {
const pivotValue = pivotCol < 0 ? aggFn.name : rowData[pivotCol];
aggregators[pivotValue] = aggFn.fn(aggregators[pivotValue], value, col, rowData);
return aggregators;
}
catch (e) {
log.error(e);
}
};
}
return cs;
};
function getValues(table, byRow, colsAccess) {
const result = { cols: {}, rows: {} };
table.forEach(rowData => {
const rowName = rowData[byRow];
result.rows[rowName] = result.rows[rowName] || { cols: {}, rows: {} };
colsAccess.map(colAccess => colAccess.gen(result.cols, rowData[colAccess.tableValueCol], colAccess.tableValueCol, rowData));
});
return result;
}
function createPivot(table, header, by, columns) {
const createColumns = (rowName, table, byRows, colsAccess) => {
const byRow = byRows.shift();
const values = getValues(table, byRow, colsAccess);
const filter = (by) => (row) => row[byRow] === by;
const rows = Object.keys(values.rows);
return {
name: rowName,
values: values,
tree: rows.length === 0 ? undefined : rows.sort().map((by) => (!by || by === 'undefined') ? undefined :
createColumns(by, table.filter(filter(by)), byRows.slice(), colsAccess))
};
};
const colsAccess = columns.map((c) => getColAccessFn(c, header));
const byRows = by.map((c) => header.indexOf(c));
return (table.length === 0 || header.length === 0) ? undefined : createColumns(' ', table, byRows.slice(), colsAccess);
}
function makeHeaders(pivot, pivotHeader) {
const oldHeaders = [];
const newHeaders = [];
if (pivotHeader) {
pivotHeader.map((key, ni) => {
if (typeof key === 'object') {
const oldKey = Object.keys(key)[0];
oldHeaders[ni] = oldKey;
newHeaders[ni] = key[oldKey];
}
else {
oldHeaders[ni] = newHeaders[ni] = key;
}
});
}
else {
Object.keys(pivot.values.cols).map((key, ni) => oldHeaders[ni] = newHeaders[ni] = key);
}
return [oldHeaders, newHeaders];
}
const makeRow = (pivot, level, colSequence) => {
const values = pivot.values;
const parts = !values ? [] : colSequence.map(c => {
let val = values.cols[c];
val = val === undefined ? '' :
typeof val !== 'object' ? val : Object.keys(val).reduce((acc, v) => typeof val[v] === 'string' ? `${acc || val[v]}` : (acc || 0) + val[v], undefined);
return m('span.hs_right', typeof val === 'number' ? format(val) : val);
});
parts.unshift(m('span.name', m.trust(pivot.name)));
return m(`.row`, parts);
};
const showByColumns = (pivot, level, colSequence, expanded = false) => m(Collapsible, { class: `pivot_row mon${level}`, isExpanded: expanded }, [
makeRow(pivot, level, colSequence),
...pivot.tree.sort((a, b) => a.name > b.name ? 1 : a.name < b.name ? -1 : 0).map(p => p ? showByColumns(p, level + 1, colSequence, false) : undefined)
]);
export class Pivot extends Widget {
oninit(node) {
node.state.id = Math.floor(Math.random() * 100000);
node.state.pivot = pivots[node.state.id] = pivots[node.state.id] || createPivot(node.attrs.table.data, node.attrs.table.header, node.attrs.by, node.attrs.columns);
const [oldHeaders, newHeaders] = makeHeaders(node.state.pivot, node.attrs.pivotHeader);
node.state.oldHeaders = oldHeaders;
node.state.newHeaders = newHeaders.map(h => m('span.hs_right', h));
}
view(node) {
return m('.hs_pivot', this.attrs(node.attrs, {}), [
m(`.row.mon_header`, [m('span.name', node.attrs.pivotName), ...node.state.newHeaders]),
showByColumns(node.state.pivot, 0, node.state.oldHeaders, true)
]);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGl2b3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvUGl2b3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0VBLE9BQU8sQ0FBQyxNQUF5QixTQUFTLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFnQixVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFtQixRQUFRLENBQUM7QUFBRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQVcsZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBVSxJQUFJLENBQUM7QUFzRXRDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztJQUN4QixPQUFPLEVBQUUsR0FBRztJQUNaLFNBQVMsRUFBRSxHQUFHO0lBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQztDQUN4QixDQUFDLENBQUM7QUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBeUJ0QyxNQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO0FBUS9DLE1BQU0sR0FBRyxHQUFjLENBQUMsR0FBVSxFQUFFLEtBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUcsU0FBUyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUd4RixNQUFNLEdBQUcsR0FBYyxDQUFDLEdBQVUsRUFBRSxLQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFHLFNBQVMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFHbEcsTUFBTSxHQUFH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