@tanstack/table-core 9.0.0-beta.34 → 9.0.0-beta.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/core/rows/coreRowsFeature.types.d.cts +2 -0
  2. package/dist/core/rows/coreRowsFeature.types.d.ts +2 -0
  3. package/dist/core/rows/coreRowsFeature.utils.cjs +11 -1
  4. package/dist/core/rows/coreRowsFeature.utils.cjs.map +1 -1
  5. package/dist/core/rows/coreRowsFeature.utils.js +11 -1
  6. package/dist/core/rows/coreRowsFeature.utils.js.map +1 -1
  7. package/dist/core/table/coreTablesFeature.types.d.cts +2 -2
  8. package/dist/core/table/coreTablesFeature.types.d.ts +2 -2
  9. package/dist/features/column-ordering/columnOrderingFeature.cjs +12 -11
  10. package/dist/features/column-ordering/columnOrderingFeature.cjs.map +1 -1
  11. package/dist/features/column-ordering/columnOrderingFeature.js +13 -12
  12. package/dist/features/column-ordering/columnOrderingFeature.js.map +1 -1
  13. package/dist/features/column-ordering/columnOrderingFeature.types.d.cts +26 -1
  14. package/dist/features/column-ordering/columnOrderingFeature.types.d.ts +26 -1
  15. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs +26 -1
  16. package/dist/features/column-ordering/columnOrderingFeature.utils.cjs.map +1 -1
  17. package/dist/features/column-ordering/columnOrderingFeature.utils.d.cts +14 -2
  18. package/dist/features/column-ordering/columnOrderingFeature.utils.d.ts +14 -2
  19. package/dist/features/column-ordering/columnOrderingFeature.utils.js +27 -3
  20. package/dist/features/column-ordering/columnOrderingFeature.utils.js.map +1 -1
  21. package/dist/features/column-pinning/columnPinningFeature.utils.cjs +10 -6
  22. package/dist/features/column-pinning/columnPinningFeature.utils.cjs.map +1 -1
  23. package/dist/features/column-pinning/columnPinningFeature.utils.js +10 -6
  24. package/dist/features/column-pinning/columnPinningFeature.utils.js.map +1 -1
  25. package/dist/features/column-resizing/columnResizingFeature.utils.cjs +11 -2
  26. package/dist/features/column-resizing/columnResizingFeature.utils.cjs.map +1 -1
  27. package/dist/features/column-resizing/columnResizingFeature.utils.js +11 -2
  28. package/dist/features/column-resizing/columnResizingFeature.utils.js.map +1 -1
  29. package/dist/index.d.cts +2 -2
  30. package/dist/index.d.ts +2 -2
  31. package/dist/static-functions.cjs +1 -0
  32. package/dist/static-functions.d.cts +2 -2
  33. package/dist/static-functions.d.ts +2 -2
  34. package/dist/static-functions.js +2 -2
  35. package/dist/types/RowModel.d.cts +2 -4
  36. package/dist/types/RowModel.d.ts +2 -4
  37. package/dist/utils.cjs +3 -2
  38. package/dist/utils.cjs.map +1 -1
  39. package/dist/utils.d.cts +2 -1
  40. package/dist/utils.d.ts +2 -1
  41. package/dist/utils.js +3 -2
  42. package/dist/utils.js.map +1 -1
  43. package/dist/worker/initTableWorker.cjs.map +1 -1
  44. package/dist/worker/initTableWorker.js.map +1 -1
  45. package/dist/worker/rebuildRowModel.cjs.map +1 -1
  46. package/dist/worker/rebuildRowModel.js.map +1 -1
  47. package/package.json +2 -1
  48. package/src/core/rows/coreRowsFeature.types.ts +5 -0
  49. package/src/core/rows/coreRowsFeature.utils.ts +13 -1
  50. package/src/core/table/coreTablesFeature.types.ts +2 -2
  51. package/src/features/column-ordering/columnOrderingFeature.ts +12 -8
  52. package/src/features/column-ordering/columnOrderingFeature.types.ts +26 -0
  53. package/src/features/column-ordering/columnOrderingFeature.utils.ts +56 -5
  54. package/src/features/column-pinning/columnPinningFeature.utils.ts +24 -10
  55. package/src/features/column-resizing/columnResizingFeature.utils.ts +22 -5
  56. package/src/types/RowModel.ts +6 -10
  57. package/src/utils.ts +3 -2
  58. package/src/worker/initTableWorker.ts +1 -1
  59. package/src/worker/rebuildRowModel.ts +8 -5
@@ -2,10 +2,12 @@ import { RowData } from "../../types/type-utils.cjs";
2
2
  import { Cell } from "../../types/Cell.cjs";
3
3
  import { Row } from "../../types/Row.cjs";
4
4
  import { Table } from "../../types/Table.cjs";
5
+ import { Column } from "../../types/Column.cjs";
5
6
  import { TableFeatures } from "../../types/TableFeatures.cjs";
6
7
 
7
8
  //#region src/core/rows/coreRowsFeature.types.d.ts
8
9
  interface Row_CoreProperties<in out TFeatures extends TableFeatures, in out TData extends RowData> {
10
+ _cellsCache?: WeakMap<Column<TFeatures, TData, unknown>, Cell<TFeatures, TData, unknown>>;
9
11
  _uniqueValuesCache: Record<string, unknown>;
10
12
  _valuesCache: Record<string, unknown>;
11
13
  /**
@@ -2,10 +2,12 @@ import { RowData } from "../../types/type-utils.js";
2
2
  import { Cell } from "../../types/Cell.js";
3
3
  import { Row } from "../../types/Row.js";
4
4
  import { Table } from "../../types/Table.js";
5
+ import { Column } from "../../types/Column.js";
5
6
  import { TableFeatures } from "../../types/TableFeatures.js";
6
7
 
7
8
  //#region src/core/rows/coreRowsFeature.types.d.ts
8
9
  interface Row_CoreProperties<in out TFeatures extends TableFeatures, in out TData extends RowData> {
10
+ _cellsCache?: WeakMap<Column<TFeatures, TData, unknown>, Cell<TFeatures, TData, unknown>>;
9
11
  _uniqueValuesCache: Record<string, unknown>;
10
12
  _valuesCache: Record<string, unknown>;
11
13
  /**
@@ -117,8 +117,18 @@ function row_getParentRows(row) {
117
117
  */
118
118
  function row_getAllCells(row) {
119
119
  const columns = row.table.getAllLeafColumns();
120
+ let cache = row._cellsCache;
121
+ if (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();
120
122
  const cells = new Array(columns.length);
121
- for (let i = 0; i < columns.length; i++) cells[i] = require_constructCell.constructCell(columns[i], row, row.table);
123
+ for (let i = 0; i < columns.length; i++) {
124
+ const column = columns[i];
125
+ let cell = cache.get(column);
126
+ if (!cell) {
127
+ cell = require_constructCell.constructCell(column, row, row.table);
128
+ cache.set(column, cell);
129
+ }
130
+ cells[i] = cell;
131
+ }
122
132
  return cells;
123
133
  }
124
134
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"coreRowsFeature.utils.cjs","names":["hasOwn","flattenBy","constructCell","makeObjectMap"],"sources":["../../../src/core/rows/coreRowsFeature.utils.ts"],"sourcesContent":["import { flattenBy, hasOwn, makeObjectMap } from '../../utils'\nimport { constructCell } from '../cells/constructCell'\nimport type { Table_Internal } from '../../types/Table'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Cell } from '../../types/Cell'\n\n/**\n * Reads and caches this row's value for a column.\n *\n * The value is produced by the column accessor. Missing columns or display\n * columns without an accessor return `undefined`.\n *\n * @example\n * ```ts\n * const firstName = row_getValue(row, 'firstName')\n * ```\n */\nexport function row_getValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._valuesCache, columnId)) {\n return row._valuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n row._valuesCache[columnId] = column.accessorFn(row.original, row.index)\n\n return row._valuesCache[columnId]\n}\n\n/**\n * Reads and caches the values used by faceting/grouping for a column.\n *\n * If the column defines `getUniqueValues`, that result is used. Otherwise the\n * row's accessor value is wrapped in a single-item array.\n *\n * @example\n * ```ts\n * const values = row_getUniqueValues(row, 'tags')\n * ```\n */\nexport function row_getUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._uniqueValuesCache, columnId)) {\n return row._uniqueValuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)]\n return row._uniqueValuesCache[columnId]\n }\n\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(\n row.original,\n row.index,\n )\n\n return row._uniqueValuesCache[columnId]\n}\n\n/**\n * Returns a renderable row value for a column.\n *\n * If the accessor value is nullish, the table's `renderFallbackValue` is used\n * instead.\n *\n * @example\n * ```ts\n * const value = row_renderValue(row, 'firstName')\n * ```\n */\nexport function row_renderValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n return row.getValue(columnId) ?? row.table.options.renderFallbackValue\n}\n\n/**\n * Flattens this row's descendant tree into leaf rows.\n *\n * The row itself is not included; only nested `subRows` are walked.\n *\n * @example\n * ```ts\n * const descendants = row_getLeafRows(row)\n * ```\n */\nexport function row_getLeafRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Row<TFeatures, TData>> {\n return flattenBy(row.subRows, (d) => d.subRows)\n}\n\n/**\n * Looks up this row's direct parent, if it has one.\n *\n * Parent lookup searches the pre-pagination row model so parent relationships\n * are available even when the parent is not on the current page.\n *\n * @example\n * ```ts\n * const parent = row_getParentRow(row)\n * ```\n */\nexport function row_getParentRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n return row.parentId ? row.table.getRow(row.parentId, true) : undefined\n}\n\n/**\n * Collects this row's ancestor chain from root to direct parent.\n *\n * The current row is not included. Rows without a parent return an empty array.\n *\n * @example\n * ```ts\n * const ancestors = row_getParentRows(row)\n * ```\n */\nexport function row_getParentRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const parentRows: Array<Row<TFeatures, TData>> = []\n let currentRow = row\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const parentRow = currentRow.getParentRow()\n if (!parentRow) break\n parentRows.push(parentRow)\n currentRow = parentRow\n }\n return parentRows.reverse()\n}\n\n/**\n * Constructs one cell for each leaf column in this row.\n *\n * The result follows `table.getAllLeafColumns()` order and includes hidden\n * columns; visibility-specific APIs filter this list later.\n *\n * @example\n * ```ts\n * const cells = row_getAllCells(row)\n * ```\n */\nexport function row_getAllCells<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Cell<TFeatures, TData, unknown>> {\n const columns = row.table.getAllLeafColumns()\n const cells: Array<Cell<TFeatures, TData, unknown>> = new Array(\n columns.length,\n )\n for (let i = 0; i < columns.length; i++) {\n cells[i] = constructCell(columns[i]!, row, row.table)\n }\n return cells\n}\n\n/**\n * Builds a lookup map of this row's cells keyed by column id.\n *\n * This is the static implementation behind `row.getAllCellsByColumnId()`.\n *\n * @example\n * ```ts\n * const cellsById = row_getAllCellsByColumnId(row)\n * ```\n */\nexport function row_getAllCellsByColumnId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const result = makeObjectMap<Cell<TFeatures, TData, unknown>>()\n const cells = row.getAllCells()\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i]!\n result[cell.column.id] = cell\n }\n return result\n}\n\n/**\n * Resolves the stable id for a row.\n *\n * `options.getRowId` wins when provided. Otherwise root rows use their index\n * and child rows append their index to the parent id, such as `0.2`.\n *\n * @example\n * ```ts\n * const id = table_getRowId(originalRow, table, index, parentRow)\n * ```\n */\nexport function table_getRowId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n originalRow: TData,\n table: Table_Internal<TFeatures, TData>,\n index: number,\n parent?: Row<TFeatures, TData>,\n) {\n return (\n table.options.getRowId?.(originalRow, index, parent) ??\n `${parent ? [parent.id, index].join('.') : index}`\n )\n}\n\n/**\n * Looks up a row by id from the current or full row model.\n *\n * By default this searches `table.getRowModel()`. Passing `searchAll` searches\n * the pre-pagination model first, then falls back to the core model.\n *\n * @example\n * ```ts\n * const row = table_getRow(table, rowId, true)\n * ```\n */\nexport function table_getRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n rowId: string,\n searchAll?: boolean,\n): Row<TFeatures, TData> {\n // TODO - simplify this across different row models\n let row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel())\n .rowsById[rowId]\n\n if (!row) {\n row = table.getCoreRowModel().rowsById[rowId]\n if (!row) {\n if (process.env.NODE_ENV === 'development') {\n throw new Error(`getRow could not find row with ID: ${rowId}`)\n }\n throw new Error()\n }\n }\n\n return row\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,aAGd,KAA4B,UAAkB;CAC9C,IAAIA,qBAAO,IAAI,cAAc,QAAQ,GACnC,OAAO,IAAI,aAAa;CAG1B,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,aAAa,YAAY,OAAO,WAAW,IAAI,UAAU,IAAI,KAAK;CAEtE,OAAO,IAAI,aAAa;AAC1B;;;;;;;;;;;;AAaA,SAAgB,oBAGd,KAA4B,UAAkB;CAC9C,IAAIA,qBAAO,IAAI,oBAAoB,QAAQ,GACzC,OAAO,IAAI,mBAAmB;CAGhC,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,CAAC,OAAO,UAAU,iBAAiB;EACrC,IAAI,mBAAmB,YAAY,CAAC,IAAI,SAAS,QAAQ,CAAC;EAC1D,OAAO,IAAI,mBAAmB;CAChC;CAEA,IAAI,mBAAmB,YAAY,OAAO,UAAU,gBAClD,IAAI,UACJ,IAAI,KACN;CAEA,OAAO,IAAI,mBAAmB;AAChC;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAA4B,UAAkB;CAC9C,OAAO,IAAI,SAAS,QAAQ,KAAK,IAAI,MAAM,QAAQ;AACrD;;;;;;;;;;;AAYA,SAAgB,gBAGd,KAA0D;CAC1D,OAAOC,wBAAU,IAAI,UAAU,MAAM,EAAE,OAAO;AAChD;;;;;;;;;;;;AAaA,SAAgB,iBAGd,KAA4B;CAC5B,OAAO,IAAI,WAAW,IAAI,MAAM,OAAO,IAAI,UAAU,IAAI,IAAI;AAC/D;;;;;;;;;;;AAYA,SAAgB,kBAGd,KAA4B;CAC5B,MAAM,aAA2C,CAAC;CAClD,IAAI,aAAa;CAEjB,OAAO,MAAM;EACX,MAAM,YAAY,WAAW,aAAa;EAC1C,IAAI,CAAC,WAAW;EAChB,WAAW,KAAK,SAAS;EACzB,aAAa;CACf;CACA,OAAO,WAAW,QAAQ;AAC5B;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAAoE;CACpE,MAAM,UAAU,IAAI,MAAM,kBAAkB;CAC5C,MAAM,QAAgD,IAAI,MACxD,QAAQ,MACV;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,MAAM,KAAKC,oCAAc,QAAQ,IAAK,KAAK,IAAI,KAAK;CAEtD,OAAO;AACT;;;;;;;;;;;AAYA,SAAgB,0BAGd,KAA4B;CAC5B,MAAM,SAASC,4BAA+C;CAC9D,MAAM,QAAQ,IAAI,YAAY;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,OAAO,MAAM;EACnB,OAAO,KAAK,OAAO,MAAM;CAC3B;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,eAId,aACA,OACA,OACA,QACA;CACA,OACE,MAAM,QAAQ,WAAW,aAAa,OAAO,MAAM,KACnD,GAAG,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI;AAE/C;;;;;;;;;;;;AAaA,SAAgB,aAId,OACA,OACA,WACuB;CAEvB,IAAI,OAAO,YAAY,MAAM,wBAAwB,IAAI,MAAM,YAAY,EAAC,CACzE,SAAS;CAEZ,IAAI,CAAC,KAAK;EACR,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS;EACvC,IAAI,CAAC,KAAK;GACR,IAAI,QAAQ,IAAI,aAAa,eAC3B,MAAM,IAAI,MAAM,sCAAsC,OAAO;GAE/D,MAAM,IAAI,MAAM;EAClB;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"coreRowsFeature.utils.cjs","names":["hasOwn","flattenBy","constructCell","makeObjectMap"],"sources":["../../../src/core/rows/coreRowsFeature.utils.ts"],"sourcesContent":["import { flattenBy, hasOwn, makeObjectMap } from '../../utils'\nimport { constructCell } from '../cells/constructCell'\nimport type { Table_Internal } from '../../types/Table'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Cell } from '../../types/Cell'\n\n/**\n * Reads and caches this row's value for a column.\n *\n * The value is produced by the column accessor. Missing columns or display\n * columns without an accessor return `undefined`.\n *\n * @example\n * ```ts\n * const firstName = row_getValue(row, 'firstName')\n * ```\n */\nexport function row_getValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._valuesCache, columnId)) {\n return row._valuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n row._valuesCache[columnId] = column.accessorFn(row.original, row.index)\n\n return row._valuesCache[columnId]\n}\n\n/**\n * Reads and caches the values used by faceting/grouping for a column.\n *\n * If the column defines `getUniqueValues`, that result is used. Otherwise the\n * row's accessor value is wrapped in a single-item array.\n *\n * @example\n * ```ts\n * const values = row_getUniqueValues(row, 'tags')\n * ```\n */\nexport function row_getUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._uniqueValuesCache, columnId)) {\n return row._uniqueValuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)]\n return row._uniqueValuesCache[columnId]\n }\n\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(\n row.original,\n row.index,\n )\n\n return row._uniqueValuesCache[columnId]\n}\n\n/**\n * Returns a renderable row value for a column.\n *\n * If the accessor value is nullish, the table's `renderFallbackValue` is used\n * instead.\n *\n * @example\n * ```ts\n * const value = row_renderValue(row, 'firstName')\n * ```\n */\nexport function row_renderValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n return row.getValue(columnId) ?? row.table.options.renderFallbackValue\n}\n\n/**\n * Flattens this row's descendant tree into leaf rows.\n *\n * The row itself is not included; only nested `subRows` are walked.\n *\n * @example\n * ```ts\n * const descendants = row_getLeafRows(row)\n * ```\n */\nexport function row_getLeafRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Row<TFeatures, TData>> {\n return flattenBy(row.subRows, (d) => d.subRows)\n}\n\n/**\n * Looks up this row's direct parent, if it has one.\n *\n * Parent lookup searches the pre-pagination row model so parent relationships\n * are available even when the parent is not on the current page.\n *\n * @example\n * ```ts\n * const parent = row_getParentRow(row)\n * ```\n */\nexport function row_getParentRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n return row.parentId ? row.table.getRow(row.parentId, true) : undefined\n}\n\n/**\n * Collects this row's ancestor chain from root to direct parent.\n *\n * The current row is not included. Rows without a parent return an empty array.\n *\n * @example\n * ```ts\n * const ancestors = row_getParentRows(row)\n * ```\n */\nexport function row_getParentRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const parentRows: Array<Row<TFeatures, TData>> = []\n let currentRow = row\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const parentRow = currentRow.getParentRow()\n if (!parentRow) break\n parentRows.push(parentRow)\n currentRow = parentRow\n }\n return parentRows.reverse()\n}\n\n/**\n * Constructs one cell for each leaf column in this row.\n *\n * The result follows `table.getAllLeafColumns()` order and includes hidden\n * columns; visibility-specific APIs filter this list later.\n *\n * @example\n * ```ts\n * const cells = row_getAllCells(row)\n * ```\n */\nexport function row_getAllCells<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Cell<TFeatures, TData, unknown>> {\n const columns = row.table.getAllLeafColumns()\n // WeakMap so cells keyed by replaced column instances can be collected;\n // rows are memoized on data only and outlive column generations\n let cache = row._cellsCache\n if (!cache) {\n cache = row._cellsCache = new WeakMap()\n }\n const cells: Array<Cell<TFeatures, TData, unknown>> = new Array(\n columns.length,\n )\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n let cell = cache.get(column)\n if (!cell) {\n cell = constructCell(column, row, row.table)\n cache.set(column, cell)\n }\n cells[i] = cell\n }\n return cells\n}\n\n/**\n * Builds a lookup map of this row's cells keyed by column id.\n *\n * This is the static implementation behind `row.getAllCellsByColumnId()`.\n *\n * @example\n * ```ts\n * const cellsById = row_getAllCellsByColumnId(row)\n * ```\n */\nexport function row_getAllCellsByColumnId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const result = makeObjectMap<Cell<TFeatures, TData, unknown>>()\n const cells = row.getAllCells()\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i]!\n result[cell.column.id] = cell\n }\n return result\n}\n\n/**\n * Resolves the stable id for a row.\n *\n * `options.getRowId` wins when provided. Otherwise root rows use their index\n * and child rows append their index to the parent id, such as `0.2`.\n *\n * @example\n * ```ts\n * const id = table_getRowId(originalRow, table, index, parentRow)\n * ```\n */\nexport function table_getRowId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n originalRow: TData,\n table: Table_Internal<TFeatures, TData>,\n index: number,\n parent?: Row<TFeatures, TData>,\n) {\n return (\n table.options.getRowId?.(originalRow, index, parent) ??\n `${parent ? [parent.id, index].join('.') : index}`\n )\n}\n\n/**\n * Looks up a row by id from the current or full row model.\n *\n * By default this searches `table.getRowModel()`. Passing `searchAll` searches\n * the pre-pagination model first, then falls back to the core model.\n *\n * @example\n * ```ts\n * const row = table_getRow(table, rowId, true)\n * ```\n */\nexport function table_getRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n rowId: string,\n searchAll?: boolean,\n): Row<TFeatures, TData> {\n // TODO - simplify this across different row models\n let row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel())\n .rowsById[rowId]\n\n if (!row) {\n row = table.getCoreRowModel().rowsById[rowId]\n if (!row) {\n if (process.env.NODE_ENV === 'development') {\n throw new Error(`getRow could not find row with ID: ${rowId}`)\n }\n throw new Error()\n }\n }\n\n return row\n}\n"],"mappings":"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"}
@@ -117,8 +117,18 @@ function row_getParentRows(row) {
117
117
  */
118
118
  function row_getAllCells(row) {
119
119
  const columns = row.table.getAllLeafColumns();
120
+ let cache = row._cellsCache;
121
+ if (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();
120
122
  const cells = new Array(columns.length);
121
- for (let i = 0; i < columns.length; i++) cells[i] = constructCell(columns[i], row, row.table);
123
+ for (let i = 0; i < columns.length; i++) {
124
+ const column = columns[i];
125
+ let cell = cache.get(column);
126
+ if (!cell) {
127
+ cell = constructCell(column, row, row.table);
128
+ cache.set(column, cell);
129
+ }
130
+ cells[i] = cell;
131
+ }
122
132
  return cells;
123
133
  }
124
134
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"coreRowsFeature.utils.js","names":[],"sources":["../../../src/core/rows/coreRowsFeature.utils.ts"],"sourcesContent":["import { flattenBy, hasOwn, makeObjectMap } from '../../utils'\nimport { constructCell } from '../cells/constructCell'\nimport type { Table_Internal } from '../../types/Table'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Cell } from '../../types/Cell'\n\n/**\n * Reads and caches this row's value for a column.\n *\n * The value is produced by the column accessor. Missing columns or display\n * columns without an accessor return `undefined`.\n *\n * @example\n * ```ts\n * const firstName = row_getValue(row, 'firstName')\n * ```\n */\nexport function row_getValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._valuesCache, columnId)) {\n return row._valuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n row._valuesCache[columnId] = column.accessorFn(row.original, row.index)\n\n return row._valuesCache[columnId]\n}\n\n/**\n * Reads and caches the values used by faceting/grouping for a column.\n *\n * If the column defines `getUniqueValues`, that result is used. Otherwise the\n * row's accessor value is wrapped in a single-item array.\n *\n * @example\n * ```ts\n * const values = row_getUniqueValues(row, 'tags')\n * ```\n */\nexport function row_getUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._uniqueValuesCache, columnId)) {\n return row._uniqueValuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)]\n return row._uniqueValuesCache[columnId]\n }\n\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(\n row.original,\n row.index,\n )\n\n return row._uniqueValuesCache[columnId]\n}\n\n/**\n * Returns a renderable row value for a column.\n *\n * If the accessor value is nullish, the table's `renderFallbackValue` is used\n * instead.\n *\n * @example\n * ```ts\n * const value = row_renderValue(row, 'firstName')\n * ```\n */\nexport function row_renderValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n return row.getValue(columnId) ?? row.table.options.renderFallbackValue\n}\n\n/**\n * Flattens this row's descendant tree into leaf rows.\n *\n * The row itself is not included; only nested `subRows` are walked.\n *\n * @example\n * ```ts\n * const descendants = row_getLeafRows(row)\n * ```\n */\nexport function row_getLeafRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Row<TFeatures, TData>> {\n return flattenBy(row.subRows, (d) => d.subRows)\n}\n\n/**\n * Looks up this row's direct parent, if it has one.\n *\n * Parent lookup searches the pre-pagination row model so parent relationships\n * are available even when the parent is not on the current page.\n *\n * @example\n * ```ts\n * const parent = row_getParentRow(row)\n * ```\n */\nexport function row_getParentRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n return row.parentId ? row.table.getRow(row.parentId, true) : undefined\n}\n\n/**\n * Collects this row's ancestor chain from root to direct parent.\n *\n * The current row is not included. Rows without a parent return an empty array.\n *\n * @example\n * ```ts\n * const ancestors = row_getParentRows(row)\n * ```\n */\nexport function row_getParentRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const parentRows: Array<Row<TFeatures, TData>> = []\n let currentRow = row\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const parentRow = currentRow.getParentRow()\n if (!parentRow) break\n parentRows.push(parentRow)\n currentRow = parentRow\n }\n return parentRows.reverse()\n}\n\n/**\n * Constructs one cell for each leaf column in this row.\n *\n * The result follows `table.getAllLeafColumns()` order and includes hidden\n * columns; visibility-specific APIs filter this list later.\n *\n * @example\n * ```ts\n * const cells = row_getAllCells(row)\n * ```\n */\nexport function row_getAllCells<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Cell<TFeatures, TData, unknown>> {\n const columns = row.table.getAllLeafColumns()\n const cells: Array<Cell<TFeatures, TData, unknown>> = new Array(\n columns.length,\n )\n for (let i = 0; i < columns.length; i++) {\n cells[i] = constructCell(columns[i]!, row, row.table)\n }\n return cells\n}\n\n/**\n * Builds a lookup map of this row's cells keyed by column id.\n *\n * This is the static implementation behind `row.getAllCellsByColumnId()`.\n *\n * @example\n * ```ts\n * const cellsById = row_getAllCellsByColumnId(row)\n * ```\n */\nexport function row_getAllCellsByColumnId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const result = makeObjectMap<Cell<TFeatures, TData, unknown>>()\n const cells = row.getAllCells()\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i]!\n result[cell.column.id] = cell\n }\n return result\n}\n\n/**\n * Resolves the stable id for a row.\n *\n * `options.getRowId` wins when provided. Otherwise root rows use their index\n * and child rows append their index to the parent id, such as `0.2`.\n *\n * @example\n * ```ts\n * const id = table_getRowId(originalRow, table, index, parentRow)\n * ```\n */\nexport function table_getRowId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n originalRow: TData,\n table: Table_Internal<TFeatures, TData>,\n index: number,\n parent?: Row<TFeatures, TData>,\n) {\n return (\n table.options.getRowId?.(originalRow, index, parent) ??\n `${parent ? [parent.id, index].join('.') : index}`\n )\n}\n\n/**\n * Looks up a row by id from the current or full row model.\n *\n * By default this searches `table.getRowModel()`. Passing `searchAll` searches\n * the pre-pagination model first, then falls back to the core model.\n *\n * @example\n * ```ts\n * const row = table_getRow(table, rowId, true)\n * ```\n */\nexport function table_getRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n rowId: string,\n searchAll?: boolean,\n): Row<TFeatures, TData> {\n // TODO - simplify this across different row models\n let row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel())\n .rowsById[rowId]\n\n if (!row) {\n row = table.getCoreRowModel().rowsById[rowId]\n if (!row) {\n if (process.env.NODE_ENV === 'development') {\n throw new Error(`getRow could not find row with ID: ${rowId}`)\n }\n throw new Error()\n }\n }\n\n return row\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,aAGd,KAA4B,UAAkB;CAC9C,IAAI,OAAO,IAAI,cAAc,QAAQ,GACnC,OAAO,IAAI,aAAa;CAG1B,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,aAAa,YAAY,OAAO,WAAW,IAAI,UAAU,IAAI,KAAK;CAEtE,OAAO,IAAI,aAAa;AAC1B;;;;;;;;;;;;AAaA,SAAgB,oBAGd,KAA4B,UAAkB;CAC9C,IAAI,OAAO,IAAI,oBAAoB,QAAQ,GACzC,OAAO,IAAI,mBAAmB;CAGhC,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,CAAC,OAAO,UAAU,iBAAiB;EACrC,IAAI,mBAAmB,YAAY,CAAC,IAAI,SAAS,QAAQ,CAAC;EAC1D,OAAO,IAAI,mBAAmB;CAChC;CAEA,IAAI,mBAAmB,YAAY,OAAO,UAAU,gBAClD,IAAI,UACJ,IAAI,KACN;CAEA,OAAO,IAAI,mBAAmB;AAChC;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAA4B,UAAkB;CAC9C,OAAO,IAAI,SAAS,QAAQ,KAAK,IAAI,MAAM,QAAQ;AACrD;;;;;;;;;;;AAYA,SAAgB,gBAGd,KAA0D;CAC1D,OAAO,UAAU,IAAI,UAAU,MAAM,EAAE,OAAO;AAChD;;;;;;;;;;;;AAaA,SAAgB,iBAGd,KAA4B;CAC5B,OAAO,IAAI,WAAW,IAAI,MAAM,OAAO,IAAI,UAAU,IAAI,IAAI;AAC/D;;;;;;;;;;;AAYA,SAAgB,kBAGd,KAA4B;CAC5B,MAAM,aAA2C,CAAC;CAClD,IAAI,aAAa;CAEjB,OAAO,MAAM;EACX,MAAM,YAAY,WAAW,aAAa;EAC1C,IAAI,CAAC,WAAW;EAChB,WAAW,KAAK,SAAS;EACzB,aAAa;CACf;CACA,OAAO,WAAW,QAAQ;AAC5B;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAAoE;CACpE,MAAM,UAAU,IAAI,MAAM,kBAAkB;CAC5C,MAAM,QAAgD,IAAI,MACxD,QAAQ,MACV;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,MAAM,KAAK,cAAc,QAAQ,IAAK,KAAK,IAAI,KAAK;CAEtD,OAAO;AACT;;;;;;;;;;;AAYA,SAAgB,0BAGd,KAA4B;CAC5B,MAAM,SAAS,cAA+C;CAC9D,MAAM,QAAQ,IAAI,YAAY;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,OAAO,MAAM;EACnB,OAAO,KAAK,OAAO,MAAM;CAC3B;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,eAId,aACA,OACA,OACA,QACA;CACA,OACE,MAAM,QAAQ,WAAW,aAAa,OAAO,MAAM,KACnD,GAAG,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI;AAE/C;;;;;;;;;;;;AAaA,SAAgB,aAId,OACA,OACA,WACuB;CAEvB,IAAI,OAAO,YAAY,MAAM,wBAAwB,IAAI,MAAM,YAAY,EAAC,CACzE,SAAS;CAEZ,IAAI,CAAC,KAAK;EACR,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS;EACvC,IAAI,CAAC,KAAK;GACR,IAAI,QAAQ,IAAI,aAAa,eAC3B,MAAM,IAAI,MAAM,sCAAsC,OAAO;GAE/D,MAAM,IAAI,MAAM;EAClB;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"coreRowsFeature.utils.js","names":[],"sources":["../../../src/core/rows/coreRowsFeature.utils.ts"],"sourcesContent":["import { flattenBy, hasOwn, makeObjectMap } from '../../utils'\nimport { constructCell } from '../cells/constructCell'\nimport type { Table_Internal } from '../../types/Table'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Cell } from '../../types/Cell'\n\n/**\n * Reads and caches this row's value for a column.\n *\n * The value is produced by the column accessor. Missing columns or display\n * columns without an accessor return `undefined`.\n *\n * @example\n * ```ts\n * const firstName = row_getValue(row, 'firstName')\n * ```\n */\nexport function row_getValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._valuesCache, columnId)) {\n return row._valuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n row._valuesCache[columnId] = column.accessorFn(row.original, row.index)\n\n return row._valuesCache[columnId]\n}\n\n/**\n * Reads and caches the values used by faceting/grouping for a column.\n *\n * If the column defines `getUniqueValues`, that result is used. Otherwise the\n * row's accessor value is wrapped in a single-item array.\n *\n * @example\n * ```ts\n * const values = row_getUniqueValues(row, 'tags')\n * ```\n */\nexport function row_getUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n if (hasOwn(row._uniqueValuesCache, columnId)) {\n return row._uniqueValuesCache[columnId]\n }\n\n const column = row.table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)]\n return row._uniqueValuesCache[columnId]\n }\n\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(\n row.original,\n row.index,\n )\n\n return row._uniqueValuesCache[columnId]\n}\n\n/**\n * Returns a renderable row value for a column.\n *\n * If the accessor value is nullish, the table's `renderFallbackValue` is used\n * instead.\n *\n * @example\n * ```ts\n * const value = row_renderValue(row, 'firstName')\n * ```\n */\nexport function row_renderValue<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string) {\n return row.getValue(columnId) ?? row.table.options.renderFallbackValue\n}\n\n/**\n * Flattens this row's descendant tree into leaf rows.\n *\n * The row itself is not included; only nested `subRows` are walked.\n *\n * @example\n * ```ts\n * const descendants = row_getLeafRows(row)\n * ```\n */\nexport function row_getLeafRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Row<TFeatures, TData>> {\n return flattenBy(row.subRows, (d) => d.subRows)\n}\n\n/**\n * Looks up this row's direct parent, if it has one.\n *\n * Parent lookup searches the pre-pagination row model so parent relationships\n * are available even when the parent is not on the current page.\n *\n * @example\n * ```ts\n * const parent = row_getParentRow(row)\n * ```\n */\nexport function row_getParentRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n return row.parentId ? row.table.getRow(row.parentId, true) : undefined\n}\n\n/**\n * Collects this row's ancestor chain from root to direct parent.\n *\n * The current row is not included. Rows without a parent return an empty array.\n *\n * @example\n * ```ts\n * const ancestors = row_getParentRows(row)\n * ```\n */\nexport function row_getParentRows<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const parentRows: Array<Row<TFeatures, TData>> = []\n let currentRow = row\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const parentRow = currentRow.getParentRow()\n if (!parentRow) break\n parentRows.push(parentRow)\n currentRow = parentRow\n }\n return parentRows.reverse()\n}\n\n/**\n * Constructs one cell for each leaf column in this row.\n *\n * The result follows `table.getAllLeafColumns()` order and includes hidden\n * columns; visibility-specific APIs filter this list later.\n *\n * @example\n * ```ts\n * const cells = row_getAllCells(row)\n * ```\n */\nexport function row_getAllCells<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>): Array<Cell<TFeatures, TData, unknown>> {\n const columns = row.table.getAllLeafColumns()\n // WeakMap so cells keyed by replaced column instances can be collected;\n // rows are memoized on data only and outlive column generations\n let cache = row._cellsCache\n if (!cache) {\n cache = row._cellsCache = new WeakMap()\n }\n const cells: Array<Cell<TFeatures, TData, unknown>> = new Array(\n columns.length,\n )\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n let cell = cache.get(column)\n if (!cell) {\n cell = constructCell(column, row, row.table)\n cache.set(column, cell)\n }\n cells[i] = cell\n }\n return cells\n}\n\n/**\n * Builds a lookup map of this row's cells keyed by column id.\n *\n * This is the static implementation behind `row.getAllCellsByColumnId()`.\n *\n * @example\n * ```ts\n * const cellsById = row_getAllCellsByColumnId(row)\n * ```\n */\nexport function row_getAllCellsByColumnId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>) {\n const result = makeObjectMap<Cell<TFeatures, TData, unknown>>()\n const cells = row.getAllCells()\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i]!\n result[cell.column.id] = cell\n }\n return result\n}\n\n/**\n * Resolves the stable id for a row.\n *\n * `options.getRowId` wins when provided. Otherwise root rows use their index\n * and child rows append their index to the parent id, such as `0.2`.\n *\n * @example\n * ```ts\n * const id = table_getRowId(originalRow, table, index, parentRow)\n * ```\n */\nexport function table_getRowId<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n originalRow: TData,\n table: Table_Internal<TFeatures, TData>,\n index: number,\n parent?: Row<TFeatures, TData>,\n) {\n return (\n table.options.getRowId?.(originalRow, index, parent) ??\n `${parent ? [parent.id, index].join('.') : index}`\n )\n}\n\n/**\n * Looks up a row by id from the current or full row model.\n *\n * By default this searches `table.getRowModel()`. Passing `searchAll` searches\n * the pre-pagination model first, then falls back to the core model.\n *\n * @example\n * ```ts\n * const row = table_getRow(table, rowId, true)\n * ```\n */\nexport function table_getRow<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n rowId: string,\n searchAll?: boolean,\n): Row<TFeatures, TData> {\n // TODO - simplify this across different row models\n let row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel())\n .rowsById[rowId]\n\n if (!row) {\n row = table.getCoreRowModel().rowsById[rowId]\n if (!row) {\n if (process.env.NODE_ENV === 'development') {\n throw new Error(`getRow could not find row with ID: ${rowId}`)\n }\n throw new Error()\n }\n }\n\n return row\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,aAGd,KAA4B,UAAkB;CAC9C,IAAI,OAAO,IAAI,cAAc,QAAQ,GACnC,OAAO,IAAI,aAAa;CAG1B,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,aAAa,YAAY,OAAO,WAAW,IAAI,UAAU,IAAI,KAAK;CAEtE,OAAO,IAAI,aAAa;AAC1B;;;;;;;;;;;;AAaA,SAAgB,oBAGd,KAA4B,UAAkB;CAC9C,IAAI,OAAO,IAAI,oBAAoB,QAAQ,GACzC,OAAO,IAAI,mBAAmB;CAGhC,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ;CAE3C,IAAI,CAAC,QAAQ,YACX;CAGF,IAAI,CAAC,OAAO,UAAU,iBAAiB;EACrC,IAAI,mBAAmB,YAAY,CAAC,IAAI,SAAS,QAAQ,CAAC;EAC1D,OAAO,IAAI,mBAAmB;CAChC;CAEA,IAAI,mBAAmB,YAAY,OAAO,UAAU,gBAClD,IAAI,UACJ,IAAI,KACN;CAEA,OAAO,IAAI,mBAAmB;AAChC;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAA4B,UAAkB;CAC9C,OAAO,IAAI,SAAS,QAAQ,KAAK,IAAI,MAAM,QAAQ;AACrD;;;;;;;;;;;AAYA,SAAgB,gBAGd,KAA0D;CAC1D,OAAO,UAAU,IAAI,UAAU,MAAM,EAAE,OAAO;AAChD;;;;;;;;;;;;AAaA,SAAgB,iBAGd,KAA4B;CAC5B,OAAO,IAAI,WAAW,IAAI,MAAM,OAAO,IAAI,UAAU,IAAI,IAAI;AAC/D;;;;;;;;;;;AAYA,SAAgB,kBAGd,KAA4B;CAC5B,MAAM,aAA2C,CAAC;CAClD,IAAI,aAAa;CAEjB,OAAO,MAAM;EACX,MAAM,YAAY,WAAW,aAAa;EAC1C,IAAI,CAAC,WAAW;EAChB,WAAW,KAAK,SAAS;EACzB,aAAa;CACf;CACA,OAAO,WAAW,QAAQ;AAC5B;;;;;;;;;;;;AAaA,SAAgB,gBAGd,KAAoE;CACpE,MAAM,UAAU,IAAI,MAAM,kBAAkB;CAG5C,IAAI,QAAQ,IAAI;CAChB,IAAI,CAAC,OACH,QAAQ,IAAI,8BAAc,IAAI,QAAQ;CAExC,MAAM,QAAgD,IAAI,MACxD,QAAQ,MACV;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,MAAM,IAAI,MAAM;EAC3B,IAAI,CAAC,MAAM;GACT,OAAO,cAAc,QAAQ,KAAK,IAAI,KAAK;GAC3C,MAAM,IAAI,QAAQ,IAAI;EACxB;EACA,MAAM,KAAK;CACb;CACA,OAAO;AACT;;;;;;;;;;;AAYA,SAAgB,0BAGd,KAA4B;CAC5B,MAAM,SAAS,cAA+C;CAC9D,MAAM,QAAQ,IAAI,YAAY;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,OAAO,MAAM;EACnB,OAAO,KAAK,OAAO,MAAM;CAC3B;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,eAId,aACA,OACA,OACA,QACA;CACA,OACE,MAAM,QAAQ,WAAW,aAAa,OAAO,MAAM,KACnD,GAAG,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI;AAE/C;;;;;;;;;;;;AAaA,SAAgB,aAId,OACA,OACA,WACuB;CAEvB,IAAI,OAAO,YAAY,MAAM,wBAAwB,IAAI,MAAM,YAAY,EAAC,CACzE,SAAS;CAEZ,IAAI,CAAC,KAAK;EACR,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS;EACvC,IAAI,CAAC,KAAK;GACR,IAAI,QAAQ,IAAI,aAAa,eAC3B,MAAM,IAAI,MAAM,sCAAsC,OAAO;GAE/D,MAAM,IAAI,MAAM;EAClB;CACF;CAEA,OAAO;AACT"}
@@ -50,9 +50,9 @@ type ExternalAtoms<TFeatures extends TableFeatures> = Partial<{ [K in keyof Tabl
50
50
  * but those slices may not be registered on the current table. Consumers must
51
51
  * use optional chaining (`table.atoms.columnPinning?.get() ?? default`).
52
52
  */
53
- type BaseAtoms_All = { [K in keyof TableState_All]?: Atom<TableState_All[K]> };
53
+ type BaseAtoms_All = { [K in keyof TableState_All]?: Atom<Exclude<TableState_All[K], undefined>> };
54
54
  type Atoms_All = { [K in keyof TableState_All]?: ReadonlyAtom<TableState_All[K]> };
55
- type ExternalAtoms_All = Partial<{ [K in keyof TableState_All]: Atom<TableState_All[K]> }>;
55
+ type ExternalAtoms_All = Partial<{ [K in keyof TableState_All]: Atom<Exclude<TableState_All[K], undefined>> }>;
56
56
  interface TableOptions_Table<in out TFeatures extends TableFeatures, in out TData extends RowData> {
57
57
  /**
58
58
  * The feature modules registered on this table instance.
@@ -50,9 +50,9 @@ type ExternalAtoms<TFeatures extends TableFeatures> = Partial<{ [K in keyof Tabl
50
50
  * but those slices may not be registered on the current table. Consumers must
51
51
  * use optional chaining (`table.atoms.columnPinning?.get() ?? default`).
52
52
  */
53
- type BaseAtoms_All = { [K in keyof TableState_All]?: Atom<TableState_All[K]> };
53
+ type BaseAtoms_All = { [K in keyof TableState_All]?: Atom<Exclude<TableState_All[K], undefined>> };
54
54
  type Atoms_All = { [K in keyof TableState_All]?: ReadonlyAtom<TableState_All[K]> };
55
- type ExternalAtoms_All = Partial<{ [K in keyof TableState_All]: Atom<TableState_All[K]> }>;
55
+ type ExternalAtoms_All = Partial<{ [K in keyof TableState_All]: Atom<Exclude<TableState_All[K], undefined>> }>;
56
56
  interface TableOptions_Table<in out TFeatures extends TableFeatures, in out TData extends RowData> {
57
57
  /**
58
58
  * The feature modules registered on this table instance.
@@ -17,23 +17,24 @@ const columnOrderingFeature = {
17
17
  },
18
18
  assignColumnPrototype: (prototype, table) => {
19
19
  require_utils.assignPrototypeAPIs("columnOrderingFeature", prototype, table, {
20
- column_getIndex: {
21
- fn: (column, position) => require_columnOrderingFeature_utils.column_getIndex(column, position),
22
- memoDeps: (column, position) => [
23
- position,
24
- column.table.atoms.columnOrder?.get(),
25
- column.table.atoms.columnPinning?.get(),
26
- column.table.atoms.grouping?.get(),
27
- column.table.atoms.columnVisibility?.get(),
28
- column.table.options.groupedColumnMode
29
- ]
30
- },
20
+ column_getIndex: { fn: (column, position) => require_columnOrderingFeature_utils.column_getIndex(column, position) },
31
21
  column_getIsFirstColumn: { fn: (column, position) => require_columnOrderingFeature_utils.column_getIsFirstColumn(column, position) },
32
22
  column_getIsLastColumn: { fn: (column, position) => require_columnOrderingFeature_utils.column_getIsLastColumn(column, position) }
33
23
  });
34
24
  },
35
25
  constructTableAPIs: (table) => {
36
26
  require_utils.assignTableAPIs("columnOrderingFeature", table, {
27
+ table_getColumnIndexes: {
28
+ fn: () => require_columnOrderingFeature_utils.table_getColumnIndexes(table),
29
+ memoDeps: () => [
30
+ table.options.columns,
31
+ table.atoms.columnOrder?.get(),
32
+ table.atoms.columnPinning?.get(),
33
+ table.atoms.columnVisibility?.get(),
34
+ table.atoms.grouping?.get(),
35
+ table.options.groupedColumnMode
36
+ ]
37
+ },
37
38
  table_setColumnOrder: { fn: (updater) => require_columnOrderingFeature_utils.table_setColumnOrder(table, updater) },
38
39
  table_resetColumnOrder: { fn: (defaultState) => require_columnOrderingFeature_utils.table_resetColumnOrder(table, defaultState) },
39
40
  table_getOrderColumnsFn: {
@@ -1 +1 @@
1
- {"version":3,"file":"columnOrderingFeature.cjs","names":["getDefaultColumnOrderState","makeStateUpdater","column_getIndex","column_getIsFirstColumn","column_getIsLastColumn","table_setColumnOrder","table_resetColumnOrder","table_getOrderColumnsFn"],"sources":["../../../src/features/column-ordering/columnOrderingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeStateUpdater,\n} from '../../utils'\nimport {\n column_getIndex,\n column_getIsFirstColumn,\n column_getIsLastColumn,\n getDefaultColumnOrderState,\n table_getOrderColumnsFn,\n table_resetColumnOrder,\n table_setColumnOrder,\n} from './columnOrderingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column ordering state and APIs for ordering leaf columns.\n */\nexport const columnOrderingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n columnOrder: getDefaultColumnOrderState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table),\n }\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnOrderingFeature', prototype, table, {\n column_getIndex: {\n fn: (column, position) => column_getIndex(column, position),\n memoDeps: (column, position) => [\n position,\n column.table.atoms.columnOrder?.get(),\n column.table.atoms.columnPinning?.get(),\n column.table.atoms.grouping?.get(),\n column.table.atoms.columnVisibility?.get(),\n column.table.options.groupedColumnMode,\n ],\n },\n column_getIsFirstColumn: {\n fn: (column, position) => column_getIsFirstColumn(column, position),\n },\n column_getIsLastColumn: {\n fn: (column, position) => column_getIsLastColumn(column, position),\n },\n })\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnOrderingFeature', table, {\n table_setColumnOrder: {\n fn: (updater) => table_setColumnOrder(table, updater),\n },\n table_resetColumnOrder: {\n fn: (defaultState) => table_resetColumnOrder(table, defaultState),\n },\n table_getOrderColumnsFn: {\n fn: () => table_getOrderColumnsFn(table),\n memoDeps: () => [\n table.atoms.columnOrder?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAmBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,aAAaA,+DAA2B;GACxC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO,EACL,qBAAqBC,+BAAiB,eAAe,KAAK,EAC5D;CACF;CAEA,wBAAwB,WAAW,UAAU;EAC3C,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,iBAAiB;IACf,KAAK,QAAQ,aAAaC,oDAAgB,QAAQ,QAAQ;IAC1D,WAAW,QAAQ,aAAa;KAC9B;KACA,OAAO,MAAM,MAAM,aAAa,IAAI;KACpC,OAAO,MAAM,MAAM,eAAe,IAAI;KACtC,OAAO,MAAM,MAAM,UAAU,IAAI;KACjC,OAAO,MAAM,MAAM,kBAAkB,IAAI;KACzC,OAAO,MAAM,QAAQ;IACvB;GACF;GACA,yBAAyB,EACvB,KAAK,QAAQ,aAAaC,4DAAwB,QAAQ,QAAQ,EACpE;GACA,wBAAwB,EACtB,KAAK,QAAQ,aAAaC,2DAAuB,QAAQ,QAAQ,EACnE;EACF,CAAC;CACH;CAEA,qBAAqB,UAAU;EAC7B,8BAAgB,yBAAyB,OAAO;GAC9C,sBAAsB,EACpB,KAAK,YAAYC,yDAAqB,OAAO,OAAO,EACtD;GACA,wBAAwB,EACtB,KAAK,iBAAiBC,2DAAuB,OAAO,YAAY,EAClE;GACA,yBAAyB;IACvB,UAAUC,4DAAwB,KAAK;IACvC,gBAAgB;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;EACF,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"columnOrderingFeature.cjs","names":["getDefaultColumnOrderState","makeStateUpdater","column_getIndex","column_getIsFirstColumn","column_getIsLastColumn","table_getColumnIndexes","table_setColumnOrder","table_resetColumnOrder","table_getOrderColumnsFn"],"sources":["../../../src/features/column-ordering/columnOrderingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeStateUpdater,\n} from '../../utils'\nimport {\n column_getIndex,\n column_getIsFirstColumn,\n column_getIsLastColumn,\n getDefaultColumnOrderState,\n table_getColumnIndexes,\n table_getOrderColumnsFn,\n table_resetColumnOrder,\n table_setColumnOrder,\n} from './columnOrderingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column ordering state and APIs for ordering leaf columns.\n */\nexport const columnOrderingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n columnOrder: getDefaultColumnOrderState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table),\n }\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnOrderingFeature', prototype, table, {\n column_getIndex: {\n fn: (column, position) => column_getIndex(column, position),\n },\n column_getIsFirstColumn: {\n fn: (column, position) => column_getIsFirstColumn(column, position),\n },\n column_getIsLastColumn: {\n fn: (column, position) => column_getIsLastColumn(column, position),\n },\n })\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnOrderingFeature', table, {\n table_getColumnIndexes: {\n fn: () => table_getColumnIndexes(table),\n memoDeps: () => [\n table.options.columns,\n table.atoms.columnOrder?.get(),\n table.atoms.columnPinning?.get(),\n table.atoms.columnVisibility?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n table_setColumnOrder: {\n fn: (updater) => table_setColumnOrder(table, updater),\n },\n table_resetColumnOrder: {\n fn: (defaultState) => table_resetColumnOrder(table, defaultState),\n },\n table_getOrderColumnsFn: {\n fn: () => table_getOrderColumnsFn(table),\n memoDeps: () => [\n table.atoms.columnOrder?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAoBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,aAAaA,+DAA2B;GACxC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO,EACL,qBAAqBC,+BAAiB,eAAe,KAAK,EAC5D;CACF;CAEA,wBAAwB,WAAW,UAAU;EAC3C,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,iBAAiB,EACf,KAAK,QAAQ,aAAaC,oDAAgB,QAAQ,QAAQ,EAC5D;GACA,yBAAyB,EACvB,KAAK,QAAQ,aAAaC,4DAAwB,QAAQ,QAAQ,EACpE;GACA,wBAAwB,EACtB,KAAK,QAAQ,aAAaC,2DAAuB,QAAQ,QAAQ,EACnE;EACF,CAAC;CACH;CAEA,qBAAqB,UAAU;EAC7B,8BAAgB,yBAAyB,OAAO;GAC9C,wBAAwB;IACtB,UAAUC,2DAAuB,KAAK;IACtC,gBAAgB;KACd,MAAM,QAAQ;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,eAAe,IAAI;KAC/B,MAAM,MAAM,kBAAkB,IAAI;KAClC,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;GACA,sBAAsB,EACpB,KAAK,YAAYC,yDAAqB,OAAO,OAAO,EACtD;GACA,wBAAwB,EACtB,KAAK,iBAAiBC,2DAAuB,OAAO,YAAY,EAClE;GACA,yBAAyB;IACvB,UAAUC,4DAAwB,KAAK;IACvC,gBAAgB;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;EACF,CAAC;CACH;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from "../../utils.js";
2
- import { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder } from "./columnOrderingFeature.utils.js";
2
+ import { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder } from "./columnOrderingFeature.utils.js";
3
3
 
4
4
  //#region src/features/column-ordering/columnOrderingFeature.ts
5
5
  /**
@@ -17,23 +17,24 @@ const columnOrderingFeature = {
17
17
  },
18
18
  assignColumnPrototype: (prototype, table) => {
19
19
  assignPrototypeAPIs("columnOrderingFeature", prototype, table, {
20
- column_getIndex: {
21
- fn: (column, position) => column_getIndex(column, position),
22
- memoDeps: (column, position) => [
23
- position,
24
- column.table.atoms.columnOrder?.get(),
25
- column.table.atoms.columnPinning?.get(),
26
- column.table.atoms.grouping?.get(),
27
- column.table.atoms.columnVisibility?.get(),
28
- column.table.options.groupedColumnMode
29
- ]
30
- },
20
+ column_getIndex: { fn: (column, position) => column_getIndex(column, position) },
31
21
  column_getIsFirstColumn: { fn: (column, position) => column_getIsFirstColumn(column, position) },
32
22
  column_getIsLastColumn: { fn: (column, position) => column_getIsLastColumn(column, position) }
33
23
  });
34
24
  },
35
25
  constructTableAPIs: (table) => {
36
26
  assignTableAPIs("columnOrderingFeature", table, {
27
+ table_getColumnIndexes: {
28
+ fn: () => table_getColumnIndexes(table),
29
+ memoDeps: () => [
30
+ table.options.columns,
31
+ table.atoms.columnOrder?.get(),
32
+ table.atoms.columnPinning?.get(),
33
+ table.atoms.columnVisibility?.get(),
34
+ table.atoms.grouping?.get(),
35
+ table.options.groupedColumnMode
36
+ ]
37
+ },
37
38
  table_setColumnOrder: { fn: (updater) => table_setColumnOrder(table, updater) },
38
39
  table_resetColumnOrder: { fn: (defaultState) => table_resetColumnOrder(table, defaultState) },
39
40
  table_getOrderColumnsFn: {
@@ -1 +1 @@
1
- {"version":3,"file":"columnOrderingFeature.js","names":[],"sources":["../../../src/features/column-ordering/columnOrderingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeStateUpdater,\n} from '../../utils'\nimport {\n column_getIndex,\n column_getIsFirstColumn,\n column_getIsLastColumn,\n getDefaultColumnOrderState,\n table_getOrderColumnsFn,\n table_resetColumnOrder,\n table_setColumnOrder,\n} from './columnOrderingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column ordering state and APIs for ordering leaf columns.\n */\nexport const columnOrderingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n columnOrder: getDefaultColumnOrderState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table),\n }\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnOrderingFeature', prototype, table, {\n column_getIndex: {\n fn: (column, position) => column_getIndex(column, position),\n memoDeps: (column, position) => [\n position,\n column.table.atoms.columnOrder?.get(),\n column.table.atoms.columnPinning?.get(),\n column.table.atoms.grouping?.get(),\n column.table.atoms.columnVisibility?.get(),\n column.table.options.groupedColumnMode,\n ],\n },\n column_getIsFirstColumn: {\n fn: (column, position) => column_getIsFirstColumn(column, position),\n },\n column_getIsLastColumn: {\n fn: (column, position) => column_getIsLastColumn(column, position),\n },\n })\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnOrderingFeature', table, {\n table_setColumnOrder: {\n fn: (updater) => table_setColumnOrder(table, updater),\n },\n table_resetColumnOrder: {\n fn: (defaultState) => table_resetColumnOrder(table, defaultState),\n },\n table_getOrderColumnsFn: {\n fn: () => table_getOrderColumnsFn(table),\n memoDeps: () => [\n table.atoms.columnOrder?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAmBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,aAAa,2BAA2B;GACxC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO,EACL,qBAAqB,iBAAiB,eAAe,KAAK,EAC5D;CACF;CAEA,wBAAwB,WAAW,UAAU;EAC3C,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,iBAAiB;IACf,KAAK,QAAQ,aAAa,gBAAgB,QAAQ,QAAQ;IAC1D,WAAW,QAAQ,aAAa;KAC9B;KACA,OAAO,MAAM,MAAM,aAAa,IAAI;KACpC,OAAO,MAAM,MAAM,eAAe,IAAI;KACtC,OAAO,MAAM,MAAM,UAAU,IAAI;KACjC,OAAO,MAAM,MAAM,kBAAkB,IAAI;KACzC,OAAO,MAAM,QAAQ;IACvB;GACF;GACA,yBAAyB,EACvB,KAAK,QAAQ,aAAa,wBAAwB,QAAQ,QAAQ,EACpE;GACA,wBAAwB,EACtB,KAAK,QAAQ,aAAa,uBAAuB,QAAQ,QAAQ,EACnE;EACF,CAAC;CACH;CAEA,qBAAqB,UAAU;EAC7B,gBAAgB,yBAAyB,OAAO;GAC9C,sBAAsB,EACpB,KAAK,YAAY,qBAAqB,OAAO,OAAO,EACtD;GACA,wBAAwB,EACtB,KAAK,iBAAiB,uBAAuB,OAAO,YAAY,EAClE;GACA,yBAAyB;IACvB,UAAU,wBAAwB,KAAK;IACvC,gBAAgB;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;EACF,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"columnOrderingFeature.js","names":[],"sources":["../../../src/features/column-ordering/columnOrderingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeStateUpdater,\n} from '../../utils'\nimport {\n column_getIndex,\n column_getIsFirstColumn,\n column_getIsLastColumn,\n getDefaultColumnOrderState,\n table_getColumnIndexes,\n table_getOrderColumnsFn,\n table_resetColumnOrder,\n table_setColumnOrder,\n} from './columnOrderingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column ordering state and APIs for ordering leaf columns.\n */\nexport const columnOrderingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n columnOrder: getDefaultColumnOrderState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table),\n }\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnOrderingFeature', prototype, table, {\n column_getIndex: {\n fn: (column, position) => column_getIndex(column, position),\n },\n column_getIsFirstColumn: {\n fn: (column, position) => column_getIsFirstColumn(column, position),\n },\n column_getIsLastColumn: {\n fn: (column, position) => column_getIsLastColumn(column, position),\n },\n })\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnOrderingFeature', table, {\n table_getColumnIndexes: {\n fn: () => table_getColumnIndexes(table),\n memoDeps: () => [\n table.options.columns,\n table.atoms.columnOrder?.get(),\n table.atoms.columnPinning?.get(),\n table.atoms.columnVisibility?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n table_setColumnOrder: {\n fn: (updater) => table_setColumnOrder(table, updater),\n },\n table_resetColumnOrder: {\n fn: (defaultState) => table_resetColumnOrder(table, defaultState),\n },\n table_getOrderColumnsFn: {\n fn: () => table_getOrderColumnsFn(table),\n memoDeps: () => [\n table.atoms.columnOrder?.get(),\n table.atoms.grouping?.get(),\n table.options.groupedColumnMode,\n ],\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAoBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,aAAa,2BAA2B;GACxC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO,EACL,qBAAqB,iBAAiB,eAAe,KAAK,EAC5D;CACF;CAEA,wBAAwB,WAAW,UAAU;EAC3C,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,iBAAiB,EACf,KAAK,QAAQ,aAAa,gBAAgB,QAAQ,QAAQ,EAC5D;GACA,yBAAyB,EACvB,KAAK,QAAQ,aAAa,wBAAwB,QAAQ,QAAQ,EACpE;GACA,wBAAwB,EACtB,KAAK,QAAQ,aAAa,uBAAuB,QAAQ,QAAQ,EACnE;EACF,CAAC;CACH;CAEA,qBAAqB,UAAU;EAC7B,gBAAgB,yBAAyB,OAAO;GAC9C,wBAAwB;IACtB,UAAU,uBAAuB,KAAK;IACtC,gBAAgB;KACd,MAAM,QAAQ;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,eAAe,IAAI;KAC/B,MAAM,MAAM,kBAAkB,IAAI;KAClC,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;GACA,sBAAsB,EACpB,KAAK,YAAY,qBAAqB,OAAO,OAAO,EACtD;GACA,wBAAwB,EACtB,KAAK,iBAAiB,uBAAuB,OAAO,YAAY,EAClE;GACA,yBAAyB;IACvB,UAAU,wBAAwB,KAAK;IACvC,gBAAgB;KACd,MAAM,MAAM,aAAa,IAAI;KAC7B,MAAM,MAAM,UAAU,IAAI;KAC1B,MAAM,QAAQ;IAChB;GACF;EACF,CAAC;CACH;AACF"}
@@ -4,6 +4,24 @@ import { TableFeatures } from "../../types/TableFeatures.cjs";
4
4
 
5
5
  //#region src/features/column-ordering/columnOrderingFeature.types.d.ts
6
6
  type ColumnOrderState = Array<string>;
7
+ interface ColumnIndexes {
8
+ /**
9
+ * Maps each visible leaf column id to its index in the full visible column list.
10
+ */
11
+ all: Record<string, number>;
12
+ /**
13
+ * Maps each unpinned visible leaf column id to its index within the center region.
14
+ */
15
+ center: Record<string, number>;
16
+ /**
17
+ * Maps each left-pinned visible leaf column id to its index within the left region.
18
+ */
19
+ left: Record<string, number>;
20
+ /**
21
+ * Maps each right-pinned visible leaf column id to its index within the right region.
22
+ */
23
+ right: Record<string, number>;
24
+ }
7
25
  interface TableState_ColumnOrdering {
8
26
  columnOrder: ColumnOrderState;
9
27
  }
@@ -40,6 +58,13 @@ interface ColumnOrderDefaultOptions {
40
58
  onColumnOrderChange: OnChangeFn<ColumnOrderState>;
41
59
  }
42
60
  interface Table_ColumnOrdering<in out TFeatures extends TableFeatures, in out TData extends RowData> {
61
+ /**
62
+ * Builds column-id to index records for each visible pinning region.
63
+ *
64
+ * This is the memoized source that `column.getIndex` reads from; most apps
65
+ * will not need to call it directly.
66
+ */
67
+ getColumnIndexes: () => ColumnIndexes;
43
68
  /**
44
69
  * Resets `columnOrder` to `initialState.columnOrder`.
45
70
  *
@@ -52,5 +77,5 @@ interface Table_ColumnOrdering<in out TFeatures extends TableFeatures, in out TD
52
77
  setColumnOrder: (updater: Updater<ColumnOrderState>) => void;
53
78
  }
54
79
  //#endregion
55
- export { ColumnOrderDefaultOptions, ColumnOrderState, Column_ColumnOrdering, TableOptions_ColumnOrdering, TableState_ColumnOrdering, Table_ColumnOrdering };
80
+ export { ColumnIndexes, ColumnOrderDefaultOptions, ColumnOrderState, Column_ColumnOrdering, TableOptions_ColumnOrdering, TableState_ColumnOrdering, Table_ColumnOrdering };
56
81
  //# sourceMappingURL=columnOrderingFeature.types.d.cts.map
@@ -4,6 +4,24 @@ import { TableFeatures } from "../../types/TableFeatures.js";
4
4
 
5
5
  //#region src/features/column-ordering/columnOrderingFeature.types.d.ts
6
6
  type ColumnOrderState = Array<string>;
7
+ interface ColumnIndexes {
8
+ /**
9
+ * Maps each visible leaf column id to its index in the full visible column list.
10
+ */
11
+ all: Record<string, number>;
12
+ /**
13
+ * Maps each unpinned visible leaf column id to its index within the center region.
14
+ */
15
+ center: Record<string, number>;
16
+ /**
17
+ * Maps each left-pinned visible leaf column id to its index within the left region.
18
+ */
19
+ left: Record<string, number>;
20
+ /**
21
+ * Maps each right-pinned visible leaf column id to its index within the right region.
22
+ */
23
+ right: Record<string, number>;
24
+ }
7
25
  interface TableState_ColumnOrdering {
8
26
  columnOrder: ColumnOrderState;
9
27
  }
@@ -40,6 +58,13 @@ interface ColumnOrderDefaultOptions {
40
58
  onColumnOrderChange: OnChangeFn<ColumnOrderState>;
41
59
  }
42
60
  interface Table_ColumnOrdering<in out TFeatures extends TableFeatures, in out TData extends RowData> {
61
+ /**
62
+ * Builds column-id to index records for each visible pinning region.
63
+ *
64
+ * This is the memoized source that `column.getIndex` reads from; most apps
65
+ * will not need to call it directly.
66
+ */
67
+ getColumnIndexes: () => ColumnIndexes;
43
68
  /**
44
69
  * Resets `columnOrder` to `initialState.columnOrder`.
45
70
  *
@@ -52,5 +77,5 @@ interface Table_ColumnOrdering<in out TFeatures extends TableFeatures, in out TD
52
77
  setColumnOrder: (updater: Updater<ColumnOrderState>) => void;
53
78
  }
54
79
  //#endregion
55
- export { ColumnOrderDefaultOptions, ColumnOrderState, Column_ColumnOrdering, TableOptions_ColumnOrdering, TableState_ColumnOrdering, Table_ColumnOrdering };
80
+ export { ColumnIndexes, ColumnOrderDefaultOptions, ColumnOrderState, Column_ColumnOrdering, TableOptions_ColumnOrdering, TableState_ColumnOrdering, Table_ColumnOrdering };
56
81
  //# sourceMappingURL=columnOrderingFeature.types.d.ts.map
@@ -17,6 +17,30 @@ function getDefaultColumnOrderState() {
17
17
  return [];
18
18
  }
19
19
  /**
20
+ * Builds column-id to index records for each visible pinning region.
21
+ *
22
+ * All four regions are built in one pass so a single memo entry serves every
23
+ * `column_getIndex` lookup without per-column scans.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const indexes = table_getColumnIndexes(table)
28
+ * ```
29
+ */
30
+ function table_getColumnIndexes(table) {
31
+ const buildIndexes = (columns) => {
32
+ const indexes = require_utils.makeObjectMap();
33
+ for (let i = 0; i < columns.length; i++) indexes[columns[i].id] = i;
34
+ return indexes;
35
+ };
36
+ return {
37
+ all: buildIndexes(require_columnPinningFeature_utils.table_getPinnedVisibleLeafColumns(table)),
38
+ center: buildIndexes(require_columnPinningFeature_utils.table_getPinnedVisibleLeafColumns(table, "center")),
39
+ left: buildIndexes(require_columnPinningFeature_utils.table_getPinnedVisibleLeafColumns(table, "left")),
40
+ right: buildIndexes(require_columnPinningFeature_utils.table_getPinnedVisibleLeafColumns(table, "right"))
41
+ };
42
+ }
43
+ /**
20
44
  * Finds this column's index within a visible pinning region.
21
45
  *
22
46
  * Pass `'left'`, `'center'`, or `'right'` to search that region; omit the
@@ -28,7 +52,7 @@ function getDefaultColumnOrderState() {
28
52
  * ```
29
53
  */
30
54
  function column_getIndex(column, position) {
31
- return require_columnPinningFeature_utils.table_getPinnedVisibleLeafColumns(column.table, position).findIndex((d) => d.id === column.id);
55
+ return require_utils.callMemoOrStaticFn(column.table, "getColumnIndexes", table_getColumnIndexes)[position === "left" ? "left" : position === "right" ? "right" : position === "center" ? "center" : "all"][column.id] ?? -1;
32
56
  }
33
57
  /**
34
58
  * Checks whether this column is the first visible column in a pinning region.
@@ -161,6 +185,7 @@ exports.column_getIsFirstColumn = column_getIsFirstColumn;
161
185
  exports.column_getIsLastColumn = column_getIsLastColumn;
162
186
  exports.getDefaultColumnOrderState = getDefaultColumnOrderState;
163
187
  exports.orderColumns = orderColumns;
188
+ exports.table_getColumnIndexes = table_getColumnIndexes;
164
189
  exports.table_getOrderColumnsFn = table_getOrderColumnsFn;
165
190
  exports.table_resetColumnOrder = table_resetColumnOrder;
166
191
  exports.table_setColumnOrder = table_setColumnOrder;
@@ -1 +1 @@
1
- {"version":3,"file":"columnOrderingFeature.utils.cjs","names":["table_getPinnedVisibleLeafColumns","cloneState"],"sources":["../../../src/features/column-ordering/columnOrderingFeature.utils.ts"],"sourcesContent":["import { table_getPinnedVisibleLeafColumns } from '../column-pinning/columnPinningFeature.utils'\nimport { cloneState } from '../../utils'\nimport type { GroupingState } from '../column-grouping/columnGroupingFeature.types'\nimport type { CellData, RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { Column_Internal } from '../../types/Column'\nimport type { ColumnPinningPosition } from '../column-pinning/columnPinningFeature.types'\nimport type { ColumnOrderState } from './columnOrderingFeature.types'\n\n/**\n * Creates the default column order state.\n *\n * The feature default is an empty array, meaning leaf columns keep their natural\n * definition order. Reset APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const order = getDefaultColumnOrderState()\n * ```\n */\nexport function getDefaultColumnOrderState(): ColumnOrderState {\n return []\n}\n\n/**\n * Finds this column's index within a visible pinning region.\n *\n * Pass `'left'`, `'center'`, or `'right'` to search that region; omit the\n * position to search the full visible leaf column list.\n *\n * @example\n * ```ts\n * const index = column_getIndex(column, 'center')\n * ```\n */\nexport function column_getIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const columns = table_getPinnedVisibleLeafColumns(column.table, position)\n return columns.findIndex((d) => d.id === column.id)\n}\n\n/**\n * Checks whether this column is the first visible column in a pinning region.\n *\n * The same `position` semantics as `column_getIndex` apply.\n *\n * @example\n * ```ts\n * const isFirst = column_getIsFirstColumn(column, 'left')\n * ```\n */\nexport function column_getIsFirstColumn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const columns = table_getPinnedVisibleLeafColumns(column.table, position)\n return columns[0]?.id === column.id\n}\n\n/**\n * Checks whether this column is the last visible column in a pinning region.\n *\n * The same `position` semantics as `column_getIndex` apply.\n *\n * @example\n * ```ts\n * const isLast = column_getIsLastColumn(column, 'right')\n * ```\n */\nexport function column_getIsLastColumn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const columns = table_getPinnedVisibleLeafColumns(column.table, position)\n return columns[columns.length - 1]?.id === column.id\n}\n\n/**\n * Routes a column order updater through the table's column-order change handler.\n *\n * The updater may be a next ordered id array or a function of the previous\n * array, matching the instance `table.setColumnOrder` behavior.\n *\n * @example\n * ```ts\n * table_setColumnOrder(table, ['firstName', 'lastName', 'age'])\n * ```\n */\nexport function table_setColumnOrder<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<ColumnOrderState>) {\n table.options.onColumnOrderChange?.(updater)\n}\n\n/**\n * Resets `columnOrder` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.columnOrder` when it\n * exists. Passing `true` ignores initial state and resets to `[]`.\n *\n * @example\n * ```ts\n * table_resetColumnOrder(table)\n * table_resetColumnOrder(table, true)\n * ```\n */\nexport function table_resetColumnOrder<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setColumnOrder(\n table,\n defaultState ? [] : cloneState(table.initialState.columnOrder ?? []),\n )\n}\n\n/**\n * Creates the ordering function used to arrange leaf columns.\n *\n * The returned function applies `state.columnOrder`, preserves unspecified\n * columns in their original order, then delegates to grouping rules.\n *\n * @example\n * ```ts\n * const orderColumnsForTable = table_getOrderColumnsFn(table)\n * ```\n */\nexport function table_getOrderColumnsFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const columnOrder = table.atoms.columnOrder?.get()\n\n return (columns: Array<Column_Internal<TFeatures, TData, unknown>>) => {\n // Sort grouped columns to the start of the column list\n // before the headers are built\n let orderedColumns: Array<Column_Internal<TFeatures, TData, unknown>> = []\n\n // If there is no order, return the normal columns\n if (!columnOrder?.length) {\n orderedColumns = columns\n } else {\n // Index columns by id for O(1) lookup\n const remaining = new Map<\n string,\n Column_Internal<TFeatures, TData, unknown>\n >()\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n remaining.set(column.id, column)\n }\n\n // Place columns in the requested order, removing each as it's used\n // (handles duplicates and unknown ids in columnOrder)\n for (let i = 0; i < columnOrder.length; i++) {\n const id = columnOrder[i]!\n const column = remaining.get(id)\n if (column) {\n orderedColumns.push(column)\n remaining.delete(id)\n }\n }\n\n // Append leftover columns in their original order\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n if (remaining.has(column.id)) orderedColumns.push(column)\n }\n }\n\n return orderColumns(table, orderedColumns)\n }\n}\n\n/**\n * Applies grouped-column placement rules to an already ordered leaf-column list.\n *\n * `groupedColumnMode: 'remove'` drops grouped columns from the list.\n * `groupedColumnMode: 'reorder'` moves grouped columns to the front in grouping\n * state order.\n *\n * @example\n * ```ts\n * const orderedColumns = orderColumns(table, leafColumns)\n * ```\n */\nexport function orderColumns<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n leafColumns: Array<Column_Internal<TFeatures, TData, unknown>>,\n) {\n const grouping = table.atoms.grouping?.get() ?? ([] as GroupingState)\n const { groupedColumnMode } = table.options\n\n if (!grouping.length || !groupedColumnMode) {\n return leafColumns\n }\n\n const nonGroupingColumns = leafColumns.filter(\n (col) => !grouping.includes(col.id),\n )\n\n if (groupedColumnMode === 'remove') {\n return nonGroupingColumns\n }\n\n const leafColumnsById = new Map<\n string,\n Column_Internal<TFeatures, TData, unknown>\n >()\n for (let i = 0; i < leafColumns.length; i++) {\n const col = leafColumns[i]!\n leafColumnsById.set(col.id, col)\n }\n\n const groupingColumns: Array<Column_Internal<TFeatures, TData, unknown>> = []\n for (let i = 0; i < grouping.length; i++) {\n const col = leafColumnsById.get(grouping[i]!)\n if (col) groupingColumns.push(col)\n }\n\n return [...groupingColumns, ...nonGroupingColumns]\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,SAAgB,6BAA+C;CAC7D,OAAO,CAAC;AACV;;;;;;;;;;;;AAaA,SAAgB,gBAKd,QACA,UACA;CAEA,OADgBA,qEAAkC,OAAO,OAAO,QACnD,CAAC,CAAC,WAAW,MAAM,EAAE,OAAO,OAAO,EAAE;AACpD;;;;;;;;;;;AAYA,SAAgB,wBAKd,QACA,UACA;CAEA,OADgBA,qEAAkC,OAAO,OAAO,QACnD,CAAC,CAAC,EAAE,EAAE,OAAO,OAAO;AACnC;;;;;;;;;;;AAYA,SAAgB,uBAKd,QACA,UACA;CACA,MAAM,UAAUA,qEAAkC,OAAO,OAAO,QAAQ;CACxE,OAAO,QAAQ,QAAQ,SAAS,EAAE,EAAE,OAAO,OAAO;AACpD;;;;;;;;;;;;AAaA,SAAgB,qBAGd,OAAyC,SAAoC;CAC7E,MAAM,QAAQ,sBAAsB,OAAO;AAC7C;;;;;;;;;;;;;AAcA,SAAgB,uBAGd,OAAyC,cAAwB;CACjE,qBACE,OACA,eAAe,CAAC,IAAIC,yBAAW,MAAM,aAAa,eAAe,CAAC,CAAC,CACrE;AACF;;;;;;;;;;;;AAaA,SAAgB,wBAGd,OAAyC;CACzC,MAAM,cAAc,MAAM,MAAM,aAAa,IAAI;CAEjD,QAAQ,YAA+D;EAGrE,IAAI,iBAAoE,CAAC;EAGzE,IAAI,CAAC,aAAa,QAChB,iBAAiB;OACZ;GAEL,MAAM,4BAAY,IAAI,IAGpB;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;IACvC,MAAM,SAAS,QAAQ;IACvB,UAAU,IAAI,OAAO,IAAI,MAAM;GACjC;GAIA,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;IAC3C,MAAM,KAAK,YAAY;IACvB,MAAM,SAAS,UAAU,IAAI,EAAE;IAC/B,IAAI,QAAQ;KACV,eAAe,KAAK,MAAM;KAC1B,UAAU,OAAO,EAAE;IACrB;GACF;GAGA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;IACvC,MAAM,SAAS,QAAQ;IACvB,IAAI,UAAU,IAAI,OAAO,EAAE,GAAG,eAAe,KAAK,MAAM;GAC1D;EACF;EAEA,OAAO,aAAa,OAAO,cAAc;CAC3C;AACF;;;;;;;;;;;;;AAcA,SAAgB,aAId,OACA,aACA;CACA,MAAM,WAAW,MAAM,MAAM,UAAU,IAAI,KAAM,CAAC;CAClD,MAAM,EAAE,sBAAsB,MAAM;CAEpC,IAAI,CAAC,SAAS,UAAU,CAAC,mBACvB,OAAO;CAGT,MAAM,qBAAqB,YAAY,QACpC,QAAQ,CAAC,SAAS,SAAS,IAAI,EAAE,CACpC;CAEA,IAAI,sBAAsB,UACxB,OAAO;CAGT,MAAM,kCAAkB,IAAI,IAG1B;CACF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,MAAM,YAAY;EACxB,gBAAgB,IAAI,IAAI,IAAI,GAAG;CACjC;CAEA,MAAM,kBAAqE,CAAC;CAC5E,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,MAAM,gBAAgB,IAAI,SAAS,EAAG;EAC5C,IAAI,KAAK,gBAAgB,KAAK,GAAG;CACnC;CAEA,OAAO,CAAC,GAAG,iBAAiB,GAAG,kBAAkB;AACnD"}
1
+ {"version":3,"file":"columnOrderingFeature.utils.cjs","names":["makeObjectMap","table_getPinnedVisibleLeafColumns","callMemoOrStaticFn","cloneState"],"sources":["../../../src/features/column-ordering/columnOrderingFeature.utils.ts"],"sourcesContent":["import { table_getPinnedVisibleLeafColumns } from '../column-pinning/columnPinningFeature.utils'\nimport { callMemoOrStaticFn, cloneState, makeObjectMap } from '../../utils'\nimport type { GroupingState } from '../column-grouping/columnGroupingFeature.types'\nimport type { CellData, RowData, Updater } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Table_Internal } from '../../types/Table'\nimport type { Column, Column_Internal } from '../../types/Column'\nimport type { ColumnPinningPosition } from '../column-pinning/columnPinningFeature.types'\nimport type {\n ColumnIndexes,\n ColumnOrderState,\n} from './columnOrderingFeature.types'\n\n/**\n * Creates the default column order state.\n *\n * The feature default is an empty array, meaning leaf columns keep their natural\n * definition order. Reset APIs use this value when `defaultState` is `true`.\n *\n * @example\n * ```ts\n * const order = getDefaultColumnOrderState()\n * ```\n */\nexport function getDefaultColumnOrderState(): ColumnOrderState {\n return []\n}\n\n/**\n * Builds column-id to index records for each visible pinning region.\n *\n * All four regions are built in one pass so a single memo entry serves every\n * `column_getIndex` lookup without per-column scans.\n *\n * @example\n * ```ts\n * const indexes = table_getColumnIndexes(table)\n * ```\n */\nexport function table_getColumnIndexes<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>): ColumnIndexes {\n const buildIndexes = (\n columns: ReadonlyArray<\n | Column<TFeatures, TData, unknown>\n | Column_Internal<TFeatures, TData, unknown>\n >,\n ): Record<string, number> => {\n const indexes = makeObjectMap<number>()\n for (let i = 0; i < columns.length; i++) {\n indexes[columns[i]!.id] = i\n }\n return indexes\n }\n\n return {\n all: buildIndexes(table_getPinnedVisibleLeafColumns(table)),\n center: buildIndexes(table_getPinnedVisibleLeafColumns(table, 'center')),\n left: buildIndexes(table_getPinnedVisibleLeafColumns(table, 'left')),\n right: buildIndexes(table_getPinnedVisibleLeafColumns(table, 'right')),\n }\n}\n\n/**\n * Finds this column's index within a visible pinning region.\n *\n * Pass `'left'`, `'center'`, or `'right'` to search that region; omit the\n * position to search the full visible leaf column list.\n *\n * @example\n * ```ts\n * const index = column_getIndex(column, 'center')\n * ```\n */\nexport function column_getIndex<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const indexes = callMemoOrStaticFn(\n column.table,\n 'getColumnIndexes',\n table_getColumnIndexes,\n )\n const key =\n position === 'left'\n ? 'left'\n : position === 'right'\n ? 'right'\n : position === 'center'\n ? 'center'\n : 'all'\n return indexes[key][column.id] ?? -1\n}\n\n/**\n * Checks whether this column is the first visible column in a pinning region.\n *\n * The same `position` semantics as `column_getIndex` apply.\n *\n * @example\n * ```ts\n * const isFirst = column_getIsFirstColumn(column, 'left')\n * ```\n */\nexport function column_getIsFirstColumn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const columns = table_getPinnedVisibleLeafColumns(column.table, position)\n return columns[0]?.id === column.id\n}\n\n/**\n * Checks whether this column is the last visible column in a pinning region.\n *\n * The same `position` semantics as `column_getIndex` apply.\n *\n * @example\n * ```ts\n * const isLast = column_getIsLastColumn(column, 'right')\n * ```\n */\nexport function column_getIsLastColumn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n>(\n column: Column_Internal<TFeatures, TData, TValue>,\n position?: ColumnPinningPosition | 'center',\n) {\n const columns = table_getPinnedVisibleLeafColumns(column.table, position)\n return columns[columns.length - 1]?.id === column.id\n}\n\n/**\n * Routes a column order updater through the table's column-order change handler.\n *\n * The updater may be a next ordered id array or a function of the previous\n * array, matching the instance `table.setColumnOrder` behavior.\n *\n * @example\n * ```ts\n * table_setColumnOrder(table, ['firstName', 'lastName', 'age'])\n * ```\n */\nexport function table_setColumnOrder<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, updater: Updater<ColumnOrderState>) {\n table.options.onColumnOrderChange?.(updater)\n}\n\n/**\n * Resets `columnOrder` to the configured initial state or feature default.\n *\n * With no argument, the reset clones `table.initialState.columnOrder` when it\n * exists. Passing `true` ignores initial state and resets to `[]`.\n *\n * @example\n * ```ts\n * table_resetColumnOrder(table)\n * table_resetColumnOrder(table, true)\n * ```\n */\nexport function table_resetColumnOrder<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>, defaultState?: boolean) {\n table_setColumnOrder(\n table,\n defaultState ? [] : cloneState(table.initialState.columnOrder ?? []),\n )\n}\n\n/**\n * Creates the ordering function used to arrange leaf columns.\n *\n * The returned function applies `state.columnOrder`, preserves unspecified\n * columns in their original order, then delegates to grouping rules.\n *\n * @example\n * ```ts\n * const orderColumnsForTable = table_getOrderColumnsFn(table)\n * ```\n */\nexport function table_getOrderColumnsFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table_Internal<TFeatures, TData>) {\n const columnOrder = table.atoms.columnOrder?.get()\n\n return (columns: Array<Column_Internal<TFeatures, TData, unknown>>) => {\n // Sort grouped columns to the start of the column list\n // before the headers are built\n let orderedColumns: Array<Column_Internal<TFeatures, TData, unknown>> = []\n\n // If there is no order, return the normal columns\n if (!columnOrder?.length) {\n orderedColumns = columns\n } else {\n // Index columns by id for O(1) lookup\n const remaining = new Map<\n string,\n Column_Internal<TFeatures, TData, unknown>\n >()\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n remaining.set(column.id, column)\n }\n\n // Place columns in the requested order, removing each as it's used\n // (handles duplicates and unknown ids in columnOrder)\n for (let i = 0; i < columnOrder.length; i++) {\n const id = columnOrder[i]!\n const column = remaining.get(id)\n if (column) {\n orderedColumns.push(column)\n remaining.delete(id)\n }\n }\n\n // Append leftover columns in their original order\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]!\n if (remaining.has(column.id)) orderedColumns.push(column)\n }\n }\n\n return orderColumns(table, orderedColumns)\n }\n}\n\n/**\n * Applies grouped-column placement rules to an already ordered leaf-column list.\n *\n * `groupedColumnMode: 'remove'` drops grouped columns from the list.\n * `groupedColumnMode: 'reorder'` moves grouped columns to the front in grouping\n * state order.\n *\n * @example\n * ```ts\n * const orderedColumns = orderColumns(table, leafColumns)\n * ```\n */\nexport function orderColumns<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table_Internal<TFeatures, TData>,\n leafColumns: Array<Column_Internal<TFeatures, TData, unknown>>,\n) {\n const grouping = table.atoms.grouping?.get() ?? ([] as GroupingState)\n const { groupedColumnMode } = table.options\n\n if (!grouping.length || !groupedColumnMode) {\n return leafColumns\n }\n\n const nonGroupingColumns = leafColumns.filter(\n (col) => !grouping.includes(col.id),\n )\n\n if (groupedColumnMode === 'remove') {\n return nonGroupingColumns\n }\n\n const leafColumnsById = new Map<\n string,\n Column_Internal<TFeatures, TData, unknown>\n >()\n for (let i = 0; i < leafColumns.length; i++) {\n const col = leafColumns[i]!\n leafColumnsById.set(col.id, col)\n }\n\n const groupingColumns: Array<Column_Internal<TFeatures, TData, unknown>> = []\n for (let i = 0; i < grouping.length; i++) {\n const col = leafColumnsById.get(grouping[i]!)\n if (col) groupingColumns.push(col)\n }\n\n return [...groupingColumns, ...nonGroupingColumns]\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { CellData, RowData, Updater } from "../../types/type-utils.cjs";
2
2
  import { ColumnPinningPosition } from "../column-pinning/columnPinningFeature.types.cjs";
3
- import { ColumnOrderState } from "./columnOrderingFeature.types.cjs";
3
+ import { ColumnIndexes, ColumnOrderState } from "./columnOrderingFeature.types.cjs";
4
4
  import { Table } from "../../types/Table.cjs";
5
5
  import { Column } from "../../types/Column.cjs";
6
6
  import { TableFeatures } from "../../types/TableFeatures.cjs";
@@ -18,6 +18,18 @@ import { TableFeatures } from "../../types/TableFeatures.cjs";
18
18
  * ```
19
19
  */
20
20
  declare function getDefaultColumnOrderState(): ColumnOrderState;
21
+ /**
22
+ * Builds column-id to index records for each visible pinning region.
23
+ *
24
+ * All four regions are built in one pass so a single memo entry serves every
25
+ * `column_getIndex` lookup without per-column scans.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const indexes = table_getColumnIndexes(table)
30
+ * ```
31
+ */
32
+ declare function table_getColumnIndexes<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): ColumnIndexes;
21
33
  /**
22
34
  * Finds this column's index within a visible pinning region.
23
35
  *
@@ -103,5 +115,5 @@ declare function table_getOrderColumnsFn<TFeatures extends TableFeatures, TData
103
115
  */
104
116
  declare function orderColumns<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, leafColumns: Array<Column<TFeatures, TData, unknown>>): Column<TFeatures, TData, unknown>[];
105
117
  //#endregion
106
- export { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };
118
+ export { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };
107
119
  //# sourceMappingURL=columnOrderingFeature.utils.d.cts.map
@@ -1,6 +1,6 @@
1
1
  import { CellData, RowData, Updater } from "../../types/type-utils.js";
2
2
  import { ColumnPinningPosition } from "../column-pinning/columnPinningFeature.types.js";
3
- import { ColumnOrderState } from "./columnOrderingFeature.types.js";
3
+ import { ColumnIndexes, ColumnOrderState } from "./columnOrderingFeature.types.js";
4
4
  import { Table } from "../../types/Table.js";
5
5
  import { Column } from "../../types/Column.js";
6
6
  import { TableFeatures } from "../../types/TableFeatures.js";
@@ -18,6 +18,18 @@ import { TableFeatures } from "../../types/TableFeatures.js";
18
18
  * ```
19
19
  */
20
20
  declare function getDefaultColumnOrderState(): ColumnOrderState;
21
+ /**
22
+ * Builds column-id to index records for each visible pinning region.
23
+ *
24
+ * All four regions are built in one pass so a single memo entry serves every
25
+ * `column_getIndex` lookup without per-column scans.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const indexes = table_getColumnIndexes(table)
30
+ * ```
31
+ */
32
+ declare function table_getColumnIndexes<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): ColumnIndexes;
21
33
  /**
22
34
  * Finds this column's index within a visible pinning region.
23
35
  *
@@ -103,5 +115,5 @@ declare function table_getOrderColumnsFn<TFeatures extends TableFeatures, TData
103
115
  */
104
116
  declare function orderColumns<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, leafColumns: Array<Column<TFeatures, TData, unknown>>): Column<TFeatures, TData, unknown>[];
105
117
  //#endregion
106
- export { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };
118
+ export { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };
107
119
  //# sourceMappingURL=columnOrderingFeature.utils.d.ts.map