@persona/design-system 0.10.12 → 0.10.13

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 (152) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/{CheckboxGroupField-XSVAmESI.d.mts → CheckboxGroupField-BW_BcW3L.d.mts} +2 -2
  3. package/dist/CheckboxGroupField.d.mts +1 -1
  4. package/dist/{Combobox-DbcSss15.d.mts → Combobox-DgYwerwd.d.mts} +3 -3
  5. package/dist/{Combobox-BNjYEAmv.mjs → Combobox-DmFQ5cAy.mjs} +63 -51
  6. package/dist/Combobox-DmFQ5cAy.mjs.map +1 -0
  7. package/dist/Combobox.d.mts +2 -2
  8. package/dist/{ComboboxBase-CrFweFGi.d.mts → ComboboxBase-DoKiRjgS.d.mts} +2 -2
  9. package/dist/ComboboxBase.d.mts +1 -1
  10. package/dist/{ComboboxMultiSelect-Cp5GBGQj.d.mts → ComboboxMultiSelect-DsoIMJiZ.d.mts} +2 -2
  11. package/dist/ComboboxMultiSelect.d.mts +1 -1
  12. package/dist/{ComboboxSingleSelect-u7fK3Yvy.d.mts → ComboboxSingleSelect-CKsqOAGB.d.mts} +3 -3
  13. package/dist/ComboboxSingleSelect.d.mts +1 -1
  14. package/dist/{CompactBar-BLZZWtIE.d.mts → CompactBar-tNtY2EhN.d.mts} +2 -2
  15. package/dist/CompactBar.d.mts +1 -1
  16. package/dist/{ControlBar-B3Jn8G0k.d.mts → ControlBar-CDb6b1_6.d.mts} +5 -3
  17. package/dist/ControlBar.d.mts +1 -1
  18. package/dist/{DataTable-DdSY9mzT.mjs → DataTable-DZ0B2Zm9.mjs} +146 -77
  19. package/dist/DataTable-DZ0B2Zm9.mjs.map +1 -0
  20. package/dist/{DataTable-C1mdfmQa.d.mts → DataTable-on3vGhyi.d.mts} +31 -7
  21. package/dist/DataTable.d.mts +1 -1
  22. package/dist/{DatePicker-DiilpYQg.mjs → DatePicker-CHVYVKB-.mjs} +2 -2
  23. package/dist/{DatePicker-DiilpYQg.mjs.map → DatePicker-CHVYVKB-.mjs.map} +1 -1
  24. package/dist/DropdownButton.d.mts +1 -1
  25. package/dist/{DropdownMenu-CQR0U-zM.d.mts → DropdownMenu-eVY-Yjpq.d.mts} +2 -2
  26. package/dist/DropdownMenu.d.mts +1 -1
  27. package/dist/{FloatingActionBar-BUgSKimy.d.mts → FloatingActionBar-CfgjHs81.d.mts} +5 -1
  28. package/dist/FloatingActionBar.d.mts +1 -1
  29. package/dist/{FormField-yYJFkJ6R.mjs → FormField-BfVrDOY0.mjs} +4 -4
  30. package/dist/{FormField-yYJFkJ6R.mjs.map → FormField-BfVrDOY0.mjs.map} +1 -1
  31. package/dist/{HoverCopyableField-X2XfKTTh.mjs → HoverCopyableField-CJ_p3llp.mjs} +2 -2
  32. package/dist/{HoverCopyableField-X2XfKTTh.mjs.map → HoverCopyableField-CJ_p3llp.mjs.map} +1 -1
  33. package/dist/IndexTableLayout.d.mts +3 -3
  34. package/dist/InlineCombobox.d.mts +1 -1
  35. package/dist/InlineInput.d.mts +1 -1
  36. package/dist/{Link-B29ZMN6m.mjs → Link-Df3zJrj2.mjs} +1 -1
  37. package/dist/{Link-B29ZMN6m.mjs.map → Link-Df3zJrj2.mjs.map} +1 -1
  38. package/dist/{ListBox-4rTgr3IJ.mjs → ListBox-BRgjgUSp.mjs} +2 -2
  39. package/dist/{ListBox-4rTgr3IJ.mjs.map → ListBox-BRgjgUSp.mjs.map} +1 -1
  40. package/dist/{ListBox-ZDaitaXR.d.mts → ListBox-Bgug8YZF.d.mts} +2 -2
  41. package/dist/ListBox.d.mts +1 -1
  42. package/dist/{ListBoxField-CGvVWKyL.d.mts → ListBoxField-Cc1sX2bo.d.mts} +4 -4
  43. package/dist/ListBoxField.d.mts +1 -1
  44. package/dist/{LogicRow-Bzp5o1sL.d.mts → LogicRow-B1_35ZJT.d.mts} +2 -2
  45. package/dist/LogicRow.d.mts +1 -1
  46. package/dist/{Menu-DviYNrFd.d.mts → Menu-keVl-eKm.d.mts} +2 -2
  47. package/dist/Menu.d.mts +1 -1
  48. package/dist/{Modal-CiPFqr0L.mjs → Modal-SnCo7ecm.mjs} +3 -2
  49. package/dist/Modal-SnCo7ecm.mjs.map +1 -0
  50. package/dist/{Pii-jSYND7Cn.mjs → Pii-BYPkrBuT.mjs} +1 -1
  51. package/dist/{Pii-jSYND7Cn.mjs.map → Pii-BYPkrBuT.mjs.map} +1 -1
  52. package/dist/{Popover-CVX-dfYb.mjs → Popover-DP9DXReH.mjs} +1 -1
  53. package/dist/{Popover-CVX-dfYb.mjs.map → Popover-DP9DXReH.mjs.map} +1 -1
  54. package/dist/{Select-DsVeAyZy.d.mts → Select-CiofH5-f.d.mts} +2 -2
  55. package/dist/Select.d.mts +1 -1
  56. package/dist/SmartTextInputField.d.mts +2 -2
  57. package/dist/SmartTextInputListbox.d.mts +8 -3
  58. package/dist/{TableBox-D9NA-s9l.mjs → TableBox-RxpwflEb.mjs} +3 -3
  59. package/dist/{TableBox-D9NA-s9l.mjs.map → TableBox-RxpwflEb.mjs.map} +1 -1
  60. package/dist/TableBox.d.mts +1 -1
  61. package/dist/{TableBoxCell-CQOL30et.d.mts → TableBoxCell-C65YFYqj.d.mts} +4 -4
  62. package/dist/TableBoxCell.d.mts +1 -1
  63. package/dist/{TableBoxField-z0GIFeQw.d.mts → TableBoxField-CHpClgsE.d.mts} +5 -5
  64. package/dist/TableBoxField.d.mts +1 -1
  65. package/dist/{TableBoxRow-tb9-KMr9.d.mts → TableBoxRow-CK-b79uD.d.mts} +2 -2
  66. package/dist/TableBoxRow.d.mts +1 -1
  67. package/dist/{TableBoxRowActions-BZwulsFP.d.mts → TableBoxRowActions-CRaabjaY.d.mts} +2 -2
  68. package/dist/TableBoxRowActions.d.mts +1 -1
  69. package/dist/{TableControls-BXykbUBf.mjs → TableControls-DM4RddQ_.mjs} +31 -12
  70. package/dist/TableControls-DM4RddQ_.mjs.map +1 -0
  71. package/dist/{TableControls-DE6eHq8h.d.mts → TableControls-v1NmlFTW.d.mts} +4 -4
  72. package/dist/TableControls.d.mts +1 -1
  73. package/dist/{TableControlsContext-C2_2EuMh.d.mts → TableControlsContext-DHYICXxy.d.mts} +2 -2
  74. package/dist/TableControlsContext.d.mts +1 -1
  75. package/dist/{TableViewConfigurationDropdown-DE9HFXYY.d.mts → TableViewConfigurationDropdown-1nT8wneI.d.mts} +2 -2
  76. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  77. package/dist/{clientFilterUtils-2TBUC31K.d.mts → clientFilterUtils-CaF2QZBy.d.mts} +2 -2
  78. package/dist/clientFilterUtils.d.mts +1 -1
  79. package/dist/components/Combobox/index.d.mts +4 -4
  80. package/dist/components/Combobox/index.mjs +1 -1
  81. package/dist/components/DataTable/TableControls/index.d.mts +7 -7
  82. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  83. package/dist/components/DataTable/index.d.mts +6 -6
  84. package/dist/components/DataTable/index.mjs +1 -1
  85. package/dist/components/DataTable/types.d.mts +1 -1
  86. package/dist/components/DatePicker/index.mjs +1 -1
  87. package/dist/components/DropdownMenu/index.d.mts +1 -1
  88. package/dist/components/FormField/index.d.mts +4 -4
  89. package/dist/components/FormField/index.mjs +1 -1
  90. package/dist/components/HoverCopyableField/index.mjs +1 -1
  91. package/dist/components/Link/index.mjs +1 -1
  92. package/dist/components/ListBox/index.d.mts +3 -3
  93. package/dist/components/ListBox/index.mjs +1 -1
  94. package/dist/components/Menu/index.d.mts +1 -1
  95. package/dist/components/Modal/index.mjs +1 -1
  96. package/dist/components/Pii/index.mjs +1 -1
  97. package/dist/components/Popover/index.mjs +1 -1
  98. package/dist/components/RichTextEditor/index.mjs +2 -2
  99. package/dist/components/Select/index.d.mts +1 -1
  100. package/dist/components/SmartTextInput/index.mjs +104 -48
  101. package/dist/components/SmartTextInput/index.mjs.map +1 -1
  102. package/dist/components/TableBox/index.d.mts +1 -1
  103. package/dist/components/TableBox/index.mjs +1 -1
  104. package/dist/components/VersionHistory/index.mjs +1 -1
  105. package/dist/fieldPickerOptions.d.mts +1 -1
  106. package/dist/{filters-DW7pqWv3.d.mts → filters-CShP0Jag.d.mts} +2 -2
  107. package/dist/filters.d.mts +1 -1
  108. package/dist/{helpers-BTD2kXLs.d.mts → helpers-Bbi1LyMW.d.mts} +5 -3
  109. package/dist/helpers.d.mts +1 -1
  110. package/dist/{index-B4tE0RxY.d.mts → index-3-eDlpcj.d.mts} +3 -3
  111. package/dist/{inputFields-DnBb3NhK.d.mts → inputFields-Dobwb4kT.d.mts} +4 -4
  112. package/dist/inputFields.d.mts +1 -1
  113. package/dist/lib/PDSProvider.d.mts +2 -1
  114. package/dist/lib/PDSProvider.mjs +8 -3
  115. package/dist/lib/PDSProvider.mjs.map +1 -1
  116. package/dist/lib/colorMode.d.mts +18 -7
  117. package/dist/lib/colorMode.mjs +47 -13
  118. package/dist/lib/colorMode.mjs.map +1 -1
  119. package/dist/lib/schemaOptions.mjs +1 -1
  120. package/dist/lib/schemaOptions.mjs.map +1 -1
  121. package/dist/patterns/IndexTableLayout/index.mjs +1 -1
  122. package/dist/patterns/WizardModal/index.mjs +1 -1
  123. package/dist/{types-NO2GRlM-.d.mts → types-BTaKBrxG.d.mts} +2 -2
  124. package/dist/{types-Dws2XDz2.d.mts → types-CUnL8JJj.d.mts} +6 -4
  125. package/dist/types5.d.mts +1 -1
  126. package/dist/useColumnConfiguration.d.mts +2 -2
  127. package/dist/useComboboxFooterAction.d.mts +1 -1
  128. package/dist/{useTableColumns-tITjHasE.d.mts → useTableColumns-BuxN7Usm.d.mts} +17 -2
  129. package/dist/useTableColumns.d.mts +1 -1
  130. package/dist/useTruncation.d.mts +1 -1
  131. package/dist/utils4.d.mts +1 -1
  132. package/dist/withDisabledReason.d.mts +19 -0
  133. package/llms.txt +4 -3
  134. package/package.json +4 -12
  135. package/skills/ui-authoring/COMPONENTS.md +0 -1
  136. package/skills/ui-authoring/PATTERNS.md +0 -64
  137. package/skills/ui-authoring/TOKENS.md +14 -25
  138. package/dist/ChartFrame.d.mts +0 -61
  139. package/dist/ChartLegend.d.mts +0 -60
  140. package/dist/ChartPopover.d.mts +0 -155
  141. package/dist/Combobox-BNjYEAmv.mjs.map +0 -1
  142. package/dist/DataTable-DdSY9mzT.mjs.map +0 -1
  143. package/dist/Modal-CiPFqr0L.mjs.map +0 -1
  144. package/dist/TableControls-BXykbUBf.mjs.map +0 -1
  145. package/dist/chartColors.d.mts +0 -92
  146. package/dist/chartFrameLayout.d.mts +0 -46
  147. package/dist/components/Chart/index.d.mts +0 -9
  148. package/dist/components/Chart/index.mjs +0 -680
  149. package/dist/components/Chart/index.mjs.map +0 -1
  150. package/dist/useChartColors.d.mts +0 -30
  151. package/dist/useChartSeriesVisibility.d.mts +0 -22
  152. package/dist/useChartStyles.d.mts +0 -108
@@ -17,10 +17,10 @@ import { n as DropdownMenu_default } from "./DropdownMenu-Ip75l4Th.mjs";
17
17
  import { t as Checkbox } from "./Checkbox-BAh-wF_F.mjs";
18
18
  import { t as Pagination_default } from "./Pagination-CqFvnlXc.mjs";
19
19
  import { a as StickyTH, d as TableTR, f as TableTH, i as StickyTD, o as TableActionTD, p as TableRow, s as TableCell, t as TableLayout, u as TableTD } from "./Table-9mNn8Q-d.mjs";
20
- import { t as HoverCopyableField } from "./HoverCopyableField-X2XfKTTh.mjs";
21
- import { t as Link } from "./Link-B29ZMN6m.mjs";
22
- import { t as Pii_default } from "./Pii-jSYND7Cn.mjs";
23
- import { L as isFilterActive, f as TableViewConfigurationDropdown, u as TableControls, v as isEmptyState } from "./TableControls-BXykbUBf.mjs";
20
+ import { L as isFilterActive, W as withDisabledReason, f as TableViewConfigurationDropdown, u as TableControls, v as isEmptyState } from "./TableControls-DM4RddQ_.mjs";
21
+ import { t as HoverCopyableField } from "./HoverCopyableField-CJ_p3llp.mjs";
22
+ import { t as Link } from "./Link-Df3zJrj2.mjs";
23
+ import { t as Pii_default } from "./Pii-BYPkrBuT.mjs";
24
24
  import { createElement, useCallback, useEffect, useMemo, useRef, useState } from "react";
25
25
  import { BorderRadius, Color, Spacing } from "@persona/design-tokens";
26
26
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -28,7 +28,7 @@ import { DateTime } from "luxon";
28
28
  import { ChevronDownIcon, ChevronRightIcon, ImageIcon, MoreIcon, XIcon } from "@persona/icons";
29
29
  import { PlusIcon as PlusIcon$1 } from "@persona/icons/12px";
30
30
  import { kebabCase, startCase } from "lodash-es";
31
- import { createColumnHelper, flexRender, getCoreRowModel, getFilteredRowModel, getMemoOptions, getPaginationRowModel, getSortedRowModel, memo as memo$1, useReactTable } from "@tanstack/react-table";
31
+ import { createColumnHelper, flexRender, functionalUpdate, getCoreRowModel, getFilteredRowModel, getMemoOptions, getPaginationRowModel, getSortedRowModel, memo as memo$1, useReactTable } from "@tanstack/react-table";
32
32
  //#region src/components/DataTable/clientFilterUtils.ts
33
33
  const getFilterFnName = (filterType) => {
34
34
  switch (filterType) {
@@ -128,6 +128,46 @@ const Bar = styled.div`
128
128
  gap: ${Spacing[8]};
129
129
  min-width: 380px;
130
130
  `;
131
+ const renderAction = (action, key) => {
132
+ if ("popover" in action) {
133
+ let trigger = null;
134
+ if ("icon" in action && "aria-label" in action) trigger = /* @__PURE__ */ jsx(IconButton, {
135
+ size: "sm",
136
+ "aria-label": action["aria-label"],
137
+ disabled: action.disabled,
138
+ children: action.icon
139
+ }, key);
140
+ else trigger = /* @__PURE__ */ jsx(Button, {
141
+ variant: action.variant || "basic",
142
+ size: "sm",
143
+ disabled: action.disabled,
144
+ children: "label" in action ? action.label : ""
145
+ }, key);
146
+ return /* @__PURE__ */ jsx(DropdownMenu_default, {
147
+ trigger,
148
+ align: "center",
149
+ portal: true,
150
+ children: (action.popover?.options ?? []).map((option) => /* @__PURE__ */ jsx(DropdownMenu_default.Item, {
151
+ id: option.value,
152
+ onClick: () => action.popover.onOptionSelect(option.value),
153
+ children: option.label
154
+ }, option.value))
155
+ }, key);
156
+ } else if ("icon" in action && "aria-label" in action) return /* @__PURE__ */ jsx(IconButton, {
157
+ size: "sm",
158
+ "aria-label": action["aria-label"],
159
+ onClick: action.onClick,
160
+ disabled: action.disabled,
161
+ children: action.icon
162
+ }, key);
163
+ else return /* @__PURE__ */ jsx(Button, {
164
+ onClick: action.onClick,
165
+ variant: action.variant || "basic",
166
+ size: "sm",
167
+ disabled: action.disabled,
168
+ children: "label" in action ? action.label : ""
169
+ }, key);
170
+ };
131
171
  const FloatingActionBar = ({ selectedCount, onClearSelection, extraContent, actions }) => {
132
172
  const strings = usePDSStrings();
133
173
  const theme = useTheme();
@@ -147,40 +187,11 @@ const FloatingActionBar = ({ selectedCount, onClearSelection, extraContent, acti
147
187
  spacing: Spacing[2],
148
188
  children: [extraContent, actions.map((action, index) => {
149
189
  const key = "label" in action ? action.label : `action-${index}`;
150
- if ("popover" in action) {
151
- let trigger = null;
152
- if ("icon" in action && "aria-label" in action) trigger = /* @__PURE__ */ jsx(IconButton, {
153
- size: "sm",
154
- "aria-label": action["aria-label"],
155
- children: action.icon
156
- }, key);
157
- else trigger = /* @__PURE__ */ jsx(Button, {
158
- variant: action.variant || "basic",
159
- size: "sm",
160
- children: "label" in action ? action.label : ""
161
- }, key);
162
- return /* @__PURE__ */ jsx(DropdownMenu_default, {
163
- trigger,
164
- align: "center",
165
- portal: true,
166
- children: (action.popover?.options ?? []).map((option) => /* @__PURE__ */ jsx(DropdownMenu_default.Item, {
167
- id: option.value,
168
- onClick: () => action.popover.onOptionSelect(option.value),
169
- children: option.label
170
- }, option.value))
171
- }, key);
172
- } else if ("icon" in action && "aria-label" in action) return /* @__PURE__ */ jsx(IconButton, {
173
- size: "sm",
174
- "aria-label": action["aria-label"],
175
- onClick: action.onClick,
176
- children: action.icon
177
- }, key);
178
- else return /* @__PURE__ */ jsx(Button, {
179
- onClick: action.onClick,
180
- variant: action.variant || "basic",
181
- size: "sm",
182
- children: "label" in action ? action.label : ""
183
- }, key);
190
+ return withDisabledReason(renderAction(action, key), {
191
+ key,
192
+ disabled: action.disabled,
193
+ disabledReason: action.disabledReason
194
+ });
184
195
  })]
185
196
  })] });
186
197
  };
@@ -189,7 +200,7 @@ const FloatingActionBar = ({ selectedCount, onClearSelection, extraContent, acti
189
200
  const EmptyCellText = styled(Paragraph)`
190
201
  ${semanticOnly((tokens) => `color: ${tokens.FgSecondaryStatic};`)}
191
202
  `;
192
- const renderAsCheckbox = ({ rowId, isChecked, onChange, onValueChange, columnHeader, disabled, indeterminate, strings = DEFAULT_COMMON_STRINGS }) => {
203
+ const renderAsCheckbox = ({ rowId, rowLabel, isChecked, onChange, onValueChange, columnHeader, disabled, indeterminate, strings = DEFAULT_COMMON_STRINGS }) => {
193
204
  return /* @__PURE__ */ jsx(Checkbox, {
194
205
  checked: isChecked,
195
206
  onChange: (e) => {
@@ -199,7 +210,7 @@ const renderAsCheckbox = ({ rowId, isChecked, onChange, onValueChange, columnHea
199
210
  containerProps: { onClick: (e) => {
200
211
  e.stopPropagation();
201
212
  } },
202
- "aria-label": columnHeader ? strings.selectRowForColumn(columnHeader, rowId) : strings.selectRow(rowId),
213
+ "aria-label": columnHeader ? strings.selectRowForColumn(columnHeader, rowLabel ?? rowId) : strings.selectRow(rowLabel ?? rowId),
203
214
  indeterminate,
204
215
  disabled
205
216
  });
@@ -505,11 +516,44 @@ const ExpandColumnPlaceholder = styled.span`
505
516
  justify-content: center;
506
517
  width: 100%;
507
518
  `;
508
- function useTableColumns({ columns, data, compact, sort, clientSearch, clientFiltering, expandColumnVisibility = "auto", showControls, enableRowSelection = false, enableSubRowSelection = true, rowActions, getRowId, expandedRows, toggleRowExpansion, canRowExpand, checkboxColumnStates, handleCheckboxCellChange, handleSelectAllCheckboxCell, getSelfAndNestedRowIds, handleRowSelectionWithShift, renderFormat }) {
519
+ function useTableColumns({ columns, data, compact, sort, clientSearch, clientFiltering, expandColumnVisibility = "auto", showControls, enableRowSelection = false, enableSubRowSelection = true, rowActions, getRowId, getRowLabel, scopeSelectAllToRows = false, stableSelectCells = false, expandedRows, toggleRowExpansion, canRowExpand, checkboxColumnStates, handleCheckboxCellChange, handleSelectAllCheckboxCell, getSelfAndNestedRowIds, handleRowSelectionWithShift, renderFormat }) {
509
520
  const { EXPAND_COLUMN_WIDTH, SELECT_COLUMN_WIDTH, ACTION_COLUMN_WIDTH } = getColumnWidths(compact);
510
521
  const strings = usePDSStrings();
511
522
  const stringsRef = useRef(strings);
512
523
  stringsRef.current = strings;
524
+ const getRowLabelRef = useRef(getRowLabel);
525
+ getRowLabelRef.current = getRowLabel;
526
+ const selectColumnRef = useRef({
527
+ enableSubRowSelection,
528
+ handleRowSelectionWithShift,
529
+ scopeSelectAllToRows
530
+ });
531
+ selectColumnRef.current = {
532
+ enableSubRowSelection,
533
+ handleRowSelectionWithShift,
534
+ scopeSelectAllToRows
535
+ };
536
+ const renderSelectHeader = useCallback(({ table }) => {
537
+ const { scopeSelectAllToRows: scoped } = selectColumnRef.current;
538
+ return renderAsCheckboxHeader({
539
+ isChecked: table.getIsAllRowsSelected(),
540
+ isIndeterminate: table.getIsAllRowsSelected() || (scoped ? table.getFilteredRowModel().flatRows.some((row) => row.getIsSelected()) : table.getIsSomeRowsSelected()),
541
+ onChange: table.getToggleAllRowsSelectedHandler(),
542
+ strings: stringsRef.current
543
+ });
544
+ }, []);
545
+ const renderSelectCell = useCallback(({ row, table }) => {
546
+ const { enableSubRowSelection: subRows } = selectColumnRef.current;
547
+ return renderAsCheckbox({
548
+ rowId: row.id,
549
+ rowLabel: getRowLabelRef.current?.(row.original),
550
+ isChecked: row.getIsSelected(),
551
+ onChange: (e) => selectColumnRef.current.handleRowSelectionWithShift(row, table, e.target.checked, e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey),
552
+ indeterminate: subRows && row.getIsSomeSelected(),
553
+ disabled: !row.getCanSelect(),
554
+ strings: stringsRef.current
555
+ });
556
+ }, []);
513
557
  const rowActionsRef = useRef(rowActions);
514
558
  rowActionsRef.current = rowActions;
515
559
  const renderActionCell = useCallback((props) => {
@@ -621,20 +665,8 @@ function useTableColumns({ columns, data, compact, sort, clientSearch, clientFil
621
665
  enableResizing: false,
622
666
  size: SELECT_COLUMN_WIDTH,
623
667
  meta: { width: SELECT_COLUMN_WIDTH },
624
- header: ({ table }) => renderAsCheckboxHeader({
625
- isChecked: table.getIsAllRowsSelected(),
626
- isIndeterminate: table.getIsSomeRowsSelected() || table.getIsAllRowsSelected(),
627
- onChange: table.getToggleAllRowsSelectedHandler(),
628
- strings
629
- }),
630
- cell: ({ row, table }) => renderAsCheckbox({
631
- rowId: row.id,
632
- isChecked: row.getIsSelected(),
633
- onChange: (e) => handleRowSelectionWithShift(row, table, e.target.checked, e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey),
634
- indeterminate: enableSubRowSelection && row.getIsSomeSelected(),
635
- disabled: !row.getCanSelect(),
636
- strings
637
- })
668
+ header: stableSelectCells ? renderSelectHeader : (context) => renderSelectHeader(context),
669
+ cell: stableSelectCells ? renderSelectCell : (context) => renderSelectCell(context)
638
670
  }));
639
671
  if (expandColumnVisibility === "always" || data.some(canRowExpand)) tableColumns.unshift(columnHelper.display({
640
672
  id: "expand-col",
@@ -692,6 +724,9 @@ function useTableColumns({ columns, data, compact, sort, clientSearch, clientFil
692
724
  hasRowActions,
693
725
  renderActionCell,
694
726
  showControls,
727
+ stableSelectCells,
728
+ renderSelectHeader,
729
+ renderSelectCell,
695
730
  sort,
696
731
  clientSearch,
697
732
  clientFiltering,
@@ -704,7 +739,6 @@ function useTableColumns({ columns, data, compact, sort, clientSearch, clientFil
704
739
  checkboxColumnStates,
705
740
  handleCheckboxCellChange,
706
741
  handleSelectAllCheckboxCell,
707
- handleRowSelectionWithShift,
708
742
  renderFormat,
709
743
  strings
710
744
  ]);
@@ -869,7 +903,7 @@ const DISPLAYED_ROW_IDS_SEPARATOR = "";
869
903
  * { accessor: 'email', header: 'Email' },
870
904
  * ];
871
905
  */
872
- const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "auto", showControls, controls, emptyState, isLoading, pagination, sort, sortDescFirst, enableSortingRemoval, showColumnProperties = false, onUpdateColumnProperties, enableRowSelection = false, enableSubRowSelection = true, getRowId, getRowLabel, getRowSelectable, getLinkToRow, rowLinkPrefix, rowLinkColumnId, rowLinkComponent, compact, floatingBulkActions = false, disableRowHover, title, clientSearch = false, searchTerm: controlledSearchTerm, onSearchTermChange, manualFiltering, expandedRowIds: controlledExpandedRowIds, onExpandedRowsChange, clientFiltering = false, columnFilters: controlledColumnFilters, hasExternalActiveFilters = false, onColumnFiltersChange, renderFormat, rowActions, bulkActions, getAvailableBulkActions, onRowSelectionChange, onAddRow, stickyHeader = false, canAddAfterRow, onRowClick, activeRowId, onDisplayedRowIdsChange, pinnedColumnLeftOffset = 0, scrollsHorizontally = true, floatingBarContent }) => {
906
+ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "auto", showControls, controls, emptyState, isLoading, pagination, sort, sortDescFirst, enableSortingRemoval, showColumnProperties = false, onUpdateColumnProperties, enableRowSelection = false, selectedRowIds: controlledSelectedRowIds, onSelectedRowIdsChange, enableSubRowSelection = true, getRowId, getRowLabel, getRowSelectable, getLinkToRow, rowLinkPrefix, rowLinkColumnId, rowLinkComponent, compact, floatingBulkActions = false, disableRowHover, title, clientSearch = false, searchTerm: controlledSearchTerm, onSearchTermChange, manualFiltering, expandedRowIds: controlledExpandedRowIds, onExpandedRowsChange, clientFiltering = false, columnFilters: controlledColumnFilters, hasExternalActiveFilters = false, onColumnFiltersChange, renderFormat, rowActions, bulkActions, getAvailableBulkActions, onRowSelectionChange, onAddRow, stickyHeader = false, canAddAfterRow, onRowClick, activeRowId, onDisplayedRowIdsChange, pinnedColumnLeftOffset = 0, scrollsHorizontally = true, floatingBarContent }) => {
873
907
  const DEFAULT_SEARCH_PLACEHOLDER = "Search...";
874
908
  const { NEST_SPACING, EXPAND_COLUMN_WIDTH } = getColumnWidths(compact);
875
909
  const [columnVisibility, setColumnVisibility] = useState(() => {
@@ -881,7 +915,27 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
881
915
  return visibility;
882
916
  });
883
917
  const [columnOrder, setColumnOrder] = useState([]);
884
- const [rowSelection, setRowSelection] = useState({});
918
+ const isSelectionControlled = controlledSelectedRowIds != null;
919
+ const [internalRowSelection, setInternalRowSelection] = useState({});
920
+ const rowSelection = useMemo(() => isSelectionControlled ? Object.fromEntries([...controlledSelectedRowIds].map((rowId) => [rowId, true])) : internalRowSelection, [
921
+ controlledSelectedRowIds,
922
+ internalRowSelection,
923
+ isSelectionControlled
924
+ ]);
925
+ const showSelectColumn = enableRowSelection && (Boolean(showControls) || isSelectionControlled);
926
+ const pendingRowSelectionRef = useRef(rowSelection);
927
+ pendingRowSelectionRef.current = rowSelection;
928
+ const isBatchingRowSelectionRef = useRef(false);
929
+ const setRowSelection = useCallback((updater) => {
930
+ if (!isSelectionControlled) {
931
+ setInternalRowSelection(updater);
932
+ return;
933
+ }
934
+ const next = functionalUpdate(updater, pendingRowSelectionRef.current);
935
+ pendingRowSelectionRef.current = next;
936
+ if (isBatchingRowSelectionRef.current) return;
937
+ onSelectedRowIdsChange?.(new Set(Object.keys(next).filter((rowId) => next[rowId] === true)));
938
+ }, [isSelectionControlled, onSelectedRowIdsChange]);
885
939
  const lastSelectedRowIdRef = useRef(null);
886
940
  const isSearchControlled = controlledSearchTerm != null;
887
941
  const [internalSearchTerm, setInternalSearchTerm] = useState(typeof clientSearch === "object" ? clientSearch.initialValue || "" : "");
@@ -936,7 +990,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
936
990
  const pinnedColumns = [];
937
991
  if (columns.some((column) => typeof column === "object" && column.pinned)) {
938
992
  if (expandColumnVisibility === "always" || data.some(canRowExpand)) pinnedColumns.push("expand-col");
939
- if (showControls && enableRowSelection) pinnedColumns.push("select-col");
993
+ if (showSelectColumn) pinnedColumns.push("select-col");
940
994
  columns.forEach((column) => {
941
995
  if (typeof column === "object" && column.pinned) pinnedColumns.push(column.accessor);
942
996
  });
@@ -947,8 +1001,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
947
1001
  data,
948
1002
  canRowExpand,
949
1003
  expandColumnVisibility,
950
- showControls,
951
- enableRowSelection
1004
+ showSelectColumn
952
1005
  ]);
953
1006
  const toggleRowExpansion = useCallback((rowId) => {
954
1007
  setExpandedRows((prev) => {
@@ -1041,7 +1094,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1041
1094
  sorting: sort.state
1042
1095
  };
1043
1096
  } else options.enableSorting = false;
1044
- if (showControls && enableRowSelection) {
1097
+ if (showSelectColumn) {
1045
1098
  options.enableRowSelection = getRowSelectable ? (row) => getRowSelectable(row.original) : true;
1046
1099
  options.onRowSelectionChange = setRowSelection;
1047
1100
  }
@@ -1089,10 +1142,10 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1089
1142
  pagination,
1090
1143
  columnVisibility,
1091
1144
  columnOrder,
1092
- enableRowSelection,
1145
+ showSelectColumn,
1093
1146
  enableSubRowSelection,
1094
1147
  rowSelection,
1095
- showControls,
1148
+ setRowSelection,
1096
1149
  sort,
1097
1150
  enableSortingRemoval,
1098
1151
  sortDescFirst,
@@ -1112,9 +1165,15 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1112
1165
  if (isShiftKey && lastIndex !== -1 && currentIndex !== -1) {
1113
1166
  const startIndex = Math.min(lastIndex, currentIndex);
1114
1167
  const endIndex = Math.max(lastIndex, currentIndex);
1115
- displayedRows.slice(startIndex, endIndex + 1).forEach((rangeRow) => {
1116
- if (rangeRow.getCanSelect()) rangeRow.toggleSelected(checked);
1117
- });
1168
+ isBatchingRowSelectionRef.current = true;
1169
+ try {
1170
+ displayedRows.slice(startIndex, endIndex + 1).forEach((rangeRow) => {
1171
+ if (rangeRow.getCanSelect()) rangeRow.toggleSelected(checked);
1172
+ });
1173
+ } finally {
1174
+ isBatchingRowSelectionRef.current = false;
1175
+ }
1176
+ table.setRowSelection((selection) => selection);
1118
1177
  } else clickedRow.toggleSelected(checked);
1119
1178
  lastSelectedRowIdRef.current = clickedRow.id;
1120
1179
  }, []);
@@ -1148,11 +1207,14 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1148
1207
  clientSearch,
1149
1208
  clientFiltering,
1150
1209
  expandColumnVisibility,
1151
- showControls,
1210
+ showControls: Boolean(showControls) || isSelectionControlled,
1152
1211
  enableRowSelection,
1153
1212
  enableSubRowSelection,
1154
1213
  rowActions,
1155
1214
  getRowId,
1215
+ getRowLabel: isSelectionControlled ? getRowLabel : void 0,
1216
+ scopeSelectAllToRows: isSelectionControlled,
1217
+ stableSelectCells: isSelectionControlled,
1156
1218
  expandedRows,
1157
1219
  toggleRowExpansion,
1158
1220
  canRowExpand,
@@ -1260,6 +1322,11 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1260
1322
  ].includes(columnId);
1261
1323
  };
1262
1324
  const selectedRows = table.getFilteredSelectedRowModel().flatRows;
1325
+ const selectedRowIds = useMemo(() => isSelectionControlled ? [...controlledSelectedRowIds] : selectedRows.map((row) => row.id), [
1326
+ controlledSelectedRowIds,
1327
+ isSelectionControlled,
1328
+ selectedRows
1329
+ ]);
1263
1330
  useEffect(() => {
1264
1331
  onRowSelectionChange?.(selectedRows.map((row) => row.original));
1265
1332
  }, [selectedRows, onRowSelectionChange]);
@@ -1269,7 +1336,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1269
1336
  const baseAction = {
1270
1337
  ...action,
1271
1338
  onClick: async () => {
1272
- await action.onClick(selectedRows.map((row) => row.id), clearSelection);
1339
+ await action.onClick(selectedRowIds, clearSelection);
1273
1340
  }
1274
1341
  };
1275
1342
  if ("popover" in action && action.popover) {
@@ -1279,8 +1346,8 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1279
1346
  popover: {
1280
1347
  options: popoverConfig.options,
1281
1348
  onOptionSelect: async (option) => {
1282
- await popoverConfig.onOptionSelect(option, selectedRows.map((row) => row.id));
1283
- table.setRowSelection({});
1349
+ await popoverConfig.onOptionSelect(option, selectedRowIds);
1350
+ if (!isSelectionControlled) table.setRowSelection({});
1284
1351
  }
1285
1352
  }
1286
1353
  };
@@ -1290,12 +1357,14 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1290
1357
  }, [
1291
1358
  bulkActions,
1292
1359
  getAvailableBulkActions,
1360
+ isSelectionControlled,
1293
1361
  selectedRows,
1362
+ selectedRowIds,
1294
1363
  table,
1295
1364
  controls?.bulkActions
1296
1365
  ]);
1297
1366
  const usesFloatingBulkActions = Boolean(compact || floatingBulkActions);
1298
- const shouldShowFloatingActionBar = usesFloatingBulkActions && actions && actions.length > 0 && selectedRows.length > 0;
1367
+ const shouldShowFloatingActionBar = usesFloatingBulkActions && actions && actions.length > 0 && selectedRowIds.length > 0;
1299
1368
  const hasGlobalFilter = clientSearch && globalFilter && globalFilter.trim().length > 0;
1300
1369
  const hasFilters = columnFilters.length > 0 || controls?.filterPanel == null && (controls?.filtersV2 != null ? controls.filtersV2.initialState != null && !isEmptyState(controls.filtersV2.initialState) : unifiedFilters.some((filter) => filter.enabled !== false && isFilterActive(filter, controls?.filterResolver)));
1301
1370
  const hasActiveFilters = hasGlobalFilter || hasFilters || hasExternalActiveFilters;
@@ -1324,7 +1393,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1324
1393
  size: compact ? "sm" : void 0,
1325
1394
  variant: compact ? "text" : "basic"
1326
1395
  }),
1327
- selectedRows: table.getFilteredSelectedRowModel().flatRows.map((row) => row.id),
1396
+ selectedRows: selectedRowIds,
1328
1397
  onClearSelection: () => table.setRowSelection({}),
1329
1398
  searchProps: generatedSearchProps,
1330
1399
  ...controls,
@@ -1405,7 +1474,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1405
1474
  const isExpanded = expandedRows.has(rowId);
1406
1475
  const canExpand = canRowExpand(rowData);
1407
1476
  const rowLinkHref = getLinkToRow ? getLinkToRow(row.original) : rowLinkPrefix ? `${rowLinkPrefix}/${rowId}` : void 0;
1408
- const dynamicNestSpacing = showControls && enableRowSelection ? NEST_SPACING + 8 : NEST_SPACING;
1477
+ const dynamicNestSpacing = showSelectColumn ? NEST_SPACING + 8 : NEST_SPACING;
1409
1478
  const visibleCells = row.getVisibleCells();
1410
1479
  const isLinkableCell = (cell) => !isFeatureCol(cell.column.id) && cell.column.columnDef.meta?.format?.type !== "url";
1411
1480
  const rowLinkCellId = rowLinkHref ? visibleCells.find((cell) => cell.column.id === rowLinkColumnId && isLinkableCell(cell))?.column.id ?? visibleCells.find(isLinkableCell)?.column.id : void 0;
@@ -1532,7 +1601,7 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1532
1601
  return elements;
1533
1602
  })
1534
1603
  }), shouldShowFloatingActionBar && actions && /* @__PURE__ */ jsx(FloatingActionBarContainer, { children: /* @__PURE__ */ jsx(FloatingActionBar, {
1535
- selectedCount: selectedRows.length,
1604
+ selectedCount: selectedRowIds.length,
1536
1605
  onClearSelection: () => table.setRowSelection({}),
1537
1606
  actions,
1538
1607
  extraContent: floatingBarContent
@@ -1558,4 +1627,4 @@ const DataTable = ({ data, columns, detailComponent, expandColumnVisibility = "a
1558
1627
  //#endregion
1559
1628
  export { getFilterFnName as S, renderAsString as _, useTableColumns as a, getColumnWidths as b, renderAsCheckboxHeader as c, renderAsDatetime as d, renderAsLightweightImage as f, renderAsSticker as g, renderAsPii as h, FloatingActionBarContainer as i, renderAsCopyableString as l, renderAsPDSFormat as m, DataTableContainer as n, Inserter as o, renderAsNumber as p, DataTableControls as r, renderAsCheckbox as s, DataTable as t, renderAsDate as u, renderAsURL as v, generateClientFilters as x, FloatingActionBar as y };
1560
1629
 
1561
- //# sourceMappingURL=DataTable-DdSY9mzT.mjs.map
1630
+ //# sourceMappingURL=DataTable-DZ0B2Zm9.mjs.map