@datum-cloud/datum-ui 2.3.2 → 2.4.0

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.
@@ -333,4 +333,10 @@ export interface CreateStoreOptions<TData extends RowData> {
333
333
  readonly filterFns?: FilterFnMap;
334
334
  readonly isLoading?: boolean;
335
335
  readonly columnCount?: number;
336
+ /**
337
+ * Row identity, used to reconcile `rowSelection` across data changes.
338
+ * When omitted, TanStack falls back to array-index ids, which are
339
+ * meaningless across a data change — so selection is cleared instead.
340
+ */
341
+ readonly getRowId?: (row: TData) => string;
336
342
  }
@@ -1,2 +1,2 @@
1
- import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "../data-table-Du7_FLBi.mjs";
1
+ import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "../data-table-ClfRpyHq.mjs";
2
2
  export { DEFAULT_DEBOUNCE_MS, DEFAULT_LOADING_ROWS, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZES, DataTable, DataTableColumnHeader, DataTableRowActions, createDataTableStore, createSelectionColumn, dataTableFeatures, resolvePath, rowMatchesSearch, useDataTableFilters, useDataTableInlineContents, useDataTableLoading, useDataTablePagination, useDataTableRows, useDataTableSearch, useDataTableSelection, useDataTableSorting, useNuqsAdapter };
@@ -313,6 +313,20 @@ function applyFilters(data, filters, search, registeredFilters, customFilterFns,
313
313
  }
314
314
  //#endregion
315
315
  //#region src/components/features/data-table/core/store.ts
316
+ /**
317
+ * Keep only the selection keys whose rows survive a data change.
318
+ * Dropping vanished keys stops a deleted row's selection from
319
+ * resurrecting if a row with the same id reappears later.
320
+ */
321
+ function pruneSelection(selection, rows, getRowId) {
322
+ const keys = Object.keys(selection);
323
+ if (keys.length === 0) return selection;
324
+ const surviving = /* @__PURE__ */ new Set();
325
+ for (const row of rows) surviving.add(getRowId(row));
326
+ const next = {};
327
+ for (const key of keys) if (selection[key] && surviving.has(key)) next[key] = true;
328
+ return next;
329
+ }
316
330
  function createDataTableStore(options) {
317
331
  let registeredFilters = /* @__PURE__ */ new Map();
318
332
  const listeners = /* @__PURE__ */ new Set();
@@ -362,13 +376,17 @@ function createDataTableStore(options) {
362
376
  setData: (data) => {
363
377
  const next = {
364
378
  ...state,
365
- data,
366
- pageIndex: 0,
367
- rowSelection: {}
379
+ data
368
380
  };
381
+ const filteredData = computeFilteredData(next);
382
+ const pageCount = Math.max(1, Math.ceil(filteredData.length / state.pageSize));
383
+ const pageIndex = Math.min(state.pageIndex, pageCount - 1);
384
+ const rowSelection = options.getRowId ? pruneSelection(state.rowSelection, filteredData, options.getRowId) : {};
369
385
  setState({
370
386
  ...next,
371
- filteredData: computeFilteredData(next)
387
+ filteredData,
388
+ pageIndex,
389
+ rowSelection
372
390
  });
373
391
  },
374
392
  setServerData: (data) => {
@@ -1168,6 +1186,7 @@ function useClientTable(store, options) {
1168
1186
  }) : updater;
1169
1187
  store.setPagination(next.pageIndex, next.pageSize);
1170
1188
  },
1189
+ autoResetPageIndex: false,
1171
1190
  getRowId,
1172
1191
  enableRowSelection: !!enableRowSelection
1173
1192
  });
@@ -1239,7 +1258,8 @@ function ClientProvider(props) {
1239
1258
  columnCount: columns.length,
1240
1259
  searchableColumns,
1241
1260
  searchFn,
1242
- filterFns
1261
+ filterFns,
1262
+ getRowId
1243
1263
  }), []);
1244
1264
  const isInitialRender = useRef(true);
1245
1265
  useEffect(() => {
@@ -1,2 +1,2 @@
1
- import { t as GroupedTable } from "../grouped-table-C5V8ESJe.mjs";
1
+ import { t as GroupedTable } from "../grouped-table-Bb9KoI1e.mjs";
2
2
  export { GroupedTable };
@@ -5,7 +5,7 @@ import { Collapsible, CollapsibleTrigger } from "./collapsible/index.mjs";
5
5
  import { t as useControllableState } from "./use-controllable-state-Dna7u3r9.mjs";
6
6
  import { Skeleton } from "./skeleton/index.mjs";
7
7
  import { TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table/index.mjs";
8
- import { f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, m as DataTableRowActions, p as dataTableFeatures } from "./data-table-Du7_FLBi.mjs";
8
+ import { f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, m as DataTableRowActions, p as dataTableFeatures } from "./data-table-ClfRpyHq.mjs";
9
9
  import { n as useDebouncedSearchInput } from "./use-debounced-search-input-yu_F0QBt.mjs";
10
10
  import { InputWithAddons } from "./input-with-addons/index.mjs";
11
11
  import { ChevronRight, Search, X } from "lucide-react";
package/dist/index.mjs CHANGED
@@ -53,7 +53,7 @@ import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider }
53
53
  import { a as formatJson, c as isValidYaml, d as CodeEditor, i as CodeEditorTabs, l as jsonToYaml, n as jsonSchema, o as formatYaml, r as yamlSchema, s as isValidJson, t as createCodeEditorSchema, u as yamlToJson } from "./types-agDpVXBG.mjs";
54
54
  import { t as toast } from "./toast-BUPlDkN3.mjs";
55
55
  import { n as Toaster, t as useToast } from "./use-toast-Bpq0yJIT.mjs";
56
- import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "./data-table-Du7_FLBi.mjs";
56
+ import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "./data-table-ClfRpyHq.mjs";
57
57
  import { t as ActionRow } from "./action-row-DTvs91_3.mjs";
58
58
  import { n as useDebouncedSearchInput, t as DEFAULT_SEARCH_DEBOUNCE_MS } from "./use-debounced-search-input-yu_F0QBt.mjs";
59
59
  import { t as MultiSelect } from "./multi-select-PtdMChPF.mjs";
@@ -69,7 +69,7 @@ import { InputWithAddons } from "./input-with-addons/index.mjs";
69
69
  import { t as TimePicker } from "./time-picker-CFhaHTtI.mjs";
70
70
  import { t as Transfer } from "./transfer-CEq9AhL7.mjs";
71
71
  import { a as getResponsiveValue, c as GRID_COLUMNS, d as RESPONSIVE_MAP, i as getGutter, l as GRID_PREFIX, n as Row, o as registerMediaQuery, r as RowContext, s as GRID_BREAKPOINTS, t as Col, u as RESPONSIVE_ARRAY } from "./col-BYGWTB4j.mjs";
72
- import { t as GroupedTable } from "./grouped-table-C5V8ESJe.mjs";
72
+ import { t as GroupedTable } from "./grouped-table-Bb9KoI1e.mjs";
73
73
  import { t as InputNumber } from "./input-number-TXmW-X9o.mjs";
74
74
  import { a as logoStyles, i as LogoFlat, n as LogoStacked, r as LogoIcon, t as LogoText } from "./logo-text-Dpm5O6Kg.mjs";
75
75
  import { t as Logo } from "./logo-C3FxD7jb.mjs";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datum-cloud/datum-ui",
3
3
  "type": "module",
4
- "version": "2.3.2",
4
+ "version": "2.4.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "https://github.com/datum-cloud/datum-ui"