UNPKG

hswidget

Version:
168 lines 17.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Pivot = void 0; const mithril_1 = __importDefault(require("mithril")); const Widget_1 = require("./Widget"); const hsutil_1 = require("hsutil"); const log = new hsutil_1.Log('Pivot'); const Collapsible_1 = require("./Collapsible"); const d3_1 = require("d3"); const locale = d3_1.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('&nbsp;', 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 mithril_1.default('span.hs_right', typeof val === 'number' ? format(val) : val); }); parts.unshift(mithril_1.default('span.name', mithril_1.default.trust(pivot.name))); return mithril_1.default(`.row`, parts); }; const showByColumns = (pivot, level, colSequence, expanded = false) => mithril_1.default(Collapsible_1.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) ]); class Pivot extends Widget_1.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 => mithril_1.default('span.hs_right', h)); } view(node) { return mithril_1.default('.hs_pivot', this.attrs(node.attrs, {}), [ mithril_1.default(`.row.mon_header`, [mithril_1.default('span.name', node.attrs.pivotName), ...node.state.newHeaders]), showByColumns(node.state.pivot, 0, node.state.oldHeaders, true) ]); } } exports.Pivot = Pivot; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGl2b3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvUGl2b3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBK0VBLHNEQUEyQztBQUUzQyxxQ0FBNEM7QUFFNUMsbUNBQTBDO0FBQUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekUsK0NBQWlEO0FBQ2pELDJCQUFzQztBQXNFdEMsTUFBTSxNQUFNLEdBQUcsaUJBQVksQ0FBQztJQUN4QixPQUFPLEVBQUUsR0FBRztJQUNaLFNBQVMsRUFBRSxHQUFHO0lBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQztDQUN4QixDQUFDLENBQUM7QUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBeUJ0QyxNQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO0FBUS9DLE1BQU0sR0FBRyxHQUFjLENBQUMsR0FBVSxFQUFFLEtBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUcsU0FBUyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUd4RixNQUFNLEdBQUcsR0FBYyxDQUFDLEdBQVUsRUFBRSxLQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFHLFNBQVMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFHbEcsTUFBTSxHQUFHLEdBQWMsQ0FBQyxHQUFVLEVBQUUsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBRyxTQUFTLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUs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