ractive-ez-table
Version:
Ractive Ez UI Table
81 lines (59 loc) • 2.02 kB
JavaScript
import utils from './utils.js';
const sortBy = (array, column) => {
const compare = column.compare || utils.compare;
const prop = utils.prop(column.path);
const sorter = column.sortDirection
? (a, b) => compare(prop(a), prop(b))
: (a, b) => compare(prop(b), prop(a));
return array.slice().sort(sorter);
};
// not very "elegant"...
const rootGroupBy = (array, groups, sortColumn) => {
const root = {
subGroups: groupBy(array, groups, sortColumn),
items: array
};
if (sortColumn && !root.groups && root.items) {
root.items = sortBy(root.items, sortColumn);
}
return root;
};
const groupBy = (array, groups, sortColumn) => {
if (array == null || array.length == 0) return null;
if (groups == null || groups.length == 0) return null;
const group = groups[0];
const remainingGroups = groups.slice(1);
const prop = utils.prop(group.path);
const sortedArray = sortBy(array, group);
const groupings = [];
const addGrouping = (grouping) => {
if (remainingGroups.length) {
grouping.subGroups = groupBy(grouping.items, remainingGroups, sortColumn);
} else if (sortColumn != null) {
grouping.items = sortBy(grouping.items, sortColumn);
}
groupings.push(grouping);
}
let currentGrouping = {
column: group,
value: prop(sortedArray[0]),
items: [sortedArray[0]],
subGroups: null
};
for (let i = 1; i < sortedArray.length; i++) {
const record = sortedArray[i];
if (prop(record) != currentGrouping.value) {
addGrouping(currentGrouping);
currentGrouping = {
column: group,
value: prop(record),
items: [],
subGroups: null
}
}
currentGrouping.items.push(record);
}
addGrouping(currentGrouping);
return groupings;
};
export default rootGroupBy;