UNPKG

hswidget

Version:
161 lines 17.3 kB
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('&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 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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