pixelize-design-library 2.2.191 → 2.2.193

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 (227) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/coverage/clover.xml +638 -0
  3. package/coverage/coverage-final.json +20 -0
  4. package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
  5. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
  6. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
  7. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
  8. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
  9. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
  10. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
  11. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
  12. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
  13. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
  14. package/coverage/lcov-report/Table/Components/index.html +266 -0
  15. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
  16. package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
  17. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
  18. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
  19. package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
  20. package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
  21. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
  22. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
  23. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
  24. package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
  25. package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
  26. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
  27. package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
  28. package/coverage/lcov-report/Table/index.html +176 -0
  29. package/coverage/lcov-report/base.css +224 -0
  30. package/coverage/lcov-report/block-navigation.js +87 -0
  31. package/coverage/lcov-report/favicon.png +0 -0
  32. package/coverage/lcov-report/index.html +146 -0
  33. package/coverage/lcov-report/prettify.css +1 -0
  34. package/coverage/lcov-report/prettify.js +2 -0
  35. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  36. package/coverage/lcov-report/sorter.js +210 -0
  37. package/coverage/lcov.info +1836 -0
  38. package/dist/Assets/defaultLogo.tsx +31 -0
  39. package/dist/Components/Editor/Editor.d.ts +2 -1
  40. package/dist/Components/Editor/Editor.js +39 -5
  41. package/dist/Components/KanbanBoard/AccountCard.d.ts +2 -2
  42. package/dist/Components/KanbanBoard/AccountCard.js +37 -4
  43. package/dist/Components/KanbanBoard/KanbanBoard.js +72 -35
  44. package/dist/Components/MultiSelect/MultiSelect.js +10 -19
  45. package/dist/Components/SearchSelect/SearchSelect.js +23 -16
  46. package/dist/Components/Table/Components/ActiveFilters.js +63 -22
  47. package/dist/Components/Table/Components/Pagination.d.ts +1 -1
  48. package/dist/Components/Table/Components/Pagination.js +41 -9
  49. package/dist/Components/Table/Components/TableBody.d.ts +1 -1
  50. package/dist/Components/Table/Components/TableBody.js +60 -3
  51. package/dist/Components/Table/Components/TableBody.virtualize.test.d.ts +1 -0
  52. package/dist/Components/Table/Components/TableBody.virtualize.test.js +93 -0
  53. package/dist/Components/Table/Components/TableFilters.js +11 -5
  54. package/dist/Components/Table/Components/useTable.js +36 -24
  55. package/dist/Components/Table/Table.js +1 -1
  56. package/dist/Components/Table/TableProps.d.ts +1 -0
  57. package/dist/Theme/Dark/palette.d.ts +370 -0
  58. package/dist/Theme/Dark/palette.js +372 -0
  59. package/dist/components-v2/AlertDialog/AlertDialog.d.ts +23 -0
  60. package/dist/components-v2/AlertDialog/AlertDialog.js +98 -0
  61. package/dist/components-v2/Breadcrumbs/Breadcrumbs.d.ts +14 -0
  62. package/dist/components-v2/Breadcrumbs/Breadcrumbs.js +66 -0
  63. package/dist/components-v2/Charts/AreaChart.d.ts +23 -0
  64. package/dist/components-v2/Charts/AreaChart.js +63 -0
  65. package/dist/components-v2/Charts/BarChart.d.ts +25 -0
  66. package/dist/components-v2/Charts/BarChart.js +57 -0
  67. package/dist/components-v2/Charts/LineChart.d.ts +23 -0
  68. package/dist/components-v2/Charts/LineChart.js +55 -0
  69. package/dist/components-v2/Charts/PieChart.d.ts +15 -0
  70. package/dist/components-v2/Charts/PieChart.js +54 -0
  71. package/dist/components-v2/Charts/PolarChart.d.ts +14 -0
  72. package/dist/components-v2/Charts/PolarChart.js +54 -0
  73. package/dist/components-v2/Charts/chartOptions.d.ts +7 -0
  74. package/dist/components-v2/Charts/chartOptions.js +41 -0
  75. package/dist/components-v2/Charts/useChartTheme.d.ts +22 -0
  76. package/dist/components-v2/Charts/useChartTheme.js +106 -0
  77. package/dist/components-v2/ContactForm/ContactForm.d.ts +25 -0
  78. package/dist/components-v2/ContactForm/ContactForm.js +116 -0
  79. package/dist/components-v2/DatePicker/Calendar.d.ts +19 -0
  80. package/dist/components-v2/DatePicker/Calendar.js +212 -0
  81. package/dist/components-v2/DatePicker/DatePicker.d.ts +46 -0
  82. package/dist/components-v2/DatePicker/DatePicker.js +189 -0
  83. package/dist/components-v2/DatePicker/TimePicker.d.ts +12 -0
  84. package/dist/components-v2/DatePicker/TimePicker.js +105 -0
  85. package/dist/components-v2/DatePicker/utils.d.ts +31 -0
  86. package/dist/components-v2/DatePicker/utils.js +109 -0
  87. package/dist/components-v2/Drawer/Drawer.d.ts +27 -0
  88. package/dist/components-v2/Drawer/Drawer.js +132 -0
  89. package/dist/components-v2/FeedbackForm/FeedbackForm.d.ts +26 -0
  90. package/dist/components-v2/FeedbackForm/FeedbackForm.js +112 -0
  91. package/dist/components-v2/FileUploader/FileUploader.d.ts +28 -0
  92. package/dist/components-v2/FileUploader/FileUploader.js +127 -0
  93. package/dist/components-v2/Input/TextInput.d.ts +41 -0
  94. package/dist/components-v2/Input/TextInput.js +169 -0
  95. package/dist/components-v2/KanbanBoard/KanbanBoard.d.ts +39 -0
  96. package/dist/components-v2/KanbanBoard/KanbanBoard.js +101 -0
  97. package/dist/components-v2/Layout/AppLayout.d.ts +22 -0
  98. package/dist/components-v2/Layout/AppLayout.js +53 -0
  99. package/dist/components-v2/Loading/Loading.d.ts +19 -0
  100. package/dist/components-v2/Loading/Loading.js +55 -0
  101. package/dist/components-v2/Modal/Modal.d.ts +30 -0
  102. package/dist/components-v2/Modal/Modal.js +82 -0
  103. package/dist/components-v2/NavigationBar/NavigationBar.d.ts +47 -0
  104. package/dist/components-v2/NavigationBar/NavigationBar.js +148 -0
  105. package/dist/components-v2/Notification/Notification.d.ts +22 -0
  106. package/dist/components-v2/Notification/Notification.js +113 -0
  107. package/dist/components-v2/NumberInput/NumberInput.d.ts +37 -0
  108. package/dist/components-v2/NumberInput/NumberInput.js +210 -0
  109. package/dist/components-v2/PinInput/PinInput.d.ts +26 -0
  110. package/dist/components-v2/PinInput/PinInput.js +138 -0
  111. package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +18 -0
  112. package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.js +91 -0
  113. package/dist/components-v2/Select/Select.d.ts +41 -0
  114. package/dist/components-v2/Select/Select.js +284 -0
  115. package/dist/components-v2/Sidebar/Sidebar.d.ts +41 -0
  116. package/dist/components-v2/Sidebar/Sidebar.js +182 -0
  117. package/dist/components-v2/Slider/Slider.d.ts +18 -0
  118. package/dist/components-v2/Slider/Slider.js +101 -0
  119. package/dist/components-v2/Table/Table.d.ts +7 -0
  120. package/dist/components-v2/Table/Table.js +172 -0
  121. package/dist/components-v2/Table/TableProps.d.ts +139 -0
  122. package/dist/components-v2/Table/TableProps.js +9 -0
  123. package/dist/components-v2/Table/components/ActiveFilters.d.ts +10 -0
  124. package/dist/components-v2/Table/components/ActiveFilters.js +70 -0
  125. package/dist/components-v2/Table/components/BulkActionBar.d.ts +11 -0
  126. package/dist/components-v2/Table/components/BulkActionBar.js +92 -0
  127. package/dist/components-v2/Table/components/ColumnResizeHandle.d.ts +7 -0
  128. package/dist/components-v2/Table/components/ColumnResizeHandle.js +41 -0
  129. package/dist/components-v2/Table/components/Pagination.d.ts +11 -0
  130. package/dist/components-v2/Table/components/Pagination.js +92 -0
  131. package/dist/components-v2/Table/components/TableBody.d.ts +23 -0
  132. package/dist/components-v2/Table/components/TableBody.js +69 -0
  133. package/dist/components-v2/Table/components/TableCell.d.ts +14 -0
  134. package/dist/components-v2/Table/components/TableCell.js +63 -0
  135. package/dist/components-v2/Table/components/TableEmptyState.d.ts +12 -0
  136. package/dist/components-v2/Table/components/TableEmptyState.js +55 -0
  137. package/dist/components-v2/Table/components/TableErrorState.d.ts +6 -0
  138. package/dist/components-v2/Table/components/TableErrorState.js +52 -0
  139. package/dist/components-v2/Table/components/TableHeader.d.ts +21 -0
  140. package/dist/components-v2/Table/components/TableHeader.js +94 -0
  141. package/dist/components-v2/Table/components/TableRow.d.ts +20 -0
  142. package/dist/components-v2/Table/components/TableRow.js +64 -0
  143. package/dist/components-v2/Table/components/TableSearch.d.ts +8 -0
  144. package/dist/components-v2/Table/components/TableSearch.js +47 -0
  145. package/dist/components-v2/Table/filters/FilterChips.d.ts +6 -0
  146. package/dist/components-v2/Table/filters/FilterChips.js +9 -0
  147. package/dist/components-v2/Table/filters/LeftFilterPane.d.ts +17 -0
  148. package/dist/components-v2/Table/filters/LeftFilterPane.js +105 -0
  149. package/dist/components-v2/Table/filters/TableFilters.d.ts +12 -0
  150. package/dist/components-v2/Table/filters/TableFilters.js +127 -0
  151. package/dist/components-v2/Table/hooks/useColumnResize.d.ts +15 -0
  152. package/dist/components-v2/Table/hooks/useColumnResize.js +104 -0
  153. package/dist/components-v2/Table/hooks/useTable.d.ts +58 -0
  154. package/dist/components-v2/Table/hooks/useTable.js +254 -0
  155. package/dist/components-v2/Table/hooks/useTableKeyboard.d.ts +25 -0
  156. package/dist/components-v2/Table/hooks/useTableKeyboard.js +112 -0
  157. package/dist/components-v2/Table/hooks/useVirtualScroll.d.ts +29 -0
  158. package/dist/components-v2/Table/hooks/useVirtualScroll.js +83 -0
  159. package/dist/components-v2/Table/settings/ManageColumns.d.ts +12 -0
  160. package/dist/components-v2/Table/settings/ManageColumns.js +59 -0
  161. package/dist/components-v2/Table/settings/TableSettings.d.ts +12 -0
  162. package/dist/components-v2/Table/settings/TableSettings.js +57 -0
  163. package/dist/components-v2/Table/utils/filterUtils.d.ts +7 -0
  164. package/dist/components-v2/Table/utils/filterUtils.js +149 -0
  165. package/dist/components-v2/Table/utils/sortUtils.d.ts +6 -0
  166. package/dist/components-v2/Table/utils/sortUtils.js +65 -0
  167. package/dist/components-v2/Tag/Tag.d.ts +15 -0
  168. package/dist/components-v2/Tag/Tag.js +87 -0
  169. package/dist/components-v2/Timeline/Timeline.d.ts +18 -0
  170. package/dist/components-v2/Timeline/Timeline.js +76 -0
  171. package/dist/components-v2/Toaster/Toaster.d.ts +61 -0
  172. package/dist/components-v2/Toaster/Toaster.js +63 -0
  173. package/dist/components-v2/Toggle/Toggle.d.ts +28 -0
  174. package/dist/components-v2/Toggle/Toggle.js +90 -0
  175. package/dist/components-v2/ui/accordion.d.ts +12 -0
  176. package/dist/components-v2/ui/accordion.js +104 -0
  177. package/dist/components-v2/ui/alert.d.ts +18 -0
  178. package/dist/components-v2/ui/alert.js +99 -0
  179. package/dist/components-v2/ui/avatar.d.ts +12 -0
  180. package/dist/components-v2/ui/avatar.js +80 -0
  181. package/dist/components-v2/ui/badge.d.ts +10 -0
  182. package/dist/components-v2/ui/badge.js +76 -0
  183. package/dist/components-v2/ui/button.d.ts +18 -0
  184. package/dist/components-v2/ui/button.js +97 -0
  185. package/dist/components-v2/ui/checkbox.d.ts +15 -0
  186. package/dist/components-v2/ui/checkbox.js +86 -0
  187. package/dist/components-v2/ui/dialog.d.ts +30 -0
  188. package/dist/components-v2/ui/dialog.js +115 -0
  189. package/dist/components-v2/ui/dropdown-menu.d.ts +26 -0
  190. package/dist/components-v2/ui/dropdown-menu.js +121 -0
  191. package/dist/components-v2/ui/field.d.ts +32 -0
  192. package/dist/components-v2/ui/field.js +62 -0
  193. package/dist/components-v2/ui/form-field.d.ts +25 -0
  194. package/dist/components-v2/ui/form-field.js +96 -0
  195. package/dist/components-v2/ui/input.d.ts +9 -0
  196. package/dist/components-v2/ui/input.js +73 -0
  197. package/dist/components-v2/ui/label.d.ts +10 -0
  198. package/dist/components-v2/ui/label.js +70 -0
  199. package/dist/components-v2/ui/popover.d.ts +9 -0
  200. package/dist/components-v2/ui/popover.js +60 -0
  201. package/dist/components-v2/ui/progress.d.ts +12 -0
  202. package/dist/components-v2/ui/progress.js +75 -0
  203. package/dist/components-v2/ui/radio-group.d.ts +17 -0
  204. package/dist/components-v2/ui/radio-group.js +91 -0
  205. package/dist/components-v2/ui/select.d.ts +24 -0
  206. package/dist/components-v2/ui/select.js +122 -0
  207. package/dist/components-v2/ui/separator.d.ts +5 -0
  208. package/dist/components-v2/ui/separator.js +55 -0
  209. package/dist/components-v2/ui/skeleton.d.ts +9 -0
  210. package/dist/components-v2/ui/skeleton.js +68 -0
  211. package/dist/components-v2/ui/spinner.d.ts +16 -0
  212. package/dist/components-v2/ui/spinner.js +64 -0
  213. package/dist/components-v2/ui/switch.d.ts +10 -0
  214. package/dist/components-v2/ui/switch.js +81 -0
  215. package/dist/components-v2/ui/tabs.d.ts +13 -0
  216. package/dist/components-v2/ui/tabs.js +95 -0
  217. package/dist/components-v2/ui/textarea.d.ts +10 -0
  218. package/dist/components-v2/ui/textarea.js +96 -0
  219. package/dist/components-v2/ui/tooltip.d.ts +17 -0
  220. package/dist/components-v2/ui/tooltip.js +75 -0
  221. package/dist/lib/utils.d.ts +2 -0
  222. package/dist/lib/utils.js +8 -0
  223. package/dist/theme-v2/ThemeProvider.d.ts +19 -0
  224. package/dist/theme-v2/ThemeProvider.js +149 -0
  225. package/dist/theme-v2/dark.css +47 -0
  226. package/dist/theme-v2/tokens.css +72 -0
  227. package/package.json +1 -1
@@ -1,17 +1,49 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var react_1 = __importDefault(require("react"));
36
+ var react_1 = __importStar(require("react"));
7
37
  var react_2 = require("@chakra-ui/react");
8
38
  var table_1 = require("../../../Utils/table");
9
39
  var lucide_react_1 = require("lucide-react");
10
- var Pagination = function (_a) {
40
+ var Pagination = react_1.default.memo(function (_a) {
11
41
  var paginationText = _a.paginationText, handlePageSizeChange = _a.handlePageSizeChange, rowsPerPage = _a.rowsPerPage, currentPage = _a.currentPage, pages = _a.pages, setCurrentPage = _a.setCurrentPage, dataLength = _a.dataLength, isServerPagination = _a.isServerPagination, paginationSelectOptions = _a.paginationSelectOptions;
12
- var computedOptions = paginationSelectOptions && paginationSelectOptions.length
13
- ? paginationSelectOptions
14
- : (0, table_1.pageSizeCalculation)(dataLength);
42
+ var computedOptions = (0, react_1.useMemo)(function () {
43
+ return paginationSelectOptions && paginationSelectOptions.length
44
+ ? paginationSelectOptions
45
+ : (0, table_1.pageSizeCalculation)(dataLength);
46
+ }, [paginationSelectOptions, dataLength]);
15
47
  // const isLeftDisabled = currentPage === 0;
16
48
  // const isRightDisabled = currentPage >= pages - 1;
17
49
  var isLeftDisabled = dataLength === 0 || currentPage === 0;
@@ -32,5 +64,5 @@ var Pagination = function (_a) {
32
64
  react_1.default.createElement(lucide_react_1.ChevronRight, null)),
33
65
  react_1.default.createElement(react_2.IconButton, { "aria-label": "last-page", color: isRightDisabled ? "gray" : "black", rounded: "full", variant: isRightDisabled ? "plain" : "ghost", onClick: function () { return setCurrentPage(pages - 1); } },
34
66
  react_1.default.createElement(lucide_react_1.ChevronsRight, null))))));
35
- };
67
+ });
36
68
  exports.default = Pagination;
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { TableBodyPageProps } from "../TableProps";
3
- declare const TableBody: ({ data, isCheckbox, columns, startRow, columnWidths, freezedBgColor, freezedTextColor, noBorders, handleCheckbox, selections, isLoading, onRowClick, isContent, isLink, isActionFreeze, loadingSkeletonRows, }: TableBodyPageProps) => React.JSX.Element;
3
+ declare const TableBody: ({ data, isCheckbox, columns, startRow, columnWidths, freezedBgColor, freezedTextColor, noBorders, handleCheckbox, selections, isLoading, onRowClick, isContent, isLink, isActionFreeze, loadingSkeletonRows, scrollContainerRef, }: TableBodyPageProps) => React.JSX.Element;
4
4
  export default TableBody;
@@ -84,10 +84,62 @@ var TableRow = react_2.default.memo(function (_a) {
84
84
  });
85
85
  var TableBody = function (_a) {
86
86
  var _b, _c, _d, _e, _f, _g, _h;
87
- var data = _a.data, isCheckbox = _a.isCheckbox, columns = _a.columns, startRow = _a.startRow, columnWidths = _a.columnWidths, freezedBgColor = _a.freezedBgColor, freezedTextColor = _a.freezedTextColor, noBorders = _a.noBorders, handleCheckbox = _a.handleCheckbox, selections = _a.selections, isLoading = _a.isLoading, onRowClick = _a.onRowClick, isContent = _a.isContent, isLink = _a.isLink, isActionFreeze = _a.isActionFreeze, loadingSkeletonRows = _a.loadingSkeletonRows;
87
+ var data = _a.data, isCheckbox = _a.isCheckbox, columns = _a.columns, startRow = _a.startRow, columnWidths = _a.columnWidths, freezedBgColor = _a.freezedBgColor, freezedTextColor = _a.freezedTextColor, noBorders = _a.noBorders, handleCheckbox = _a.handleCheckbox, selections = _a.selections, isLoading = _a.isLoading, onRowClick = _a.onRowClick, isContent = _a.isContent, isLink = _a.isLink, isActionFreeze = _a.isActionFreeze, loadingSkeletonRows = _a.loadingSkeletonRows, scrollContainerRef = _a.scrollContainerRef;
88
88
  var theme = (0, useCustomTheme_1.useCustomTheme)();
89
89
  var _j = (0, react_2.useState)(new Set()), expandedRows = _j[0], setExpandedRows = _j[1];
90
90
  var selectionsSet = (0, react_2.useMemo)(function () { return new Set(selections); }, [selections]);
91
+ // --- Row virtualization ---------------------------------------------------
92
+ // Rows are a fixed 45px tall (see the `height={45}` on every <Td/> below),
93
+ // and the scroll viewport is capped at ~500px, so only ~11 rows are ever
94
+ // visible. Mounting all 50/100 page rows is what makes paging freeze. We
95
+ // render only the rows inside the viewport (+ overscan) and reserve the
96
+ // remaining height with empty spacer rows. Spacer rows (rather than CSS
97
+ // transforms) keep the table in normal flow so the sticky header and
98
+ // `position: sticky` frozen columns keep working.
99
+ // Disabled when expandable content rows are present, since those break the
100
+ // fixed-height assumption.
101
+ var ROW_HEIGHT = 45;
102
+ var OVERSCAN = 6;
103
+ var VIRTUALIZE_THRESHOLD = 30;
104
+ var shouldVirtualize = !isContent && data.length > VIRTUALIZE_THRESHOLD;
105
+ var _k = (0, react_2.useState)(0), scrollTop = _k[0], setScrollTop = _k[1];
106
+ var _l = (0, react_2.useState)(0), viewportH = _l[0], setViewportH = _l[1];
107
+ (0, react_2.useEffect)(function () {
108
+ var el = scrollContainerRef === null || scrollContainerRef === void 0 ? void 0 : scrollContainerRef.current;
109
+ if (!el || !shouldVirtualize)
110
+ return;
111
+ var onScroll = function () { return setScrollTop(el.scrollTop); };
112
+ var measure = function () { return setViewportH(el.clientHeight); };
113
+ measure();
114
+ setScrollTop(el.scrollTop);
115
+ el.addEventListener("scroll", onScroll, { passive: true });
116
+ window.addEventListener("resize", measure);
117
+ return function () {
118
+ el.removeEventListener("scroll", onScroll);
119
+ window.removeEventListener("resize", measure);
120
+ };
121
+ }, [scrollContainerRef, shouldVirtualize, data.length]);
122
+ // New page: jump back to the top so the window recomputes from row 0.
123
+ (0, react_2.useEffect)(function () {
124
+ if (!shouldVirtualize)
125
+ return;
126
+ var el = scrollContainerRef === null || scrollContainerRef === void 0 ? void 0 : scrollContainerRef.current;
127
+ if (el)
128
+ el.scrollTop = 0;
129
+ setScrollTop(0);
130
+ }, [startRow, shouldVirtualize, scrollContainerRef]);
131
+ var total = data.length;
132
+ var firstIndex = 0;
133
+ var lastIndex = total;
134
+ if (shouldVirtualize) {
135
+ var vh = viewportH || 500;
136
+ firstIndex = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);
137
+ var count = Math.ceil(vh / ROW_HEIGHT) + OVERSCAN * 2;
138
+ lastIndex = Math.min(total, firstIndex + count);
139
+ }
140
+ var visibleRows = shouldVirtualize ? data.slice(firstIndex, lastIndex) : data;
141
+ var topPad = firstIndex * ROW_HEIGHT;
142
+ var bottomPad = (total - lastIndex) * ROW_HEIGHT;
91
143
  var toggleRowExpansion = (0, react_2.useCallback)(function (rowIndex) {
92
144
  setExpandedRows(function (prev) {
93
145
  var newSet = new Set(prev);
@@ -133,12 +185,17 @@ var TableBody = function (_a) {
133
185
  react_2.default.createElement(react_1.Td, { colSpan: totalVisibleColumns, p: 0, border: "none", position: "relative", height: 0 },
134
186
  react_2.default.createElement(react_1.Box, { position: "absolute", top: 4, left: "50%", transform: "translateX(-50%)", zIndex: 10 },
135
187
  react_2.default.createElement(react_1.Spinner, { size: "sm", color: ((_h = (_g = theme.colors) === null || _g === void 0 ? void 0 : _g.primary) === null || _h === void 0 ? void 0 : _h[500]) || "blue.500" }))))),
136
- data.map(function (row, index) {
188
+ shouldVirtualize && topPad > 0 && (react_2.default.createElement("tr", { "aria-hidden": "true", style: { height: topPad } },
189
+ react_2.default.createElement("td", { colSpan: totalVisibleColumns, style: { padding: 0, border: "none", height: topPad } }))),
190
+ visibleRows.map(function (row, i) {
137
191
  var _a;
192
+ var index = firstIndex + i;
138
193
  var rowIndex = startRow + index;
139
194
  var isExpanded = expandedRows.has(rowIndex);
140
195
  var isChecked = selectionsSet.has(row.id);
141
196
  return (react_2.default.createElement(TableRow, { key: (_a = row.id) !== null && _a !== void 0 ? _a : rowIndex, row: row, rowIndex: rowIndex, index: index, isChecked: isChecked, isExpanded: isExpanded, isContent: isContent, isLink: isLink, isCheckbox: isCheckbox, isLoading: isLoading, isActionFreeze: isActionFreeze, columns: columns, leftOffsets: leftOffsets, noBorders: noBorders, freezedBgColor: freezedBgColor, freezedTextColor: freezedTextColor, theme: theme, borderStyle: borderStyle, hoverStyle: hoverStyle, handleCheckbox: handleCheckbox, onRowClick: onRowClick, toggleRowExpansion: toggleRowExpansion }));
142
- })));
197
+ }),
198
+ shouldVirtualize && bottomPad > 0 && (react_2.default.createElement("tr", { "aria-hidden": "true", style: { height: bottomPad } },
199
+ react_2.default.createElement("td", { colSpan: totalVisibleColumns, style: { padding: 0, border: "none", height: bottomPad } })))));
143
200
  };
144
201
  exports.default = TableBody;
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom";
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var react_1 = __importStar(require("react"));
40
+ var react_2 = require("@testing-library/react");
41
+ require("@testing-library/jest-dom");
42
+ var react_3 = require("@chakra-ui/react");
43
+ var TableBody_1 = __importDefault(require("./TableBody"));
44
+ jest.mock("../../../Theme/useCustomTheme", function () { return ({
45
+ useCustomTheme: function () { return ({
46
+ colors: {
47
+ background: { 50: "#fff", 100: "#f9f9f9" },
48
+ backgroundColor: { light: "#fafafa", secondary: "#eee", muted: "#f3f3f3" },
49
+ disabled: { 100: "#eee" },
50
+ gray: { 100: "#f0f0f0", 200: "#eee", 300: "#ddd", 400: "#ccc", 500: "#bbb", 600: "#666" },
51
+ border: { 500: "#ddd" },
52
+ primary: { 500: "#3182ce" },
53
+ text: { 500: "#555" },
54
+ secondary: { opacity: { 4: "rgba(0,0,0,0.04)" } },
55
+ white: "#fff",
56
+ },
57
+ shadows: { lg: "0 0 0" },
58
+ }); },
59
+ }); });
60
+ var columns = [{ id: "name", label: "Name" }];
61
+ var makeData = function (n) {
62
+ return Array.from({ length: n }, function (_, i) { return ({ id: i, name: "Row ".concat(i) }); });
63
+ };
64
+ var Harness = function (_a) {
65
+ var count = _a.count;
66
+ var ref = (0, react_1.useRef)(null);
67
+ return (react_1.default.createElement(react_3.ChakraProvider, null,
68
+ react_1.default.createElement("div", { ref: ref },
69
+ react_1.default.createElement(react_3.Table, null,
70
+ react_1.default.createElement(react_3.Tbody, null,
71
+ react_1.default.createElement(TableBody_1.default, { data: makeData(count), columns: columns, startRow: 0, endRow: count, columnWidths: [120], isCheckbox: false, isContent: false, isLink: false, isActionFreeze: false, noBorders: false, selections: [], handleCheckbox: function () { }, scrollContainerRef: ref }))))));
72
+ };
73
+ describe("TableBody virtualization", function () {
74
+ it("windows large pages and reserves height with spacer rows", function () {
75
+ var _a = (0, react_2.render)(react_1.default.createElement(Harness, { count: 100 })), container = _a.container, queryByText = _a.queryByText;
76
+ // jsdom clientHeight=0 -> 500px fallback -> ceil(500/45)+12 = 24 rows
77
+ expect(queryByText("Row 0")).toBeInTheDocument();
78
+ expect(queryByText("Row 23")).toBeInTheDocument();
79
+ // Rows beyond the window are not mounted.
80
+ expect(queryByText("Row 50")).not.toBeInTheDocument();
81
+ expect(queryByText("Row 99")).not.toBeInTheDocument();
82
+ // A trailing spacer reserves the height of the unrendered rows.
83
+ var spacers = container.querySelectorAll('tr[aria-hidden="true"]');
84
+ expect(spacers.length).toBe(1);
85
+ expect(spacers[0]).toHaveStyle({ height: "".concat((100 - 24) * 45, "px") });
86
+ });
87
+ it("renders every row and no spacers below the threshold", function () {
88
+ var _a = (0, react_2.render)(react_1.default.createElement(Harness, { count: 30 })), container = _a.container, queryByText = _a.queryByText;
89
+ expect(queryByText("Row 0")).toBeInTheDocument();
90
+ expect(queryByText("Row 29")).toBeInTheDocument();
91
+ expect(container.querySelectorAll('tr[aria-hidden="true"]').length).toBe(0);
92
+ });
93
+ });
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  var react_1 = __importStar(require("react"));
37
37
  var react_2 = require("@chakra-ui/react");
38
- var table_1 = require("../../../Utils/table");
39
38
  var lucide_react_1 = require("lucide-react");
40
39
  var TableFilters = (0, react_1.memo)(function (_a) {
41
40
  var _b, _c;
@@ -43,9 +42,16 @@ var TableFilters = (0, react_1.memo)(function (_a) {
43
42
  var theme = (0, react_2.useTheme)();
44
43
  var searchRef = (0, react_1.useRef)(null);
45
44
  var _d = (0, react_1.useState)(false), refreshDataOnOpen = _d[0], setRefreshDataOnOpen = _d[1];
46
- var debounceRef = (0, table_1.debounce)(function (value) {
47
- setColumnsSearch(value);
48
- }, 700);
45
+ var setColumnsSearchRef = (0, react_1.useRef)(setColumnsSearch);
46
+ setColumnsSearchRef.current = setColumnsSearch;
47
+ var debounceTimerRef = (0, react_1.useRef)(null);
48
+ var debouncedSearch = (0, react_1.useCallback)(function (value) {
49
+ if (debounceTimerRef.current)
50
+ clearTimeout(debounceTimerRef.current);
51
+ debounceTimerRef.current = setTimeout(function () {
52
+ setColumnsSearchRef.current(value);
53
+ }, 700);
54
+ }, []);
49
55
  (0, react_1.useEffect)(function () {
50
56
  if (columnsSearch.length && searchRef.current) {
51
57
  searchRef.current.value = columnsSearch;
@@ -77,7 +83,7 @@ var TableFilters = (0, react_1.memo)(function (_a) {
77
83
  react_1.default.createElement(react_2.Icon, { as: lucide_react_1.Search, color: "gray.400", boxSize: 4 })),
78
84
  react_1.default.createElement(react_2.Input, { autoFocus: true, placeholder: "Search ".concat(header.label, "..."), size: "xs", ref: searchRef, onChange: function (e) {
79
85
  e.stopPropagation();
80
- debounceRef(e.target.value);
86
+ debouncedSearch(e.target.value);
81
87
  }, onFocus: function (e) { return e.stopPropagation(); } })))))));
82
88
  });
83
89
  exports.default = TableFilters;
@@ -38,14 +38,15 @@ var mergeColumnWithPreference = function (pref, originalCol) {
38
38
  return next;
39
39
  };
40
40
  var useTable = function (_a) {
41
+ var _b, _c;
41
42
  var tableBorderColor = _a.tableBorderColor, data = _a.data, isPagination = _a.isPagination, selections = _a.selections, onSelection = _a.onSelection, tablePreferences = _a.tablePreferences, savePreferences = _a.savePreferences, noOfRowsPerPage = _a.noOfRowsPerPage, isServerPagination = _a.isServerPagination, totalRecords = _a.totalRecords, columns = _a.columns, onNoOfRowsPerPageChange = _a.onNoOfRowsPerPageChange, defaultVisibleColumns = _a.defaultVisibleColumns;
42
43
  var theme = (0, useCustomTheme_1.useCustomTheme)();
43
44
  var headerRefs = (0, react_1.useRef)([]);
44
- var _b = (0, react_1.useState)([]), columnWidths = _b[0], setColumnWidths = _b[1];
45
- var _c = (0, react_1.useState)(selections !== null && selections !== void 0 ? selections : []), selection = _c[0], setSelection = _c[1];
46
- var _d = (0, react_1.useState)([]), columnsSort = _d[0], setColumnsSort = _d[1];
47
- var _e = (0, react_1.useState)(0), currentPage = _e[0], setCurrentPage = _e[1];
48
- var _f = (0, react_1.useState)(noOfRowsPerPage !== null && noOfRowsPerPage !== void 0 ? noOfRowsPerPage : defaultPageSize), rowsPerPage = _f[0], setRowsPerPage = _f[1];
45
+ var _d = (0, react_1.useState)([]), columnWidths = _d[0], setColumnWidths = _d[1];
46
+ var _e = (0, react_1.useState)(selections !== null && selections !== void 0 ? selections : []), selection = _e[0], setSelection = _e[1];
47
+ var _f = (0, react_1.useState)([]), columnsSort = _f[0], setColumnsSort = _f[1];
48
+ var _g = (0, react_1.useState)(0), currentPage = _g[0], setCurrentPage = _g[1];
49
+ var _h = (0, react_1.useState)(noOfRowsPerPage !== null && noOfRowsPerPage !== void 0 ? noOfRowsPerPage : defaultPageSize), rowsPerPage = _h[0], setRowsPerPage = _h[1];
49
50
  var prevRowsPerPageProp = (0, react_1.useRef)(noOfRowsPerPage);
50
51
  if (noOfRowsPerPage !== prevRowsPerPageProp.current) {
51
52
  prevRowsPerPageProp.current = noOfRowsPerPage;
@@ -54,12 +55,12 @@ var useTable = function (_a) {
54
55
  }
55
56
  }
56
57
  var tableData = data;
57
- var _g = (0, react_1.useState)(function () {
58
+ var _j = (0, react_1.useState)(function () {
58
59
  return columns.map(function (col, i) {
59
60
  var _a;
60
61
  return (__assign(__assign({}, col), { isHidden: defaultVisibleColumns ? i >= defaultVisibleColumns : ((_a = col.isHidden) !== null && _a !== void 0 ? _a : false) }));
61
62
  });
62
- }), columnsList = _g[0], setColumnsList = _g[1];
63
+ }), columnsList = _j[0], setColumnsList = _j[1];
63
64
  (0, react_1.useEffect)(function () {
64
65
  var _a;
65
66
  var columnPreference = (_a = tablePreferences === null || tablePreferences === void 0 ? void 0 : tablePreferences.columns) !== null && _a !== void 0 ? _a : [];
@@ -90,8 +91,18 @@ var useTable = function (_a) {
90
91
  overflowY: "auto",
91
92
  });
92
93
  }, [tableBorderColor, theme]);
93
- var isContent = (0, react_1.useMemo)(function () { return tableData.some(function (o) { return o.content; }); }, [tableData]);
94
- var isLink = (0, react_1.useMemo)(function () { return tableData.some(function (o) { return o.onLink || o.onDelete || o.onEdit; }); }, [tableData]);
94
+ var prevIsContent = (0, react_1.useRef)(false);
95
+ var prevIsLink = (0, react_1.useRef)(false);
96
+ var isContent = (0, react_1.useMemo)(function () {
97
+ var result = tableData.some(function (o) { return o.content; });
98
+ prevIsContent.current = result;
99
+ return result;
100
+ }, [tableData.length === 0 ? 0 : (_b = tableData[0]) === null || _b === void 0 ? void 0 : _b.id, tableData.length]); // eslint-disable-line react-hooks/exhaustive-deps
101
+ var isLink = (0, react_1.useMemo)(function () {
102
+ var result = tableData.some(function (o) { return o.onLink || o.onDelete || o.onEdit; });
103
+ prevIsLink.current = result;
104
+ return result;
105
+ }, [tableData.length === 0 ? 0 : (_c = tableData[0]) === null || _c === void 0 ? void 0 : _c.id, tableData.length]); // eslint-disable-line react-hooks/exhaustive-deps
95
106
  (0, react_1.useEffect)(function () {
96
107
  var widths = headerRefs.current.map(function (ref) { return (ref === null || ref === void 0 ? void 0 : ref.offsetWidth) || 0; });
97
108
  setColumnWidths(widths);
@@ -128,24 +139,25 @@ var useTable = function (_a) {
128
139
  var handleSort = (0, react_1.useCallback)(function (field, sort) {
129
140
  if (!sort)
130
141
  return;
131
- var newSortState = __spreadArray([], columnsSort, true);
132
- var existingIndex = newSortState.findIndex(function (sort) { return sort.column === field; });
133
- if (existingIndex === -1) {
134
- newSortState.push({
135
- column: field,
136
- direction: "asc", // Default to ascending when adding a column
137
- });
138
- }
139
- else {
140
- var existingSort = newSortState[existingIndex];
141
- existingSort.direction = sort;
142
- }
143
- setColumnsSort(newSortState);
144
- }, [columnsSort]);
142
+ setColumnsSort(function (prev) {
143
+ var newSortState = __spreadArray([], prev, true);
144
+ var existingIndex = newSortState.findIndex(function (s) { return s.column === field; });
145
+ if (existingIndex === -1) {
146
+ newSortState.push({
147
+ column: field,
148
+ direction: "asc",
149
+ });
150
+ }
151
+ else {
152
+ newSortState[existingIndex] = __assign(__assign({}, newSortState[existingIndex]), { direction: sort });
153
+ }
154
+ return newSortState;
155
+ });
156
+ }, []);
145
157
  (0, react_1.useEffect)(function () {
146
158
  setSelection(selections !== null && selections !== void 0 ? selections : []);
147
159
  }, [selections]);
148
- var _h = (0, react_1.useState)(false), isSelecting = _h[0], setIsSelecting = _h[1];
160
+ var _k = (0, react_1.useState)(false), isSelecting = _k[0], setIsSelecting = _k[1];
149
161
  var selectionRef = (0, react_1.useRef)(selection);
150
162
  selectionRef.current = selection;
151
163
  var onSelectionRef = (0, react_1.useRef)(onSelection);
@@ -278,5 +278,5 @@ function Table(_a) {
278
278
  ? false
279
279
  : "indeterminate", isContent: isContent, isLink: isLink, isActionFreeze: isActionFreeze, setColumnsSearch: setColumnsSearch, columnsSearch: columnsSearch, isSelecting: isSelecting })),
280
280
  react_1.default.createElement(react_3.Tbody, null,
281
- react_1.default.createElement(TableBody_1.default, { data: _filteredData, columns: columnsList, startRow: startRow, endRow: endRow, isCheckbox: isCheckbox, columnWidths: columnWidths, noBorders: noBorders, freezedBgColor: freezedBgColor !== null && freezedBgColor !== void 0 ? freezedBgColor : theme.colors.backgroundColor.secondary, freezedTextColor: freezedTextColor !== null && freezedTextColor !== void 0 ? freezedTextColor : (_z = theme.colors) === null || _z === void 0 ? void 0 : _z.gray[600], handleCheckbox: handleCheckbox, selections: selection, isLoading: isTableLoading, loadingSkeletonRows: loadingSkeletonRows, onRowClick: onRowClick, isContent: isContent, isLink: isLink, isActionFreeze: isActionFreeze }))))))));
281
+ react_1.default.createElement(TableBody_1.default, { data: _filteredData, columns: columnsList, startRow: startRow, endRow: endRow, scrollContainerRef: tableContainerRef, isCheckbox: isCheckbox, columnWidths: columnWidths, noBorders: noBorders, freezedBgColor: freezedBgColor !== null && freezedBgColor !== void 0 ? freezedBgColor : theme.colors.backgroundColor.secondary, freezedTextColor: freezedTextColor !== null && freezedTextColor !== void 0 ? freezedTextColor : (_z = theme.colors) === null || _z === void 0 ? void 0 : _z.gray[600], handleCheckbox: handleCheckbox, selections: selection, isLoading: isTableLoading, loadingSkeletonRows: loadingSkeletonRows, onRowClick: onRowClick, isContent: isContent, isLink: isLink, isActionFreeze: isActionFreeze }))))))));
282
282
  }
@@ -118,6 +118,7 @@ export type TableBodyPageProps = Pick<TableProps, "columns" | "isCheckbox" | "da
118
118
  selections: (string | number)[];
119
119
  isContent: boolean;
120
120
  isLink: boolean;
121
+ scrollContainerRef?: MutableRefObject<HTMLDivElement | null>;
121
122
  };
122
123
  export type TableFiltersProps = {
123
124
  header: DataObject;