@atom-learning/components 9.0.0 → 10.0.1

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 (229) hide show
  1. package/dist/components/accordion/Accordion.js +1 -1
  2. package/dist/components/accordion/AccordionContent.js +1 -1
  3. package/dist/components/accordion/AccordionItem.js +1 -1
  4. package/dist/components/accordion/AccordionTrigger.js +2 -2
  5. package/dist/components/action-icon/ActionIcon.js +1 -1
  6. package/dist/components/alert-dialog/Alert.d.ts +3 -0
  7. package/dist/components/alert-dialog/Alert.js +7 -0
  8. package/dist/components/alert-dialog/Alert.js.map +1 -0
  9. package/dist/components/alert-dialog/AlertDialog.context.js +9 -6
  10. package/dist/components/alert-dialog/AlertDialog.context.js.map +1 -1
  11. package/dist/components/alert-dialog/alert-context/AlertDialog.js +1 -1
  12. package/dist/components/alert-dialog/alert-context/reducer.js +1 -5
  13. package/dist/components/alert-dialog/alert-context/reducer.js.map +1 -1
  14. package/dist/components/alert-dialog/alert-context/types.d.ts +1 -2
  15. package/dist/components/avatar/Avatar.js +5 -6
  16. package/dist/components/avatar/Avatar.js.map +1 -1
  17. package/dist/components/avatar/AvatarIcon.js +2 -2
  18. package/dist/components/avatar/AvatarIcon.js.map +1 -1
  19. package/dist/components/avatar/AvatarInitial.js +2 -2
  20. package/dist/components/avatar/AvatarInitial.js.map +1 -1
  21. package/dist/components/badge/Badge.context.js +12 -13
  22. package/dist/components/badge/Badge.context.js.map +1 -1
  23. package/dist/components/badge/Badge.js +4 -3
  24. package/dist/components/badge/Badge.js.map +1 -1
  25. package/dist/components/badge/BadgeText.js +3 -3
  26. package/dist/components/badge/BadgeText.js.map +1 -1
  27. package/dist/components/banner/Banner.context.js +13 -14
  28. package/dist/components/banner/Banner.context.js.map +1 -1
  29. package/dist/components/banner/banner-regular/BannerRegularActions.js +2 -8
  30. package/dist/components/banner/banner-regular/BannerRegularActions.js.map +1 -1
  31. package/dist/components/banner/banner-regular/BannerRegularButton.js +2 -2
  32. package/dist/components/banner/banner-regular/BannerRegularButton.js.map +1 -1
  33. package/dist/components/banner/banner-regular/BannerRegularDismiss.js +1 -1
  34. package/dist/components/banner/banner-regular/BannerRegularDismiss.js.map +1 -1
  35. package/dist/components/banner/banner-slim/BannerSlimButton.js +2 -2
  36. package/dist/components/banner/banner-slim/BannerSlimButton.js.map +1 -1
  37. package/dist/components/banner/banner-slim/BannerSlimContainer.js +4 -13
  38. package/dist/components/banner/banner-slim/BannerSlimContainer.js.map +1 -1
  39. package/dist/components/calendar/Calendar.d.ts +1 -1
  40. package/dist/components/calendar/Calendar.js +6 -4
  41. package/dist/components/calendar/Calendar.js.map +1 -1
  42. package/dist/components/carousel/Carousel.js +2 -2
  43. package/dist/components/carousel/Carousel.js.map +1 -1
  44. package/dist/components/carousel/CarouselSlide.js +1 -1
  45. package/dist/components/carousel/CarouselSlide.js.map +1 -1
  46. package/dist/components/carousel/CarouselSlider.js +1 -1
  47. package/dist/components/carousel/CarouselSlider.js.map +1 -1
  48. package/dist/components/checkbox/Checkbox.js +2 -2
  49. package/dist/components/checkbox/Checkbox.js.map +1 -1
  50. package/dist/components/checkbox-field/CheckboxField.js +7 -3
  51. package/dist/components/checkbox-field/CheckboxField.js.map +1 -1
  52. package/dist/components/checkbox-group/CheckboxGroup.d.ts +1 -1
  53. package/dist/components/checkbox-group/CheckboxGroupAllItem.js +2 -2
  54. package/dist/components/checkbox-group/CheckboxGroupAllItem.js.map +1 -1
  55. package/dist/components/checkbox-group/CheckboxGroupChecked.context.js +13 -14
  56. package/dist/components/checkbox-group/CheckboxGroupChecked.context.js.map +1 -1
  57. package/dist/components/checkbox-group/CheckboxGroupItem.js +2 -2
  58. package/dist/components/checkbox-group/CheckboxGroupItem.js.map +1 -1
  59. package/dist/components/checkbox-group/CheckboxGroupMounted.context.js +6 -7
  60. package/dist/components/checkbox-group/CheckboxGroupMounted.context.js.map +1 -1
  61. package/dist/components/chip/Chip.js +4 -5
  62. package/dist/components/chip/Chip.js.map +1 -1
  63. package/dist/components/create-password-field/CreatePasswordField.js +1 -1
  64. package/dist/components/create-password-field/CreatePasswordField.js.map +1 -1
  65. package/dist/components/data-table/DataTable.context.js +43 -26
  66. package/dist/components/data-table/DataTable.context.js.map +1 -1
  67. package/dist/components/data-table/DataTable.types.d.ts +1 -0
  68. package/dist/components/data-table/DataTable.types.js.map +1 -1
  69. package/dist/components/data-table/DataTableBulkActionsFloating.js +3 -7
  70. package/dist/components/data-table/DataTableBulkActionsFloating.js.map +1 -1
  71. package/dist/components/data-table/DataTableGlobalFilter.js +16 -8
  72. package/dist/components/data-table/DataTableGlobalFilter.js.map +1 -1
  73. package/dist/components/data-table/DataTableHead.js +5 -14
  74. package/dist/components/data-table/DataTableHead.js.map +1 -1
  75. package/dist/components/data-table/DataTableHeaderCell.js +1 -1
  76. package/dist/components/data-table/DataTableRowSelectionCheckbox.js +1 -0
  77. package/dist/components/data-table/DataTableRowSelectionCheckbox.js.map +1 -1
  78. package/dist/components/data-table/DataTableSelectAllRowsCheckbox.js +2 -1
  79. package/dist/components/data-table/DataTableSelectAllRowsCheckbox.js.map +1 -1
  80. package/dist/components/data-table/DataTableTable.js +8 -6
  81. package/dist/components/data-table/DataTableTable.js.map +1 -1
  82. package/dist/components/data-table/drag-and-drop/DragAndDropTable.js +1 -1
  83. package/dist/components/data-table/drag-and-drop/DragAndDropTable.js.map +1 -1
  84. package/dist/components/data-table/pagination/Pagination.js +3 -2
  85. package/dist/components/data-table/pagination/Pagination.js.map +1 -1
  86. package/dist/components/data-table/usePagination.d.ts +1 -0
  87. package/dist/components/data-table/usePagination.js +7 -2
  88. package/dist/components/data-table/usePagination.js.map +1 -1
  89. package/dist/components/date-input/DateInput.js +4 -3
  90. package/dist/components/date-input/DateInput.js.map +1 -1
  91. package/dist/components/dismissible/DismissibleRoot.js +15 -16
  92. package/dist/components/dismissible/DismissibleRoot.js.map +1 -1
  93. package/dist/components/dismissible/DismissibleTrigger.js +1 -1
  94. package/dist/components/dismissible/DismissibleTrigger.js.map +1 -1
  95. package/dist/components/dismissible-group/DismissibleGroupItem.js +1 -1
  96. package/dist/components/dismissible-group/DismissibleGroupItem.js.map +1 -1
  97. package/dist/components/dismissible-group/DismissibleGroupRoot.js +5 -6
  98. package/dist/components/dismissible-group/DismissibleGroupRoot.js.map +1 -1
  99. package/dist/components/drawer/Drawer.context.js +2 -3
  100. package/dist/components/drawer/Drawer.context.js.map +1 -1
  101. package/dist/components/drawer/DrawerContent.js +1 -1
  102. package/dist/components/drawer/DrawerContent.js.map +1 -1
  103. package/dist/components/empty-state/EmptyState.context.js +2 -3
  104. package/dist/components/empty-state/EmptyState.context.js.map +1 -1
  105. package/dist/components/empty-state/EmptyStateBody.js +1 -1
  106. package/dist/components/empty-state/EmptyStateBody.js.map +1 -1
  107. package/dist/components/empty-state/EmptyStateImage.js +1 -1
  108. package/dist/components/empty-state/EmptyStateImage.js.map +1 -1
  109. package/dist/components/empty-state/EmptyStateTitle.js +1 -1
  110. package/dist/components/empty-state/EmptyStateTitle.js.map +1 -1
  111. package/dist/components/file-drop/FileDrop.js +3 -3
  112. package/dist/components/file-drop/FileDrop.js.map +1 -1
  113. package/dist/components/file-drop/useFileDrop.js +1 -1
  114. package/dist/components/file-drop/useFileDrop.js.map +1 -1
  115. package/dist/components/file-input/FileInput.js +1 -1
  116. package/dist/components/form/Form.js +7 -6
  117. package/dist/components/form/Form.js.map +1 -1
  118. package/dist/components/form/useFormCustomContext.js +1 -1
  119. package/dist/components/form/useFormCustomContext.js.map +1 -1
  120. package/dist/components/index.d.ts +1 -3
  121. package/dist/components/inline-message/InlineMessage.js +1 -1
  122. package/dist/components/input/Input.js +2 -2
  123. package/dist/components/input/Input.js.map +1 -1
  124. package/dist/components/keyboard-shortcut/KeyboardShortcut.js +10 -7
  125. package/dist/components/keyboard-shortcut/KeyboardShortcut.js.map +1 -1
  126. package/dist/components/markdown-content/MarkdownContent.d.ts +1 -1
  127. package/dist/components/markdown-content/MarkdownContent.js +9 -9
  128. package/dist/components/markdown-content/MarkdownContent.js.map +1 -1
  129. package/dist/components/markdown-content/components/MarkdownEmphasis.d.ts +2 -2
  130. package/dist/components/markdown-content/components/MarkdownEmphasis.js.map +1 -1
  131. package/dist/components/markdown-content/components/MarkdownHeading.d.ts +2 -2
  132. package/dist/components/markdown-content/components/MarkdownHeading.js.map +1 -1
  133. package/dist/components/markdown-content/components/MarkdownLink.d.ts +2 -2
  134. package/dist/components/markdown-content/components/MarkdownLink.js.map +1 -1
  135. package/dist/components/markdown-content/components/MarkdownList.d.ts +2 -2
  136. package/dist/components/markdown-content/components/MarkdownList.js.map +1 -1
  137. package/dist/components/markdown-content/components/MarkdownListItem.d.ts +2 -2
  138. package/dist/components/markdown-content/components/MarkdownListItem.js.map +1 -1
  139. package/dist/components/markdown-content/components/MarkdownParagraph.d.ts +2 -2
  140. package/dist/components/markdown-content/components/MarkdownParagraph.js.map +1 -1
  141. package/dist/components/markdown-content/components/MarkdownStrong.d.ts +2 -2
  142. package/dist/components/markdown-content/components/MarkdownStrong.js.map +1 -1
  143. package/dist/components/navigation/NavigationMenu.context.js +1 -1
  144. package/dist/components/navigation/NavigationMenu.context.js.map +1 -1
  145. package/dist/components/navigation/NavigationMenu.js +8 -7
  146. package/dist/components/navigation/NavigationMenu.js.map +1 -1
  147. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordion.d.ts +2 -2
  148. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordion.js +3 -3
  149. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordion.js.map +1 -1
  150. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordionContent.js +1 -1
  151. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordionContent.js.map +1 -1
  152. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordionTrigger.js +1 -1
  153. package/dist/components/navigation-menu-vertical/NavigationMenuVerticalAccordionTrigger.js.map +1 -1
  154. package/dist/components/number-input/NumberInput.js +15 -16
  155. package/dist/components/number-input/NumberInput.js.map +1 -1
  156. package/dist/components/number-input-field/NumberInputField.js +7 -3
  157. package/dist/components/number-input-field/NumberInputField.js.map +1 -1
  158. package/dist/components/pagination/Pagination.context.js +29 -22
  159. package/dist/components/pagination/Pagination.context.js.map +1 -1
  160. package/dist/components/pagination/usePagination.js +1 -1
  161. package/dist/components/pagination/usePagination.js.map +1 -1
  162. package/dist/components/password-input/PasswordInput.js +1 -2
  163. package/dist/components/password-input/PasswordInput.js.map +1 -1
  164. package/dist/components/radio-button-field/RadioButtonField.js +7 -3
  165. package/dist/components/radio-button-field/RadioButtonField.js.map +1 -1
  166. package/dist/components/search-input/SearchInput.js +7 -11
  167. package/dist/components/search-input/SearchInput.js.map +1 -1
  168. package/dist/components/section-message/SectionMessage.context.js +15 -16
  169. package/dist/components/section-message/SectionMessage.context.js.map +1 -1
  170. package/dist/components/segmented-control/SegmentedControlBadge.js +1 -1
  171. package/dist/components/segmented-control/SegmentedControlBadge.js.map +1 -1
  172. package/dist/components/segmented-control/SegmentedControlDescription.js +1 -1
  173. package/dist/components/segmented-control/SegmentedControlDescription.js.map +1 -1
  174. package/dist/components/segmented-control/SegmentedControlHeading.js +1 -1
  175. package/dist/components/segmented-control/SegmentedControlHeading.js.map +1 -1
  176. package/dist/components/segmented-control/SegmentedControlIcon.js +1 -1
  177. package/dist/components/segmented-control/SegmentedControlIcon.js.map +1 -1
  178. package/dist/components/segmented-control/SegmentedControlItem.js +1 -1
  179. package/dist/components/segmented-control/SegmentedControlItem.js.map +1 -1
  180. package/dist/components/segmented-control/SegmentedControlItemList.js +20 -14
  181. package/dist/components/segmented-control/SegmentedControlItemList.js.map +1 -1
  182. package/dist/components/segmented-control/SegmentedControlRoot.js +14 -18
  183. package/dist/components/segmented-control/SegmentedControlRoot.js.map +1 -1
  184. package/dist/components/select-menu/SelectMenu.context.js +1 -1
  185. package/dist/components/select-menu/SelectMenu.context.js.map +1 -1
  186. package/dist/components/select-menu/SelectMenu.js +18 -12
  187. package/dist/components/select-menu/SelectMenu.js.map +1 -1
  188. package/dist/components/side-bar/SideBar.context.js +1 -1
  189. package/dist/components/side-bar/SideBar.context.js.map +1 -1
  190. package/dist/components/side-bar/SideBar.js +2 -2
  191. package/dist/components/side-bar/SideBar.js.map +1 -1
  192. package/dist/components/slider-field/SliderField.js +8 -3
  193. package/dist/components/slider-field/SliderField.js.map +1 -1
  194. package/dist/components/sortable/SortableRoot.js +5 -3
  195. package/dist/components/sortable/SortableRoot.js.map +1 -1
  196. package/dist/components/stepper/Stepper.context.js +38 -30
  197. package/dist/components/stepper/Stepper.context.js.map +1 -1
  198. package/dist/components/tabs/TabsTriggerList.js +1 -1
  199. package/dist/components/toast/Toast.context.js +1 -1
  200. package/dist/components/toast/Toast.context.js.map +1 -1
  201. package/dist/components/toast/ToastProvider.js +1 -1
  202. package/dist/components/toast/ToastProvider.js.map +1 -1
  203. package/dist/components/tree/TreeCollapsible.d.ts +2 -2
  204. package/dist/components/tree/TreeCollapsible.js +3 -3
  205. package/dist/components/tree/TreeCollapsible.js.map +1 -1
  206. package/dist/components/tree/TreeCollapsibleContent.js +1 -1
  207. package/dist/components/tree/TreeCollapsibleContent.js.map +1 -1
  208. package/dist/components/tree/TreeCollapsibleTrigger.js +1 -1
  209. package/dist/components/tree/TreeCollapsibleTrigger.js.map +1 -1
  210. package/dist/docgen.json +1 -1
  211. package/dist/index.cjs.js +1299 -1244
  212. package/dist/index.cjs.js.map +1 -1
  213. package/dist/index.js +7 -7
  214. package/dist/styled.js +5 -1
  215. package/dist/styled.js.map +1 -1
  216. package/dist/utilities/hooks/useCallbackRef.d.ts +3 -3
  217. package/dist/utilities/hooks/useCallbackRef.js +4 -1
  218. package/dist/utilities/hooks/useCallbackRef.js.map +1 -1
  219. package/dist/utilities/hooks/useResizeObserver.js +13 -3
  220. package/dist/utilities/hooks/useResizeObserver.js.map +1 -1
  221. package/dist/utilities/hooks/useScrollPosition.js +22 -17
  222. package/dist/utilities/hooks/useScrollPosition.js.map +1 -1
  223. package/dist/utilities/hooks/useWindowScrollPosition.js +19 -15
  224. package/dist/utilities/hooks/useWindowScrollPosition.js.map +1 -1
  225. package/dist/utilities/uri/index.js +1 -6
  226. package/dist/utilities/uri/index.js.map +1 -1
  227. package/package.json +39 -35
  228. package/dist/components/index.js +0 -102
  229. package/dist/components/index.js.map +0 -1
@@ -4,13 +4,12 @@ import { usePagination } from "./usePagination.js";
4
4
  import { useSortByColumn } from "./useSorting.js";
5
5
  import * as React$1 from "react";
6
6
  import { jsx } from "react/jsx-runtime";
7
- import { v4 } from "@lukeed/uuid";
8
7
  import { getCoreRowModel, getExpandedRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
9
8
  import { useDeepCompareEffectNoCheck } from "use-deep-compare-effect";
10
9
  //#region src/components/data-table/DataTable.context.tsx
11
10
  var DataTableContext = React$1.createContext(null);
12
11
  var DataTableProvider = ({ columns, data: dataProp = [], getAsyncData, defaultSort, initialState = void 0, disabledRows, enableRowSelection, onRowSelectionChange, children }) => {
13
- const tableId = React$1.useRef(v4());
12
+ const tableId = React$1.useId();
14
13
  const [data, setData] = React$1.useState({
15
14
  results: dataProp ?? [],
16
15
  total: dataProp?.length ?? 0
@@ -23,17 +22,22 @@ var DataTableProvider = ({ columns, data: dataProp = [], getAsyncData, defaultSo
23
22
  offsetTop: 0,
24
23
  isVisible: true
25
24
  });
26
- const { isPaginated, applyPagination, paginationState, setPaginationState } = usePagination(initialState?.pagination);
25
+ const { isPaginated, applyPagination, removePagination, paginationState, setPaginationState } = usePagination(initialState?.pagination);
27
26
  const [asyncDataState, setAsyncDataState] = React$1.useState(AsyncDataState.NONE);
28
27
  const [globalFilter, setGlobalFilter] = React$1.useState("");
29
28
  const { setIsSortable, isSortable, sorting, setSorting } = useSortByColumn(defaultSort);
29
+ const asyncRequestIdRef = React$1.useRef(0);
30
30
  const runAsyncData = React$1.useCallback(async (overrideAsyncDataOptions) => {
31
31
  if (!getAsyncData) return;
32
+ const requestId = ++asyncRequestIdRef.current;
32
33
  try {
33
34
  setAsyncDataState(AsyncDataState.PENDING);
34
- setData(await getNewAsyncData(getAsyncData, overrideAsyncDataOptions, paginationState, sorting, globalFilter));
35
+ const newData = await getNewAsyncData(getAsyncData, overrideAsyncDataOptions, paginationState, sorting, globalFilter);
36
+ if (requestId !== asyncRequestIdRef.current) return;
37
+ setData(newData);
35
38
  setAsyncDataState(AsyncDataState.FULFILLED);
36
39
  } catch (_error) {
40
+ if (requestId !== asyncRequestIdRef.current) return;
37
41
  setAsyncDataState(AsyncDataState.REJECTED);
38
42
  }
39
43
  }, [
@@ -53,7 +57,7 @@ var DataTableProvider = ({ columns, data: dataProp = [], getAsyncData, defaultSo
53
57
  total: dataProp.length
54
58
  });
55
59
  }, [dataProp]);
56
- const getTotalRows = () => data.total;
60
+ const getTotalRows = React$1.useCallback(() => data.total, [data.total]);
57
61
  const table = useReactTable({
58
62
  columns,
59
63
  data: data.results,
@@ -97,42 +101,55 @@ var DataTableProvider = ({ columns, data: dataProp = [], getAsyncData, defaultSo
97
101
  }
98
102
  }
99
103
  });
100
- const value = React$1.useMemo(() => {
101
- return {
102
- ...table,
104
+ return /* @__PURE__ */ jsx(DataTableContext, {
105
+ value: React$1.useMemo(() => {
106
+ return {
107
+ ...table,
108
+ columns,
109
+ data,
110
+ setData,
111
+ setIsSortable,
112
+ applyPagination,
113
+ removePagination,
114
+ getTotalRows,
115
+ isSortable,
116
+ asyncDataState,
117
+ runAsyncData,
118
+ hasAsyncData: !!getAsyncData,
119
+ disabledRows,
120
+ enableRowSelection,
121
+ rowSelection,
122
+ tablePosition,
123
+ setTablePosition,
124
+ tableId
125
+ };
126
+ }, [
127
+ table,
103
128
  columns,
104
129
  data,
105
- setData,
106
- setIsSortable,
107
130
  applyPagination,
131
+ removePagination,
108
132
  getTotalRows,
109
133
  isSortable,
110
134
  asyncDataState,
111
135
  runAsyncData,
112
- hasAsyncData: !!getAsyncData,
136
+ getAsyncData,
113
137
  disabledRows,
114
138
  enableRowSelection,
115
139
  rowSelection,
116
140
  tablePosition,
117
- setTablePosition,
118
- tableId: tableId.current
119
- };
120
- }, [
121
- table,
122
- applyPagination,
123
- getTotalRows,
124
- isSortable,
125
- enableRowSelection,
126
- tableId,
127
- getAsyncData
128
- ]);
129
- return /* @__PURE__ */ jsx(DataTableContext.Provider, {
130
- value,
141
+ expanded,
142
+ sorting,
143
+ globalFilter,
144
+ paginationState,
145
+ isPaginated,
146
+ tableId
147
+ ]),
131
148
  children
132
149
  });
133
150
  };
134
151
  var useDataTable = () => {
135
- const context = React$1.useContext(DataTableContext);
152
+ const context = React$1.use(DataTableContext);
136
153
  if (!context) throw new Error("useDataTable can only be called from inside a DataTableProvider");
137
154
  return context;
138
155
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.context.js","names":[],"sources":["../../../src/components/data-table/DataTable.context.tsx"],"sourcesContent":["import { v4 as uuid } from '@lukeed/uuid'\nimport type {\n ExpandedState,\n OnChangeFn,\n PaginationState,\n Row,\n RowSelectionState\n} from '@tanstack/react-table'\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table'\nimport * as React from 'react'\n// Use the named export, not the default: the CJS build's Node-mode interop\n// (__toESM(mod, 1)) shadows this package's `default` with the whole module\n// object, so a default import resolves to a non-callable object at runtime.\n// NoCheck is equivalent here — the dep (`dataProp`) is always an array, so the\n// default export's dev-only all-primitive guard would never fire.\nimport { useDeepCompareEffectNoCheck as useDeepCompareEffect } from 'use-deep-compare-effect'\n\nimport {\n AsyncDataState,\n type DataTableContextType,\n type InitialState,\n type TableData,\n type TablePosition,\n type AsyncDataOptions,\n type AsyncDataResult,\n type DefaultSort,\n type GetAsyncData\n} from './DataTable.types'\nimport { getNewAsyncData } from './getNewAsyncData'\nimport { usePagination } from './usePagination'\nimport { useSortByColumn } from './useSorting'\n\nconst DataTableContext =\n React.createContext<DataTableContextType<unknown> | null>(null)\n\ntype DataTableProviderProps = {\n columns\n defaultSort?: DefaultSort\n children: React.ReactNode\n initialState?: InitialState\n disabledRows?: Record<string, boolean>\n enableRowSelection?: boolean | ((row: Row<unknown>) => boolean)\n onRowSelectionChange?: OnChangeFn<RowSelectionState>\n} & (\n | { data: TableData; getAsyncData?: never }\n | { data?: never; getAsyncData: GetAsyncData }\n)\n\nexport const DataTableProvider = ({\n columns,\n data: dataProp = [],\n getAsyncData,\n defaultSort,\n initialState = undefined,\n disabledRows,\n enableRowSelection,\n onRowSelectionChange,\n children\n}: DataTableProviderProps) => {\n const tableId = React.useRef(uuid())\n\n const [data, setData] = React.useState<AsyncDataResult>({\n results: dataProp ?? [],\n total: dataProp?.length ?? 0\n })\n\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})\n const [expanded, setExpanded] = React.useState<ExpandedState>({})\n\n const [tablePosition, setTablePosition] = React.useState<TablePosition>({\n top: null,\n bottom: null,\n offsetTop: 0,\n isVisible: true\n })\n\n const { isPaginated, applyPagination, paginationState, setPaginationState } =\n usePagination(initialState?.pagination)\n\n const [asyncDataState, setAsyncDataState] = React.useState<AsyncDataState>(\n AsyncDataState.NONE\n )\n\n const [globalFilter, setGlobalFilter] = React.useState<string>('')\n\n const { setIsSortable, isSortable, sorting, setSorting } =\n useSortByColumn(defaultSort)\n\n const runAsyncData = React.useCallback(\n async (overrideAsyncDataOptions: Partial<AsyncDataOptions>) => {\n if (!getAsyncData) return\n\n try {\n setAsyncDataState(AsyncDataState.PENDING)\n\n const newData = await getNewAsyncData(\n getAsyncData,\n overrideAsyncDataOptions,\n paginationState as PaginationState,\n sorting,\n globalFilter\n )\n\n setData(newData as AsyncDataResult)\n setAsyncDataState(AsyncDataState.FULFILLED)\n } catch (_error) {\n setAsyncDataState(AsyncDataState.REJECTED)\n }\n },\n [\n getAsyncData,\n paginationState?.pageIndex,\n paginationState?.pageSize,\n sorting,\n globalFilter\n ]\n )\n\n React.useEffect(() => {\n runAsyncData({})\n }, [runAsyncData])\n\n useDeepCompareEffect(() => {\n if (!dataProp) return\n\n setData({ results: dataProp, total: dataProp.length })\n }, [dataProp])\n\n const getTotalRows = () => data.total\n\n const table = useReactTable<unknown>({\n columns,\n data: data.results,\n pageCount:\n getAsyncData && paginationState\n ? Math.ceil(getTotalRows() / paginationState.pageSize)\n : -1,\n initialState: initialState,\n state: {\n sorting,\n globalFilter,\n pagination: paginationState,\n rowSelection,\n expanded\n },\n manualPagination: getAsyncData && isPaginated,\n manualSorting: getAsyncData && isPaginated,\n enableSorting: asyncDataState !== AsyncDataState.PENDING,\n enableGlobalFilter: !getAsyncData,\n enableRowSelection,\n onExpandedChange: setExpanded,\n getSubRows: (row) => (row as Row<unknown>).subRows,\n onRowSelectionChange: (updaterOrValue) => {\n if (onRowSelectionChange) onRowSelectionChange(updaterOrValue)\n setRowSelection(updaterOrValue)\n },\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: isPaginated ? getPaginationRowModel() : undefined,\n getSortedRowModel:\n isSortable || sorting.length ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n onPaginationChange: isPaginated\n ? (setPaginationState as OnChangeFn<PaginationState>)\n : undefined,\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n globalFilterFn: (row, columnId, filterValue) => {\n const checkFilterMatchesCell = (cellValue: string) =>\n cellValue.toLowerCase().includes(filterValue.toLowerCase())\n\n const isSubRow = row.depth > 0\n\n if (isSubRow) return true\n\n const value = row.getValue(columnId)\n switch (typeof value) {\n case 'string':\n return checkFilterMatchesCell(value)\n case 'boolean':\n case 'number':\n return checkFilterMatchesCell(String(value))\n default:\n return false\n }\n }\n })\n\n const value: DataTableContextType = React.useMemo(() => {\n return {\n ...table,\n columns,\n data,\n setData,\n setIsSortable,\n applyPagination,\n getTotalRows,\n isSortable,\n asyncDataState,\n runAsyncData,\n hasAsyncData: !!getAsyncData,\n disabledRows,\n enableRowSelection,\n rowSelection,\n tablePosition,\n setTablePosition,\n tableId: tableId.current\n }\n }, [\n table,\n applyPagination,\n getTotalRows,\n isSortable,\n enableRowSelection,\n tableId,\n getAsyncData\n ])\n\n return (\n <DataTableContext.Provider value={value}>\n {children}\n </DataTableContext.Provider>\n )\n}\n\nexport const useDataTable = <T extends Record<string, unknown>>() => {\n const context = React.useContext(DataTableContext) as DataTableContextType<T>\n\n if (!context)\n throw new Error(\n 'useDataTable can only be called from inside a DataTableProvider'\n )\n\n return context\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.context.js","names":[],"sources":["../../../src/components/data-table/DataTable.context.tsx"],"sourcesContent":["import type {\n ExpandedState,\n OnChangeFn,\n PaginationState,\n Row,\n RowSelectionState\n} from '@tanstack/react-table'\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table'\nimport * as React from 'react'\n// Use the named export, not the default: the CJS build's Node-mode interop\n// (__toESM(mod, 1)) shadows this package's `default` with the whole module\n// object, so a default import resolves to a non-callable object at runtime.\n// NoCheck is equivalent here — the dep (`dataProp`) is always an array, so the\n// default export's dev-only all-primitive guard would never fire.\nimport { useDeepCompareEffectNoCheck as useDeepCompareEffect } from 'use-deep-compare-effect'\n\nimport {\n AsyncDataState,\n type DataTableContextType,\n type InitialState,\n type TableData,\n type TablePosition,\n type AsyncDataOptions,\n type AsyncDataResult,\n type DefaultSort,\n type GetAsyncData\n} from './DataTable.types'\nimport { getNewAsyncData } from './getNewAsyncData'\nimport { usePagination } from './usePagination'\nimport { useSortByColumn } from './useSorting'\n\nconst DataTableContext =\n React.createContext<DataTableContextType<unknown> | null>(null)\n\ntype DataTableProviderProps = {\n columns\n defaultSort?: DefaultSort\n children: React.ReactNode\n initialState?: InitialState\n disabledRows?: Record<string, boolean>\n enableRowSelection?: boolean | ((row: Row<unknown>) => boolean)\n onRowSelectionChange?: OnChangeFn<RowSelectionState>\n} & (\n | { data: TableData; getAsyncData?: never }\n | { data?: never; getAsyncData: GetAsyncData }\n)\n\nexport const DataTableProvider = ({\n columns,\n data: dataProp = [],\n getAsyncData,\n defaultSort,\n initialState = undefined,\n disabledRows,\n enableRowSelection,\n onRowSelectionChange,\n children\n}: DataTableProviderProps) => {\n // Rendered into checkbox id/htmlFor/name attributes, so it must be\n // identical between server and client render — useId guarantees this.\n const tableId = React.useId()\n\n const [data, setData] = React.useState<AsyncDataResult>({\n results: dataProp ?? [],\n total: dataProp?.length ?? 0\n })\n\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})\n const [expanded, setExpanded] = React.useState<ExpandedState>({})\n\n const [tablePosition, setTablePosition] = React.useState<TablePosition>({\n top: null,\n bottom: null,\n offsetTop: 0,\n isVisible: true\n })\n\n const {\n isPaginated,\n applyPagination,\n removePagination,\n paginationState,\n setPaginationState\n } = usePagination(initialState?.pagination)\n\n const [asyncDataState, setAsyncDataState] = React.useState<AsyncDataState>(\n AsyncDataState.NONE\n )\n\n const [globalFilter, setGlobalFilter] = React.useState<string>('')\n\n const { setIsSortable, isSortable, sorting, setSorting } =\n useSortByColumn(defaultSort)\n\n // Monotonic sequence so only the latest in-flight request may commit its\n // response — without this, rapid pagination/sort/filter changes race two\n // requests and the slower, stale response wins `setData`.\n const asyncRequestIdRef = React.useRef(0)\n\n const runAsyncData = React.useCallback(\n async (overrideAsyncDataOptions: Partial<AsyncDataOptions>) => {\n if (!getAsyncData) return\n\n const requestId = ++asyncRequestIdRef.current\n\n try {\n setAsyncDataState(AsyncDataState.PENDING)\n\n const newData = await getNewAsyncData(\n getAsyncData,\n overrideAsyncDataOptions,\n paginationState as PaginationState,\n sorting,\n globalFilter\n )\n\n if (requestId !== asyncRequestIdRef.current) return\n\n setData(newData as AsyncDataResult)\n setAsyncDataState(AsyncDataState.FULFILLED)\n } catch (_error) {\n if (requestId !== asyncRequestIdRef.current) return\n\n setAsyncDataState(AsyncDataState.REJECTED)\n }\n },\n [\n getAsyncData,\n paginationState?.pageIndex,\n paginationState?.pageSize,\n sorting,\n globalFilter\n ]\n )\n\n React.useEffect(() => {\n runAsyncData({})\n }, [runAsyncData])\n\n useDeepCompareEffect(() => {\n if (!dataProp) return\n\n setData({ results: dataProp, total: dataProp.length })\n }, [dataProp])\n\n const getTotalRows = React.useCallback(() => data.total, [data.total])\n\n const table = useReactTable<unknown>({\n columns,\n data: data.results,\n pageCount:\n getAsyncData && paginationState\n ? Math.ceil(getTotalRows() / paginationState.pageSize)\n : -1,\n initialState: initialState,\n state: {\n sorting,\n globalFilter,\n pagination: paginationState,\n rowSelection,\n expanded\n },\n manualPagination: getAsyncData && isPaginated,\n manualSorting: getAsyncData && isPaginated,\n enableSorting: asyncDataState !== AsyncDataState.PENDING,\n enableGlobalFilter: !getAsyncData,\n enableRowSelection,\n onExpandedChange: setExpanded,\n getSubRows: (row) => (row as Row<unknown>).subRows,\n onRowSelectionChange: (updaterOrValue) => {\n if (onRowSelectionChange) onRowSelectionChange(updaterOrValue)\n setRowSelection(updaterOrValue)\n },\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: isPaginated ? getPaginationRowModel() : undefined,\n getSortedRowModel:\n isSortable || sorting.length ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n onPaginationChange: isPaginated\n ? (setPaginationState as OnChangeFn<PaginationState>)\n : undefined,\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n globalFilterFn: (row, columnId, filterValue) => {\n const checkFilterMatchesCell = (cellValue: string) =>\n cellValue.toLowerCase().includes(filterValue.toLowerCase())\n\n const isSubRow = row.depth > 0\n\n if (isSubRow) return true\n\n const value = row.getValue(columnId)\n switch (typeof value) {\n case 'string':\n return checkFilterMatchesCell(value)\n case 'boolean':\n case 'number':\n return checkFilterMatchesCell(String(value))\n default:\n return false\n }\n }\n })\n\n const value: DataTableContextType = React.useMemo(() => {\n return {\n ...table,\n columns,\n data,\n setData,\n setIsSortable,\n applyPagination,\n removePagination,\n getTotalRows,\n isSortable,\n asyncDataState,\n runAsyncData,\n hasAsyncData: !!getAsyncData,\n disabledRows,\n enableRowSelection,\n rowSelection,\n tablePosition,\n setTablePosition,\n tableId\n }\n // The value object's identity is what notifies consumers, and the spread\n // `table` instance is stable while its internal state changes — so every\n // piece of provider state must be a dep here or consumers go stale.\n }, [\n table,\n columns,\n data,\n applyPagination,\n removePagination,\n getTotalRows,\n isSortable,\n asyncDataState,\n runAsyncData,\n getAsyncData,\n disabledRows,\n enableRowSelection,\n rowSelection,\n tablePosition,\n expanded,\n sorting,\n globalFilter,\n paginationState,\n isPaginated,\n tableId\n ])\n\n return <DataTableContext value={value}>{children}</DataTableContext>\n}\n\nexport const useDataTable = <T extends Record<string, unknown>>() => {\n const context = React.use(DataTableContext) as DataTableContextType<T>\n\n if (!context)\n throw new Error(\n 'useDataTable can only be called from inside a DataTableProvider'\n )\n\n return context\n}\n"],"mappings":"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"}
@@ -27,6 +27,7 @@ export type TablePosition = {
27
27
  export type DataTableContextType<T = unknown> = Table<T> & {
28
28
  setIsSortable: React.Dispatch<React.SetStateAction<boolean>>;
29
29
  applyPagination: () => void;
30
+ removePagination: () => void;
30
31
  getTotalRows: () => number;
31
32
  isSortable: boolean;
32
33
  asyncDataState?: AsyncDataState;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.types.js","names":[],"sources":["../../../src/components/data-table/DataTable.types.ts"],"sourcesContent":["import type {\n InitialTableState,\n Row,\n RowSelectionState,\n SortDirection,\n Table\n} from '@tanstack/react-table'\nimport * as React from 'react'\n\nexport enum AsyncDataState {\n NONE = 'none',\n PENDING = 'pending',\n FULFILLED = 'fulfilled',\n REJECTED = 'rejected'\n}\n\nexport type AsyncDataResult = {\n total: number\n results: TableData\n}\n\nexport type AsyncDataOptions = {\n pageIndex: number\n pageSize: number\n sortBy?: string\n sortDirection?: SortDirection\n globalFilter?: string\n}\n\nexport type GetAsyncData = (\n options: AsyncDataOptions\n) => Promise<AsyncDataResult | undefined>\n\nexport type TablePosition = {\n top: number | null\n bottom: number | null\n offsetTop: number\n isVisible: boolean\n}\n\nexport type DataTableContextType<T = unknown> = Table<T> & {\n setIsSortable: React.Dispatch<React.SetStateAction<boolean>>\n applyPagination: () => void\n getTotalRows: () => number\n isSortable: boolean\n asyncDataState?: AsyncDataState\n runAsyncData?: (options: Partial<AsyncDataOptions>) => Promise<void>\n hasAsyncData: boolean\n disabledRows?: Record<string, boolean>\n enableRowSelection?: boolean | ((row: Row<unknown>) => boolean)\n rowSelection: RowSelectionState\n tablePosition?: TablePosition\n setTablePosition: React.Dispatch<React.SetStateAction<TablePosition>>\n data: AsyncDataResult\n columns: any\n tableId: string\n /**\n * Directly update the data array that the table rows are built from.\n * This is useful when re-ordering rows, but is high-risk if you're not sure what you're doing!\n *\n * Note in particular that this value is also updated if you update the value of the `DataTable`'s `data` prop\n * — it's probably best to only use one of those two methods for any given table.\n */\n setData: React.Dispatch<React.SetStateAction<AsyncDataResult>>\n}\n\nexport type TableData = Array<Record<string, unknown>>\n\n// Use tanstack's purpose-built initial-state type rather than composing from\n// the full `*TableState` interfaces: a shallow `Partial<… & PaginationTableState>`\n// leaves `pagination` typed as the full `PaginationState` (requiring `pageIndex`),\n// whereas `InitialTableState` correctly types it as `Partial<PaginationState>` so\n// consumers can pass e.g. `{ pagination: { pageSize } }`.\nexport type InitialState = InitialTableState\n\nexport type DefaultSort = { column: string; direction: SortDirection }\n"],"mappings":";;AASA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,UAAA;CACA,eAAA,aAAA;CACA,eAAA,eAAA;CACA,eAAA,cAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"DataTable.types.js","names":[],"sources":["../../../src/components/data-table/DataTable.types.ts"],"sourcesContent":["import type {\n InitialTableState,\n Row,\n RowSelectionState,\n SortDirection,\n Table\n} from '@tanstack/react-table'\nimport * as React from 'react'\n\nexport enum AsyncDataState {\n NONE = 'none',\n PENDING = 'pending',\n FULFILLED = 'fulfilled',\n REJECTED = 'rejected'\n}\n\nexport type AsyncDataResult = {\n total: number\n results: TableData\n}\n\nexport type AsyncDataOptions = {\n pageIndex: number\n pageSize: number\n sortBy?: string\n sortDirection?: SortDirection\n globalFilter?: string\n}\n\nexport type GetAsyncData = (\n options: AsyncDataOptions\n) => Promise<AsyncDataResult | undefined>\n\nexport type TablePosition = {\n top: number | null\n bottom: number | null\n offsetTop: number\n isVisible: boolean\n}\n\nexport type DataTableContextType<T = unknown> = Table<T> & {\n setIsSortable: React.Dispatch<React.SetStateAction<boolean>>\n applyPagination: () => void\n removePagination: () => void\n getTotalRows: () => number\n isSortable: boolean\n asyncDataState?: AsyncDataState\n runAsyncData?: (options: Partial<AsyncDataOptions>) => Promise<void>\n hasAsyncData: boolean\n disabledRows?: Record<string, boolean>\n enableRowSelection?: boolean | ((row: Row<unknown>) => boolean)\n rowSelection: RowSelectionState\n tablePosition?: TablePosition\n setTablePosition: React.Dispatch<React.SetStateAction<TablePosition>>\n data: AsyncDataResult\n columns: any\n tableId: string\n /**\n * Directly update the data array that the table rows are built from.\n * This is useful when re-ordering rows, but is high-risk if you're not sure what you're doing!\n *\n * Note in particular that this value is also updated if you update the value of the `DataTable`'s `data` prop\n * — it's probably best to only use one of those two methods for any given table.\n */\n setData: React.Dispatch<React.SetStateAction<AsyncDataResult>>\n}\n\nexport type TableData = Array<Record<string, unknown>>\n\n// Use tanstack's purpose-built initial-state type rather than composing from\n// the full `*TableState` interfaces: a shallow `Partial<… & PaginationTableState>`\n// leaves `pagination` typed as the full `PaginationState` (requiring `pageIndex`),\n// whereas `InitialTableState` correctly types it as `Partial<PaginationState>` so\n// consumers can pass e.g. `{ pagination: { pageSize } }`.\nexport type InitialState = InitialTableState\n\nexport type DefaultSort = { column: string; direction: SortDirection }\n"],"mappings":";;AASA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,UAAA;CACA,eAAA,aAAA;CACA,eAAA,eAAA;CACA,eAAA,cAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1,11 +1,11 @@
1
1
  import { styled } from "../../styled.js";
2
- import { Text } from "../text/Text.js";
3
2
  import { Icon } from "../icon/Icon.js";
4
3
  import { ActionIcon } from "../action-icon/ActionIcon.js";
4
+ import { Text } from "../text/Text.js";
5
5
  import { Badge } from "../badge/Badge.js";
6
6
  import { useDataTable } from "./DataTable.context.js";
7
7
  import { BulkActionsSelectedRowActions } from "./DataTableBulkActionsSelectedRowActions.js";
8
- import * as React$1 from "react";
8
+ import "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { Close } from "@atom-learning/icons";
11
11
  //#region src/components/data-table/DataTableBulkActionsFloating.tsx
@@ -39,14 +39,10 @@ var StyledContainer = styled("div", { base: [
39
39
  ] });
40
40
  var DataTableBulkActionsFloating = /* @__PURE__ */ Object.assign(({ children, ...rest }) => {
41
41
  const { rowSelection, toggleAllPageRowsSelected } = useDataTable();
42
- const actionBarRef = React$1.useRef(null);
43
- const numberOfSelectedRows = React$1.useMemo(() => {
44
- return Object.keys(rowSelection || {}).length;
45
- }, [rowSelection]);
42
+ const numberOfSelectedRows = Object.keys(rowSelection || {}).length;
46
43
  const handleDeselectAllPageRows = () => toggleAllPageRowsSelected(false);
47
44
  if (numberOfSelectedRows === 0) return null;
48
45
  return /* @__PURE__ */ jsx("section", {
49
- ref: actionBarRef,
50
46
  className: "pointer-events-none sticky bottom-0 left-0 flex justify-center",
51
47
  children: /* @__PURE__ */ jsxs(StyledContainer, {
52
48
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableBulkActionsFloating.js","names":[],"sources":["../../../src/components/data-table/DataTableBulkActionsFloating.tsx"],"sourcesContent":["import { Close } from '@atom-learning/icons'\nimport * as React from 'react'\n\nimport { styled } from '../../styled'\nimport { ActionIcon } from '../action-icon/ActionIcon'\nimport { Badge } from '../badge/Badge'\nimport { Icon } from '../icon/Icon'\nimport { Text } from '../text/Text'\nimport { useDataTable } from './DataTable.context'\nimport { BulkActionsSelectedRowActions } from './DataTableBulkActionsSelectedRowActions'\n\nconst StyledContainer = styled('div', {\n base: [\n 'flex',\n 'pl-3',\n 'pr-1',\n 'py-2',\n 'mb-4',\n 'mt-2',\n 'justify-between',\n 'items-center',\n 'rounded-lg',\n 'bg-primary-800',\n 'pointer-events-auto',\n 'z-2',\n 'w-full',\n 'mx-4',\n 'shadow-lg',\n 'sm:max-w-200',\n 'lg:max-w-250',\n 'lg:mb-8',\n 'lg:pl-4',\n 'lg:pr-1',\n 'lg:py-3',\n 'xl:max-w-350',\n 'xl:mb-8',\n 'xl:pl-6',\n 'xl:pr-2',\n 'xl:py-4'\n ]\n})\n\nexport const DataTableBulkActionsFloating = /* @__PURE__ */ Object.assign(\n ({\n children,\n ...rest\n }: React.PropsWithChildren<React.ComponentProps<typeof StyledContainer>>) => {\n const { rowSelection, toggleAllPageRowsSelected } = useDataTable()\n\n const actionBarRef = React.useRef<HTMLDivElement>(null)\n\n const numberOfSelectedRows = React.useMemo(() => {\n return Object.keys(rowSelection || {}).length\n }, [rowSelection])\n\n const handleDeselectAllPageRows = () => toggleAllPageRowsSelected(false)\n\n if (numberOfSelectedRows === 0) return null\n\n return (\n <section\n ref={actionBarRef}\n className=\"pointer-events-none sticky bottom-0 left-0 flex justify-center\"\n >\n <StyledContainer {...rest}>\n <div className=\"flex flex-auto items-center justify-start gap-2\">\n <Badge\n theme=\"success\"\n size=\"xs\"\n emphasis=\"subtle\"\n className=\"h-6 min-w-6\"\n >\n {numberOfSelectedRows}\n </Badge>\n <Text size=\"sm\" weight=\"bold\" className=\"text-white\">\n selected\n </Text>\n </div>\n <div className=\"flex flex-auto items-center justify-end gap-3\">\n {children}\n <ActionIcon\n appearance=\"simple\"\n theme=\"white\"\n size=\"md\"\n onClick={handleDeselectAllPageRows}\n label=\"close\"\n >\n <Icon is={Close} />\n </ActionIcon>\n </div>\n </StyledContainer>\n </section>\n )\n },\n {\n SelectedRowActions: BulkActionsSelectedRowActions\n }\n)\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,kBAAkB,OAAO,OAAO,EACpC,MAAM;CACJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,EACF,CAAC;AAED,IAAa,+BAA+C,uBAAO,QAChE,EACC,UACA,GAAG,WACwE;CAC3E,MAAM,EAAE,cAAc,8BAA8B,aAAa;CAEjE,MAAM,eAAe,QAAM,OAAuB,IAAI;CAEtD,MAAM,uBAAuB,QAAM,cAAc;EAC/C,OAAO,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACzC,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,kCAAkC,0BAA0B,KAAK;CAEvE,IAAI,yBAAyB,GAAG,OAAO;CAEvC,OACE,oBAAC,WAAD;EACE,KAAK;EACL,WAAU;YAEV,qBAAC,iBAAD;GAAiB,GAAI;aAArB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD;KACE,OAAM;KACN,MAAK;KACL,UAAS;KACT,WAAU;eAET;IACI,CAAA,GACP,oBAAC,MAAD;KAAM,MAAK;KAAK,QAAO;KAAO,WAAU;eAAa;IAE/C,CAAA,CACH;OACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,UACD,oBAAC,YAAD;KACE,YAAW;KACX,OAAM;KACN,MAAK;KACL,SAAS;KACT,OAAM;eAEN,oBAAC,MAAD,EAAM,IAAI,MAAQ,CAAA;IACR,CAAA,CACT;KACU;;CACV,CAAA;AAEb,GACA,EACE,oBAAoB,8BACtB,CACF"}
1
+ {"version":3,"file":"DataTableBulkActionsFloating.js","names":[],"sources":["../../../src/components/data-table/DataTableBulkActionsFloating.tsx"],"sourcesContent":["import { Close } from '@atom-learning/icons'\nimport * as React from 'react'\n\nimport { styled } from '../../styled'\nimport { ActionIcon } from '../action-icon/ActionIcon'\nimport { Badge } from '../badge/Badge'\nimport { Icon } from '../icon/Icon'\nimport { Text } from '../text/Text'\nimport { useDataTable } from './DataTable.context'\nimport { BulkActionsSelectedRowActions } from './DataTableBulkActionsSelectedRowActions'\n\nconst StyledContainer = styled('div', {\n base: [\n 'flex',\n 'pl-3',\n 'pr-1',\n 'py-2',\n 'mb-4',\n 'mt-2',\n 'justify-between',\n 'items-center',\n 'rounded-lg',\n 'bg-primary-800',\n 'pointer-events-auto',\n 'z-2',\n 'w-full',\n 'mx-4',\n 'shadow-lg',\n 'sm:max-w-200',\n 'lg:max-w-250',\n 'lg:mb-8',\n 'lg:pl-4',\n 'lg:pr-1',\n 'lg:py-3',\n 'xl:max-w-350',\n 'xl:mb-8',\n 'xl:pl-6',\n 'xl:pr-2',\n 'xl:py-4'\n ]\n})\n\nexport const DataTableBulkActionsFloating = /* @__PURE__ */ Object.assign(\n ({\n children,\n ...rest\n }: React.PropsWithChildren<React.ComponentProps<typeof StyledContainer>>) => {\n const { rowSelection, toggleAllPageRowsSelected } = useDataTable()\n\n const numberOfSelectedRows = Object.keys(rowSelection || {}).length\n\n const handleDeselectAllPageRows = () => toggleAllPageRowsSelected(false)\n\n if (numberOfSelectedRows === 0) return null\n\n return (\n <section className=\"pointer-events-none sticky bottom-0 left-0 flex justify-center\">\n <StyledContainer {...rest}>\n <div className=\"flex flex-auto items-center justify-start gap-2\">\n <Badge\n theme=\"success\"\n size=\"xs\"\n emphasis=\"subtle\"\n className=\"h-6 min-w-6\"\n >\n {numberOfSelectedRows}\n </Badge>\n <Text size=\"sm\" weight=\"bold\" className=\"text-white\">\n selected\n </Text>\n </div>\n <div className=\"flex flex-auto items-center justify-end gap-3\">\n {children}\n <ActionIcon\n appearance=\"simple\"\n theme=\"white\"\n size=\"md\"\n onClick={handleDeselectAllPageRows}\n label=\"close\"\n >\n <Icon is={Close} />\n </ActionIcon>\n </div>\n </StyledContainer>\n </section>\n )\n },\n {\n SelectedRowActions: BulkActionsSelectedRowActions\n }\n)\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,kBAAkB,OAAO,OAAO,EACpC,MAAM;CACJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,EACF,CAAC;AAED,IAAa,+BAA+C,uBAAO,QAChE,EACC,UACA,GAAG,WACwE;CAC3E,MAAM,EAAE,cAAc,8BAA8B,aAAa;CAEjE,MAAM,uBAAuB,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAE7D,MAAM,kCAAkC,0BAA0B,KAAK;CAEvE,IAAI,yBAAyB,GAAG,OAAO;CAEvC,OACE,oBAAC,WAAD;EAAS,WAAU;YACjB,qBAAC,iBAAD;GAAiB,GAAI;aAArB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD;KACE,OAAM;KACN,MAAK;KACL,UAAS;KACT,WAAU;eAET;IACI,CAAA,GACP,oBAAC,MAAD;KAAM,MAAK;KAAK,QAAO;KAAO,WAAU;eAAa;IAE/C,CAAA,CACH;OACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,UACD,oBAAC,YAAD;KACE,YAAW;KACX,OAAM;KACN,MAAK;KACL,SAAS;KACT,OAAM;eAEN,oBAAC,MAAD,EAAM,IAAI,MAAQ,CAAA;IACR,CAAA,CACT;KACU;;CACV,CAAA;AAEb,GACA,EACE,oBAAoB,8BACtB,CACF"}
@@ -3,26 +3,34 @@ import { Label } from "../label/Label.js";
3
3
  import { AsyncDataState } from "./DataTable.types.js";
4
4
  import { useDataTable } from "./DataTable.context.js";
5
5
  import { SearchInput } from "../search-input/SearchInput.js";
6
- import "react";
6
+ import * as React$1 from "react";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { debounce } from "throttle-debounce";
9
9
  //#region src/components/data-table/DataTableGlobalFilter.tsx
10
10
  var DataTableGlobalFilter = ({ onChange, label, hideLabel = false, ...rest }) => {
11
11
  const { setGlobalFilter, getState, resetPagination, getTotalRows, asyncDataState } = useDataTable();
12
12
  const { globalFilter } = getState();
13
- if (!(asyncDataState === AsyncDataState.PENDING) && getTotalRows() === 0) return null;
14
- const handleChange = debounce(250, (event) => {
15
- const { target: { value } } = event;
13
+ const inputId = React$1.useId();
14
+ const handleChange = React$1.useMemo(() => debounce(250, (event) => {
16
15
  onChange?.(event);
17
- resetPagination();
18
- setGlobalFilter(value);
19
- });
16
+ React$1.startTransition(() => {
17
+ resetPagination();
18
+ setGlobalFilter(event.target.value);
19
+ });
20
+ }), [
21
+ onChange,
22
+ resetPagination,
23
+ setGlobalFilter
24
+ ]);
25
+ React$1.useEffect(() => () => handleChange.cancel(), [handleChange]);
26
+ if (!(asyncDataState === AsyncDataState.PENDING) && getTotalRows() === 0) return null;
20
27
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Label, {
21
- htmlFor: label,
28
+ htmlFor: inputId,
22
29
  className: cn("mb-3", hideLabel && "sr-only"),
23
30
  children: label
24
31
  }), /* @__PURE__ */ jsx(SearchInput, {
25
32
  ...rest,
33
+ id: inputId,
26
34
  defaultValue: globalFilter,
27
35
  onChange: handleChange,
28
36
  name: label
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableGlobalFilter.js","names":[],"sources":["../../../src/components/data-table/DataTableGlobalFilter.tsx"],"sourcesContent":["import * as React from 'react'\nimport { debounce } from 'throttle-debounce'\n\nimport { cn } from '../../styled'\nimport { Label } from '../label/Label'\nimport { SearchInput } from '../search-input/SearchInput'\nimport { useDataTable } from './DataTable.context'\nimport { AsyncDataState } from './DataTable.types'\n\ntype DataTableSearchProps = React.ComponentProps<typeof SearchInput> & {\n label: string\n hideLabel?: boolean\n}\nexport const DataTableGlobalFilter = ({\n onChange,\n label,\n hideLabel = false,\n ...rest\n}: DataTableSearchProps) => {\n const {\n setGlobalFilter,\n getState,\n resetPagination,\n getTotalRows,\n asyncDataState\n } = useDataTable()\n const { globalFilter } = getState()\n\n const isPending = asyncDataState === AsyncDataState.PENDING\n const isEmpty = !isPending && getTotalRows() === 0\n\n if (isEmpty) return null\n\n const handleChange = debounce(250, (event) => {\n const {\n target: { value }\n } = event\n\n onChange?.(event)\n resetPagination()\n setGlobalFilter(value)\n })\n\n return (\n <>\n <Label htmlFor={label} className={cn('mb-3', hideLabel && 'sr-only')}>\n {label}\n </Label>\n <SearchInput\n {...rest}\n defaultValue={globalFilter}\n onChange={handleChange}\n name={label}\n />\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAaA,IAAa,yBAAyB,EACpC,UACA,OACA,YAAY,OACZ,GAAG,WACuB;CAC1B,MAAM,EACJ,iBACA,UACA,iBACA,cACA,mBACE,aAAa;CACjB,MAAM,EAAE,iBAAiB,SAAS;CAKlC,IAFgB,EADE,mBAAmB,eAAe,YACtB,aAAa,MAAM,GAEpC,OAAO;CAEpB,MAAM,eAAe,SAAS,MAAM,UAAU;EAC5C,MAAM,EACJ,QAAQ,EAAE,YACR;EAEJ,WAAW,KAAK;EAChB,gBAAgB;EAChB,gBAAgB,KAAK;CACvB,CAAC;CAED,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAO,SAAS;EAAO,WAAW,GAAG,QAAQ,aAAa,SAAS;YAChE;CACI,CAAA,GACP,oBAAC,aAAD;EACE,GAAI;EACJ,cAAc;EACd,UAAU;EACV,MAAM;CACP,CAAA,CACD,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"DataTableGlobalFilter.js","names":[],"sources":["../../../src/components/data-table/DataTableGlobalFilter.tsx"],"sourcesContent":["import * as React from 'react'\nimport { debounce } from 'throttle-debounce'\n\nimport { cn } from '../../styled'\nimport { Label } from '../label/Label'\nimport { SearchInput } from '../search-input/SearchInput'\nimport { useDataTable } from './DataTable.context'\nimport { AsyncDataState } from './DataTable.types'\n\ntype DataTableSearchProps = React.ComponentProps<typeof SearchInput> & {\n label: string\n hideLabel?: boolean\n}\nexport const DataTableGlobalFilter = ({\n onChange,\n label,\n hideLabel = false,\n ...rest\n}: DataTableSearchProps) => {\n const {\n setGlobalFilter,\n getState,\n resetPagination,\n getTotalRows,\n asyncDataState\n } = useDataTable()\n const { globalFilter } = getState()\n const inputId = React.useId()\n\n // Memoized so re-renders don't recreate the debouncer and reset its timer\n // mid-typing. Filtering happens in a transition: re-filtering large row sets\n // must not block keystroke rendering.\n const handleChange = React.useMemo(\n () =>\n debounce(250, (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n React.startTransition(() => {\n resetPagination()\n setGlobalFilter(event.target.value)\n })\n }),\n [onChange, resetPagination, setGlobalFilter]\n )\n\n React.useEffect(() => () => handleChange.cancel(), [handleChange])\n\n const isPending = asyncDataState === AsyncDataState.PENDING\n const isEmpty = !isPending && getTotalRows() === 0\n\n if (isEmpty) return null\n\n return (\n <>\n <Label htmlFor={inputId} className={cn('mb-3', hideLabel && 'sr-only')}>\n {label}\n </Label>\n <SearchInput\n {...rest}\n id={inputId}\n defaultValue={globalFilter}\n onChange={handleChange}\n name={label}\n />\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAaA,IAAa,yBAAyB,EACpC,UACA,OACA,YAAY,OACZ,GAAG,WACuB;CAC1B,MAAM,EACJ,iBACA,UACA,iBACA,cACA,mBACE,aAAa;CACjB,MAAM,EAAE,iBAAiB,SAAS;CAClC,MAAM,UAAU,QAAM,MAAM;CAK5B,MAAM,eAAe,QAAM,cAEvB,SAAS,MAAM,UAA+C;EAC5D,WAAW,KAAK;EAChB,QAAM,sBAAsB;GAC1B,gBAAgB;GAChB,gBAAgB,MAAM,OAAO,KAAK;EACpC,CAAC;CACH,CAAC,GACH;EAAC;EAAU;EAAiB;CAAe,CAC7C;CAEA,QAAM,sBAAsB,aAAa,OAAO,GAAG,CAAC,YAAY,CAAC;CAKjE,IAFgB,EADE,mBAAmB,eAAe,YACtB,aAAa,MAAM,GAEpC,OAAO;CAEpB,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAO,SAAS;EAAS,WAAW,GAAG,QAAQ,aAAa,SAAS;YAClE;CACI,CAAA,GACP,oBAAC,aAAD;EACE,GAAI;EACJ,IAAI;EACJ,cAAc;EACd,UAAU;EACV,MAAM;CACP,CAAA,CACD,EAAA,CAAA;AAEN"}
@@ -7,23 +7,14 @@ import * as React$1 from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region src/components/data-table/DataTableHead.tsx
9
9
  var DataTableHead = ({ sortable = true, theme = "light", isSticky = false, stickyOffset = 0, showTotalInFirstColumn, totalSuffix, style, className, ...rest }) => {
10
- const { getHeaderGroups, setIsSortable, enableRowSelection, getCanSomeRowsExpand, tablePosition, setTablePosition } = useDataTable();
10
+ const { getHeaderGroups, setIsSortable, enableRowSelection, getCanSomeRowsExpand, tablePosition } = useDataTable();
11
11
  React$1.useEffect(() => {
12
12
  setIsSortable(sortable);
13
13
  }, [sortable, setIsSortable]);
14
14
  const tableHeaderRowRef = React$1.useRef(null);
15
15
  const tableRef = React$1.useRef(null);
16
- const headerOffsetRef = React$1.useRef(0);
17
16
  const [headerOffset, setHeaderOffset] = React$1.useState(0);
18
17
  const [headerHide, setHeaderHide] = React$1.useState(false);
19
- const tableHeadElement = tableHeaderRowRef?.current?.closest("thead");
20
- if (tableHeadElement && tablePosition?.offsetTop === null) {
21
- const intersectionOffset = stickyOffset + tableHeadElement.getBoundingClientRect().height;
22
- if (tablePosition) setTablePosition({
23
- ...tablePosition,
24
- offsetTop: intersectionOffset || 0
25
- });
26
- }
27
18
  React$1.useEffect(() => {
28
19
  if (!isSticky) return;
29
20
  if (!tableRef.current && tableHeaderRowRef.current) tableRef.current = tableHeaderRowRef.current.closest("table");
@@ -31,11 +22,11 @@ var DataTableHead = ({ sortable = true, theme = "light", isSticky = false, stick
31
22
  if (tablePosition?.top !== null && tablePosition?.bottom !== null) {
32
23
  const newOffset = tablePosition?.top != null && tablePosition?.bottom != null && tablePosition.top < stickyOffset && tablePosition.bottom > 100 ? -tablePosition.top + stickyOffset : 0;
33
24
  if (newOffset !== 0) setHeaderHide(true);
34
- headerOffsetRef.current = newOffset;
35
25
  setHeaderOffset(newOffset);
36
- requestAnimationFrame(() => {
26
+ const rafId = requestAnimationFrame(() => {
37
27
  setHeaderHide(false);
38
28
  });
29
+ return () => cancelAnimationFrame(rafId);
39
30
  }
40
31
  }
41
32
  }, [
@@ -51,9 +42,9 @@ var DataTableHead = ({ sortable = true, theme = "light", isSticky = false, stick
51
42
  },
52
43
  ...rest,
53
44
  className: cn("relative", "z-3", "[&_tr:not(:last-child)>th]:border-b-none", "[&_tr:not(:first-child)>th]:rounded-none!", className),
54
- children: getHeaderGroups().map((headerGroup) => {
45
+ children: getHeaderGroups().map((headerGroup, headerGroupIndex) => {
55
46
  return /* @__PURE__ */ jsxs(Table.Row, {
56
- ref: tableHeaderRowRef,
47
+ ref: headerGroupIndex === 0 ? tableHeaderRowRef : void 0,
57
48
  className: isSticky && headerOffset !== 0 ? cn("translate-y-(--header-offset)", headerHide ? "delay-0ms opacity-0 transition-none" : "delay-150ms opacity-100 transition-opacity duration-100", "[&_th]:last:before:absolute", "[&_th]:last:before:bottom-0", "[&_th]:last:before:pointer-events-none", "[&_th]:last:before:right-0", "[&_th]:last:before:shadow-sm", "[&_th]:last:before:top-0", "[&_th]:last:before:w-full") : void 0,
58
49
  children: [
59
50
  getCanSomeRowsExpand() && /* @__PURE__ */ jsx(Table.HeaderCell, { className: "w-10" }),
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableHead.js","names":[],"sources":["../../../src/components/data-table/DataTableHead.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../../styled'\nimport { Table } from '../table/Table'\nimport { useDataTable } from './DataTable.context'\nimport { DataTableHeaderCell } from './DataTableHeaderCell'\nimport { DataTableSelectAllRowsCheckbox } from './DataTableSelectAllRowsCheckbox'\n\ntype DataTableHeadProps = Omit<\n React.ComponentProps<typeof Table.Header>,\n 'children'\n> & {\n sortable?: boolean\n isSticky?: boolean\n stickyOffset?: number\n showTotalInFirstColumn?: boolean\n totalSuffix?: string\n}\n\nexport const DataTableHead = ({\n sortable = true,\n theme = 'light',\n isSticky = false,\n stickyOffset = 0,\n showTotalInFirstColumn,\n totalSuffix,\n style,\n className,\n ...rest\n}: DataTableHeadProps): React.ReactElement<unknown> => {\n const {\n getHeaderGroups,\n setIsSortable,\n enableRowSelection,\n getCanSomeRowsExpand,\n tablePosition,\n setTablePosition\n } = useDataTable()\n\n React.useEffect(() => {\n setIsSortable(sortable)\n }, [sortable, setIsSortable])\n\n const tableHeaderRowRef = React.useRef<HTMLTableRowElement>(null)\n const tableRef = React.useRef<HTMLTableElement | null>(null)\n const headerOffsetRef = React.useRef(0)\n\n const [headerOffset, setHeaderOffset] = React.useState<number>(0)\n const [headerHide, setHeaderHide] = React.useState<boolean>(false)\n\n const tableHeadElement = tableHeaderRowRef?.current?.closest('thead')\n\n if (tableHeadElement && tablePosition?.offsetTop === null) {\n const tableHeadHeight = tableHeadElement.getBoundingClientRect().height\n const intersectionOffset = stickyOffset + tableHeadHeight\n if (tablePosition) {\n setTablePosition({ ...tablePosition, offsetTop: intersectionOffset || 0 })\n }\n }\n\n React.useEffect(() => {\n if (!isSticky) return\n\n if (!tableRef.current && tableHeaderRowRef.current) {\n tableRef.current = tableHeaderRowRef.current.closest(\n 'table'\n ) as HTMLTableElement | null\n }\n\n if (tableRef.current) {\n if (tablePosition?.top !== null && tablePosition?.bottom !== null) {\n const newOffset =\n tablePosition?.top != null &&\n tablePosition?.bottom != null &&\n tablePosition.top < stickyOffset &&\n tablePosition.bottom > 100\n ? -tablePosition.top + stickyOffset\n : 0\n\n if (newOffset !== 0) setHeaderHide(true)\n\n headerOffsetRef.current = newOffset\n setHeaderOffset(newOffset)\n\n requestAnimationFrame(() => {\n setHeaderHide(false)\n })\n }\n }\n }, [isSticky, stickyOffset, tablePosition])\n\n return (\n <Table.Header\n theme={theme}\n style={{\n ...style,\n '--header-offset': `${headerOffset}px`\n }}\n {...rest}\n className={cn(\n 'relative',\n 'z-3',\n '[&_tr:not(:last-child)>th]:border-b-none',\n '[&_tr:not(:first-child)>th]:rounded-none!',\n className\n )}\n >\n {getHeaderGroups().map((headerGroup) => {\n return (\n <Table.Row\n key={headerGroup.id}\n ref={tableHeaderRowRef}\n className={\n isSticky && headerOffset !== 0\n ? cn(\n 'translate-y-(--header-offset)',\n headerHide\n ? 'delay-0ms opacity-0 transition-none'\n : 'delay-150ms opacity-100 transition-opacity duration-100',\n '[&_th]:last:before:absolute',\n '[&_th]:last:before:bottom-0',\n '[&_th]:last:before:pointer-events-none',\n '[&_th]:last:before:right-0',\n '[&_th]:last:before:shadow-sm',\n '[&_th]:last:before:top-0',\n '[&_th]:last:before:w-full'\n )\n : undefined\n }\n >\n {getCanSomeRowsExpand() && <Table.HeaderCell className=\"w-10\" />}\n {enableRowSelection && (\n <Table.HeaderCell className=\"w-10\">\n <DataTableSelectAllRowsCheckbox />\n </Table.HeaderCell>\n )}\n {headerGroup.headers.map((header, index) => (\n <DataTableHeaderCell\n header={header}\n key={header.id}\n includeTotal={index === 0 && showTotalInFirstColumn}\n totalSuffix={totalSuffix}\n />\n ))}\n </Table.Row>\n )\n })}\n </Table.Header>\n )\n}\n"],"mappings":";;;;;;;;AAmBA,IAAa,iBAAiB,EAC5B,WAAW,MACX,QAAQ,SACR,WAAW,OACX,eAAe,GACf,wBACA,aACA,OACA,WACA,GAAG,WACkD;CACrD,MAAM,EACJ,iBACA,eACA,oBACA,sBACA,eACA,qBACE,aAAa;CAEjB,QAAM,gBAAgB;EACpB,cAAc,QAAQ;CACxB,GAAG,CAAC,UAAU,aAAa,CAAC;CAE5B,MAAM,oBAAoB,QAAM,OAA4B,IAAI;CAChE,MAAM,WAAW,QAAM,OAAgC,IAAI;CAC3D,MAAM,kBAAkB,QAAM,OAAO,CAAC;CAEtC,MAAM,CAAC,cAAc,mBAAmB,QAAM,SAAiB,CAAC;CAChE,MAAM,CAAC,YAAY,iBAAiB,QAAM,SAAkB,KAAK;CAEjE,MAAM,mBAAmB,mBAAmB,SAAS,QAAQ,OAAO;CAEpE,IAAI,oBAAoB,eAAe,cAAc,MAAM;EAEzD,MAAM,qBAAqB,eADH,iBAAiB,sBAAsB,CAAC,CAAC;EAEjE,IAAI,eACF,iBAAiB;GAAE,GAAG;GAAe,WAAW,sBAAsB;EAAE,CAAC;CAE7E;CAEA,QAAM,gBAAgB;EACpB,IAAI,CAAC,UAAU;EAEf,IAAI,CAAC,SAAS,WAAW,kBAAkB,SACzC,SAAS,UAAU,kBAAkB,QAAQ,QAC3C,OACF;EAGF,IAAI,SAAS;OACP,eAAe,QAAQ,QAAQ,eAAe,WAAW,MAAM;IACjE,MAAM,YACJ,eAAe,OAAO,QACtB,eAAe,UAAU,QACzB,cAAc,MAAM,gBACpB,cAAc,SAAS,MACnB,CAAC,cAAc,MAAM,eACrB;IAEN,IAAI,cAAc,GAAG,cAAc,IAAI;IAEvC,gBAAgB,UAAU;IAC1B,gBAAgB,SAAS;IAEzB,4BAA4B;KAC1B,cAAc,KAAK;IACrB,CAAC;GACH;;CAEJ,GAAG;EAAC;EAAU;EAAc;CAAa,CAAC;CAE1C,OACE,oBAAC,MAAM,QAAP;EACS;EACP,OAAO;GACL,GAAG;GACH,mBAAmB,GAAG,aAAa;EACrC;EACA,GAAI;EACJ,WAAW,GACT,YACA,OACA,4CACA,6CACA,SACF;YAEC,gBAAgB,CAAC,CAAC,KAAK,gBAAgB;GACtC,OACE,qBAAC,MAAM,KAAP;IAEE,KAAK;IACL,WACE,YAAY,iBAAiB,IACzB,GACE,iCACA,aACI,wCACA,2DACJ,+BACA,+BACA,0CACA,8BACA,gCACA,4BACA,2BACF,IACA,KAAA;cAlBR;KAqBG,qBAAqB,KAAK,oBAAC,MAAM,YAAP,EAAkB,WAAU,OAAQ,CAAA;KAC9D,sBACC,oBAAC,MAAM,YAAP;MAAkB,WAAU;gBAC1B,oBAAC,gCAAD,CAAiC,CAAA;KACjB,CAAA;KAEnB,YAAY,QAAQ,KAAK,QAAQ,UAChC,oBAAC,qBAAD;MACU;MAER,cAAc,UAAU,KAAK;MAChB;KACd,GAHM,OAAO,EAGb,CACF;IACQ;MAlCJ,YAAY,EAkCR;EAEf,CAAC;CACW,CAAA;AAElB"}
1
+ {"version":3,"file":"DataTableHead.js","names":[],"sources":["../../../src/components/data-table/DataTableHead.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../../styled'\nimport { Table } from '../table/Table'\nimport { useDataTable } from './DataTable.context'\nimport { DataTableHeaderCell } from './DataTableHeaderCell'\nimport { DataTableSelectAllRowsCheckbox } from './DataTableSelectAllRowsCheckbox'\n\ntype DataTableHeadProps = Omit<\n React.ComponentProps<typeof Table.Header>,\n 'children'\n> & {\n sortable?: boolean\n isSticky?: boolean\n stickyOffset?: number\n showTotalInFirstColumn?: boolean\n totalSuffix?: string\n}\n\nexport const DataTableHead = ({\n sortable = true,\n theme = 'light',\n isSticky = false,\n stickyOffset = 0,\n showTotalInFirstColumn,\n totalSuffix,\n style,\n className,\n ...rest\n}: DataTableHeadProps): React.ReactElement<unknown> => {\n const {\n getHeaderGroups,\n setIsSortable,\n enableRowSelection,\n getCanSomeRowsExpand,\n tablePosition\n } = useDataTable()\n\n React.useEffect(() => {\n setIsSortable(sortable)\n }, [sortable, setIsSortable])\n\n const tableHeaderRowRef = React.useRef<HTMLTableRowElement>(null)\n const tableRef = React.useRef<HTMLTableElement | null>(null)\n\n const [headerOffset, setHeaderOffset] = React.useState<number>(0)\n const [headerHide, setHeaderHide] = React.useState<boolean>(false)\n\n React.useEffect(() => {\n if (!isSticky) return\n\n if (!tableRef.current && tableHeaderRowRef.current) {\n tableRef.current = tableHeaderRowRef.current.closest(\n 'table'\n ) as HTMLTableElement | null\n }\n\n if (tableRef.current) {\n if (tablePosition?.top !== null && tablePosition?.bottom !== null) {\n const newOffset =\n tablePosition?.top != null &&\n tablePosition?.bottom != null &&\n tablePosition.top < stickyOffset &&\n tablePosition.bottom > 100\n ? -tablePosition.top + stickyOffset\n : 0\n\n if (newOffset !== 0) setHeaderHide(true)\n\n setHeaderOffset(newOffset)\n\n const rafId = requestAnimationFrame(() => {\n setHeaderHide(false)\n })\n\n return () => cancelAnimationFrame(rafId)\n }\n }\n }, [isSticky, stickyOffset, tablePosition])\n\n return (\n <Table.Header\n theme={theme}\n style={{\n ...style,\n '--header-offset': `${headerOffset}px`\n }}\n {...rest}\n className={cn(\n 'relative',\n 'z-3',\n '[&_tr:not(:last-child)>th]:border-b-none',\n '[&_tr:not(:first-child)>th]:rounded-none!',\n className\n )}\n >\n {getHeaderGroups().map((headerGroup, headerGroupIndex) => {\n return (\n <Table.Row\n key={headerGroup.id}\n // Single ref slot: only the first header row may carry it, or\n // each successive header group would silently clobber it.\n ref={headerGroupIndex === 0 ? tableHeaderRowRef : undefined}\n className={\n isSticky && headerOffset !== 0\n ? cn(\n 'translate-y-(--header-offset)',\n headerHide\n ? 'delay-0ms opacity-0 transition-none'\n : 'delay-150ms opacity-100 transition-opacity duration-100',\n '[&_th]:last:before:absolute',\n '[&_th]:last:before:bottom-0',\n '[&_th]:last:before:pointer-events-none',\n '[&_th]:last:before:right-0',\n '[&_th]:last:before:shadow-sm',\n '[&_th]:last:before:top-0',\n '[&_th]:last:before:w-full'\n )\n : undefined\n }\n >\n {getCanSomeRowsExpand() && <Table.HeaderCell className=\"w-10\" />}\n {enableRowSelection && (\n <Table.HeaderCell className=\"w-10\">\n <DataTableSelectAllRowsCheckbox />\n </Table.HeaderCell>\n )}\n {headerGroup.headers.map((header, index) => (\n <DataTableHeaderCell\n header={header}\n key={header.id}\n includeTotal={index === 0 && showTotalInFirstColumn}\n totalSuffix={totalSuffix}\n />\n ))}\n </Table.Row>\n )\n })}\n </Table.Header>\n )\n}\n"],"mappings":";;;;;;;;AAmBA,IAAa,iBAAiB,EAC5B,WAAW,MACX,QAAQ,SACR,WAAW,OACX,eAAe,GACf,wBACA,aACA,OACA,WACA,GAAG,WACkD;CACrD,MAAM,EACJ,iBACA,eACA,oBACA,sBACA,kBACE,aAAa;CAEjB,QAAM,gBAAgB;EACpB,cAAc,QAAQ;CACxB,GAAG,CAAC,UAAU,aAAa,CAAC;CAE5B,MAAM,oBAAoB,QAAM,OAA4B,IAAI;CAChE,MAAM,WAAW,QAAM,OAAgC,IAAI;CAE3D,MAAM,CAAC,cAAc,mBAAmB,QAAM,SAAiB,CAAC;CAChE,MAAM,CAAC,YAAY,iBAAiB,QAAM,SAAkB,KAAK;CAEjE,QAAM,gBAAgB;EACpB,IAAI,CAAC,UAAU;EAEf,IAAI,CAAC,SAAS,WAAW,kBAAkB,SACzC,SAAS,UAAU,kBAAkB,QAAQ,QAC3C,OACF;EAGF,IAAI,SAAS;OACP,eAAe,QAAQ,QAAQ,eAAe,WAAW,MAAM;IACjE,MAAM,YACJ,eAAe,OAAO,QACtB,eAAe,UAAU,QACzB,cAAc,MAAM,gBACpB,cAAc,SAAS,MACnB,CAAC,cAAc,MAAM,eACrB;IAEN,IAAI,cAAc,GAAG,cAAc,IAAI;IAEvC,gBAAgB,SAAS;IAEzB,MAAM,QAAQ,4BAA4B;KACxC,cAAc,KAAK;IACrB,CAAC;IAED,aAAa,qBAAqB,KAAK;GACzC;;CAEJ,GAAG;EAAC;EAAU;EAAc;CAAa,CAAC;CAE1C,OACE,oBAAC,MAAM,QAAP;EACS;EACP,OAAO;GACL,GAAG;GACH,mBAAmB,GAAG,aAAa;EACrC;EACA,GAAI;EACJ,WAAW,GACT,YACA,OACA,4CACA,6CACA,SACF;YAEC,gBAAgB,CAAC,CAAC,KAAK,aAAa,qBAAqB;GACxD,OACE,qBAAC,MAAM,KAAP;IAIE,KAAK,qBAAqB,IAAI,oBAAoB,KAAA;IAClD,WACE,YAAY,iBAAiB,IACzB,GACE,iCACA,aACI,wCACA,2DACJ,+BACA,+BACA,0CACA,8BACA,gCACA,4BACA,2BACF,IACA,KAAA;cApBR;KAuBG,qBAAqB,KAAK,oBAAC,MAAM,YAAP,EAAkB,WAAU,OAAQ,CAAA;KAC9D,sBACC,oBAAC,MAAM,YAAP;MAAkB,WAAU;gBAC1B,oBAAC,gCAAD,CAAiC,CAAA;KACjB,CAAA;KAEnB,YAAY,QAAQ,KAAK,QAAQ,UAChC,oBAAC,qBAAD;MACU;MAER,cAAc,UAAU,KAAK;MAChB;KACd,GAHM,OAAO,EAGb,CACF;IACQ;MApCJ,YAAY,EAoCR;EAEf,CAAC;CACW,CAAA;AAElB"}
@@ -1,6 +1,6 @@
1
1
  import { cn, styled } from "../../styled.js";
2
- import { Text } from "../text/Text.js";
3
2
  import { Icon } from "../icon/Icon.js";
3
+ import { Text } from "../text/Text.js";
4
4
  import { useDataTable } from "./DataTable.context.js";
5
5
  import { Table } from "../table/Table.js";
6
6
  import "react";
@@ -14,6 +14,7 @@ var DataTableRowSelectionCheckbox = ({ row, checked, onCheckedChange, label = `R
14
14
  style: { "--depth": row.depth },
15
15
  checked,
16
16
  onCheckedChange,
17
+ id: `${tableId}_row_${row.id}_selection`,
17
18
  name: `${tableId}_row_${row.id}_selection`,
18
19
  disabled: !row.getCanSelect(),
19
20
  className: "mr-3 ml-[calc((var(--depth,0)*2)*4px)]"
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableRowSelectionCheckbox.js","names":[],"sources":["../../../src/components/data-table/DataTableRowSelectionCheckbox.tsx"],"sourcesContent":["import type { Row } from '@tanstack/react-table'\nimport * as React from 'react'\n\nimport { Checkbox } from '../checkbox/Checkbox'\nimport { useDataTable } from './DataTable.context'\n\nexport const DataTableRowSelectionCheckbox = ({\n row,\n checked,\n onCheckedChange,\n label = `Row ${row.id} selection`\n}: {\n row: Row<Record<string, unknown>>\n checked: boolean | 'indeterminate'\n onCheckedChange: (value: boolean) => void\n label?: string\n}): React.ReactElement<unknown> => {\n const { tableId } = useDataTable()\n\n return (\n <>\n <label htmlFor={`${tableId}_row_${row.id}_selection`} className=\"sr-only\">\n {label}\n </label>\n <Checkbox\n size=\"lg\"\n style={{ '--depth': row.depth }}\n checked={checked}\n onCheckedChange={onCheckedChange}\n name={`${tableId}_row_${row.id}_selection`}\n disabled={!row.getCanSelect()}\n className=\"mr-3 ml-[calc((var(--depth,0)*2)*4px)]\"\n />\n </>\n )\n}\n"],"mappings":";;;;;AAMA,IAAa,iCAAiC,EAC5C,KACA,SACA,iBACA,QAAQ,OAAO,IAAI,GAAG,kBAMW;CACjC,MAAM,EAAE,YAAY,aAAa;CAEjC,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAO,SAAS,GAAG,QAAQ,OAAO,IAAI,GAAG;EAAa,WAAU;YAC7D;CACI,CAAA,GACP,oBAAC,UAAD;EACE,MAAK;EACL,OAAO,EAAE,WAAW,IAAI,MAAM;EACrB;EACQ;EACjB,MAAM,GAAG,QAAQ,OAAO,IAAI,GAAG;EAC/B,UAAU,CAAC,IAAI,aAAa;EAC5B,WAAU;CACX,CAAA,CACD,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"DataTableRowSelectionCheckbox.js","names":[],"sources":["../../../src/components/data-table/DataTableRowSelectionCheckbox.tsx"],"sourcesContent":["import type { Row } from '@tanstack/react-table'\nimport * as React from 'react'\n\nimport { Checkbox } from '../checkbox/Checkbox'\nimport { useDataTable } from './DataTable.context'\n\nexport const DataTableRowSelectionCheckbox = ({\n row,\n checked,\n onCheckedChange,\n label = `Row ${row.id} selection`\n}: {\n row: Row<Record<string, unknown>>\n checked: boolean | 'indeterminate'\n onCheckedChange: (value: boolean) => void\n label?: string\n}): React.ReactElement<unknown> => {\n const { tableId } = useDataTable()\n\n return (\n <>\n <label htmlFor={`${tableId}_row_${row.id}_selection`} className=\"sr-only\">\n {label}\n </label>\n <Checkbox\n size=\"lg\"\n style={{ '--depth': row.depth }}\n checked={checked}\n onCheckedChange={onCheckedChange}\n id={`${tableId}_row_${row.id}_selection`}\n name={`${tableId}_row_${row.id}_selection`}\n disabled={!row.getCanSelect()}\n className=\"mr-3 ml-[calc((var(--depth,0)*2)*4px)]\"\n />\n </>\n )\n}\n"],"mappings":";;;;;AAMA,IAAa,iCAAiC,EAC5C,KACA,SACA,iBACA,QAAQ,OAAO,IAAI,GAAG,kBAMW;CACjC,MAAM,EAAE,YAAY,aAAa;CAEjC,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAO,SAAS,GAAG,QAAQ,OAAO,IAAI,GAAG;EAAa,WAAU;YAC7D;CACI,CAAA,GACP,oBAAC,UAAD;EACE,MAAK;EACL,OAAO,EAAE,WAAW,IAAI,MAAM;EACrB;EACQ;EACjB,IAAI,GAAG,QAAQ,OAAO,IAAI,GAAG;EAC7B,MAAM,GAAG,QAAQ,OAAO,IAAI,GAAG;EAC/B,UAAU,CAAC,IAAI,aAAa;EAC5B,WAAU;CACX,CAAA,CACD,EAAA,CAAA;AAEN"}
@@ -22,7 +22,8 @@ var DataTableSelectAllRowsCheckbox = ({ label = "All rows selection" }) => {
22
22
  size: "lg",
23
23
  checked: getCheckedState(),
24
24
  onCheckedChange: updateCheckedState,
25
- name: `${tableId}_allRowsSelection`
25
+ id: `${tableId}_all_rows_selection`,
26
+ name: `${tableId}_all_rows_selection`
26
27
  })] });
27
28
  };
28
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableSelectAllRowsCheckbox.js","names":[],"sources":["../../../src/components/data-table/DataTableSelectAllRowsCheckbox.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { Checkbox } from '../checkbox/Checkbox'\nimport { Label } from '../label/Label'\nimport { useDataTable } from './DataTable.context'\n\nexport const DataTableSelectAllRowsCheckbox = ({\n label = 'All rows selection'\n}: {\n label?: string\n}) => {\n const {\n getIsAllPageRowsSelected,\n getIsSomePageRowsSelected,\n toggleAllPageRowsSelected,\n tableId\n } = useDataTable()\n\n const getCheckedState = () => {\n if (getIsSomePageRowsSelected()) return 'indeterminate'\n if (getIsAllPageRowsSelected()) return true\n return false\n }\n\n const updateCheckedState = () => {\n if (getIsSomePageRowsSelected()) {\n return toggleAllPageRowsSelected(false)\n }\n return toggleAllPageRowsSelected(!getIsAllPageRowsSelected())\n }\n\n return (\n <>\n <label htmlFor={`${tableId}_all_rows_selection`} className=\"sr-only\">\n {label}\n </label>\n <Checkbox\n size=\"lg\"\n checked={getCheckedState()}\n onCheckedChange={updateCheckedState}\n name={`${tableId}_allRowsSelection`}\n />\n </>\n )\n}\n"],"mappings":";;;;;AAMA,IAAa,kCAAkC,EAC7C,QAAQ,2BAGJ;CACJ,MAAM,EACJ,0BACA,2BACA,2BACA,YACE,aAAa;CAEjB,MAAM,wBAAwB;EAC5B,IAAI,0BAA0B,GAAG,OAAO;EACxC,IAAI,yBAAyB,GAAG,OAAO;EACvC,OAAO;CACT;CAEA,MAAM,2BAA2B;EAC/B,IAAI,0BAA0B,GAC5B,OAAO,0BAA0B,KAAK;EAExC,OAAO,0BAA0B,CAAC,yBAAyB,CAAC;CAC9D;CAEA,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAO,SAAS,GAAG,QAAQ;EAAsB,WAAU;YACxD;CACI,CAAA,GACP,oBAAC,UAAD;EACE,MAAK;EACL,SAAS,gBAAgB;EACzB,iBAAiB;EACjB,MAAM,GAAG,QAAQ;CAClB,CAAA,CACD,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"DataTableSelectAllRowsCheckbox.js","names":[],"sources":["../../../src/components/data-table/DataTableSelectAllRowsCheckbox.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { Checkbox } from '../checkbox/Checkbox'\nimport { Label } from '../label/Label'\nimport { useDataTable } from './DataTable.context'\n\nexport const DataTableSelectAllRowsCheckbox = ({\n label = 'All rows selection'\n}: {\n label?: string\n}) => {\n const {\n getIsAllPageRowsSelected,\n getIsSomePageRowsSelected,\n toggleAllPageRowsSelected,\n tableId\n } = useDataTable()\n\n const getCheckedState = () => {\n if (getIsSomePageRowsSelected()) return 'indeterminate'\n if (getIsAllPageRowsSelected()) return true\n return false\n }\n\n const updateCheckedState = () => {\n if (getIsSomePageRowsSelected()) {\n return toggleAllPageRowsSelected(false)\n }\n return toggleAllPageRowsSelected(!getIsAllPageRowsSelected())\n }\n\n return (\n <>\n <label htmlFor={`${tableId}_all_rows_selection`} className=\"sr-only\">\n {label}\n </label>\n <Checkbox\n size=\"lg\"\n checked={getCheckedState()}\n onCheckedChange={updateCheckedState}\n id={`${tableId}_all_rows_selection`}\n name={`${tableId}_all_rows_selection`}\n />\n </>\n )\n}\n"],"mappings":";;;;;AAMA,IAAa,kCAAkC,EAC7C,QAAQ,2BAGJ;CACJ,MAAM,EACJ,0BACA,2BACA,2BACA,YACE,aAAa;CAEjB,MAAM,wBAAwB;EAC5B,IAAI,0BAA0B,GAAG,OAAO;EACxC,IAAI,yBAAyB,GAAG,OAAO;EACvC,OAAO;CACT;CAEA,MAAM,2BAA2B;EAC/B,IAAI,0BAA0B,GAC5B,OAAO,0BAA0B,KAAK;EAExC,OAAO,0BAA0B,CAAC,yBAAyB,CAAC;CAC9D;CAEA,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAO,SAAS,GAAG,QAAQ;EAAsB,WAAU;YACxD;CACI,CAAA,GACP,oBAAC,UAAD;EACE,MAAK;EACL,SAAS,gBAAgB;EACzB,iBAAiB;EACjB,IAAI,GAAG,QAAQ;EACf,MAAM,GAAG,QAAQ;CAClB,CAAA,CACD,EAAA,CAAA;AAEN"}
@@ -24,10 +24,8 @@ var DataTableTable = ({ sortable, striped, theme = "white", className, scrollOpt
24
24
  const tableRef = React$1.useRef(null);
25
25
  const isTableVisible = React$1.useRef(false);
26
26
  const isScrolling = React$1.useRef(false);
27
- const scrollTarget = React$1.useMemo(() => {
28
- if (typeof window === "undefined") return null;
29
- return window;
30
- }, []);
27
+ const scrollRafIdRef = React$1.useRef(null);
28
+ const scrollTarget = typeof window === "undefined" ? null : window;
31
29
  React$1.useEffect(() => {
32
30
  if (!scrollTarget || typeof IntersectionObserver === "undefined") return;
33
31
  const updatePosition = () => {
@@ -44,7 +42,7 @@ var DataTableTable = ({ sortable, striped, theme = "white", className, scrollOpt
44
42
  };
45
43
  const handleScroll = () => {
46
44
  if (!isScrolling.current) {
47
- requestAnimationFrame(updatePosition);
45
+ scrollRafIdRef.current = requestAnimationFrame(updatePosition);
48
46
  isScrolling.current = true;
49
47
  }
50
48
  };
@@ -69,13 +67,17 @@ var DataTableTable = ({ sortable, striped, theme = "white", className, scrollOpt
69
67
  if (tableRef.current && (scrollOptions.hasStickyHeader || Object.keys(rowSelection || {}).length > 0)) tableObserver.observe(tableRef.current);
70
68
  return () => {
71
69
  tableObserver.disconnect();
70
+ if (scrollRafIdRef.current !== null) {
71
+ cancelAnimationFrame(scrollRafIdRef.current);
72
+ scrollRafIdRef.current = null;
73
+ }
74
+ isScrolling.current = false;
72
75
  if (scrollTarget) scrollTarget?.removeEventListener("scroll", handleScroll);
73
76
  };
74
77
  }, [
75
78
  rowSelection,
76
79
  scrollOptions.hasStickyHeader,
77
80
  scrollOptions?.stickyHeaderOffset,
78
- scrollTarget,
79
81
  setTablePosition
80
82
  ]);
81
83
  const isPending = asyncDataState === AsyncDataState.PENDING;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableTable.js","names":[],"sources":["../../../src/components/data-table/DataTableTable.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { styled, cn } from '../../styled'\nimport { Table } from '../table/Table'\nimport { TableBody } from '../table/TableBody'\nimport { useDataTable } from './DataTable.context'\nimport { AsyncDataState } from './DataTable.types'\nimport { DataTableBody } from './DataTableBody'\nimport { DataTableHead } from './DataTableHead'\nimport { DataTableLoading } from './DataTableLoading'\n\nconst TableContainer = styled('div', {\n base: ['p-2', 'bg-white', 'rounded-lg']\n})\n\nexport type DataTableTableProps = Omit<\n React.ComponentProps<typeof Table>,\n 'children' | 'numberOfStickyColumns'\n> &\n Partial<\n Pick<React.ComponentProps<typeof DataTableHead>, 'theme' | 'sortable'>\n > &\n Partial<Pick<React.ComponentProps<typeof TableBody>, 'striped'>> & {\n scrollOptions?: {\n hasStickyHeader?: boolean\n stickyHeaderOffset?: number\n headerCss?: string\n numberOfStickyColumns?: number\n scrollContainerCls?: string | string[]\n showTotalInFirstColumn?: boolean\n totalSuffix?: string\n }\n rowAction?: (row: Record<string, unknown>, event: React.MouseEvent) => void\n withContainer?: boolean\n }\n\nexport const DataTableTable = ({\n sortable,\n striped,\n theme = 'white',\n className,\n scrollOptions = {\n numberOfStickyColumns: 0,\n stickyHeaderOffset: 0,\n hasStickyHeader: false,\n showTotalInFirstColumn: true,\n totalSuffix: 'items'\n },\n rowAction,\n withContainer = false,\n ...rest\n}: DataTableTableProps): React.JSX.Element | null => {\n const {\n asyncDataState,\n getTotalRows,\n getCanSomeRowsExpand,\n rowSelection,\n enableRowSelection,\n tableId,\n setTablePosition\n } = useDataTable()\n\n const tableRef = React.useRef<HTMLTableElement | null>(null)\n const isTableVisible = React.useRef(false)\n const isScrolling = React.useRef<boolean>(false)\n\n const scrollTarget = React.useMemo(() => {\n if (typeof window === 'undefined') return null\n return window\n }, [])\n\n React.useEffect(() => {\n if (!scrollTarget || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n const updatePosition = () => {\n if (tableRef.current) {\n const tableTop = tableRef.current.getBoundingClientRect().top\n const tableBottom = tableRef.current.getBoundingClientRect().bottom\n\n setTablePosition((prevPosition) => ({\n ...prevPosition,\n top: tableTop,\n bottom: tableBottom\n }))\n }\n isScrolling.current = false\n }\n\n const handleScroll = () => {\n if (!isScrolling.current) {\n requestAnimationFrame(updatePosition)\n isScrolling.current = true\n }\n }\n\n if (!tableRef.current) return\n\n const observerOffset = scrollOptions?.stickyHeaderOffset || 0\n\n const observerOptions = {\n rootMargin: `-${observerOffset}px 0px -${observerOffset}px 0px`,\n threshold: 0\n }\n\n const handleTableIntersection = (entries: IntersectionObserverEntry[]) => {\n if (!entries || entries.length === 0) return\n const entry = entries[0]\n\n isTableVisible.current = entry.isIntersecting\n\n if (scrollTarget) {\n if (entry.isIntersecting) {\n // add scroll listener\n scrollTarget?.addEventListener('scroll', handleScroll)\n } else {\n // remove scroll listener\n scrollTarget?.removeEventListener('scroll', handleScroll)\n }\n }\n\n setTablePosition((prevPosition) => ({\n ...prevPosition,\n isVisible: entry.isIntersecting\n }))\n }\n\n const tableObserver = new IntersectionObserver(\n handleTableIntersection,\n observerOptions\n )\n\n //only track table position if we have a sticky header or bulk actions active\n if (\n tableRef.current &&\n (scrollOptions.hasStickyHeader ||\n Object.keys(rowSelection || {}).length > 0)\n ) {\n tableObserver.observe(tableRef.current)\n }\n\n return () => {\n tableObserver.disconnect()\n if (scrollTarget) {\n scrollTarget?.removeEventListener('scroll', handleScroll)\n }\n }\n }, [\n rowSelection,\n scrollOptions.hasStickyHeader,\n scrollOptions?.stickyHeaderOffset,\n scrollTarget,\n setTablePosition\n ])\n\n const isPending = asyncDataState === AsyncDataState.PENDING\n const isEmpty = !isPending && getTotalRows() === 0\n\n const buildScrollContainerKey = (): string => {\n let controlColumnCount = 0\n\n if (getCanSomeRowsExpand() && !!enableRowSelection) {\n controlColumnCount = 2\n } else if (getCanSomeRowsExpand() || !!enableRowSelection) {\n controlColumnCount = 1\n }\n\n return `${tableId}_${controlColumnCount}_control_columns`\n }\n\n if (isEmpty) return null\n\n const tableComponent = (\n <Table\n corners=\"round\"\n size=\"lg\"\n {...rest}\n ref={tableRef}\n numberOfStickyColumns={scrollOptions.numberOfStickyColumns}\n scrollContainerCls={scrollOptions.scrollContainerCls}\n scrollContainerkey={buildScrollContainerKey()}\n className={cn(\n isPending && [\n 'opacity-50',\n 'pointer-events-none',\n 'transition-opacity',\n 'duration-250',\n 'linear',\n 'delay-150'\n ],\n className\n )}\n >\n <DataTableHead\n theme={theme}\n sortable={sortable}\n isSticky={scrollOptions.hasStickyHeader}\n stickyOffset={scrollOptions.stickyHeaderOffset}\n className={scrollOptions.headerCss}\n showTotalInFirstColumn={scrollOptions.showTotalInFirstColumn}\n totalSuffix={scrollOptions.totalSuffix}\n />\n <DataTableBody striped={striped} rowAction={rowAction} />\n </Table>\n )\n\n return (\n <>\n <DataTableLoading />\n {withContainer ? (\n <TableContainer\n className={cn(\n scrollOptions.numberOfStickyColumns === 0 && 'overflow-x-auto'\n )}\n >\n {tableComponent}\n </TableContainer>\n ) : (\n tableComponent\n )}\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTableTable.js","names":[],"sources":["../../../src/components/data-table/DataTableTable.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { styled, cn } from '../../styled'\nimport { Table } from '../table/Table'\nimport { TableBody } from '../table/TableBody'\nimport { useDataTable } from './DataTable.context'\nimport { AsyncDataState } from './DataTable.types'\nimport { DataTableBody } from './DataTableBody'\nimport { DataTableHead } from './DataTableHead'\nimport { DataTableLoading } from './DataTableLoading'\n\nconst TableContainer = styled('div', {\n base: ['p-2', 'bg-white', 'rounded-lg']\n})\n\nexport type DataTableTableProps = Omit<\n React.ComponentProps<typeof Table>,\n 'children' | 'numberOfStickyColumns'\n> &\n Partial<\n Pick<React.ComponentProps<typeof DataTableHead>, 'theme' | 'sortable'>\n > &\n Partial<Pick<React.ComponentProps<typeof TableBody>, 'striped'>> & {\n scrollOptions?: {\n hasStickyHeader?: boolean\n stickyHeaderOffset?: number\n headerCss?: string\n numberOfStickyColumns?: number\n scrollContainerCls?: string | string[]\n showTotalInFirstColumn?: boolean\n totalSuffix?: string\n }\n rowAction?: (row: Record<string, unknown>, event: React.MouseEvent) => void\n withContainer?: boolean\n }\n\nexport const DataTableTable = ({\n sortable,\n striped,\n theme = 'white',\n className,\n scrollOptions = {\n numberOfStickyColumns: 0,\n stickyHeaderOffset: 0,\n hasStickyHeader: false,\n showTotalInFirstColumn: true,\n totalSuffix: 'items'\n },\n rowAction,\n withContainer = false,\n ...rest\n}: DataTableTableProps): React.JSX.Element | null => {\n const {\n asyncDataState,\n getTotalRows,\n getCanSomeRowsExpand,\n rowSelection,\n enableRowSelection,\n tableId,\n setTablePosition\n } = useDataTable()\n\n const tableRef = React.useRef<HTMLTableElement | null>(null)\n const isTableVisible = React.useRef(false)\n const isScrolling = React.useRef<boolean>(false)\n const scrollRafIdRef = React.useRef<number | null>(null)\n\n const scrollTarget = typeof window === 'undefined' ? null : window\n\n React.useEffect(() => {\n if (!scrollTarget || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n const updatePosition = () => {\n if (tableRef.current) {\n const tableTop = tableRef.current.getBoundingClientRect().top\n const tableBottom = tableRef.current.getBoundingClientRect().bottom\n\n setTablePosition((prevPosition) => ({\n ...prevPosition,\n top: tableTop,\n bottom: tableBottom\n }))\n }\n isScrolling.current = false\n }\n\n const handleScroll = () => {\n if (!isScrolling.current) {\n scrollRafIdRef.current = requestAnimationFrame(updatePosition)\n isScrolling.current = true\n }\n }\n\n if (!tableRef.current) return\n\n const observerOffset = scrollOptions?.stickyHeaderOffset || 0\n\n const observerOptions = {\n rootMargin: `-${observerOffset}px 0px -${observerOffset}px 0px`,\n threshold: 0\n }\n\n const handleTableIntersection = (entries: IntersectionObserverEntry[]) => {\n if (!entries || entries.length === 0) return\n const entry = entries[0]\n\n isTableVisible.current = entry.isIntersecting\n\n if (scrollTarget) {\n if (entry.isIntersecting) {\n // add scroll listener\n scrollTarget?.addEventListener('scroll', handleScroll)\n } else {\n // remove scroll listener\n scrollTarget?.removeEventListener('scroll', handleScroll)\n }\n }\n\n setTablePosition((prevPosition) => ({\n ...prevPosition,\n isVisible: entry.isIntersecting\n }))\n }\n\n const tableObserver = new IntersectionObserver(\n handleTableIntersection,\n observerOptions\n )\n\n //only track table position if we have a sticky header or bulk actions active\n if (\n tableRef.current &&\n (scrollOptions.hasStickyHeader ||\n Object.keys(rowSelection || {}).length > 0)\n ) {\n tableObserver.observe(tableRef.current)\n }\n\n return () => {\n tableObserver.disconnect()\n if (scrollRafIdRef.current !== null) {\n cancelAnimationFrame(scrollRafIdRef.current)\n scrollRafIdRef.current = null\n }\n isScrolling.current = false\n if (scrollTarget) {\n scrollTarget?.removeEventListener('scroll', handleScroll)\n }\n }\n }, [\n rowSelection,\n scrollOptions.hasStickyHeader,\n scrollOptions?.stickyHeaderOffset,\n setTablePosition\n ])\n\n const isPending = asyncDataState === AsyncDataState.PENDING\n const isEmpty = !isPending && getTotalRows() === 0\n\n const buildScrollContainerKey = (): string => {\n let controlColumnCount = 0\n\n if (getCanSomeRowsExpand() && !!enableRowSelection) {\n controlColumnCount = 2\n } else if (getCanSomeRowsExpand() || !!enableRowSelection) {\n controlColumnCount = 1\n }\n\n return `${tableId}_${controlColumnCount}_control_columns`\n }\n\n if (isEmpty) return null\n\n const tableComponent = (\n <Table\n corners=\"round\"\n size=\"lg\"\n {...rest}\n ref={tableRef}\n numberOfStickyColumns={scrollOptions.numberOfStickyColumns}\n scrollContainerCls={scrollOptions.scrollContainerCls}\n scrollContainerkey={buildScrollContainerKey()}\n className={cn(\n isPending && [\n 'opacity-50',\n 'pointer-events-none',\n 'transition-opacity',\n 'duration-250',\n 'linear',\n 'delay-150'\n ],\n className\n )}\n >\n <DataTableHead\n theme={theme}\n sortable={sortable}\n isSticky={scrollOptions.hasStickyHeader}\n stickyOffset={scrollOptions.stickyHeaderOffset}\n className={scrollOptions.headerCss}\n showTotalInFirstColumn={scrollOptions.showTotalInFirstColumn}\n totalSuffix={scrollOptions.totalSuffix}\n />\n <DataTableBody striped={striped} rowAction={rowAction} />\n </Table>\n )\n\n return (\n <>\n <DataTableLoading />\n {withContainer ? (\n <TableContainer\n className={cn(\n scrollOptions.numberOfStickyColumns === 0 && 'overflow-x-auto'\n )}\n >\n {tableComponent}\n </TableContainer>\n ) : (\n tableComponent\n )}\n </>\n )\n}\n"],"mappings":"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"}
@@ -15,7 +15,7 @@ var DragAndDropTable = ({ idColumn = "id", onDragAndDrop, sortable, striped, the
15
15
  const isPending = asyncDataState === AsyncDataState.PENDING;
16
16
  const rowIds = React$1.useMemo(() => data.results.map((row) => {
17
17
  return row[idColumn];
18
- }), [data]);
18
+ }), [data, idColumn]);
19
19
  return /* @__PURE__ */ jsxs(SortableRoot, {
20
20
  onSortChange: React$1.useCallback(({ oldIndex, newIndex }) => {
21
21
  const sortedResults = arrayMove(data.results, oldIndex, newIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"DragAndDropTable.js","names":[],"sources":["../../../../src/components/data-table/drag-and-drop/DragAndDropTable.tsx"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable'\nimport * as React from 'react'\n\nimport { cn } from '../../../styled'\nimport * as Sortable from '../../sortable'\nimport { Table } from '../../table/Table'\nimport { useDataTable } from '../DataTable.context'\nimport { AsyncDataState, type AsyncDataResult } from '../DataTable.types'\nimport { DataTableHead } from '../DataTableHead'\nimport { DataTableLoading } from '../DataTableLoading'\nimport type { DataTableTableProps } from '../DataTableTable'\nimport { DragAndDropTableBody } from './DragAndDropTableBody'\n\ntype DragAndDropTableProps = DataTableTableProps & {\n className?: string\n idColumn?: string\n onDragAndDrop?: (onDragAndDropData: {\n oldIndex: number\n newIndex: number\n newData: AsyncDataResult\n }) => void\n}\n\nexport const DragAndDropTable = ({\n idColumn = 'id',\n onDragAndDrop,\n sortable,\n striped,\n theme,\n className,\n ...rest\n}: DragAndDropTableProps) => {\n const { asyncDataState, data, setData } = useDataTable()\n const isPending = asyncDataState === AsyncDataState.PENDING\n\n const rowIds = React.useMemo(\n () =>\n data.results.map((row) => {\n return row[idColumn] as string | number\n }),\n [data]\n )\n const handleSortChange = React.useCallback(\n ({ oldIndex, newIndex }) => {\n const sortedResults = arrayMove(data.results, oldIndex, newIndex)\n const newData = { results: sortedResults, total: data.total }\n setData({ results: sortedResults, total: data.total })\n onDragAndDrop?.({ oldIndex, newIndex, newData })\n },\n [data, onDragAndDrop]\n )\n\n return (\n <Sortable.Root onSortChange={handleSortChange} sortableIds={rowIds}>\n <DataTableLoading />\n <Table\n {...rest}\n className={cn(\n isPending && [\n 'opacity-50',\n 'pointer-events-none',\n 'transition-opacity',\n 'duration-250',\n 'linear',\n 'delay-150'\n ],\n className\n )}\n >\n <DataTableHead theme={theme} sortable={sortable} />\n <DragAndDropTableBody striped={striped} idColumn={idColumn} />\n </Table>\n </Sortable.Root>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,oBAAoB,EAC/B,WAAW,MACX,eACA,UACA,SACA,OACA,WACA,GAAG,WACwB;CAC3B,MAAM,EAAE,gBAAgB,MAAM,YAAY,aAAa;CACvD,MAAM,YAAY,mBAAmB,eAAe;CAEpD,MAAM,SAAS,QAAM,cAEjB,KAAK,QAAQ,KAAK,QAAQ;EACxB,OAAO,IAAI;CACb,CAAC,GACH,CAAC,IAAI,CACP;CAWA,OACE,qBAAC,cAAD;EAAe,cAXQ,QAAM,aAC5B,EAAE,UAAU,eAAe;GAC1B,MAAM,gBAAgB,UAAU,KAAK,SAAS,UAAU,QAAQ;GAChE,MAAM,UAAU;IAAE,SAAS;IAAe,OAAO,KAAK;GAAM;GAC5D,QAAQ;IAAE,SAAS;IAAe,OAAO,KAAK;GAAM,CAAC;GACrD,gBAAgB;IAAE;IAAU;IAAU;GAAQ,CAAC;EACjD,GACA,CAAC,MAAM,aAAa,CAIS;EAAkB,aAAa;YAA5D,CACE,oBAAC,kBAAD,CAAmB,CAAA,GACnB,qBAAC,OAAD;GACE,GAAI;GACJ,WAAW,GACT,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;GACF,GACA,SACF;aAZF,CAcE,oBAAC,eAAD;IAAsB;IAAiB;GAAW,CAAA,GAClD,oBAAC,sBAAD;IAA+B;IAAmB;GAAW,CAAA,CACxD;IACM;;AAEnB"}
1
+ {"version":3,"file":"DragAndDropTable.js","names":[],"sources":["../../../../src/components/data-table/drag-and-drop/DragAndDropTable.tsx"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable'\nimport * as React from 'react'\n\nimport { cn } from '../../../styled'\nimport * as Sortable from '../../sortable'\nimport { Table } from '../../table/Table'\nimport { useDataTable } from '../DataTable.context'\nimport { AsyncDataState, type AsyncDataResult } from '../DataTable.types'\nimport { DataTableHead } from '../DataTableHead'\nimport { DataTableLoading } from '../DataTableLoading'\nimport type { DataTableTableProps } from '../DataTableTable'\nimport { DragAndDropTableBody } from './DragAndDropTableBody'\n\ntype DragAndDropTableProps = DataTableTableProps & {\n className?: string\n idColumn?: string\n onDragAndDrop?: (onDragAndDropData: {\n oldIndex: number\n newIndex: number\n newData: AsyncDataResult\n }) => void\n}\n\nexport const DragAndDropTable = ({\n idColumn = 'id',\n onDragAndDrop,\n sortable,\n striped,\n theme,\n className,\n ...rest\n}: DragAndDropTableProps) => {\n const { asyncDataState, data, setData } = useDataTable()\n const isPending = asyncDataState === AsyncDataState.PENDING\n\n const rowIds = React.useMemo(\n () =>\n data.results.map((row) => {\n return row[idColumn] as string | number\n }),\n [data, idColumn]\n )\n const handleSortChange = React.useCallback(\n ({ oldIndex, newIndex }) => {\n const sortedResults = arrayMove(data.results, oldIndex, newIndex)\n const newData = { results: sortedResults, total: data.total }\n setData({ results: sortedResults, total: data.total })\n onDragAndDrop?.({ oldIndex, newIndex, newData })\n },\n [data, onDragAndDrop]\n )\n\n return (\n <Sortable.Root onSortChange={handleSortChange} sortableIds={rowIds}>\n <DataTableLoading />\n <Table\n {...rest}\n className={cn(\n isPending && [\n 'opacity-50',\n 'pointer-events-none',\n 'transition-opacity',\n 'duration-250',\n 'linear',\n 'delay-150'\n ],\n className\n )}\n >\n <DataTableHead theme={theme} sortable={sortable} />\n <DragAndDropTableBody striped={striped} idColumn={idColumn} />\n </Table>\n </Sortable.Root>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,oBAAoB,EAC/B,WAAW,MACX,eACA,UACA,SACA,OACA,WACA,GAAG,WACwB;CAC3B,MAAM,EAAE,gBAAgB,MAAM,YAAY,aAAa;CACvD,MAAM,YAAY,mBAAmB,eAAe;CAEpD,MAAM,SAAS,QAAM,cAEjB,KAAK,QAAQ,KAAK,QAAQ;EACxB,OAAO,IAAI;CACb,CAAC,GACH,CAAC,MAAM,QAAQ,CACjB;CAWA,OACE,qBAAC,cAAD;EAAe,cAXQ,QAAM,aAC5B,EAAE,UAAU,eAAe;GAC1B,MAAM,gBAAgB,UAAU,KAAK,SAAS,UAAU,QAAQ;GAChE,MAAM,UAAU;IAAE,SAAS;IAAe,OAAO,KAAK;GAAM;GAC5D,QAAQ;IAAE,SAAS;IAAe,OAAO,KAAK;GAAM,CAAC;GACrD,gBAAgB;IAAE;IAAU;IAAU;GAAQ,CAAC;EACjD,GACA,CAAC,MAAM,aAAa,CAIS;EAAkB,aAAa;YAA5D,CACE,oBAAC,kBAAD,CAAmB,CAAA,GACnB,qBAAC,OAAD;GACE,GAAI;GACJ,WAAW,GACT,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;GACF,GACA,SACF;aAZF,CAcE,oBAAC,eAAD;IAAsB;IAAiB;GAAW,CAAA,GAClD,oBAAC,sBAAD;IAA+B;IAAmB;GAAW,CAAA,CACxD;IACM;;AAEnB"}
@@ -20,10 +20,11 @@ var StyledNav = styled("nav", { base: [
20
20
  ] });
21
21
  /** Applies pagination to parent DataTableProvider and renders UI to switch pages etc */
22
22
  var Pagination = ({ colorScheme, ...rest }) => {
23
- const { applyPagination, getState, getExpandedRowModel, getRowModel, setPageIndex, getTotalRows, getPageCount, asyncDataState, hasAsyncData } = useDataTable();
23
+ const { applyPagination, removePagination, getState, getExpandedRowModel, getRowModel, setPageIndex, getTotalRows, getPageCount, asyncDataState, hasAsyncData } = useDataTable();
24
24
  React$1.useEffect(() => {
25
25
  applyPagination();
26
- }, [applyPagination]);
26
+ return () => removePagination();
27
+ }, [applyPagination, removePagination]);
27
28
  const { pagination: paginationState } = getState();
28
29
  const isEmpty = !(asyncDataState === AsyncDataState.PENDING) && getTotalRows() === 0;
29
30
  const showPagination = hasAsyncData ? getPageCount() > 1 : getExpandedRowModel().rows.length / paginationState.pageSize > 1;