@tanstack/table-core
Version:
Headless UI for building powerful tables & datagrids for TS/JS.
71 lines (70 loc) • 2.47 kB
JavaScript
//#region src/worker/serializeRowModel.ts
function isCloneSafe(value) {
return typeof value !== "function" && typeof value !== "symbol";
}
function serializeRows(rows, coreIndexById, coreFlatRows, aggregateColumnIds, stage) {
const nodes = new Array(rows.length);
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
if (row.groupingColumnId == null) {
const index = coreIndexById[row.id];
const coreRow = coreFlatRows[index];
nodes[i] = stage === "filtered" || row.subRows.length || coreRow.subRows.length ? {
index,
children: serializeRows(row.subRows, coreIndexById, coreFlatRows, aggregateColumnIds, stage),
...stage === "filtered" ? { filterData: serializeFilterData(row) } : {}
} : index;
continue;
}
const aggregates = {};
for (let c = 0; c < aggregateColumnIds.length; c++) {
const columnId = aggregateColumnIds[c];
const value = row.getValue(columnId);
if (value !== void 0 && isCloneSafe(value)) aggregates[columnId] = value;
}
if (!(row.groupingColumnId in aggregates)) {
const value = row.getValue(row.groupingColumnId);
if (value !== void 0 && isCloneSafe(value)) aggregates[row.groupingColumnId] = value;
}
nodes[i] = {
id: row.id,
groupingColumnId: row.groupingColumnId,
groupingValue: row.groupingValue,
index: row.index,
aggregates,
children: serializeRows(row.subRows, coreIndexById, coreFlatRows, aggregateColumnIds, stage)
};
}
return nodes;
}
function serializeRowModel(model, coreIndexById, coreFlatRows, aggregateColumnIds, transfer, stage) {
if (model.flatRows.length === model.rows.length && model.rows.every((row) => {
const coreRow = coreFlatRows[coreIndexById[row.id]];
return row.groupingColumnId == null && !coreRow.subRows.length;
})) {
const indices = new Uint32Array(model.rows.length);
const filterData = stage === "filtered" ? new Array(model.rows.length) : void 0;
for (let i = 0; i < indices.length; i++) {
indices[i] = coreIndexById[model.rows[i].id];
if (filterData) filterData[i] = serializeFilterData(model.rows[i]);
}
transfer.push(indices.buffer);
return {
kind: "flat",
indices,
filterData
};
}
return {
kind: "tree",
children: serializeRows(model.rows, coreIndexById, coreFlatRows, aggregateColumnIds, stage)
};
}
function serializeFilterData(row) {
return {
columnFilters: row.columnFilters,
columnFiltersMeta: row.columnFiltersMeta
};
}
//#endregion
export { serializeRowModel };