@economic/taco 14.2.0 → 14.2.1-EC-87277-rollup-optional-dep-test-release.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.
Files changed (29) hide show
  1. package/dist/components/Table3/components/Editing/Alert.cjs +38 -5
  2. package/dist/components/Table3/components/Editing/Alert.cjs.map +1 -1
  3. package/dist/components/Table3/components/Editing/Alert.js +38 -5
  4. package/dist/components/Table3/components/Editing/Alert.js.map +1 -1
  5. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs +15 -10
  6. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs.map +1 -1
  7. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js +15 -10
  8. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js.map +1 -1
  9. package/dist/primitives/Table/Core/components/Columns/Internal/Selection.cjs +17 -8
  10. package/dist/primitives/Table/Core/components/Columns/Internal/Selection.cjs.map +1 -1
  11. package/dist/primitives/Table/Core/components/Columns/Internal/Selection.js +17 -8
  12. package/dist/primitives/Table/Core/components/Columns/Internal/Selection.js.map +1 -1
  13. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs +2 -2
  14. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs.map +1 -1
  15. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.d.ts +1 -1
  16. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js +2 -2
  17. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js.map +1 -1
  18. package/dist/primitives/Table/useTableManager/listeners/useTableFilterListener.cjs +1 -1
  19. package/dist/primitives/Table/useTableManager/listeners/useTableFilterListener.cjs.map +1 -1
  20. package/dist/primitives/Table/useTableManager/listeners/useTableFilterListener.js +1 -1
  21. package/dist/primitives/Table/useTableManager/listeners/useTableFilterListener.js.map +1 -1
  22. package/dist/primitives/Table/useTableManager/listeners/useTableSortingListener.cjs +1 -1
  23. package/dist/primitives/Table/useTableManager/listeners/useTableSortingListener.cjs.map +1 -1
  24. package/dist/primitives/Table/useTableManager/listeners/useTableSortingListener.js +1 -1
  25. package/dist/primitives/Table/useTableManager/listeners/useTableSortingListener.js.map +1 -1
  26. package/package.json +7 -10
  27. /package/dist/components/Icon/config/{index-template.d.ts → index-template.d.cts} +0 -0
  28. /package/dist/components/Icon/config/{svgr.config.d.ts → svgr.config.d.cts} +0 -0
  29. /package/dist/components/Icon/config/{template.d.ts → template.d.cts} +0 -0
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
+ const columns = require("../../../../primitives/Table/useTableManager/util/columns.cjs");
4
5
  const rows = require("../../../../primitives/Table/useTableManager/util/rows.cjs");
5
6
  const Localization = require("../../../Provider/Localization.cjs");
6
7
  const Tooltip = require("../../../Tooltip/Tooltip.cjs");
@@ -15,10 +16,26 @@ function Alert(props) {
15
16
  const tableMeta = rows.getTableMeta(table);
16
17
  const [showFilterResetDialog, setShowFilterResetDialog] = React.useState(false);
17
18
  const [pendingFocusRowId, setPendingFocusRowId] = React.useState(null);
19
+ const hasScrolledToPendingRow = React.useRef(false);
18
20
  const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert();
21
+ const isDataLoader2 = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2;
19
22
  const visibleRows = table.getRowModel().rows;
20
23
  function getVisibleRowIndex(rowId) {
21
- return visibleRows.findIndex((row) => row.id === rowId);
24
+ return visibleRows.findIndex((row) => row.original !== void 0 && row.id === rowId);
25
+ }
26
+ function getDatasetRowIndex(visibleIndex) {
27
+ if (!isDataLoader2) {
28
+ return visibleIndex;
29
+ }
30
+ const pageSize = tableMeta.server.pageSize;
31
+ const pageIndex = tableMeta.server.pages?.[Math.floor(visibleIndex / pageSize)];
32
+ if (pageIndex === void 0) {
33
+ return visibleIndex;
34
+ }
35
+ return pageIndex * pageSize + visibleIndex % pageSize;
36
+ }
37
+ function hasActiveFilters() {
38
+ return !!table.getState().columnFilters.length || !!table.getState().globalFilter;
22
39
  }
23
40
  function scrollToRow(rowIndex) {
24
41
  tableMeta.rowActive.setRowActiveIndex(rowIndex);
@@ -44,9 +61,9 @@ function Alert(props) {
44
61
  links.push(` ${validationTexts.alert.messageAnd} `);
45
62
  }
46
63
  const handleClick = () => {
47
- const visibleIndex = getVisibleRowIndex(pendingChangeWithError.rowId);
48
- if (visibleIndex > -1) {
49
- scrollToRow(visibleIndex);
64
+ if (getVisibleRowIndex(pendingChangeWithError.rowId) > -1 || isDataLoader2 && !hasActiveFilters()) {
65
+ hasScrolledToPendingRow.current = false;
66
+ setPendingFocusRowId(pendingChangeWithError.rowId);
50
67
  } else {
51
68
  setShowFilterResetDialog(pendingChangeWithError.rowId);
52
69
  }
@@ -91,9 +108,14 @@ function Alert(props) {
91
108
  });
92
109
  const handleResetFilters = () => {
93
110
  const rowId = showFilterResetDialog;
111
+ const search = table.getState().globalFilter;
94
112
  table.resetGlobalFilter();
95
113
  table.resetColumnFilters();
114
+ if (isDataLoader2 && search) {
115
+ tableMeta.search.handleSearch?.(void 0, columns.getHiddenColumns(table.getState().columnVisibility));
116
+ }
96
117
  if (typeof rowId === "string") {
118
+ hasScrolledToPendingRow.current = false;
97
119
  setPendingFocusRowId(rowId);
98
120
  }
99
121
  setShowFilterResetDialog(false);
@@ -104,8 +126,19 @@ function Alert(props) {
104
126
  }
105
127
  const visibleIndex = getVisibleRowIndex(pendingFocusRowId);
106
128
  if (visibleIndex > -1) {
107
- scrollToRow(visibleIndex);
129
+ scrollToRow(getDatasetRowIndex(visibleIndex));
108
130
  setPendingFocusRowId(null);
131
+ hasScrolledToPendingRow.current = false;
132
+ } else if (isDataLoader2) {
133
+ const datasetIndex = pendingChangesWithErrors.find((change) => change.rowId === pendingFocusRowId)?.index;
134
+ const targetPageLoaded = datasetIndex !== void 0 && !!tableMeta.server.pages?.includes(Math.floor(datasetIndex / tableMeta.server.pageSize));
135
+ if (datasetIndex === void 0 || targetPageLoaded && hasScrolledToPendingRow.current) {
136
+ setPendingFocusRowId(null);
137
+ hasScrolledToPendingRow.current = false;
138
+ } else {
139
+ hasScrolledToPendingRow.current = true;
140
+ scrollToIndex(datasetIndex, { align: "center" });
141
+ }
109
142
  }
110
143
  }, [pendingFocusRowId, visibleRows]);
111
144
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Alert$1.Alert, { ...attributes, state: "error" }, /* @__PURE__ */ React.createElement("span", { className: "font-bold" }, title), " ", message), /* @__PURE__ */ React.createElement(
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.cjs","sources":["../../../../../src/components/Table3/components/Editing/Alert.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport type { ScrollToOptions as ReactVirtualScrollToOptions } from '@tanstack/react-virtual';\nimport React from 'react';\n\nimport type { AlertProps as BaseAlertProps, DialogProps } from '@/components';\nimport { Alert as BaseAlert, Button, Dialog, Inline, Tooltip, useLocalization } from '@/components';\nimport type { TableRef } from '@/primitives/Table/types';\nimport { getTableMeta } from '@/primitives/Table/useTableManager/util/rows';\n\ntype AlertProps<TType = unknown> = Omit<BaseAlertProps, 'children'> & {\n scrollToIndex: (index: number, options: ReactVirtualScrollToOptions) => void;\n table: ReactTable<TType>;\n tableRef: React.RefObject<TableRef>;\n};\n\nexport function Alert<TType = unknown>(props: AlertProps<TType>) {\n const { scrollToIndex, table, tableRef, ...attributes } = props;\n const { texts } = useLocalization();\n const validationTexts = texts.table3.editing.validation;\n const tableMeta = getTableMeta(table);\n const [showFilterResetDialog, setShowFilterResetDialog] = React.useState<string | false>(false);\n // row to scroll to and focus once the filters have been reset and it becomes visible again\n const [pendingFocusRowId, setPendingFocusRowId] = React.useState<string | null>(null);\n const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert<TType>();\n\n const visibleRows = table.getRowModel().rows;\n\n function getVisibleRowIndex(rowId: string) {\n return visibleRows.findIndex(row => row.id === rowId);\n }\n\n function scrollToRow(rowIndex: number) {\n tableMeta.rowActive.setRowActiveIndex(rowIndex);\n scrollToIndex(rowIndex, { align: 'center' });\n\n requestAnimationFrame(() => {\n const cell = tableRef.current?.querySelector(\n 'tbody > tr[data-row-active=\"true\"] > td[data-cell-editing-invalid=\"true\"]'\n );\n\n if (cell) {\n (cell as HTMLElement).focus?.();\n }\n });\n }\n\n // generate the \"N unsaved entries\" title\n const title = (\n pendingChangesWithErrors.length === 1 ? validationTexts.alert.titleOne : validationTexts.alert.titlePlural\n ).replace('[COUNT]', String(pendingChangesWithErrors.length));\n\n // generate links to each invalid row, to go into the error message\n const links: React.ReactNode[] = [];\n const visibleColumns = table.getVisibleFlatColumns().map(c => c.id);\n const rowIdentityColumn =\n // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505\n tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor))\n ? table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor))\n : undefined;\n\n pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {\n // if appropriate, concatenate the item with the text \"and\"\n if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {\n // Add space before and after `messageAnd` text\n links.push(` ${validationTexts.alert.messageAnd} `);\n }\n\n const handleClick = () => {\n const visibleIndex = getVisibleRowIndex(pendingChangeWithError.rowId);\n\n if (visibleIndex > -1) {\n scrollToRow(visibleIndex);\n } else {\n setShowFilterResetDialog(pendingChangeWithError.rowId);\n }\n };\n\n let tooltip;\n\n if (pendingChangeWithError.errors.row) {\n tooltip = pendingChangeWithError.errors.row;\n } else {\n const firstCellErrorColumnId = Object.keys(pendingChangeWithError.errors.cells)[0];\n const columnName = table.getAllColumns().find(column => column.id === firstCellErrorColumnId)?.columnDef.meta?.header;\n\n if (columnName && firstCellErrorColumnId) {\n tooltip = `${columnName}: ${pendingChangeWithError.errors.cells[firstCellErrorColumnId]}`;\n }\n }\n\n let row;\n try {\n row = table.getRow(pendingChangeWithError.rowId).original;\n } catch {\n // because of server loading, some rows may not be accessible\n }\n\n // the row identity when there is one, otherwise the 1-based position, which server loading can leave unknown\n let label = '';\n\n const rowIdentity = rowIdentityColumn ? row?.[rowIdentityColumn.id as keyof TType] : undefined;\n\n if (rowIdentity !== null && rowIdentity !== undefined) {\n label = String(rowIdentity);\n } else if (pendingChangeWithError.index !== undefined) {\n label = String(pendingChangeWithError.index + 1);\n }\n\n links.push(\n <Tooltip key={pendingChangeWithError.rowId} title={tooltip ?? ''}>\n <span className=\"text-blue\" onClick={handleClick} role=\"button\">\n {label}\n </span>\n </Tooltip>\n );\n\n // if appropriate, concatenate the item with the text \",\"\n if (pendingChangesWithErrors.length > 2 && index < pendingChangesWithErrors.length - 2) {\n links.push(', ');\n }\n });\n\n // generate the \"Row N is incomplete and hasn't been saved\" error message\n const message = (links.length === 1 ? validationTexts.alert.messageOne : validationTexts.alert.messagePlural)\n .split(/(\\[\\w+\\])/u)\n .map(part => {\n if (part === '[COLUMN]') {\n return rowIdentityColumn?.columnDef.meta?.header ?? validationTexts.alert.messageRow;\n }\n\n if (part === '[ROW]') {\n return links;\n }\n\n return part;\n });\n\n const handleResetFilters = () => {\n const rowId = showFilterResetDialog;\n\n table.resetGlobalFilter();\n table.resetColumnFilters();\n\n // defer focusing until the row model has re-rendered with the filters cleared,\n // otherwise the row isn't in the model/DOM yet\n if (typeof rowId === 'string') {\n setPendingFocusRowId(rowId);\n }\n\n setShowFilterResetDialog(false);\n };\n\n // once the filters are reset and the previously hidden row is visible again, scroll to and focus it\n React.useEffect(() => {\n if (pendingFocusRowId === null) {\n return;\n }\n\n const visibleIndex = getVisibleRowIndex(pendingFocusRowId);\n\n if (visibleIndex > -1) {\n scrollToRow(visibleIndex);\n setPendingFocusRowId(null);\n }\n }, [pendingFocusRowId, visibleRows]);\n\n return (\n <>\n <BaseAlert {...attributes} state=\"error\">\n <span className=\"font-bold\">{title}</span>&nbsp;{message}\n </BaseAlert>\n <FilterResetDialog\n open={showFilterResetDialog !== false}\n onChange={() => setShowFilterResetDialog(false)}\n onSubmit={handleResetFilters}\n />\n </>\n );\n}\n\ntype FilterResetDialogProps = Omit<DialogProps, 'children'> & {\n onSubmit: () => void;\n};\n\nfunction FilterResetDialog(props: FilterResetDialogProps) {\n const { onSubmit: handleSubmit, ...dialogProps } = props;\n const { texts } = useLocalization();\n\n return (\n <Dialog {...dialogProps} size=\"xs\">\n <Dialog.Content aria-label={texts.table3.editing.validation.resetFiltersDialog.title}>\n <Dialog.Title>{texts.table3.editing.validation.resetFiltersDialog.title}</Dialog.Title>\n <p>{texts.table3.editing.validation.resetFiltersDialog.description}</p>\n <Dialog.Footer>\n <Inline spacing={8} alignInline=\"end\">\n <Dialog.Close>\n <Button>{texts.table3.editing.validation.resetFiltersDialog.cancel}</Button>\n </Dialog.Close>\n <Button variant=\"primary\" onClick={handleSubmit}>\n {texts.table3.editing.validation.resetFiltersDialog.confirm}\n </Button>\n </Inline>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n}\n"],"names":["useLocalization","getTableMeta","Tooltip","BaseAlert","Dialog","Inline","Button"],"mappings":"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"}
1
+ {"version":3,"file":"Alert.cjs","sources":["../../../../../src/components/Table3/components/Editing/Alert.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport type { ScrollToOptions as ReactVirtualScrollToOptions } from '@tanstack/react-virtual';\nimport React from 'react';\n\nimport type { AlertProps as BaseAlertProps, DialogProps } from '@/components';\nimport { Alert as BaseAlert, Button, Dialog, Inline, Tooltip, useLocalization } from '@/components';\nimport type { TableRef } from '@/primitives/Table/types';\nimport { getHiddenColumns } from '@/primitives/Table/useTableManager/util/columns';\nimport { getTableMeta } from '@/primitives/Table/useTableManager/util/rows';\n\ntype AlertProps<TType = unknown> = Omit<BaseAlertProps, 'children'> & {\n scrollToIndex: (index: number, options: ReactVirtualScrollToOptions) => void;\n table: ReactTable<TType>;\n tableRef: React.RefObject<TableRef>;\n};\n\nexport function Alert<TType = unknown>(props: AlertProps<TType>) {\n const { scrollToIndex, table, tableRef, ...attributes } = props;\n const { texts } = useLocalization();\n const validationTexts = texts.table3.editing.validation;\n const tableMeta = getTableMeta(table);\n const [showFilterResetDialog, setShowFilterResetDialog] = React.useState<string | false>(false);\n // row to scroll to and focus once the filters have been reset and it becomes visible again\n const [pendingFocusRowId, setPendingFocusRowId] = React.useState<string | null>(null);\n // whether the pending focus effect has already scrolled towards the pending row's stored index\n const hasScrolledToPendingRow = React.useRef(false);\n const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert<TType>();\n\n const isDataLoader2 = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2;\n const visibleRows = table.getRowModel().rows;\n\n function getVisibleRowIndex(rowId: string) {\n // rows in unloaded dataloader2 pages are placeholders with an index-based id, which can\n // collide with a real row id - so only match rows that actually have data\n return visibleRows.findIndex(row => row.original !== undefined && row.id === rowId);\n }\n\n // with dataloader2 the row model only contains the loaded window of pages while row indexes span\n // the full dataset, so a row model index has to be mapped onto its dataset index before scrolling\n function getDatasetRowIndex(visibleIndex: number) {\n if (!isDataLoader2) {\n return visibleIndex;\n }\n\n const pageSize = tableMeta.server.pageSize;\n const pageIndex = tableMeta.server.pages?.[Math.floor(visibleIndex / pageSize)];\n\n // page 0 is a valid loaded page, so only fall back when the page is actually unknown\n if (pageIndex === undefined) {\n return visibleIndex;\n }\n\n return pageIndex * pageSize + (visibleIndex % pageSize);\n }\n\n function hasActiveFilters() {\n return !!table.getState().columnFilters.length || !!table.getState().globalFilter;\n }\n\n function scrollToRow(rowIndex: number) {\n tableMeta.rowActive.setRowActiveIndex(rowIndex);\n scrollToIndex(rowIndex, { align: 'center' });\n\n requestAnimationFrame(() => {\n const cell = tableRef.current?.querySelector(\n 'tbody > tr[data-row-active=\"true\"] > td[data-cell-editing-invalid=\"true\"]'\n );\n\n if (cell) {\n (cell as HTMLElement).focus?.();\n }\n });\n }\n\n // generate the \"N unsaved entries\" title\n const title = (\n pendingChangesWithErrors.length === 1 ? validationTexts.alert.titleOne : validationTexts.alert.titlePlural\n ).replace('[COUNT]', String(pendingChangesWithErrors.length));\n\n // generate links to each invalid row, to go into the error message\n const links: React.ReactNode[] = [];\n const visibleColumns = table.getVisibleFlatColumns().map(c => c.id);\n const rowIdentityColumn =\n // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505\n tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor))\n ? table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor))\n : undefined;\n\n pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {\n // if appropriate, concatenate the item with the text \"and\"\n if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {\n // Add space before and after `messageAnd` text\n links.push(` ${validationTexts.alert.messageAnd} `);\n }\n\n const handleClick = () => {\n // the pending focus effect below owns scrolling/focusing: it scrolls immediately when the row\n // is in the row model, and chases the row into view when it sits in an unloaded dataloader2\n // page (with no active filters a missing row isn't filtered out, just not loaded yet)\n if (getVisibleRowIndex(pendingChangeWithError.rowId) > -1 || (isDataLoader2 && !hasActiveFilters())) {\n hasScrolledToPendingRow.current = false;\n setPendingFocusRowId(pendingChangeWithError.rowId);\n } else {\n setShowFilterResetDialog(pendingChangeWithError.rowId);\n }\n };\n\n let tooltip;\n\n if (pendingChangeWithError.errors.row) {\n tooltip = pendingChangeWithError.errors.row;\n } else {\n const firstCellErrorColumnId = Object.keys(pendingChangeWithError.errors.cells)[0];\n const columnName = table.getAllColumns().find(column => column.id === firstCellErrorColumnId)?.columnDef.meta?.header;\n\n if (columnName && firstCellErrorColumnId) {\n tooltip = `${columnName}: ${pendingChangeWithError.errors.cells[firstCellErrorColumnId]}`;\n }\n }\n\n let row;\n try {\n row = table.getRow(pendingChangeWithError.rowId).original;\n } catch {\n // because of server loading, some rows may not be accessible\n }\n\n // the row identity when there is one, otherwise the 1-based position, which server loading can leave unknown\n let label = '';\n\n const rowIdentity = rowIdentityColumn ? row?.[rowIdentityColumn.id as keyof TType] : undefined;\n\n if (rowIdentity !== null && rowIdentity !== undefined) {\n label = String(rowIdentity);\n } else if (pendingChangeWithError.index !== undefined) {\n label = String(pendingChangeWithError.index + 1);\n }\n\n links.push(\n <Tooltip key={pendingChangeWithError.rowId} title={tooltip ?? ''}>\n <span className=\"text-blue\" onClick={handleClick} role=\"button\">\n {label}\n </span>\n </Tooltip>\n );\n\n // if appropriate, concatenate the item with the text \",\"\n if (pendingChangesWithErrors.length > 2 && index < pendingChangesWithErrors.length - 2) {\n links.push(', ');\n }\n });\n\n // generate the \"Row N is incomplete and hasn't been saved\" error message\n const message = (links.length === 1 ? validationTexts.alert.messageOne : validationTexts.alert.messagePlural)\n .split(/(\\[\\w+\\])/u)\n .map(part => {\n if (part === '[COLUMN]') {\n return rowIdentityColumn?.columnDef.meta?.header ?? validationTexts.alert.messageRow;\n }\n\n if (part === '[ROW]') {\n return links;\n }\n\n return part;\n });\n\n const handleResetFilters = () => {\n const rowId = showFilterResetDialog;\n const search = table.getState().globalFilter;\n\n table.resetGlobalFilter();\n table.resetColumnFilters();\n\n // resetting column filters reloads dataloader2 data through the filter listener, but its\n // server-side search only reloads when the search handler is called explicitly\n if (isDataLoader2 && search) {\n tableMeta.search.handleSearch?.(undefined, getHiddenColumns(table.getState().columnVisibility));\n }\n\n // defer focusing until the row model has re-rendered with the filters cleared,\n // otherwise the row isn't in the model/DOM yet\n if (typeof rowId === 'string') {\n hasScrolledToPendingRow.current = false;\n setPendingFocusRowId(rowId);\n }\n\n setShowFilterResetDialog(false);\n };\n\n // scrolls to and focuses the pending row as soon as it is (back) in the row model, e.g. after the\n // filters have been reset or, with dataloader2, once the page containing the row has loaded\n React.useEffect(() => {\n if (pendingFocusRowId === null) {\n return;\n }\n\n const visibleIndex = getVisibleRowIndex(pendingFocusRowId);\n\n if (visibleIndex > -1) {\n scrollToRow(getDatasetRowIndex(visibleIndex));\n setPendingFocusRowId(null);\n hasScrolledToPendingRow.current = false;\n } else if (isDataLoader2) {\n const datasetIndex = pendingChangesWithErrors.find(change => change.rowId === pendingFocusRowId)?.index;\n const targetPageLoaded =\n datasetIndex !== undefined &&\n !!tableMeta.server.pages?.includes(Math.floor(datasetIndex / tableMeta.server.pageSize));\n\n // stop chasing when the change is gone, or when the page at the stored index has loaded\n // without the row - the snapshot is stale (e.g. sorting changed since the error was recorded)\n if (datasetIndex === undefined || (targetPageLoaded && hasScrolledToPendingRow.current)) {\n setPendingFocusRowId(null);\n hasScrolledToPendingRow.current = false;\n } else {\n // the row sits in a page that isn't loaded - scroll towards its last known dataset index so\n // the skeleton rows load their pages, then this effect runs again once the row model updates\n hasScrolledToPendingRow.current = true;\n scrollToIndex(datasetIndex, { align: 'center' });\n }\n }\n }, [pendingFocusRowId, visibleRows]);\n\n return (\n <>\n <BaseAlert {...attributes} state=\"error\">\n <span className=\"font-bold\">{title}</span>&nbsp;{message}\n </BaseAlert>\n <FilterResetDialog\n open={showFilterResetDialog !== false}\n onChange={() => setShowFilterResetDialog(false)}\n onSubmit={handleResetFilters}\n />\n </>\n );\n}\n\ntype FilterResetDialogProps = Omit<DialogProps, 'children'> & {\n onSubmit: () => void;\n};\n\nfunction FilterResetDialog(props: FilterResetDialogProps) {\n const { onSubmit: handleSubmit, ...dialogProps } = props;\n const { texts } = useLocalization();\n\n return (\n <Dialog {...dialogProps} size=\"xs\">\n <Dialog.Content aria-label={texts.table3.editing.validation.resetFiltersDialog.title}>\n <Dialog.Title>{texts.table3.editing.validation.resetFiltersDialog.title}</Dialog.Title>\n <p>{texts.table3.editing.validation.resetFiltersDialog.description}</p>\n <Dialog.Footer>\n <Inline spacing={8} alignInline=\"end\">\n <Dialog.Close>\n <Button>{texts.table3.editing.validation.resetFiltersDialog.cancel}</Button>\n </Dialog.Close>\n <Button variant=\"primary\" onClick={handleSubmit}>\n {texts.table3.editing.validation.resetFiltersDialog.confirm}\n </Button>\n </Inline>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n}\n"],"names":["useLocalization","getTableMeta","Tooltip","getHiddenColumns","BaseAlert","Dialog","Inline","Button"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import React__default from "react";
2
+ import { getHiddenColumns } from "../../../../primitives/Table/useTableManager/util/columns.js";
2
3
  import { getTableMeta } from "../../../../primitives/Table/useTableManager/util/rows.js";
3
4
  import { useLocalization } from "../../../Provider/Localization.js";
4
5
  import { Tooltip } from "../../../Tooltip/Tooltip.js";
@@ -13,10 +14,26 @@ function Alert(props) {
13
14
  const tableMeta = getTableMeta(table);
14
15
  const [showFilterResetDialog, setShowFilterResetDialog] = React__default.useState(false);
15
16
  const [pendingFocusRowId, setPendingFocusRowId] = React__default.useState(null);
17
+ const hasScrolledToPendingRow = React__default.useRef(false);
16
18
  const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert();
19
+ const isDataLoader2 = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2;
17
20
  const visibleRows = table.getRowModel().rows;
18
21
  function getVisibleRowIndex(rowId) {
19
- return visibleRows.findIndex((row) => row.id === rowId);
22
+ return visibleRows.findIndex((row) => row.original !== void 0 && row.id === rowId);
23
+ }
24
+ function getDatasetRowIndex(visibleIndex) {
25
+ if (!isDataLoader2) {
26
+ return visibleIndex;
27
+ }
28
+ const pageSize = tableMeta.server.pageSize;
29
+ const pageIndex = tableMeta.server.pages?.[Math.floor(visibleIndex / pageSize)];
30
+ if (pageIndex === void 0) {
31
+ return visibleIndex;
32
+ }
33
+ return pageIndex * pageSize + visibleIndex % pageSize;
34
+ }
35
+ function hasActiveFilters() {
36
+ return !!table.getState().columnFilters.length || !!table.getState().globalFilter;
20
37
  }
21
38
  function scrollToRow(rowIndex) {
22
39
  tableMeta.rowActive.setRowActiveIndex(rowIndex);
@@ -42,9 +59,9 @@ function Alert(props) {
42
59
  links.push(` ${validationTexts.alert.messageAnd} `);
43
60
  }
44
61
  const handleClick = () => {
45
- const visibleIndex = getVisibleRowIndex(pendingChangeWithError.rowId);
46
- if (visibleIndex > -1) {
47
- scrollToRow(visibleIndex);
62
+ if (getVisibleRowIndex(pendingChangeWithError.rowId) > -1 || isDataLoader2 && !hasActiveFilters()) {
63
+ hasScrolledToPendingRow.current = false;
64
+ setPendingFocusRowId(pendingChangeWithError.rowId);
48
65
  } else {
49
66
  setShowFilterResetDialog(pendingChangeWithError.rowId);
50
67
  }
@@ -89,9 +106,14 @@ function Alert(props) {
89
106
  });
90
107
  const handleResetFilters = () => {
91
108
  const rowId = showFilterResetDialog;
109
+ const search = table.getState().globalFilter;
92
110
  table.resetGlobalFilter();
93
111
  table.resetColumnFilters();
112
+ if (isDataLoader2 && search) {
113
+ tableMeta.search.handleSearch?.(void 0, getHiddenColumns(table.getState().columnVisibility));
114
+ }
94
115
  if (typeof rowId === "string") {
116
+ hasScrolledToPendingRow.current = false;
95
117
  setPendingFocusRowId(rowId);
96
118
  }
97
119
  setShowFilterResetDialog(false);
@@ -102,8 +124,19 @@ function Alert(props) {
102
124
  }
103
125
  const visibleIndex = getVisibleRowIndex(pendingFocusRowId);
104
126
  if (visibleIndex > -1) {
105
- scrollToRow(visibleIndex);
127
+ scrollToRow(getDatasetRowIndex(visibleIndex));
106
128
  setPendingFocusRowId(null);
129
+ hasScrolledToPendingRow.current = false;
130
+ } else if (isDataLoader2) {
131
+ const datasetIndex = pendingChangesWithErrors.find((change) => change.rowId === pendingFocusRowId)?.index;
132
+ const targetPageLoaded = datasetIndex !== void 0 && !!tableMeta.server.pages?.includes(Math.floor(datasetIndex / tableMeta.server.pageSize));
133
+ if (datasetIndex === void 0 || targetPageLoaded && hasScrolledToPendingRow.current) {
134
+ setPendingFocusRowId(null);
135
+ hasScrolledToPendingRow.current = false;
136
+ } else {
137
+ hasScrolledToPendingRow.current = true;
138
+ scrollToIndex(datasetIndex, { align: "center" });
139
+ }
107
140
  }
108
141
  }, [pendingFocusRowId, visibleRows]);
109
142
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Alert$1, { ...attributes, state: "error" }, /* @__PURE__ */ React__default.createElement("span", { className: "font-bold" }, title), " ", message), /* @__PURE__ */ React__default.createElement(
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.js","sources":["../../../../../src/components/Table3/components/Editing/Alert.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport type { ScrollToOptions as ReactVirtualScrollToOptions } from '@tanstack/react-virtual';\nimport React from 'react';\n\nimport type { AlertProps as BaseAlertProps, DialogProps } from '@/components';\nimport { Alert as BaseAlert, Button, Dialog, Inline, Tooltip, useLocalization } from '@/components';\nimport type { TableRef } from '@/primitives/Table/types';\nimport { getTableMeta } from '@/primitives/Table/useTableManager/util/rows';\n\ntype AlertProps<TType = unknown> = Omit<BaseAlertProps, 'children'> & {\n scrollToIndex: (index: number, options: ReactVirtualScrollToOptions) => void;\n table: ReactTable<TType>;\n tableRef: React.RefObject<TableRef>;\n};\n\nexport function Alert<TType = unknown>(props: AlertProps<TType>) {\n const { scrollToIndex, table, tableRef, ...attributes } = props;\n const { texts } = useLocalization();\n const validationTexts = texts.table3.editing.validation;\n const tableMeta = getTableMeta(table);\n const [showFilterResetDialog, setShowFilterResetDialog] = React.useState<string | false>(false);\n // row to scroll to and focus once the filters have been reset and it becomes visible again\n const [pendingFocusRowId, setPendingFocusRowId] = React.useState<string | null>(null);\n const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert<TType>();\n\n const visibleRows = table.getRowModel().rows;\n\n function getVisibleRowIndex(rowId: string) {\n return visibleRows.findIndex(row => row.id === rowId);\n }\n\n function scrollToRow(rowIndex: number) {\n tableMeta.rowActive.setRowActiveIndex(rowIndex);\n scrollToIndex(rowIndex, { align: 'center' });\n\n requestAnimationFrame(() => {\n const cell = tableRef.current?.querySelector(\n 'tbody > tr[data-row-active=\"true\"] > td[data-cell-editing-invalid=\"true\"]'\n );\n\n if (cell) {\n (cell as HTMLElement).focus?.();\n }\n });\n }\n\n // generate the \"N unsaved entries\" title\n const title = (\n pendingChangesWithErrors.length === 1 ? validationTexts.alert.titleOne : validationTexts.alert.titlePlural\n ).replace('[COUNT]', String(pendingChangesWithErrors.length));\n\n // generate links to each invalid row, to go into the error message\n const links: React.ReactNode[] = [];\n const visibleColumns = table.getVisibleFlatColumns().map(c => c.id);\n const rowIdentityColumn =\n // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505\n tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor))\n ? table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor))\n : undefined;\n\n pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {\n // if appropriate, concatenate the item with the text \"and\"\n if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {\n // Add space before and after `messageAnd` text\n links.push(` ${validationTexts.alert.messageAnd} `);\n }\n\n const handleClick = () => {\n const visibleIndex = getVisibleRowIndex(pendingChangeWithError.rowId);\n\n if (visibleIndex > -1) {\n scrollToRow(visibleIndex);\n } else {\n setShowFilterResetDialog(pendingChangeWithError.rowId);\n }\n };\n\n let tooltip;\n\n if (pendingChangeWithError.errors.row) {\n tooltip = pendingChangeWithError.errors.row;\n } else {\n const firstCellErrorColumnId = Object.keys(pendingChangeWithError.errors.cells)[0];\n const columnName = table.getAllColumns().find(column => column.id === firstCellErrorColumnId)?.columnDef.meta?.header;\n\n if (columnName && firstCellErrorColumnId) {\n tooltip = `${columnName}: ${pendingChangeWithError.errors.cells[firstCellErrorColumnId]}`;\n }\n }\n\n let row;\n try {\n row = table.getRow(pendingChangeWithError.rowId).original;\n } catch {\n // because of server loading, some rows may not be accessible\n }\n\n // the row identity when there is one, otherwise the 1-based position, which server loading can leave unknown\n let label = '';\n\n const rowIdentity = rowIdentityColumn ? row?.[rowIdentityColumn.id as keyof TType] : undefined;\n\n if (rowIdentity !== null && rowIdentity !== undefined) {\n label = String(rowIdentity);\n } else if (pendingChangeWithError.index !== undefined) {\n label = String(pendingChangeWithError.index + 1);\n }\n\n links.push(\n <Tooltip key={pendingChangeWithError.rowId} title={tooltip ?? ''}>\n <span className=\"text-blue\" onClick={handleClick} role=\"button\">\n {label}\n </span>\n </Tooltip>\n );\n\n // if appropriate, concatenate the item with the text \",\"\n if (pendingChangesWithErrors.length > 2 && index < pendingChangesWithErrors.length - 2) {\n links.push(', ');\n }\n });\n\n // generate the \"Row N is incomplete and hasn't been saved\" error message\n const message = (links.length === 1 ? validationTexts.alert.messageOne : validationTexts.alert.messagePlural)\n .split(/(\\[\\w+\\])/u)\n .map(part => {\n if (part === '[COLUMN]') {\n return rowIdentityColumn?.columnDef.meta?.header ?? validationTexts.alert.messageRow;\n }\n\n if (part === '[ROW]') {\n return links;\n }\n\n return part;\n });\n\n const handleResetFilters = () => {\n const rowId = showFilterResetDialog;\n\n table.resetGlobalFilter();\n table.resetColumnFilters();\n\n // defer focusing until the row model has re-rendered with the filters cleared,\n // otherwise the row isn't in the model/DOM yet\n if (typeof rowId === 'string') {\n setPendingFocusRowId(rowId);\n }\n\n setShowFilterResetDialog(false);\n };\n\n // once the filters are reset and the previously hidden row is visible again, scroll to and focus it\n React.useEffect(() => {\n if (pendingFocusRowId === null) {\n return;\n }\n\n const visibleIndex = getVisibleRowIndex(pendingFocusRowId);\n\n if (visibleIndex > -1) {\n scrollToRow(visibleIndex);\n setPendingFocusRowId(null);\n }\n }, [pendingFocusRowId, visibleRows]);\n\n return (\n <>\n <BaseAlert {...attributes} state=\"error\">\n <span className=\"font-bold\">{title}</span>&nbsp;{message}\n </BaseAlert>\n <FilterResetDialog\n open={showFilterResetDialog !== false}\n onChange={() => setShowFilterResetDialog(false)}\n onSubmit={handleResetFilters}\n />\n </>\n );\n}\n\ntype FilterResetDialogProps = Omit<DialogProps, 'children'> & {\n onSubmit: () => void;\n};\n\nfunction FilterResetDialog(props: FilterResetDialogProps) {\n const { onSubmit: handleSubmit, ...dialogProps } = props;\n const { texts } = useLocalization();\n\n return (\n <Dialog {...dialogProps} size=\"xs\">\n <Dialog.Content aria-label={texts.table3.editing.validation.resetFiltersDialog.title}>\n <Dialog.Title>{texts.table3.editing.validation.resetFiltersDialog.title}</Dialog.Title>\n <p>{texts.table3.editing.validation.resetFiltersDialog.description}</p>\n <Dialog.Footer>\n <Inline spacing={8} alignInline=\"end\">\n <Dialog.Close>\n <Button>{texts.table3.editing.validation.resetFiltersDialog.cancel}</Button>\n </Dialog.Close>\n <Button variant=\"primary\" onClick={handleSubmit}>\n {texts.table3.editing.validation.resetFiltersDialog.confirm}\n </Button>\n </Inline>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n}\n"],"names":["React","BaseAlert"],"mappings":"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"}
1
+ {"version":3,"file":"Alert.js","sources":["../../../../../src/components/Table3/components/Editing/Alert.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport type { ScrollToOptions as ReactVirtualScrollToOptions } from '@tanstack/react-virtual';\nimport React from 'react';\n\nimport type { AlertProps as BaseAlertProps, DialogProps } from '@/components';\nimport { Alert as BaseAlert, Button, Dialog, Inline, Tooltip, useLocalization } from '@/components';\nimport type { TableRef } from '@/primitives/Table/types';\nimport { getHiddenColumns } from '@/primitives/Table/useTableManager/util/columns';\nimport { getTableMeta } from '@/primitives/Table/useTableManager/util/rows';\n\ntype AlertProps<TType = unknown> = Omit<BaseAlertProps, 'children'> & {\n scrollToIndex: (index: number, options: ReactVirtualScrollToOptions) => void;\n table: ReactTable<TType>;\n tableRef: React.RefObject<TableRef>;\n};\n\nexport function Alert<TType = unknown>(props: AlertProps<TType>) {\n const { scrollToIndex, table, tableRef, ...attributes } = props;\n const { texts } = useLocalization();\n const validationTexts = texts.table3.editing.validation;\n const tableMeta = getTableMeta(table);\n const [showFilterResetDialog, setShowFilterResetDialog] = React.useState<string | false>(false);\n // row to scroll to and focus once the filters have been reset and it becomes visible again\n const [pendingFocusRowId, setPendingFocusRowId] = React.useState<string | null>(null);\n // whether the pending focus effect has already scrolled towards the pending row's stored index\n const hasScrolledToPendingRow = React.useRef(false);\n const pendingChangesWithErrors = tableMeta.editing.getErrorsShownInAlert<TType>();\n\n const isDataLoader2 = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2;\n const visibleRows = table.getRowModel().rows;\n\n function getVisibleRowIndex(rowId: string) {\n // rows in unloaded dataloader2 pages are placeholders with an index-based id, which can\n // collide with a real row id - so only match rows that actually have data\n return visibleRows.findIndex(row => row.original !== undefined && row.id === rowId);\n }\n\n // with dataloader2 the row model only contains the loaded window of pages while row indexes span\n // the full dataset, so a row model index has to be mapped onto its dataset index before scrolling\n function getDatasetRowIndex(visibleIndex: number) {\n if (!isDataLoader2) {\n return visibleIndex;\n }\n\n const pageSize = tableMeta.server.pageSize;\n const pageIndex = tableMeta.server.pages?.[Math.floor(visibleIndex / pageSize)];\n\n // page 0 is a valid loaded page, so only fall back when the page is actually unknown\n if (pageIndex === undefined) {\n return visibleIndex;\n }\n\n return pageIndex * pageSize + (visibleIndex % pageSize);\n }\n\n function hasActiveFilters() {\n return !!table.getState().columnFilters.length || !!table.getState().globalFilter;\n }\n\n function scrollToRow(rowIndex: number) {\n tableMeta.rowActive.setRowActiveIndex(rowIndex);\n scrollToIndex(rowIndex, { align: 'center' });\n\n requestAnimationFrame(() => {\n const cell = tableRef.current?.querySelector(\n 'tbody > tr[data-row-active=\"true\"] > td[data-cell-editing-invalid=\"true\"]'\n );\n\n if (cell) {\n (cell as HTMLElement).focus?.();\n }\n });\n }\n\n // generate the \"N unsaved entries\" title\n const title = (\n pendingChangesWithErrors.length === 1 ? validationTexts.alert.titleOne : validationTexts.alert.titlePlural\n ).replace('[COUNT]', String(pendingChangesWithErrors.length));\n\n // generate links to each invalid row, to go into the error message\n const links: React.ReactNode[] = [];\n const visibleColumns = table.getVisibleFlatColumns().map(c => c.id);\n const rowIdentityColumn =\n // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505\n tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor))\n ? table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor))\n : undefined;\n\n pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {\n // if appropriate, concatenate the item with the text \"and\"\n if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {\n // Add space before and after `messageAnd` text\n links.push(` ${validationTexts.alert.messageAnd} `);\n }\n\n const handleClick = () => {\n // the pending focus effect below owns scrolling/focusing: it scrolls immediately when the row\n // is in the row model, and chases the row into view when it sits in an unloaded dataloader2\n // page (with no active filters a missing row isn't filtered out, just not loaded yet)\n if (getVisibleRowIndex(pendingChangeWithError.rowId) > -1 || (isDataLoader2 && !hasActiveFilters())) {\n hasScrolledToPendingRow.current = false;\n setPendingFocusRowId(pendingChangeWithError.rowId);\n } else {\n setShowFilterResetDialog(pendingChangeWithError.rowId);\n }\n };\n\n let tooltip;\n\n if (pendingChangeWithError.errors.row) {\n tooltip = pendingChangeWithError.errors.row;\n } else {\n const firstCellErrorColumnId = Object.keys(pendingChangeWithError.errors.cells)[0];\n const columnName = table.getAllColumns().find(column => column.id === firstCellErrorColumnId)?.columnDef.meta?.header;\n\n if (columnName && firstCellErrorColumnId) {\n tooltip = `${columnName}: ${pendingChangeWithError.errors.cells[firstCellErrorColumnId]}`;\n }\n }\n\n let row;\n try {\n row = table.getRow(pendingChangeWithError.rowId).original;\n } catch {\n // because of server loading, some rows may not be accessible\n }\n\n // the row identity when there is one, otherwise the 1-based position, which server loading can leave unknown\n let label = '';\n\n const rowIdentity = rowIdentityColumn ? row?.[rowIdentityColumn.id as keyof TType] : undefined;\n\n if (rowIdentity !== null && rowIdentity !== undefined) {\n label = String(rowIdentity);\n } else if (pendingChangeWithError.index !== undefined) {\n label = String(pendingChangeWithError.index + 1);\n }\n\n links.push(\n <Tooltip key={pendingChangeWithError.rowId} title={tooltip ?? ''}>\n <span className=\"text-blue\" onClick={handleClick} role=\"button\">\n {label}\n </span>\n </Tooltip>\n );\n\n // if appropriate, concatenate the item with the text \",\"\n if (pendingChangesWithErrors.length > 2 && index < pendingChangesWithErrors.length - 2) {\n links.push(', ');\n }\n });\n\n // generate the \"Row N is incomplete and hasn't been saved\" error message\n const message = (links.length === 1 ? validationTexts.alert.messageOne : validationTexts.alert.messagePlural)\n .split(/(\\[\\w+\\])/u)\n .map(part => {\n if (part === '[COLUMN]') {\n return rowIdentityColumn?.columnDef.meta?.header ?? validationTexts.alert.messageRow;\n }\n\n if (part === '[ROW]') {\n return links;\n }\n\n return part;\n });\n\n const handleResetFilters = () => {\n const rowId = showFilterResetDialog;\n const search = table.getState().globalFilter;\n\n table.resetGlobalFilter();\n table.resetColumnFilters();\n\n // resetting column filters reloads dataloader2 data through the filter listener, but its\n // server-side search only reloads when the search handler is called explicitly\n if (isDataLoader2 && search) {\n tableMeta.search.handleSearch?.(undefined, getHiddenColumns(table.getState().columnVisibility));\n }\n\n // defer focusing until the row model has re-rendered with the filters cleared,\n // otherwise the row isn't in the model/DOM yet\n if (typeof rowId === 'string') {\n hasScrolledToPendingRow.current = false;\n setPendingFocusRowId(rowId);\n }\n\n setShowFilterResetDialog(false);\n };\n\n // scrolls to and focuses the pending row as soon as it is (back) in the row model, e.g. after the\n // filters have been reset or, with dataloader2, once the page containing the row has loaded\n React.useEffect(() => {\n if (pendingFocusRowId === null) {\n return;\n }\n\n const visibleIndex = getVisibleRowIndex(pendingFocusRowId);\n\n if (visibleIndex > -1) {\n scrollToRow(getDatasetRowIndex(visibleIndex));\n setPendingFocusRowId(null);\n hasScrolledToPendingRow.current = false;\n } else if (isDataLoader2) {\n const datasetIndex = pendingChangesWithErrors.find(change => change.rowId === pendingFocusRowId)?.index;\n const targetPageLoaded =\n datasetIndex !== undefined &&\n !!tableMeta.server.pages?.includes(Math.floor(datasetIndex / tableMeta.server.pageSize));\n\n // stop chasing when the change is gone, or when the page at the stored index has loaded\n // without the row - the snapshot is stale (e.g. sorting changed since the error was recorded)\n if (datasetIndex === undefined || (targetPageLoaded && hasScrolledToPendingRow.current)) {\n setPendingFocusRowId(null);\n hasScrolledToPendingRow.current = false;\n } else {\n // the row sits in a page that isn't loaded - scroll towards its last known dataset index so\n // the skeleton rows load their pages, then this effect runs again once the row model updates\n hasScrolledToPendingRow.current = true;\n scrollToIndex(datasetIndex, { align: 'center' });\n }\n }\n }, [pendingFocusRowId, visibleRows]);\n\n return (\n <>\n <BaseAlert {...attributes} state=\"error\">\n <span className=\"font-bold\">{title}</span>&nbsp;{message}\n </BaseAlert>\n <FilterResetDialog\n open={showFilterResetDialog !== false}\n onChange={() => setShowFilterResetDialog(false)}\n onSubmit={handleResetFilters}\n />\n </>\n );\n}\n\ntype FilterResetDialogProps = Omit<DialogProps, 'children'> & {\n onSubmit: () => void;\n};\n\nfunction FilterResetDialog(props: FilterResetDialogProps) {\n const { onSubmit: handleSubmit, ...dialogProps } = props;\n const { texts } = useLocalization();\n\n return (\n <Dialog {...dialogProps} size=\"xs\">\n <Dialog.Content aria-label={texts.table3.editing.validation.resetFiltersDialog.title}>\n <Dialog.Title>{texts.table3.editing.validation.resetFiltersDialog.title}</Dialog.Title>\n <p>{texts.table3.editing.validation.resetFiltersDialog.description}</p>\n <Dialog.Footer>\n <Inline spacing={8} alignInline=\"end\">\n <Dialog.Close>\n <Button>{texts.table3.editing.validation.resetFiltersDialog.cancel}</Button>\n </Dialog.Close>\n <Button variant=\"primary\" onClick={handleSubmit}>\n {texts.table3.editing.validation.resetFiltersDialog.confirm}\n </Button>\n </Inline>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n}\n"],"names":["React","BaseAlert"],"mappings":"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"}
@@ -37,16 +37,21 @@ const MemoedGroupedCell = React.memo(function MemoedGroupedCell2(props) {
37
37
  const { canShowActions, cellRef, children, colSpan, rowActions: rowActions$1, rowId, subRows, table, ...attributes } = props;
38
38
  return (
39
39
  // pr-1 is needed to align group row actions with row actions in sibling rows, if present
40
- /* @__PURE__ */ React.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React.createElement("span", { className: "grow" }, children), rowActions.hasRowActions(rowActions$1) && canShowActions ? /* @__PURE__ */ React.createElement(
41
- Actions.Actions,
42
- {
43
- actions: rowActions$1,
44
- actionsLength: 4,
45
- data: subRows,
46
- isActiveRow: true,
47
- rowId,
48
- table
49
- }
40
+ /* @__PURE__ */ React.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React.createElement("span", { className: "grow" }, children), rowActions.hasRowActions(rowActions$1) && canShowActions ? (
41
+ // the cell spans the full row, so when the table overflows horizontally the actions would sit
42
+ // beyond the scrollport - stick this wrapper to its right edge, like the row actions
43
+ // column in sibling rows (right-1 matches that column's pr-1 inset)
44
+ /* @__PURE__ */ React.createElement("span", { className: "sticky right-1 bg-[inherit] print:hidden", "data-taco": "table-row-group-actions" }, /* @__PURE__ */ React.createElement(
45
+ Actions.Actions,
46
+ {
47
+ actions: rowActions$1,
48
+ actionsLength: 4,
49
+ data: subRows,
50
+ isActiveRow: true,
51
+ rowId,
52
+ table
53
+ }
54
+ ))
50
55
  ) : null)
51
56
  );
52
57
  });
@@ -1 +1 @@
1
- {"version":3,"file":"GroupedCell.cjs","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport { getTableMeta } from '../../../../../useTableManager/util/rows';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = getTableMeta(table);\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n <RowGroupActions<TType>\n // TOOD: remove \"as\" when we'll migrate to a new API and get rid of mixed array types\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["getTableMeta","getCellAttributes","RowContext","isInternalColumn","MemoedGroupedCell","rowActions","hasRowActions","RowGroupActions"],"mappings":";;;;;;;;;AAYO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAYA,KAAAA,aAAa,KAAK;AACpC,QAAM,aAAaC,KAAAA,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAa,MAAM,WAAWC,WAAAA,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAACC,QAAAA,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoB,MAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAA,YAASC,cAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEI,sBAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzG,sBAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChCC,WAAAA,cAAcD,YAAU,KAAK,iBAC1B,sBAAA;AAAA,MAACE,QAAAA;AAAAA,MAAA;AAAA,QAEG,SAASF;AAAAA,QACT,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,IAEJ,IACR;AAAA;AAER,CAAC;;"}
1
+ {"version":3,"file":"GroupedCell.cjs","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport { getTableMeta } from '../../../../../useTableManager/util/rows';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = getTableMeta(table);\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n // the cell spans the full row, so when the table overflows horizontally the actions would sit\n // beyond the scrollport - stick this wrapper to its right edge, like the row actions\n // column in sibling rows (right-1 matches that column's pr-1 inset)\n <span className=\"sticky right-1 bg-[inherit] print:hidden\" data-taco=\"table-row-group-actions\">\n <RowGroupActions<TType>\n // TOOD: remove \"as\" when we'll migrate to a new API and get rid of mixed array types\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n </span>\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["getTableMeta","getCellAttributes","RowContext","isInternalColumn","MemoedGroupedCell","rowActions","hasRowActions","RowGroupActions"],"mappings":";;;;;;;;;AAYO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAYA,KAAAA,aAAa,KAAK;AACpC,QAAM,aAAaC,KAAAA,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAa,MAAM,WAAWC,WAAAA,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAACC,QAAAA,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoB,MAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAA,YAASC,cAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEI,sBAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzG,sBAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChCC,WAAAA,cAAcD,YAAU,KAAK;AAAA;AAAA;AAAA;AAAA,MAI1B,sBAAA,cAAC,QAAA,EAAK,WAAU,4CAA2C,aAAU,6BACjE,sBAAA;AAAA,QAACE,QAAAA;AAAAA,QAAA;AAAA,UAEG,SAASF;AAAAA,UACT,eAAe;AAAA,UACf,MAAM;AAAA,UACN,aAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA;AAAA,MAAA,CAER;AAAA,QACA,IACR;AAAA;AAER,CAAC;;"}
@@ -35,16 +35,21 @@ const MemoedGroupedCell = React__default.memo(function MemoedGroupedCell2(props)
35
35
  const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;
36
36
  return (
37
37
  // pr-1 is needed to align group row actions with row actions in sibling rows, if present
38
- /* @__PURE__ */ React__default.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React__default.createElement("span", { className: "grow" }, children), hasRowActions(rowActions) && canShowActions ? /* @__PURE__ */ React__default.createElement(
39
- Actions,
40
- {
41
- actions: rowActions,
42
- actionsLength: 4,
43
- data: subRows,
44
- isActiveRow: true,
45
- rowId,
46
- table
47
- }
38
+ /* @__PURE__ */ React__default.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React__default.createElement("span", { className: "grow" }, children), hasRowActions(rowActions) && canShowActions ? (
39
+ // the cell spans the full row, so when the table overflows horizontally the actions would sit
40
+ // beyond the scrollport - stick this wrapper to its right edge, like the row actions
41
+ // column in sibling rows (right-1 matches that column's pr-1 inset)
42
+ /* @__PURE__ */ React__default.createElement("span", { className: "sticky right-1 bg-[inherit] print:hidden", "data-taco": "table-row-group-actions" }, /* @__PURE__ */ React__default.createElement(
43
+ Actions,
44
+ {
45
+ actions: rowActions,
46
+ actionsLength: 4,
47
+ data: subRows,
48
+ isActiveRow: true,
49
+ rowId,
50
+ table
51
+ }
52
+ ))
48
53
  ) : null)
49
54
  );
50
55
  });
@@ -1 +1 @@
1
- {"version":3,"file":"GroupedCell.js","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport { getTableMeta } from '../../../../../useTableManager/util/rows';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = getTableMeta(table);\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n <RowGroupActions<TType>\n // TOOD: remove \"as\" when we'll migrate to a new API and get rid of mixed array types\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["React","MemoedGroupedCell","RowGroupActions"],"mappings":";;;;;;;AAYO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,aAAa,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAaA,eAAM,WAAW,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoBA,eAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAS,YAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEID,+BAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzGA,+BAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChC,cAAc,UAAU,KAAK,iBAC1BA,+BAAA;AAAA,MAACE;AAAAA,MAAA;AAAA,QAEG,SAAS;AAAA,QACT,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,IAEJ,IACR;AAAA;AAER,CAAC;"}
1
+ {"version":3,"file":"GroupedCell.js","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport { getTableMeta } from '../../../../../useTableManager/util/rows';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = getTableMeta(table);\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n // the cell spans the full row, so when the table overflows horizontally the actions would sit\n // beyond the scrollport - stick this wrapper to its right edge, like the row actions\n // column in sibling rows (right-1 matches that column's pr-1 inset)\n <span className=\"sticky right-1 bg-[inherit] print:hidden\" data-taco=\"table-row-group-actions\">\n <RowGroupActions<TType>\n // TOOD: remove \"as\" when we'll migrate to a new API and get rid of mixed array types\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n </span>\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["React","MemoedGroupedCell","RowGroupActions"],"mappings":";;;;;;;AAYO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,aAAa,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAaA,eAAM,WAAW,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoBA,eAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAS,YAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEID,+BAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzGA,+BAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChC,cAAc,UAAU,KAAK;AAAA;AAAA;AAAA;AAAA,MAI1BA,+BAAA,cAAC,QAAA,EAAK,WAAU,4CAA2C,aAAU,6BACjEA,+BAAA;AAAA,QAACE;AAAAA,QAAA;AAAA,UAEG,SAAS;AAAA,UACT,eAAe;AAAA,UACf,MAAM;AAAA,UACN,aAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA;AAAA,MAAA,CAER;AAAA,QACA,IACR;AAAA;AAER,CAAC;"}
@@ -46,7 +46,7 @@ const toggleBetween = (fromRowIndex, toRowIndex) => {
46
46
  function Cell(context) {
47
47
  const { texts } = Localization.useLocalization();
48
48
  const { row, table } = context;
49
- const { hideInternalColumns, rowIndex } = React.useContext(RowContext.RowContext);
49
+ const { hideInternalColumns } = React.useContext(RowContext.RowContext);
50
50
  const tableMeta = rows.getTableMeta(table);
51
51
  if (hideInternalColumns || table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped()) {
52
52
  return null;
@@ -59,7 +59,7 @@ function Cell(context) {
59
59
  if (row.getIsGrouped()) {
60
60
  row.subRows.forEach((row2) => row2.toggleSelected());
61
61
  } else if (event.shiftKey) {
62
- const [fromIndex, toIndex] = toggleBetween(tableMeta.rowSelection.lastSelectedRowIndex.current ?? 0, rowIndex);
62
+ const lastSelectedRowId = tableMeta.rowSelection.lastSelectedRowId.current;
63
63
  if (tableMeta.server.loadAllIfNeeded) {
64
64
  const hiddenColumns = columns.getHiddenColumns(table.getState().columnVisibility);
65
65
  await tableMeta.server.loadAllIfNeeded(
@@ -69,15 +69,24 @@ function Cell(context) {
69
69
  tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : void 0
70
70
  );
71
71
  }
72
- const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);
73
- table.setRowSelection((currentRowSelection) => ({
74
- ...currentRowSelection,
75
- ...selectedRows.filter((row2) => row2.getCanSelect()).reduce((state, row2) => ({ ...state, [row2.id]: true }), {})
76
- }));
72
+ requestAnimationFrame(() => {
73
+ const rows2 = table.getRowModel().rows;
74
+ const clickedRowIndex = rows2.findIndex(({ id }) => id === row.id);
75
+ const lastSelectedRowIndex = lastSelectedRowId === void 0 ? 0 : rows2.findIndex(({ id }) => id === lastSelectedRowId);
76
+ const [fromIndex, toIndex] = toggleBetween(
77
+ lastSelectedRowIndex === -1 ? clickedRowIndex : lastSelectedRowIndex,
78
+ clickedRowIndex
79
+ );
80
+ const selectedRows = clickedRowIndex === -1 ? [row] : rows2.slice(fromIndex, toIndex + 1);
81
+ table.setRowSelection((currentRowSelection) => ({
82
+ ...currentRowSelection,
83
+ ...selectedRows.filter((row2) => row2.getCanSelect()).reduce((state, row2) => ({ ...state, [row2.id]: true }), {})
84
+ }));
85
+ });
77
86
  } else {
78
87
  row.toggleSelected();
79
88
  }
80
- tableMeta.rowSelection.lastSelectedRowIndex.current = row.index;
89
+ tableMeta.rowSelection.lastSelectedRowId.current = row.id;
81
90
  };
82
91
  return /* @__PURE__ */ React.createElement(
83
92
  Tooltip.Tooltip,
@@ -1 +1 @@
1
- {"version":3,"file":"Selection.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Selection.tsx"],"sourcesContent":["import type {\n HeaderContext as ReactTableHeaderContext,\n CellContext as ReactTableCellContext,\n RowSelectionState,\n} from '@tanstack/react-table';\nimport React from 'react';\n\nimport { Checkbox, Spinner, Tooltip, Shortcut, useLocalization } from '@/components';\n\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { getHiddenColumns } from '../../../../useTableManager/util/columns';\nimport { getTableMeta } from '../../../../useTableManager/util/rows';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction Header<TType = unknown>(context: ReactTableHeaderContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { table } = context;\n const tableMeta = getTableMeta(table);\n\n const isAllRowsSelected = table.getIsAllRowsSelected();\n const isSomeRowsSelected = table.getIsSomeRowsSelected();\n const title = isAllRowsSelected ? texts.table.columns.select.deselectAll : texts.table.columns.select.selectAll;\n\n const handleChange = async (checked: boolean) => {\n // load all data if that is possible (only needed when selecting all, not when deselecting)\n if (checked && tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // setTimeout here fixes issue related React 18's automatic batching:\n // Selection should be applied after all rows are loaded\n setTimeout(() => table.toggleAllRowsSelected(checked), 1);\n };\n\n return (\n <Tooltip title={title}>\n {tableMeta.server.loading ? (\n <Spinner className=\"h-5 w-5 text-blue-500\" />\n ) : (\n <Checkbox\n aria-label={title}\n checked={isAllRowsSelected}\n indeterminate={isSomeRowsSelected && !isAllRowsSelected}\n onChange={handleChange}\n />\n )}\n </Tooltip>\n );\n}\n\nconst toggleBetween = (fromRowIndex: number, toRowIndex: number): [number, number] => {\n const fromIndex = toRowIndex < fromRowIndex ? toRowIndex : fromRowIndex;\n const toIndex = toRowIndex > fromRowIndex ? toRowIndex : fromRowIndex;\n\n return [fromIndex, toIndex];\n};\n\nfunction Cell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { row, table } = context;\n const { hideInternalColumns, rowIndex } = React.useContext(RowContext);\n const tableMeta = getTableMeta(table);\n\n if (hideInternalColumns || (table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped())) {\n return null;\n }\n\n const isSelected = row.getIsGrouped() ? row.getIsAllSubRowsSelected() : row.getIsSelected();\n const canSelect = row.getCanSelect();\n const title = isSelected ? texts.table.columns.select.deselect : texts.table.columns.select.select;\n\n const handleClick = async (event: React.MouseEvent) => {\n event.stopPropagation();\n\n if (row.getIsGrouped()) {\n row.subRows.forEach(row => row.toggleSelected());\n } else if (event.shiftKey) {\n const [fromIndex, toIndex] = toggleBetween(tableMeta.rowSelection.lastSelectedRowIndex.current ?? 0, rowIndex);\n\n if (tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);\n table.setRowSelection((currentRowSelection: RowSelectionState) => ({\n ...currentRowSelection,\n ...selectedRows.filter(row => row.getCanSelect()).reduce((state, row) => ({ ...state, [row.id]: true }), {}),\n }));\n } else {\n row.toggleSelected();\n }\n\n tableMeta.rowSelection.lastSelectedRowIndex.current = row.index;\n };\n\n return (\n <Tooltip\n hidden={!canSelect}\n title={\n <>\n {title}\n <Shortcut className=\"ml-2\" keys=\"Space\" />\n </>\n }>\n <Checkbox\n aria-label={title}\n checked={isSelected}\n onClick={handleClick}\n disabled={!canSelect}\n // this is necessary to remove console spam from eslint\n onChange={() => false}\n />\n </Tooltip>\n );\n}\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n size: 40,\n meta: {\n align: 'center',\n className: '!px-1',\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n headerClassName: '!px-1',\n },\n};\n"],"names":["useLocalization","getTableMeta","getHiddenColumns","Tooltip","Spinner","Checkbox","RowContext","row","Shortcut"],"mappings":"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"}
1
+ {"version":3,"file":"Selection.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Selection.tsx"],"sourcesContent":["import type {\n HeaderContext as ReactTableHeaderContext,\n CellContext as ReactTableCellContext,\n RowSelectionState,\n} from '@tanstack/react-table';\nimport React from 'react';\n\nimport { Checkbox, Spinner, Tooltip, Shortcut, useLocalization } from '@/components';\n\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { getHiddenColumns } from '../../../../useTableManager/util/columns';\nimport { getTableMeta } from '../../../../useTableManager/util/rows';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction Header<TType = unknown>(context: ReactTableHeaderContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { table } = context;\n const tableMeta = getTableMeta(table);\n\n const isAllRowsSelected = table.getIsAllRowsSelected();\n const isSomeRowsSelected = table.getIsSomeRowsSelected();\n const title = isAllRowsSelected ? texts.table.columns.select.deselectAll : texts.table.columns.select.selectAll;\n\n const handleChange = async (checked: boolean) => {\n // load all data if that is possible (only needed when selecting all, not when deselecting)\n if (checked && tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // setTimeout here fixes issue related React 18's automatic batching:\n // Selection should be applied after all rows are loaded\n setTimeout(() => table.toggleAllRowsSelected(checked), 1);\n };\n\n return (\n <Tooltip title={title}>\n {tableMeta.server.loading ? (\n <Spinner className=\"h-5 w-5 text-blue-500\" />\n ) : (\n <Checkbox\n aria-label={title}\n checked={isAllRowsSelected}\n indeterminate={isSomeRowsSelected && !isAllRowsSelected}\n onChange={handleChange}\n />\n )}\n </Tooltip>\n );\n}\n\nconst toggleBetween = (fromRowIndex: number, toRowIndex: number): [number, number] => {\n const fromIndex = toRowIndex < fromRowIndex ? toRowIndex : fromRowIndex;\n const toIndex = toRowIndex > fromRowIndex ? toRowIndex : fromRowIndex;\n\n return [fromIndex, toIndex];\n};\n\nfunction Cell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { row, table } = context;\n const { hideInternalColumns } = React.useContext(RowContext);\n const tableMeta = getTableMeta(table);\n\n if (hideInternalColumns || (table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped())) {\n return null;\n }\n\n const isSelected = row.getIsGrouped() ? row.getIsAllSubRowsSelected() : row.getIsSelected();\n const canSelect = row.getCanSelect();\n const title = isSelected ? texts.table.columns.select.deselect : texts.table.columns.select.select;\n\n const handleClick = async (event: React.MouseEvent) => {\n event.stopPropagation();\n\n if (row.getIsGrouped()) {\n row.subRows.forEach(row => row.toggleSelected());\n } else if (event.shiftKey) {\n // the anchor must be read before it is reassigned to the clicked row below\n const lastSelectedRowId = tableMeta.rowSelection.lastSelectedRowId.current;\n\n if (tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // rows fetched by loadAllIfNeeded only reach the row model when React re-renders after this handler, so resolving\n // the ids synchronously would read stale rows - defer to the next frame (handleChange in Header defers too)\n requestAnimationFrame(() => {\n // resolve ids to visible positions - data positions (row.index) don't match them when sorted or filtered\n const rows = table.getRowModel().rows;\n const clickedRowIndex = rows.findIndex(({ id }) => id === row.id);\n const lastSelectedRowIndex =\n lastSelectedRowId === undefined ? 0 : rows.findIndex(({ id }) => id === lastSelectedRowId);\n\n // if the anchor row is no longer visible (e.g. filtered out), select only the clicked row\n const [fromIndex, toIndex] = toggleBetween(\n lastSelectedRowIndex === -1 ? clickedRowIndex : lastSelectedRowIndex,\n clickedRowIndex\n );\n const selectedRows = clickedRowIndex === -1 ? [row] : rows.slice(fromIndex, toIndex + 1);\n\n table.setRowSelection((currentRowSelection: RowSelectionState) => ({\n ...currentRowSelection,\n ...selectedRows.filter(row => row.getCanSelect()).reduce((state, row) => ({ ...state, [row.id]: true }), {}),\n }));\n });\n } else {\n row.toggleSelected();\n }\n\n tableMeta.rowSelection.lastSelectedRowId.current = row.id;\n };\n\n return (\n <Tooltip\n hidden={!canSelect}\n title={\n <>\n {title}\n <Shortcut className=\"ml-2\" keys=\"Space\" />\n </>\n }>\n <Checkbox\n aria-label={title}\n checked={isSelected}\n onClick={handleClick}\n disabled={!canSelect}\n // this is necessary to remove console spam from eslint\n onChange={() => false}\n />\n </Tooltip>\n );\n}\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n size: 40,\n meta: {\n align: 'center',\n className: '!px-1',\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n headerClassName: '!px-1',\n },\n};\n"],"names":["useLocalization","getTableMeta","getHiddenColumns","Tooltip","Spinner","Checkbox","RowContext","row","rows","Shortcut"],"mappings":"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"}
@@ -44,7 +44,7 @@ const toggleBetween = (fromRowIndex, toRowIndex) => {
44
44
  function Cell(context) {
45
45
  const { texts } = useLocalization();
46
46
  const { row, table } = context;
47
- const { hideInternalColumns, rowIndex } = React__default.useContext(RowContext);
47
+ const { hideInternalColumns } = React__default.useContext(RowContext);
48
48
  const tableMeta = getTableMeta(table);
49
49
  if (hideInternalColumns || table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped()) {
50
50
  return null;
@@ -57,7 +57,7 @@ function Cell(context) {
57
57
  if (row.getIsGrouped()) {
58
58
  row.subRows.forEach((row2) => row2.toggleSelected());
59
59
  } else if (event.shiftKey) {
60
- const [fromIndex, toIndex] = toggleBetween(tableMeta.rowSelection.lastSelectedRowIndex.current ?? 0, rowIndex);
60
+ const lastSelectedRowId = tableMeta.rowSelection.lastSelectedRowId.current;
61
61
  if (tableMeta.server.loadAllIfNeeded) {
62
62
  const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
63
63
  await tableMeta.server.loadAllIfNeeded(
@@ -67,15 +67,24 @@ function Cell(context) {
67
67
  tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : void 0
68
68
  );
69
69
  }
70
- const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);
71
- table.setRowSelection((currentRowSelection) => ({
72
- ...currentRowSelection,
73
- ...selectedRows.filter((row2) => row2.getCanSelect()).reduce((state, row2) => ({ ...state, [row2.id]: true }), {})
74
- }));
70
+ requestAnimationFrame(() => {
71
+ const rows = table.getRowModel().rows;
72
+ const clickedRowIndex = rows.findIndex(({ id }) => id === row.id);
73
+ const lastSelectedRowIndex = lastSelectedRowId === void 0 ? 0 : rows.findIndex(({ id }) => id === lastSelectedRowId);
74
+ const [fromIndex, toIndex] = toggleBetween(
75
+ lastSelectedRowIndex === -1 ? clickedRowIndex : lastSelectedRowIndex,
76
+ clickedRowIndex
77
+ );
78
+ const selectedRows = clickedRowIndex === -1 ? [row] : rows.slice(fromIndex, toIndex + 1);
79
+ table.setRowSelection((currentRowSelection) => ({
80
+ ...currentRowSelection,
81
+ ...selectedRows.filter((row2) => row2.getCanSelect()).reduce((state, row2) => ({ ...state, [row2.id]: true }), {})
82
+ }));
83
+ });
75
84
  } else {
76
85
  row.toggleSelected();
77
86
  }
78
- tableMeta.rowSelection.lastSelectedRowIndex.current = row.index;
87
+ tableMeta.rowSelection.lastSelectedRowId.current = row.id;
79
88
  };
80
89
  return /* @__PURE__ */ React__default.createElement(
81
90
  Tooltip,
@@ -1 +1 @@
1
- {"version":3,"file":"Selection.js","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Selection.tsx"],"sourcesContent":["import type {\n HeaderContext as ReactTableHeaderContext,\n CellContext as ReactTableCellContext,\n RowSelectionState,\n} from '@tanstack/react-table';\nimport React from 'react';\n\nimport { Checkbox, Spinner, Tooltip, Shortcut, useLocalization } from '@/components';\n\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { getHiddenColumns } from '../../../../useTableManager/util/columns';\nimport { getTableMeta } from '../../../../useTableManager/util/rows';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction Header<TType = unknown>(context: ReactTableHeaderContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { table } = context;\n const tableMeta = getTableMeta(table);\n\n const isAllRowsSelected = table.getIsAllRowsSelected();\n const isSomeRowsSelected = table.getIsSomeRowsSelected();\n const title = isAllRowsSelected ? texts.table.columns.select.deselectAll : texts.table.columns.select.selectAll;\n\n const handleChange = async (checked: boolean) => {\n // load all data if that is possible (only needed when selecting all, not when deselecting)\n if (checked && tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // setTimeout here fixes issue related React 18's automatic batching:\n // Selection should be applied after all rows are loaded\n setTimeout(() => table.toggleAllRowsSelected(checked), 1);\n };\n\n return (\n <Tooltip title={title}>\n {tableMeta.server.loading ? (\n <Spinner className=\"h-5 w-5 text-blue-500\" />\n ) : (\n <Checkbox\n aria-label={title}\n checked={isAllRowsSelected}\n indeterminate={isSomeRowsSelected && !isAllRowsSelected}\n onChange={handleChange}\n />\n )}\n </Tooltip>\n );\n}\n\nconst toggleBetween = (fromRowIndex: number, toRowIndex: number): [number, number] => {\n const fromIndex = toRowIndex < fromRowIndex ? toRowIndex : fromRowIndex;\n const toIndex = toRowIndex > fromRowIndex ? toRowIndex : fromRowIndex;\n\n return [fromIndex, toIndex];\n};\n\nfunction Cell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { row, table } = context;\n const { hideInternalColumns, rowIndex } = React.useContext(RowContext);\n const tableMeta = getTableMeta(table);\n\n if (hideInternalColumns || (table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped())) {\n return null;\n }\n\n const isSelected = row.getIsGrouped() ? row.getIsAllSubRowsSelected() : row.getIsSelected();\n const canSelect = row.getCanSelect();\n const title = isSelected ? texts.table.columns.select.deselect : texts.table.columns.select.select;\n\n const handleClick = async (event: React.MouseEvent) => {\n event.stopPropagation();\n\n if (row.getIsGrouped()) {\n row.subRows.forEach(row => row.toggleSelected());\n } else if (event.shiftKey) {\n const [fromIndex, toIndex] = toggleBetween(tableMeta.rowSelection.lastSelectedRowIndex.current ?? 0, rowIndex);\n\n if (tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);\n table.setRowSelection((currentRowSelection: RowSelectionState) => ({\n ...currentRowSelection,\n ...selectedRows.filter(row => row.getCanSelect()).reduce((state, row) => ({ ...state, [row.id]: true }), {}),\n }));\n } else {\n row.toggleSelected();\n }\n\n tableMeta.rowSelection.lastSelectedRowIndex.current = row.index;\n };\n\n return (\n <Tooltip\n hidden={!canSelect}\n title={\n <>\n {title}\n <Shortcut className=\"ml-2\" keys=\"Space\" />\n </>\n }>\n <Checkbox\n aria-label={title}\n checked={isSelected}\n onClick={handleClick}\n disabled={!canSelect}\n // this is necessary to remove console spam from eslint\n onChange={() => false}\n />\n </Tooltip>\n );\n}\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n size: 40,\n meta: {\n align: 'center',\n className: '!px-1',\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n headerClassName: '!px-1',\n },\n};\n"],"names":["React","row"],"mappings":"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"}
1
+ {"version":3,"file":"Selection.js","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Selection.tsx"],"sourcesContent":["import type {\n HeaderContext as ReactTableHeaderContext,\n CellContext as ReactTableCellContext,\n RowSelectionState,\n} from '@tanstack/react-table';\nimport React from 'react';\n\nimport { Checkbox, Spinner, Tooltip, Shortcut, useLocalization } from '@/components';\n\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { getHiddenColumns } from '../../../../useTableManager/util/columns';\nimport { getTableMeta } from '../../../../useTableManager/util/rows';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction Header<TType = unknown>(context: ReactTableHeaderContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { table } = context;\n const tableMeta = getTableMeta(table);\n\n const isAllRowsSelected = table.getIsAllRowsSelected();\n const isSomeRowsSelected = table.getIsSomeRowsSelected();\n const title = isAllRowsSelected ? texts.table.columns.select.deselectAll : texts.table.columns.select.selectAll;\n\n const handleChange = async (checked: boolean) => {\n // load all data if that is possible (only needed when selecting all, not when deselecting)\n if (checked && tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // setTimeout here fixes issue related React 18's automatic batching:\n // Selection should be applied after all rows are loaded\n setTimeout(() => table.toggleAllRowsSelected(checked), 1);\n };\n\n return (\n <Tooltip title={title}>\n {tableMeta.server.loading ? (\n <Spinner className=\"h-5 w-5 text-blue-500\" />\n ) : (\n <Checkbox\n aria-label={title}\n checked={isAllRowsSelected}\n indeterminate={isSomeRowsSelected && !isAllRowsSelected}\n onChange={handleChange}\n />\n )}\n </Tooltip>\n );\n}\n\nconst toggleBetween = (fromRowIndex: number, toRowIndex: number): [number, number] => {\n const fromIndex = toRowIndex < fromRowIndex ? toRowIndex : fromRowIndex;\n const toIndex = toRowIndex > fromRowIndex ? toRowIndex : fromRowIndex;\n\n return [fromIndex, toIndex];\n};\n\nfunction Cell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { texts } = useLocalization();\n const { row, table } = context;\n const { hideInternalColumns } = React.useContext(RowContext);\n const tableMeta = getTableMeta(table);\n\n if (hideInternalColumns || (table.options.enableGrouping && table.getState().grouping?.length && !row.getIsGrouped())) {\n return null;\n }\n\n const isSelected = row.getIsGrouped() ? row.getIsAllSubRowsSelected() : row.getIsSelected();\n const canSelect = row.getCanSelect();\n const title = isSelected ? texts.table.columns.select.deselect : texts.table.columns.select.select;\n\n const handleClick = async (event: React.MouseEvent) => {\n event.stopPropagation();\n\n if (row.getIsGrouped()) {\n row.subRows.forEach(row => row.toggleSelected());\n } else if (event.shiftKey) {\n // the anchor must be read before it is reassigned to the clicked row below\n const lastSelectedRowId = tableMeta.rowSelection.lastSelectedRowId.current;\n\n if (tableMeta.server.loadAllIfNeeded) {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n\n // don't pass the search query because we need all data - not filtered data\n await tableMeta.server.loadAllIfNeeded(\n table.getState().sorting,\n table.getState().columnFilters,\n hiddenColumns,\n tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined\n );\n }\n\n // rows fetched by loadAllIfNeeded only reach the row model when React re-renders after this handler, so resolving\n // the ids synchronously would read stale rows - defer to the next frame (handleChange in Header defers too)\n requestAnimationFrame(() => {\n // resolve ids to visible positions - data positions (row.index) don't match them when sorted or filtered\n const rows = table.getRowModel().rows;\n const clickedRowIndex = rows.findIndex(({ id }) => id === row.id);\n const lastSelectedRowIndex =\n lastSelectedRowId === undefined ? 0 : rows.findIndex(({ id }) => id === lastSelectedRowId);\n\n // if the anchor row is no longer visible (e.g. filtered out), select only the clicked row\n const [fromIndex, toIndex] = toggleBetween(\n lastSelectedRowIndex === -1 ? clickedRowIndex : lastSelectedRowIndex,\n clickedRowIndex\n );\n const selectedRows = clickedRowIndex === -1 ? [row] : rows.slice(fromIndex, toIndex + 1);\n\n table.setRowSelection((currentRowSelection: RowSelectionState) => ({\n ...currentRowSelection,\n ...selectedRows.filter(row => row.getCanSelect()).reduce((state, row) => ({ ...state, [row.id]: true }), {}),\n }));\n });\n } else {\n row.toggleSelected();\n }\n\n tableMeta.rowSelection.lastSelectedRowId.current = row.id;\n };\n\n return (\n <Tooltip\n hidden={!canSelect}\n title={\n <>\n {title}\n <Shortcut className=\"ml-2\" keys=\"Space\" />\n </>\n }>\n <Checkbox\n aria-label={title}\n checked={isSelected}\n onClick={handleClick}\n disabled={!canSelect}\n // this is necessary to remove console spam from eslint\n onChange={() => false}\n />\n </Tooltip>\n );\n}\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n size: 40,\n meta: {\n align: 'center',\n className: '!px-1',\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n headerClassName: '!px-1',\n },\n};\n"],"names":["React","row"],"mappings":"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"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
4
  const rows = require("../util/rows.cjs");
5
5
  function useTableRowSelection(isEnabled = false, controlledSelectedRows) {
6
- const lastSelectedRowIndex = React.useRef(void 0);
6
+ const lastSelectedRowId = React.useRef(void 0);
7
7
  const isControlled = isEnabled && controlledSelectedRows !== void 0;
8
8
  const onKeyDown = React.useCallback(
9
9
  (event, table) => {
@@ -31,7 +31,7 @@ function useTableRowSelection(isEnabled = false, controlledSelectedRows) {
31
31
  isControlled,
32
32
  controlledSelectedRows,
33
33
  handleKeyDown: isEnabled ? onKeyDown : () => void 0,
34
- lastSelectedRowIndex
34
+ lastSelectedRowId
35
35
  };
36
36
  }
37
37
  exports.useTableRowSelection = useTableRowSelection;
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRowSelection.cjs","sources":["../../../../../src/primitives/Table/useTableManager/features/useTableRowSelection.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { getTableMeta } from '../util/rows';\n\nexport function useTableRowSelection(isEnabled = false, controlledSelectedRows?: Record<string, boolean>) {\n const lastSelectedRowIndex = React.useRef<number | undefined>(undefined);\n const isControlled = isEnabled && controlledSelectedRows !== undefined;\n\n const onKeyDown = React.useCallback(\n <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => {\n if (!isEnabled || !table.options.enableRowSelection || event.defaultPrevented) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n\n if (event.key === ' ') {\n event.preventDefault();\n const rowActiveIndex = getTableMeta(table).rowActive.rowActiveIndex;\n\n if (rowActiveIndex !== undefined && rows[rowActiveIndex]?.getCanSelect()) {\n rows[rowActiveIndex]?.toggleSelected();\n }\n\n return;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key === 'a' &&\n !['INPUT', 'TEXTAREA'].includes((event.target as Element)?.tagName)\n ) {\n event.preventDefault();\n table.toggleAllRowsSelected();\n }\n },\n [isEnabled]\n ) as <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => void;\n\n return {\n isEnabled,\n isControlled,\n controlledSelectedRows,\n handleKeyDown: isEnabled ? onKeyDown : () => undefined,\n lastSelectedRowIndex,\n };\n}\n"],"names":["rows","getTableMeta"],"mappings":";;;;AAKO,SAAS,qBAAqB,YAAY,OAAO,wBAAkD;AACtG,QAAM,uBAAuB,MAAM,OAA2B,MAAS;AACvE,QAAM,eAAe,aAAa,2BAA2B;AAE7D,QAAM,YAAY,MAAM;AAAA,IACpB,CAAkB,OAAsB,UAA6B;AACjE,UAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,sBAAsB,MAAM,kBAAkB;AAC3E;AAAA,MACJ;AAEA,YAAMA,SAAO,MAAM,YAAA,EAAc;AAEjC,UAAI,MAAM,QAAQ,KAAK;AACnB,cAAM,eAAA;AACN,cAAM,iBAAiBC,KAAAA,aAAa,KAAK,EAAE,UAAU;AAErD,YAAI,mBAAmB,UAAaD,OAAK,cAAc,GAAG,gBAAgB;AACtEA,iBAAK,cAAc,GAAG,eAAA;AAAA,QAC1B;AAEA;AAAA,MACJ;AACA,WACK,MAAM,WAAW,MAAM,YACxB,MAAM,QAAQ,OACd,CAAC,CAAC,SAAS,UAAU,EAAE,SAAU,MAAM,QAAoB,OAAO,GACpE;AACE,cAAM,eAAA;AACN,cAAM,sBAAA;AAAA,MACV;AAAA,IACJ;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,YAAY,YAAY,MAAM;AAAA,IAC7C;AAAA,EAAA;AAER;;"}
1
+ {"version":3,"file":"useTableRowSelection.cjs","sources":["../../../../../src/primitives/Table/useTableManager/features/useTableRowSelection.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { getTableMeta } from '../util/rows';\n\nexport function useTableRowSelection(isEnabled = false, controlledSelectedRows?: Record<string, boolean>) {\n // the shift-click range anchor, stored as a row id because positions move when sorting or filtering\n const lastSelectedRowId = React.useRef<string | undefined>(undefined);\n const isControlled = isEnabled && controlledSelectedRows !== undefined;\n\n const onKeyDown = React.useCallback(\n <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => {\n if (!isEnabled || !table.options.enableRowSelection || event.defaultPrevented) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n\n if (event.key === ' ') {\n event.preventDefault();\n const rowActiveIndex = getTableMeta(table).rowActive.rowActiveIndex;\n\n if (rowActiveIndex !== undefined && rows[rowActiveIndex]?.getCanSelect()) {\n rows[rowActiveIndex]?.toggleSelected();\n }\n\n return;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key === 'a' &&\n !['INPUT', 'TEXTAREA'].includes((event.target as Element)?.tagName)\n ) {\n event.preventDefault();\n table.toggleAllRowsSelected();\n }\n },\n [isEnabled]\n ) as <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => void;\n\n return {\n isEnabled,\n isControlled,\n controlledSelectedRows,\n handleKeyDown: isEnabled ? onKeyDown : () => undefined,\n lastSelectedRowId,\n };\n}\n"],"names":["rows","getTableMeta"],"mappings":";;;;AAKO,SAAS,qBAAqB,YAAY,OAAO,wBAAkD;AAEtG,QAAM,oBAAoB,MAAM,OAA2B,MAAS;AACpE,QAAM,eAAe,aAAa,2BAA2B;AAE7D,QAAM,YAAY,MAAM;AAAA,IACpB,CAAkB,OAAsB,UAA6B;AACjE,UAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,sBAAsB,MAAM,kBAAkB;AAC3E;AAAA,MACJ;AAEA,YAAMA,SAAO,MAAM,YAAA,EAAc;AAEjC,UAAI,MAAM,QAAQ,KAAK;AACnB,cAAM,eAAA;AACN,cAAM,iBAAiBC,KAAAA,aAAa,KAAK,EAAE,UAAU;AAErD,YAAI,mBAAmB,UAAaD,OAAK,cAAc,GAAG,gBAAgB;AACtEA,iBAAK,cAAc,GAAG,eAAA;AAAA,QAC1B;AAEA;AAAA,MACJ;AACA,WACK,MAAM,WAAW,MAAM,YACxB,MAAM,QAAQ,OACd,CAAC,CAAC,SAAS,UAAU,EAAE,SAAU,MAAM,QAAoB,OAAO,GACpE;AACE,cAAM,eAAA;AACN,cAAM,sBAAA;AAAA,MACV;AAAA,IACJ;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,YAAY,YAAY,MAAM;AAAA,IAC7C;AAAA,EAAA;AAER;;"}
@@ -5,5 +5,5 @@ export declare function useTableRowSelection(isEnabled?: boolean, controlledSele
5
5
  isControlled: boolean;
6
6
  controlledSelectedRows: Record<string, boolean> | undefined;
7
7
  handleKeyDown: <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => void;
8
- lastSelectedRowIndex: React.RefObject<number | undefined>;
8
+ lastSelectedRowId: React.RefObject<string | undefined>;
9
9
  };
@@ -1,7 +1,7 @@
1
1
  import React__default from "react";
2
2
  import { getTableMeta } from "../util/rows.js";
3
3
  function useTableRowSelection(isEnabled = false, controlledSelectedRows) {
4
- const lastSelectedRowIndex = React__default.useRef(void 0);
4
+ const lastSelectedRowId = React__default.useRef(void 0);
5
5
  const isControlled = isEnabled && controlledSelectedRows !== void 0;
6
6
  const onKeyDown = React__default.useCallback(
7
7
  (event, table) => {
@@ -29,7 +29,7 @@ function useTableRowSelection(isEnabled = false, controlledSelectedRows) {
29
29
  isControlled,
30
30
  controlledSelectedRows,
31
31
  handleKeyDown: isEnabled ? onKeyDown : () => void 0,
32
- lastSelectedRowIndex
32
+ lastSelectedRowId
33
33
  };
34
34
  }
35
35
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRowSelection.js","sources":["../../../../../src/primitives/Table/useTableManager/features/useTableRowSelection.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { getTableMeta } from '../util/rows';\n\nexport function useTableRowSelection(isEnabled = false, controlledSelectedRows?: Record<string, boolean>) {\n const lastSelectedRowIndex = React.useRef<number | undefined>(undefined);\n const isControlled = isEnabled && controlledSelectedRows !== undefined;\n\n const onKeyDown = React.useCallback(\n <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => {\n if (!isEnabled || !table.options.enableRowSelection || event.defaultPrevented) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n\n if (event.key === ' ') {\n event.preventDefault();\n const rowActiveIndex = getTableMeta(table).rowActive.rowActiveIndex;\n\n if (rowActiveIndex !== undefined && rows[rowActiveIndex]?.getCanSelect()) {\n rows[rowActiveIndex]?.toggleSelected();\n }\n\n return;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key === 'a' &&\n !['INPUT', 'TEXTAREA'].includes((event.target as Element)?.tagName)\n ) {\n event.preventDefault();\n table.toggleAllRowsSelected();\n }\n },\n [isEnabled]\n ) as <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => void;\n\n return {\n isEnabled,\n isControlled,\n controlledSelectedRows,\n handleKeyDown: isEnabled ? onKeyDown : () => undefined,\n lastSelectedRowIndex,\n };\n}\n"],"names":["React"],"mappings":";;AAKO,SAAS,qBAAqB,YAAY,OAAO,wBAAkD;AACtG,QAAM,uBAAuBA,eAAM,OAA2B,MAAS;AACvE,QAAM,eAAe,aAAa,2BAA2B;AAE7D,QAAM,YAAYA,eAAM;AAAA,IACpB,CAAkB,OAAsB,UAA6B;AACjE,UAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,sBAAsB,MAAM,kBAAkB;AAC3E;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM,YAAA,EAAc;AAEjC,UAAI,MAAM,QAAQ,KAAK;AACnB,cAAM,eAAA;AACN,cAAM,iBAAiB,aAAa,KAAK,EAAE,UAAU;AAErD,YAAI,mBAAmB,UAAa,KAAK,cAAc,GAAG,gBAAgB;AACtE,eAAK,cAAc,GAAG,eAAA;AAAA,QAC1B;AAEA;AAAA,MACJ;AACA,WACK,MAAM,WAAW,MAAM,YACxB,MAAM,QAAQ,OACd,CAAC,CAAC,SAAS,UAAU,EAAE,SAAU,MAAM,QAAoB,OAAO,GACpE;AACE,cAAM,eAAA;AACN,cAAM,sBAAA;AAAA,MACV;AAAA,IACJ;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,YAAY,YAAY,MAAM;AAAA,IAC7C;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"useTableRowSelection.js","sources":["../../../../../src/primitives/Table/useTableManager/features/useTableRowSelection.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { getTableMeta } from '../util/rows';\n\nexport function useTableRowSelection(isEnabled = false, controlledSelectedRows?: Record<string, boolean>) {\n // the shift-click range anchor, stored as a row id because positions move when sorting or filtering\n const lastSelectedRowId = React.useRef<string | undefined>(undefined);\n const isControlled = isEnabled && controlledSelectedRows !== undefined;\n\n const onKeyDown = React.useCallback(\n <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => {\n if (!isEnabled || !table.options.enableRowSelection || event.defaultPrevented) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n\n if (event.key === ' ') {\n event.preventDefault();\n const rowActiveIndex = getTableMeta(table).rowActive.rowActiveIndex;\n\n if (rowActiveIndex !== undefined && rows[rowActiveIndex]?.getCanSelect()) {\n rows[rowActiveIndex]?.toggleSelected();\n }\n\n return;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key === 'a' &&\n !['INPUT', 'TEXTAREA'].includes((event.target as Element)?.tagName)\n ) {\n event.preventDefault();\n table.toggleAllRowsSelected();\n }\n },\n [isEnabled]\n ) as <TType = unknown>(event: KeyboardEvent, table: ReactTable<TType>) => void;\n\n return {\n isEnabled,\n isControlled,\n controlledSelectedRows,\n handleKeyDown: isEnabled ? onKeyDown : () => undefined,\n lastSelectedRowId,\n };\n}\n"],"names":["React"],"mappings":";;AAKO,SAAS,qBAAqB,YAAY,OAAO,wBAAkD;AAEtG,QAAM,oBAAoBA,eAAM,OAA2B,MAAS;AACpE,QAAM,eAAe,aAAa,2BAA2B;AAE7D,QAAM,YAAYA,eAAM;AAAA,IACpB,CAAkB,OAAsB,UAA6B;AACjE,UAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,sBAAsB,MAAM,kBAAkB;AAC3E;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM,YAAA,EAAc;AAEjC,UAAI,MAAM,QAAQ,KAAK;AACnB,cAAM,eAAA;AACN,cAAM,iBAAiB,aAAa,KAAK,EAAE,UAAU;AAErD,YAAI,mBAAmB,UAAa,KAAK,cAAc,GAAG,gBAAgB;AACtE,eAAK,cAAc,GAAG,eAAA;AAAA,QAC1B;AAEA;AAAA,MACJ;AACA,WACK,MAAM,WAAW,MAAM,YACxB,MAAM,QAAQ,OACd,CAAC,CAAC,SAAS,UAAU,EAAE,SAAU,MAAM,QAAoB,OAAO,GACpE;AACE,cAAM,eAAA;AACN,cAAM,sBAAA;AAAA,MACV;AAAA,IACJ;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,YAAY,YAAY,MAAM;AAAA,IAC7C;AAAA,EAAA;AAER;"}
@@ -8,7 +8,7 @@ function useTableFilterListener(table, onFilter) {
8
8
  if (table.options.enableColumnFilters && typeof onFilter === "function") {
9
9
  const hiddenColumns = columns.getHiddenColumns(table.getState().columnVisibility);
10
10
  onFilter(columnFilters, hiddenColumns);
11
- if (table.options.enableRowSelection) {
11
+ if (table.options.enableRowSelection && !table.options.getRowId) {
12
12
  table.resetRowSelection();
13
13
  }
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableFilterListener.cjs","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableFilterListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\n\nimport type { TableFilterHandler } from '../../types';\nimport { getHiddenColumns } from '../util/columns';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the filtering state, so that it can filter server side\nexport function useTableFilterListener<TType = unknown>(table: ReactTable<TType>, onFilter?: TableFilterHandler) {\n const columnFilters = table.getState().columnFilters;\n\n useLazyEffect(() => {\n if (table.options.enableColumnFilters && typeof onFilter === 'function') {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n onFilter(columnFilters, hiddenColumns);\n\n if (table.options.enableRowSelection) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableColumnFilters, columnFilters]);\n}\n"],"names":["useLazyEffect","getHiddenColumns"],"mappings":";;;;AAUO,SAAS,uBAAwC,OAA0B,UAA+B;AAC7G,QAAM,gBAAgB,MAAM,SAAA,EAAW;AAEvCA,gBAAAA,cAAc,MAAM;AAChB,QAAI,MAAM,QAAQ,uBAAuB,OAAO,aAAa,YAAY;AACrE,YAAM,gBAAgBC,QAAAA,iBAAiB,MAAM,SAAA,EAAW,gBAAgB;AACxE,eAAS,eAAe,aAAa;AAErC,UAAI,MAAM,QAAQ,oBAAoB;AAClC,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,qBAAqB,aAAa,CAAC;AACzD;;"}
1
+ {"version":3,"file":"useTableFilterListener.cjs","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableFilterListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\n\nimport type { TableFilterHandler } from '../../types';\nimport { getHiddenColumns } from '../util/columns';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the filtering state, so that it can filter server side\nexport function useTableFilterListener<TType = unknown>(table: ReactTable<TType>, onFilter?: TableFilterHandler) {\n const columnFilters = table.getState().columnFilters;\n\n useLazyEffect(() => {\n if (table.options.enableColumnFilters && typeof onFilter === 'function') {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n onFilter(columnFilters, hiddenColumns);\n\n // selection without stable row ids (rowIdentityAccessor) is positional and would point at\n // different rows after the server filters the data, so it is only safe to keep with getRowId\n if (table.options.enableRowSelection && !table.options.getRowId) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableColumnFilters, columnFilters]);\n}\n"],"names":["useLazyEffect","getHiddenColumns"],"mappings":";;;;AAUO,SAAS,uBAAwC,OAA0B,UAA+B;AAC7G,QAAM,gBAAgB,MAAM,SAAA,EAAW;AAEvCA,gBAAAA,cAAc,MAAM;AAChB,QAAI,MAAM,QAAQ,uBAAuB,OAAO,aAAa,YAAY;AACrE,YAAM,gBAAgBC,QAAAA,iBAAiB,MAAM,SAAA,EAAW,gBAAgB;AACxE,eAAS,eAAe,aAAa;AAIrC,UAAI,MAAM,QAAQ,sBAAsB,CAAC,MAAM,QAAQ,UAAU;AAC7D,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,qBAAqB,aAAa,CAAC;AACzD;;"}
@@ -6,7 +6,7 @@ function useTableFilterListener(table, onFilter) {
6
6
  if (table.options.enableColumnFilters && typeof onFilter === "function") {
7
7
  const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
8
8
  onFilter(columnFilters, hiddenColumns);
9
- if (table.options.enableRowSelection) {
9
+ if (table.options.enableRowSelection && !table.options.getRowId) {
10
10
  table.resetRowSelection();
11
11
  }
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableFilterListener.js","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableFilterListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\n\nimport type { TableFilterHandler } from '../../types';\nimport { getHiddenColumns } from '../util/columns';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the filtering state, so that it can filter server side\nexport function useTableFilterListener<TType = unknown>(table: ReactTable<TType>, onFilter?: TableFilterHandler) {\n const columnFilters = table.getState().columnFilters;\n\n useLazyEffect(() => {\n if (table.options.enableColumnFilters && typeof onFilter === 'function') {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n onFilter(columnFilters, hiddenColumns);\n\n if (table.options.enableRowSelection) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableColumnFilters, columnFilters]);\n}\n"],"names":[],"mappings":";;AAUO,SAAS,uBAAwC,OAA0B,UAA+B;AAC7G,QAAM,gBAAgB,MAAM,SAAA,EAAW;AAEvC,gBAAc,MAAM;AAChB,QAAI,MAAM,QAAQ,uBAAuB,OAAO,aAAa,YAAY;AACrE,YAAM,gBAAgB,iBAAiB,MAAM,SAAA,EAAW,gBAAgB;AACxE,eAAS,eAAe,aAAa;AAErC,UAAI,MAAM,QAAQ,oBAAoB;AAClC,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,qBAAqB,aAAa,CAAC;AACzD;"}
1
+ {"version":3,"file":"useTableFilterListener.js","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableFilterListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\n\nimport type { TableFilterHandler } from '../../types';\nimport { getHiddenColumns } from '../util/columns';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the filtering state, so that it can filter server side\nexport function useTableFilterListener<TType = unknown>(table: ReactTable<TType>, onFilter?: TableFilterHandler) {\n const columnFilters = table.getState().columnFilters;\n\n useLazyEffect(() => {\n if (table.options.enableColumnFilters && typeof onFilter === 'function') {\n const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);\n onFilter(columnFilters, hiddenColumns);\n\n // selection without stable row ids (rowIdentityAccessor) is positional and would point at\n // different rows after the server filters the data, so it is only safe to keep with getRowId\n if (table.options.enableRowSelection && !table.options.getRowId) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableColumnFilters, columnFilters]);\n}\n"],"names":[],"mappings":";;AAUO,SAAS,uBAAwC,OAA0B,UAA+B;AAC7G,QAAM,gBAAgB,MAAM,SAAA,EAAW;AAEvC,gBAAc,MAAM;AAChB,QAAI,MAAM,QAAQ,uBAAuB,OAAO,aAAa,YAAY;AACrE,YAAM,gBAAgB,iBAAiB,MAAM,SAAA,EAAW,gBAAgB;AACxE,eAAS,eAAe,aAAa;AAIrC,UAAI,MAAM,QAAQ,sBAAsB,CAAC,MAAM,QAAQ,UAAU;AAC7D,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,qBAAqB,aAAa,CAAC;AACzD;"}
@@ -6,7 +6,7 @@ function useTableSortingListener(table, onSort) {
6
6
  useLazyDebouncedEffect.useLazyDebouncedEffect(() => {
7
7
  if (table.options.enableSorting && typeof onSort === "function") {
8
8
  onSort(sorting);
9
- if (table.options.enableRowSelection) {
9
+ if (table.options.enableRowSelection && !table.options.getRowId) {
10
10
  table.resetRowSelection();
11
11
  }
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableSortingListener.cjs","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableSortingListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyDebouncedEffect } from '@/hooks/useLazyDebouncedEffect';\n\nimport type { TableSortHandler } from '../../types';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the sorting state, so that it can sort server side\nexport function useTableSortingListener<TType = unknown>(table: ReactTable<TType>, onSort?: TableSortHandler) {\n const sorting = table.getState().sorting;\n\n useLazyDebouncedEffect(() => {\n if (table.options.enableSorting && typeof onSort === 'function') {\n onSort(sorting);\n\n if (table.options.enableRowSelection) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableSorting, sorting]);\n}\n"],"names":["useLazyDebouncedEffect"],"mappings":";;;AASO,SAAS,wBAAyC,OAA0B,QAA2B;AAC1G,QAAM,UAAU,MAAM,SAAA,EAAW;AAEjCA,yBAAAA,uBAAuB,MAAM;AACzB,QAAI,MAAM,QAAQ,iBAAiB,OAAO,WAAW,YAAY;AAC7D,aAAO,OAAO;AAEd,UAAI,MAAM,QAAQ,oBAAoB;AAClC,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,eAAe,OAAO,CAAC;AAC7C;;"}
1
+ {"version":3,"file":"useTableSortingListener.cjs","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableSortingListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyDebouncedEffect } from '@/hooks/useLazyDebouncedEffect';\n\nimport type { TableSortHandler } from '../../types';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the sorting state, so that it can sort server side\nexport function useTableSortingListener<TType = unknown>(table: ReactTable<TType>, onSort?: TableSortHandler) {\n const sorting = table.getState().sorting;\n\n useLazyDebouncedEffect(() => {\n if (table.options.enableSorting && typeof onSort === 'function') {\n onSort(sorting);\n\n // selection without stable row ids (rowIdentityAccessor) is positional and would point at\n // different rows after the server re-sorts the data, so it is only safe to keep with getRowId\n if (table.options.enableRowSelection && !table.options.getRowId) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableSorting, sorting]);\n}\n"],"names":["useLazyDebouncedEffect"],"mappings":";;;AASO,SAAS,wBAAyC,OAA0B,QAA2B;AAC1G,QAAM,UAAU,MAAM,SAAA,EAAW;AAEjCA,yBAAAA,uBAAuB,MAAM;AACzB,QAAI,MAAM,QAAQ,iBAAiB,OAAO,WAAW,YAAY;AAC7D,aAAO,OAAO;AAId,UAAI,MAAM,QAAQ,sBAAsB,CAAC,MAAM,QAAQ,UAAU;AAC7D,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,eAAe,OAAO,CAAC;AAC7C;;"}
@@ -4,7 +4,7 @@ function useTableSortingListener(table, onSort) {
4
4
  useLazyDebouncedEffect(() => {
5
5
  if (table.options.enableSorting && typeof onSort === "function") {
6
6
  onSort(sorting);
7
- if (table.options.enableRowSelection) {
7
+ if (table.options.enableRowSelection && !table.options.getRowId) {
8
8
  table.resetRowSelection();
9
9
  }
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableSortingListener.js","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableSortingListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyDebouncedEffect } from '@/hooks/useLazyDebouncedEffect';\n\nimport type { TableSortHandler } from '../../types';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the sorting state, so that it can sort server side\nexport function useTableSortingListener<TType = unknown>(table: ReactTable<TType>, onSort?: TableSortHandler) {\n const sorting = table.getState().sorting;\n\n useLazyDebouncedEffect(() => {\n if (table.options.enableSorting && typeof onSort === 'function') {\n onSort(sorting);\n\n if (table.options.enableRowSelection) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableSorting, sorting]);\n}\n"],"names":[],"mappings":";AASO,SAAS,wBAAyC,OAA0B,QAA2B;AAC1G,QAAM,UAAU,MAAM,SAAA,EAAW;AAEjC,yBAAuB,MAAM;AACzB,QAAI,MAAM,QAAQ,iBAAiB,OAAO,WAAW,YAAY;AAC7D,aAAO,OAAO;AAEd,UAAI,MAAM,QAAQ,oBAAoB;AAClC,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,eAAe,OAAO,CAAC;AAC7C;"}
1
+ {"version":3,"file":"useTableSortingListener.js","sources":["../../../../../src/primitives/Table/useTableManager/listeners/useTableSortingListener.ts"],"sourcesContent":["import type { Table as ReactTable } from '@tanstack/react-table';\n\nimport { useLazyDebouncedEffect } from '@/hooks/useLazyDebouncedEffect';\n\nimport type { TableSortHandler } from '../../types';\n\n// we use a listener, and not the internal \"controlled\" change handlers because we don't actually want consumers\n// to control the state outside the table. this listener is really here to let the consumer make a server request\n// and provide the server with the sorting state, so that it can sort server side\nexport function useTableSortingListener<TType = unknown>(table: ReactTable<TType>, onSort?: TableSortHandler) {\n const sorting = table.getState().sorting;\n\n useLazyDebouncedEffect(() => {\n if (table.options.enableSorting && typeof onSort === 'function') {\n onSort(sorting);\n\n // selection without stable row ids (rowIdentityAccessor) is positional and would point at\n // different rows after the server re-sorts the data, so it is only safe to keep with getRowId\n if (table.options.enableRowSelection && !table.options.getRowId) {\n table.resetRowSelection();\n }\n }\n }, [table.options.enableSorting, sorting]);\n}\n"],"names":[],"mappings":";AASO,SAAS,wBAAyC,OAA0B,QAA2B;AAC1G,QAAM,UAAU,MAAM,SAAA,EAAW;AAEjC,yBAAuB,MAAM;AACzB,QAAI,MAAM,QAAQ,iBAAiB,OAAO,WAAW,YAAY;AAC7D,aAAO,OAAO;AAId,UAAI,MAAM,QAAQ,sBAAsB,CAAC,MAAM,QAAQ,UAAU;AAC7D,cAAM,kBAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,eAAe,OAAO,CAAC;AAC7C;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@economic/taco",
3
- "version": "14.2.0",
3
+ "version": "14.2.1-EC-87277-rollup-optional-dep-test-release.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -47,7 +47,7 @@
47
47
  "@dnd-kit/modifiers": "^9.0.0",
48
48
  "@dnd-kit/sortable": "^10.0.0",
49
49
  "@dnd-kit/utilities": "^3.2.2",
50
- "@economic/taco-tokens": "^3.0.3",
50
+ "@economic/taco-tokens": "3.0.4-EC-87277-rollup-optional-dep-test-release.0",
51
51
  "@radix-ui/react-scroll-area": "1.2.10",
52
52
  "@react-aria/focus": "^3.19.0",
53
53
  "@react-aria/interactions": "^3.12.0",
@@ -67,14 +67,14 @@
67
67
  "tailwindcss": ">=3.4.19"
68
68
  },
69
69
  "devDependencies": {
70
- "@economic/taco-rules": "^1.1.1",
70
+ "@economic/taco-rules": "1.1.2-EC-87277-rollup-optional-dep-test-release.0",
71
71
  "@oxlint/plugins": "^1.75.0",
72
72
  "@svgr/cli": "^8.1.0",
73
73
  "@testing-library/jest-dom": "^6.9.1",
74
74
  "@testing-library/react": "^16.3.3",
75
75
  "@testing-library/user-event": "^14.6.7",
76
76
  "@types/lodash": "^4.17.25",
77
- "@types/node": "^22.20.4",
77
+ "@types/node": "^22.20.5",
78
78
  "@types/react": "19.2.18",
79
79
  "@types/react-dom": "19.2.7",
80
80
  "clsx": "^2.1.1",
@@ -82,18 +82,15 @@
82
82
  "jsdom": "^29.1.1",
83
83
  "resize-observer-polyfill": "^1.5.1",
84
84
  "rimraf": "^6.1.3",
85
- "stylelint": "^17.15.0",
85
+ "stylelint": "^17.16.0",
86
86
  "svgo": "^4.1.0",
87
87
  "tailwindcss": "^3.4.19",
88
88
  "typescript": "^6.0.3",
89
89
  "vite": "^7.3.6",
90
- "vite-plugin-dts": "^5.1.1",
90
+ "vite-plugin-dts": "^5.1.2",
91
91
  "vite-plugin-externalize-deps": "^0.10.0",
92
92
  "vitest": "^4.1.11",
93
93
  "vitest-fail-on-console": "^0.10.1"
94
94
  },
95
- "optionalDependencies": {
96
- "@rollup/rollup-linux-x64-gnu": "^4.63.5"
97
- },
98
- "gitHead": "5d80c1b6aaf3018e39e1df42457581a881dcd6be"
95
+ "gitHead": "24feb93f48149ee0221c89524190bf281e26b6c7"
99
96
  }