Versie 0.2.0
This commit is contained in:
commit
e77d8fd373
495 files changed
+81026
No files matched your search
@@ -0,0 +1,57 @@
|
||||
// Generated, do not edit. sha256:50118a60294dbc8f28d9357f89a87533bb1550041305794ac6ceb8f28c573fcc
|
||||
import { compare } from './table-rows.js';
|
||||
|
||||
const SEP = '\u0000';
|
||||
|
||||
export function groupSections(rows, { columns, groupKey, groupKey2 = null, groupKey3 = null, sort = null, collapsed = null }) {
|
||||
const col = columns.find(c => c.key === groupKey);
|
||||
const col2 = groupKey2 ? columns.find(c => c.key === groupKey2) : null;
|
||||
const col3 = groupKey3 ? columns.find(c => c.key === groupKey3) : null;
|
||||
const orderOf = (c, key) => ((sort && sort.key === key) ? sort.dir : (c.group.order || 'asc'));
|
||||
const order = orderOf(col, groupKey);
|
||||
const order2 = col2 ? orderOf(col2, groupKey2) : 'asc';
|
||||
const order3 = col3 ? orderOf(col3, groupKey3) : 'asc';
|
||||
|
||||
const buckets = new Map();
|
||||
for (const r of rows) {
|
||||
const v1 = col.group.value(r);
|
||||
const v2 = col2 ? col2.group.value(r) : null;
|
||||
const v3 = col3 ? col3.group.value(r) : null;
|
||||
const key = [String(v1), col2 ? String(v2) : '', col3 ? String(v3) : ''].join(SEP);
|
||||
if (!buckets.has(key)) buckets.set(key, { v1, v2, v3, items: [] });
|
||||
buckets.get(key).items.push(r);
|
||||
}
|
||||
const entries = [...buckets.values()].sort((a, b) => {
|
||||
const c1 = compare(a.v1, b.v1, order);
|
||||
if (c1 !== 0 || !col2) return c1;
|
||||
const c2 = compare(a.v2, b.v2, order2);
|
||||
return (c2 !== 0 || !col3) ? c2 : compare(a.v3, b.v3, order3);
|
||||
});
|
||||
|
||||
let itemsByV1 = null;
|
||||
if (collapsed) {
|
||||
itemsByV1 = new Map();
|
||||
for (const e of entries) {
|
||||
const tk = String(e.v1);
|
||||
if (!itemsByV1.has(tk)) itemsByV1.set(tk, []);
|
||||
itemsByV1.get(tk).push(...e.items);
|
||||
}
|
||||
}
|
||||
const shownCollapsed = new Set();
|
||||
const out = [];
|
||||
for (const { v1, v2, v3, items } of entries) {
|
||||
const token = String(v1);
|
||||
const l1 = col.group.label ? col.group.label(v1) : v1;
|
||||
if (collapsed && collapsed.has(token)) {
|
||||
if (shownCollapsed.has(token)) continue;
|
||||
shownCollapsed.add(token);
|
||||
out.push({ token, value: v1, label: l1, items: itemsByV1.get(token) || items, collapsed: true });
|
||||
continue;
|
||||
}
|
||||
let label = l1;
|
||||
if (col2) label += ` - ${col2.group.label ? col2.group.label(v2) : v2}`;
|
||||
if (col3) label += ` - ${col3.group.label ? col3.group.label(v3) : v3}`;
|
||||
out.push({ token, value: v1, label, items, collapsed: false });
|
||||
}
|
||||
return out;
|
||||
}
|
||||
Reference in new issue
Block a user