@react-fabric/data 1.0.0-beta.9 → 1.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 (141) hide show
  1. package/{src/histogram/Histogram.module.css → css/_histogram.css} +16 -13
  2. package/css/styles.css +24 -0
  3. package/dist/cjs/checklist/CheckList.js +59 -33
  4. package/dist/cjs/histogram/Histogram.js +41 -26
  5. package/dist/cjs/hooks/useFilteredList.js +100 -17
  6. package/dist/cjs/hooks/usePagination.js +29 -8
  7. package/dist/cjs/hooks/useSelectableList.js +30 -5
  8. package/dist/cjs/i18n/{ar.json.js → ar/data.json.js} +8 -1
  9. package/dist/cjs/i18n/{en.json.js → en/data.json.js} +8 -1
  10. package/dist/cjs/i18n/index.js +4 -4
  11. package/dist/cjs/index.js +30 -0
  12. package/dist/cjs/json/JsonViewer.js +80 -43
  13. package/dist/cjs/pagination/Pagination.js +24 -15
  14. package/dist/cjs/table/AddColumn.js +5 -5
  15. package/dist/cjs/table/BodyCell.js +20 -13
  16. package/dist/cjs/table/BodyRow.js +41 -28
  17. package/dist/cjs/table/CheckboxCell.js +10 -9
  18. package/dist/cjs/table/ColumnFilters.js +100 -0
  19. package/dist/cjs/table/EmptyCell.js +4 -4
  20. package/dist/cjs/table/HeaderCell.js +79 -53
  21. package/dist/cjs/table/HtmlTable.js +84 -0
  22. package/dist/cjs/table/{Context.js → Provider.js} +8 -10
  23. package/dist/cjs/table/Table.js +99 -33
  24. package/dist/cjs/{tree/types.js → table/context.js} +9 -5
  25. package/dist/cjs/table/types.js +29 -0
  26. package/dist/cjs/table/useResizer.js +10 -10
  27. package/dist/cjs/table/useTableColumns.js +4 -4
  28. package/dist/cjs/table/useVirtualTable.js +129 -22
  29. package/dist/cjs/tree/TreeNode.js +66 -46
  30. package/dist/cjs/tree/TreePanel.js +60 -24
  31. package/dist/cjs/tree/useTree.js +212 -47
  32. package/dist/cjs/tree/utils.js +63 -34
  33. package/dist/cjs/utils/getColor.js +58 -0
  34. package/dist/cjs/virtual/Gallery.js +119 -61
  35. package/dist/cjs/virtual/List.js +116 -55
  36. package/dist/cjs/virtual/Scroller.js +16 -8
  37. package/dist/esm/checklist/CheckList.js +61 -35
  38. package/dist/esm/histogram/Histogram.js +43 -28
  39. package/dist/esm/hooks/useFilteredList.js +101 -18
  40. package/dist/esm/hooks/usePagination.js +29 -8
  41. package/dist/esm/hooks/useSelectableList.js +30 -5
  42. package/dist/esm/i18n/{ar.json.js → ar/data.json.js} +8 -2
  43. package/dist/esm/i18n/{en.json.js → en/data.json.js} +8 -2
  44. package/dist/esm/i18n/index.js +2 -2
  45. package/dist/esm/index.js +31 -0
  46. package/dist/esm/json/JsonViewer.js +82 -45
  47. package/dist/esm/pagination/Pagination.js +25 -16
  48. package/dist/esm/table/AddColumn.js +6 -6
  49. package/dist/esm/table/BodyCell.js +21 -14
  50. package/dist/esm/table/BodyRow.js +41 -28
  51. package/dist/esm/table/CheckboxCell.js +11 -10
  52. package/dist/esm/table/ColumnFilters.js +100 -0
  53. package/dist/esm/table/EmptyCell.js +4 -4
  54. package/dist/esm/table/HeaderCell.js +80 -54
  55. package/dist/esm/table/HtmlTable.js +84 -0
  56. package/dist/esm/table/{Context.js → Provider.js} +11 -12
  57. package/dist/esm/table/Table.js +100 -34
  58. package/dist/esm/{tree/types.js → table/context.js} +8 -4
  59. package/dist/esm/table/types.js +29 -0
  60. package/dist/esm/table/useResizer.js +10 -10
  61. package/dist/esm/table/useTableColumns.js +4 -4
  62. package/dist/esm/table/useVirtualTable.js +131 -24
  63. package/dist/esm/tree/TreeNode.js +69 -49
  64. package/dist/esm/tree/TreePanel.js +62 -26
  65. package/dist/esm/tree/useTree.js +215 -50
  66. package/dist/esm/tree/utils.js +64 -35
  67. package/dist/esm/utils/getColor.js +58 -0
  68. package/dist/esm/virtual/Gallery.js +121 -63
  69. package/dist/esm/virtual/List.js +118 -57
  70. package/dist/esm/virtual/Scroller.js +17 -9
  71. package/dist/types/checklist/CheckList.d.ts +25 -6
  72. package/dist/types/histogram/Histogram.d.ts +28 -6
  73. package/dist/types/hooks/useFilteredList.d.ts +62 -5
  74. package/dist/types/hooks/usePagination.d.ts +18 -2
  75. package/dist/types/hooks/useSelectableList.d.ts +24 -1
  76. package/dist/types/index.d.ts +27 -0
  77. package/dist/types/json/JsonViewer.d.ts +23 -3
  78. package/dist/types/pagination/Pagination.d.ts +8 -2
  79. package/dist/types/table/AddColumn.d.ts +2 -2
  80. package/dist/types/table/BodyCell.d.ts +2 -2
  81. package/dist/types/table/BodyRow.d.ts +9 -9
  82. package/dist/types/table/CheckboxCell.d.ts +3 -3
  83. package/dist/types/table/ColumnFilters.d.ts +12 -0
  84. package/dist/types/table/EmptyCell.d.ts +1 -1
  85. package/dist/types/table/HeaderCell.d.ts +1 -1
  86. package/dist/types/table/HtmlTable.d.ts +21 -0
  87. package/dist/types/table/Provider.d.ts +2 -0
  88. package/dist/types/table/Table.d.ts +10 -1
  89. package/dist/types/table/context.d.ts +7 -0
  90. package/dist/types/table/types.d.ts +52 -10
  91. package/dist/types/table/useResizer.d.ts +1 -1
  92. package/dist/types/table/useTableColumns.d.ts +1 -1
  93. package/dist/types/table/useVirtualTable.d.ts +31 -12
  94. package/dist/types/tree/TreeNode.d.ts +1 -1
  95. package/dist/types/tree/TreePanel.d.ts +36 -1
  96. package/dist/types/tree/types.d.ts +75 -28
  97. package/dist/types/tree/useTree.d.ts +8 -12
  98. package/dist/types/tree/utils.d.ts +15 -8
  99. package/dist/types/utils/getColor.d.ts +43 -0
  100. package/dist/types/virtual/Gallery.d.ts +37 -6
  101. package/dist/types/virtual/List.d.ts +38 -6
  102. package/dist/types/virtual/Scroller.d.ts +1 -1
  103. package/package.json +17 -19
  104. package/src/checklist/CheckList.tsx +68 -71
  105. package/src/histogram/Histogram.tsx +47 -48
  106. package/src/hooks/useFilteredList.tsx +111 -28
  107. package/src/hooks/usePagination.tsx +39 -39
  108. package/src/hooks/useSelectableList.ts +45 -33
  109. package/src/i18n/{ar.json → ar/data.json} +5 -0
  110. package/src/i18n/{en.json → en/data.json} +5 -0
  111. package/src/i18n/index.ts +2 -2
  112. package/src/index.ts +23 -17
  113. package/src/json/JsonViewer.tsx +89 -120
  114. package/src/pagination/Pagination.tsx +104 -105
  115. package/src/table/AddColumn.tsx +6 -15
  116. package/src/table/BodyCell.tsx +27 -36
  117. package/src/table/BodyRow.tsx +36 -59
  118. package/src/table/CheckboxCell.tsx +12 -15
  119. package/src/table/ColumnFilters.tsx +93 -0
  120. package/src/table/EmptyCell.tsx +5 -18
  121. package/src/table/HeaderCell.tsx +72 -53
  122. package/src/table/HtmlTable.tsx +106 -0
  123. package/src/table/{Context.tsx → Provider.tsx} +11 -28
  124. package/src/table/Table.tsx +98 -83
  125. package/src/table/context.ts +33 -0
  126. package/src/table/types.ts +53 -27
  127. package/src/table/useResizer.ts +5 -9
  128. package/src/table/useTableColumns.ts +4 -6
  129. package/src/table/useVirtualTable.ts +136 -37
  130. package/src/tree/TreeNode.tsx +91 -86
  131. package/src/tree/TreePanel.tsx +87 -51
  132. package/src/tree/types.ts +85 -46
  133. package/src/tree/useTree.ts +210 -65
  134. package/src/tree/utils.ts +81 -62
  135. package/src/utils/getColor.ts +55 -0
  136. package/src/virtual/Gallery.tsx +129 -120
  137. package/src/virtual/List.tsx +124 -91
  138. package/src/virtual/Scroller.tsx +25 -9
  139. package/dist/cjs/histogram/Histogram.module.css +0 -1
  140. package/dist/esm/histogram/Histogram.module.css +0 -1
  141. package/dist/types/table/Context.d.ts +0 -8
@@ -1,40 +1,48 @@
1
1
  'use client';
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
- import { useDebounce, Loading, EmptyContent } from '@react-fabric/core';
5
- import { debounce } from '@react-fabric/utilities';
4
+ import { useDebounce, LoadingLine, Icon, EmptyContent } from '@react-fabric/core';
5
+ import { debounce, cn } from '@react-fabric/utilities';
6
6
  import { useRef, useMemo, useLayoutEffect, useImperativeHandle, useEffect } from 'react';
7
7
  import { useTranslation } from 'react-i18next';
8
8
  import { AddColumn } from './AddColumn.js';
9
9
  import { BodyRow } from './BodyRow.js';
10
10
  import { CheckboxCell } from './CheckboxCell.js';
11
- import { TableProvider } from './Context.js';
12
11
  import { EmptyCell } from './EmptyCell.js';
13
12
  import { HeaderCell } from './HeaderCell.js';
13
+ import { TableProvider } from './Provider.js';
14
14
  import { useTableColumns } from './useTableColumns.js';
15
15
  import { useVirtualTable } from './useVirtualTable.js';
16
16
  import { jsx, jsxs } from 'react/jsx-runtime';
17
17
 
18
18
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
- var Table = function Table(_ref) {
21
- var _state$start, _state$cols, _state$end, _items$, _state$start2, _state$cols2, _state$end2;
19
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
+ function Table(_ref) {
21
+ var _state$start, _state$cols, _state$end, _items, _state$start2, _state$cols2, _state$end2;
22
22
  var ref = _ref.ref,
23
23
  data = _ref.data,
24
24
  columns = _ref.columns,
25
- keyProperty = _ref.keyProperty,
25
+ _ref$keyProperty = _ref.keyProperty,
26
+ keyProperty = _ref$keyProperty === void 0 ? "id" : _ref$keyProperty,
27
+ groupProperty = _ref.groupProperty,
26
28
  checkableRows = _ref.checkableRows,
27
29
  initialScroll = _ref.initialScroll,
28
30
  hideableColumns = _ref.hideableColumns,
29
31
  sort = _ref.sort,
30
32
  loading = _ref.loading,
33
+ checked = _ref.checked,
31
34
  emptyDisplay = _ref.emptyDisplay,
35
+ groupRenderer = _ref.groupRenderer,
32
36
  canExpand = _ref.canExpand,
33
37
  children = _ref.children,
34
38
  onSort = _ref.onSort,
39
+ onFilter = _ref.onFilter,
35
40
  onScroll = _ref.onScroll,
36
41
  onRowClick = _ref.onRowClick,
37
- onCheckedChanged = _ref.onCheckedChanged;
42
+ onCheckedChanged = _ref.onCheckedChanged,
43
+ _ref$total = _ref.total,
44
+ total = _ref$total === void 0 ? 0 : _ref$total,
45
+ onLoadMore = _ref.onLoadMore;
38
46
  var _useTranslation = useTranslation("data"),
39
47
  t = _useTranslation.t;
40
48
  var fireCheckChanged = useDebounce(function (checkedIds) {
@@ -43,19 +51,30 @@ var Table = function Table(_ref) {
43
51
  var _useTableColumns = useTableColumns(columns),
44
52
  state = _useTableColumns.state,
45
53
  onHide = _useTableColumns.onHide;
46
- var _useVirtualTable = useVirtualTable(data, keyProperty, fireCheckChanged),
54
+ var _useVirtualTable = useVirtualTable(data, {
55
+ checked: checked,
56
+ keyProperty: keyProperty,
57
+ groupProperty: groupProperty,
58
+ total: total,
59
+ loading: loading,
60
+ onLoadMore: onLoadMore,
61
+ onCheckChanged: fireCheckChanged
62
+ }),
47
63
  scrollerRef = _useVirtualTable.scrollerRef,
48
64
  items = _useVirtualTable.items,
49
65
  top = _useVirtualTable.top,
50
66
  checkState = _useVirtualTable.checkState,
51
67
  virtualizer = _useVirtualTable.virtualizer,
68
+ hasActiveSticky = _useVirtualTable.hasActiveSticky,
52
69
  toggleExpand = _useVirtualTable.toggleExpand,
53
70
  toggleChecked = _useVirtualTable.toggleChecked,
54
71
  toggleAllChecked = _useVirtualTable.toggleAllChecked,
72
+ toggleGroupExpand = _useVirtualTable.toggleGroupExpand,
55
73
  getData = _useVirtualTable.getData,
56
74
  totalSize = _useVirtualTable.totalSize,
75
+ isActiveSticky = _useVirtualTable.isActiveSticky,
57
76
  measureElement = _useVirtualTable.measureElement;
58
- var refBody = useRef(null);
77
+ var bodyRef = useRef(null);
59
78
  var wrapperStart = useMemo(function () {
60
79
  return "bg-inherit sticky start-0 flex flex-nowrap z-1";
61
80
  }, []);
@@ -63,11 +82,15 @@ var Table = function Table(_ref) {
63
82
  return "bg-inherit sticky end-0 flex flex-nowrap z-1 border-s -ms-px";
64
83
  }, []);
65
84
  useLayoutEffect(function () {
66
- setTimeout(function () {
67
- initialScroll && virtualizer.scrollToIndex(initialScroll, {
85
+ var tmr = setTimeout(function () {
86
+ if (initialScroll) virtualizer.scrollToIndex(initialScroll, {
68
87
  align: "start"
69
88
  });
70
89
  }, 100);
90
+ return function () {
91
+ clearTimeout(tmr);
92
+ };
93
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
71
94
  }, []);
72
95
  useImperativeHandle(ref, function () {
73
96
  return {
@@ -92,7 +115,9 @@ var Table = function Table(_ref) {
92
115
  (_scrollerRef$current3 = scrollerRef.current) === null || _scrollerRef$current3 === void 0 || (_scrollerRef$current3 = _scrollerRef$current3.querySelector(".hilight")) === null || _scrollerRef$current3 === void 0 || _scrollerRef$current3.classList.remove("hilight", "ring-1");
93
116
  }
94
117
  };
95
- }, []);
118
+ },
119
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
120
+ []);
96
121
  useEffect(function () {
97
122
  var handle = debounce(function (top) {
98
123
  onScroll === null || onScroll === void 0 || onScroll(top !== null && top !== void 0 ? top : 0);
@@ -101,16 +126,18 @@ var Table = function Table(_ref) {
101
126
  return function () {
102
127
  handle.cancel();
103
128
  };
104
- }, [top]);
129
+ }, [onScroll, top]);
105
130
  return /*#__PURE__*/jsx(TableProvider, {
106
131
  children: /*#__PURE__*/jsxs("div", {
107
132
  className: "grid area-content overflow-auto relative",
108
133
  style: {
109
134
  gridTemplate: "\"head\" auto \"loader\" auto \"content\" 1fr \"foot\" auto/1fr"
110
135
  },
136
+ "data-ref": "tableScroller",
111
137
  ref: scrollerRef,
112
138
  children: [/*#__PURE__*/jsxs("div", {
113
- className: "bg-base font-medium sticky top-0 area-head border-b select-none flex flex-nowrap z-2",
139
+ "data-ref": "tableHeader",
140
+ className: "bg-default font-medium sticky top-0 h-8 area-head border-b select-none flex flex-nowrap z-3",
114
141
  children: [/*#__PURE__*/jsxs("div", {
115
142
  className: wrapperStart,
116
143
  children: [canExpand && /*#__PURE__*/jsx("div", {
@@ -119,23 +146,38 @@ var Table = function Table(_ref) {
119
146
  state: checkState.allChecked,
120
147
  onClick: toggleAllChecked
121
148
  }), (_state$start = state.start) === null || _state$start === void 0 ? void 0 : _state$start.map(function (col, idx) {
122
- return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
123
- sort: sort,
124
- onSort: onSort
125
- }), idx);
149
+ return (
150
+ /*#__PURE__*/
151
+ // eslint-disable-next-line @eslint-react/no-array-index-key
152
+ jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
153
+ sort: sort,
154
+ onSort: onSort,
155
+ onFilter: onFilter
156
+ }), idx)
157
+ );
126
158
  })]
127
159
  }), (_state$cols = state.cols) === null || _state$cols === void 0 ? void 0 : _state$cols.map(function (col, idx) {
128
- return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
129
- sort: sort,
130
- onSort: onSort
131
- }), idx);
160
+ return (
161
+ /*#__PURE__*/
162
+ // eslint-disable-next-line @eslint-react/no-array-index-key
163
+ jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
164
+ sort: sort,
165
+ onSort: onSort,
166
+ onFilter: onFilter
167
+ }), idx)
168
+ );
132
169
  }), /*#__PURE__*/jsxs("div", {
133
170
  className: wrapperEnd,
134
171
  children: [(_state$end = state.end) === null || _state$end === void 0 ? void 0 : _state$end.map(function (col, idx) {
135
- return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
136
- sort: sort,
137
- onSort: onSort
138
- }), idx);
172
+ return (
173
+ /*#__PURE__*/
174
+ // eslint-disable-next-line @eslint-react/no-array-index-key
175
+ jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
176
+ sort: sort,
177
+ onSort: onSort,
178
+ onFilter: onFilter
179
+ }), idx)
180
+ );
139
181
  }), hideableColumns && /*#__PURE__*/jsx(AddColumn, {
140
182
  onClick: onHide,
141
183
  columns: state.columns.filter(function (col) {
@@ -143,22 +185,46 @@ var Table = function Table(_ref) {
143
185
  })
144
186
  })]
145
187
  })]
146
- }), loading && /*#__PURE__*/jsx(Loading, {}), data.length > 0 && /*#__PURE__*/jsxs("div", {
147
- className: "area-content flex flex-col flex-nowrap",
188
+ }), loading && /*#__PURE__*/jsx(LoadingLine, {}), data.length > 0 && /*#__PURE__*/jsxs("div", {
189
+ className: "area-content flex flex-col flex-nowrap min-h-full",
148
190
  style: {
149
191
  height: totalSize()
150
192
  },
151
- ref: refBody,
193
+ ref: bodyRef,
152
194
  children: [/*#__PURE__*/jsx("div", {
153
195
  style: {
154
- height: (_items$ = items[0]) === null || _items$ === void 0 ? void 0 : _items$.start
196
+ height: (_items = items[hasActiveSticky ? 1 : 0]) === null || _items === void 0 ? void 0 : _items.start
155
197
  }
156
198
  }), items.map(function (_ref2) {
199
+ var _groupRenderer;
157
200
  var index = _ref2.index,
158
201
  key = _ref2.key;
159
202
  var data = getData(index);
160
- return /*#__PURE__*/jsx(BodyRow, {
161
- rowKey: key,
203
+ return "__GROUP__" in data ? /*#__PURE__*/jsx("div", {
204
+ ref: measureElement,
205
+ "data-index": index,
206
+ className: cn("text-md bg-default border-y border-tint-100 border-t-0 cursor-pointer flex items-center justify-start gap-1 z-2", isActiveSticky(index) && "sticky top-8"),
207
+ role: "none",
208
+ onClick: function onClick() {
209
+ return toggleGroupExpand(data.key);
210
+ },
211
+ children: /*#__PURE__*/jsxs("div", {
212
+ className: cn("px-2 py-1 flex items-center gap-1 z-2 sticky inset-s-0"),
213
+ children: [/*#__PURE__*/jsx(Icon, {
214
+ rtlFlip: true,
215
+ icon: data.open ? "icon-[mdi--chevron-down]" : "icon-[mdi--chevron-right]"
216
+ }), (_groupRenderer = groupRenderer === null || groupRenderer === void 0 ? void 0 : groupRenderer(data)) !== null && _groupRenderer !== void 0 ? _groupRenderer : /*#__PURE__*/jsxs("div", {
217
+ className: "flex gap-1 items-center",
218
+ children: [/*#__PURE__*/jsx("span", {
219
+ children: data.key
220
+ }), /*#__PURE__*/jsxs("span", {
221
+ className: "text-sm",
222
+ children: ["(", data.itemCount, ")"]
223
+ })]
224
+ })]
225
+ })
226
+ }, key) : /*#__PURE__*/jsx(BodyRow, {
227
+ rowKey: key.toString(),
162
228
  index: index,
163
229
  checkableRows: checkableRows,
164
230
  checked: keyProperty && checkState.checked.includes(data[keyProperty]) ? 1 : 0,
@@ -205,6 +271,6 @@ var Table = function Table(_ref) {
205
271
  }))]
206
272
  })
207
273
  });
208
- };
274
+ }
209
275
 
210
276
  export { Table };
@@ -1,12 +1,14 @@
1
1
  'use client';
2
2
 
3
+ import { createContext, use } from 'react';
4
+
3
5
  /*
4
6
  * React Fabric
5
7
  * @version: 1.0.0
6
8
  *
7
9
  *
8
10
  * The MIT License (MIT)
9
- * Copyright (c) 2024 Adarsh Pastakia
11
+ * Copyright (c) 2026 Adarsh Pastakia
10
12
  *
11
13
  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
12
14
  * and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -23,7 +25,9 @@
23
25
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
26
  */
25
27
 
26
- var iconExpandAll = "M12.984 9v6h3l-3.984 3.984-3.984-3.984h3v-6h-3l3.984-3.984 3.984 3.984h-3zM3.984 2.016h16.031v1.969h-16.031v-1.969zM3.984 20.016h16.031v1.969h-16.031v-1.969z";
27
- var iconCollapseAll = "M3.984 11.016h16.031v1.969h-16.031v-1.969zM15.984 5.016l-3.984 3.984-3.984-3.984h3v-4.031h1.969v4.031h3zM8.016 18.984l3.984-3.984 3.984 3.984h-3v4.031h-1.969v-4.031h-3z";
28
+ var TableContext = /*#__PURE__*/createContext({});
29
+ var useTableContext = function useTableContext() {
30
+ return use(TableContext);
31
+ };
28
32
 
29
- export { iconCollapseAll, iconExpandAll };
33
+ export { TableContext, useTableContext };
@@ -27,4 +27,33 @@ var COL_MIN_WIDTH = "3rem";
27
27
  var COL_MAX_WIDTH = "64rem";
28
28
  var COL_DEFAULT_WIDTH = "12rem";
29
29
 
30
+ /**
31
+ * TableColumn interface defines the structure of a column in a table.
32
+ * It includes properties for column identification, display options, alignment,
33
+ * visibility, resizing, sorting, filtering, and rendering.
34
+ *
35
+ * @template T - The type of data the column will represent, defaulting to KeyValue.
36
+ * @property {keyof T | string} id - Unique identifier for the column.
37
+ * @property {"string" | "number" | "boolean" | "datetime" | "date" | "time" | "unknown"} [dataType] - Data type of the column values.
38
+ * @property {string} [label] - Display label for the column header.
39
+ * @property {string} [tooltip] - Tooltip text for the column header.
40
+ * @property {string} [format] - Format string for displaying the column values.
41
+ * @property {"start" | "center" | "end"} [align] - Text alignment within the column.
42
+ * @property {"start" | "end"} [locked] - Indicates if the column is locked at the start or end.
43
+ * @property {boolean} [hidden] - Whether the column is hidden.
44
+ * @property {boolean} [truncate] - Whether to truncate the text in the column.
45
+ * @property {boolean} [hideable] - Whether the column can be hidden by the user.
46
+ * @property {boolean} [resizable] - Whether the column can be resized by the user.
47
+ * @property {boolean} [sortable] - Whether the column can be sorted.
48
+ * @property {boolean} [filterable] - Whether the column can be filtered.
49
+ * @property {AnyObject} [filter] - Filter criteria for the column.
50
+ * @property {ReactElement[]} [actions] - Array of action elements to be displayed in the column.
51
+ * @property {AnyObject[]} [filterOptions] - Options for filtering the column.
52
+ * @property {string | number} [width] - Width of the column.
53
+ * @property {string | number} [minWidth] - Minimum width of the column.
54
+ * @property {string | number} [maxWidth] - Maximum width of the column.
55
+ * @property {KeyValue} [valueMap] - Mapping of values for the column.
56
+ * @property {(value: AnyObject, data: T, index: number) => Elements<AnyObject>} [renderer] - Custom renderer function for the column values.
57
+ */
58
+
30
59
  export { COL_DEFAULT_WIDTH, COL_MAX_WIDTH, COL_MIN_WIDTH };
@@ -23,7 +23,7 @@
23
23
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
24
  */
25
25
 
26
- var useResizer = function useResizer(colEl, ghostEl, callback) {
26
+ function startResizer(colEl, ghostEl, callback) {
27
27
  var placeholder = ghostEl.firstElementChild;
28
28
  var isRtl = getComputedStyle(colEl).direction === "rtl";
29
29
  var onResize = function onResize(evt) {
@@ -34,24 +34,24 @@ var useResizer = function useResizer(colEl, ghostEl, callback) {
34
34
  };
35
35
 
36
36
  /** ***************** dettach handlers on mouseup *******************/
37
- var onResizeEnd = function onResizeEnd() {
37
+ var _onResizeEnd = function onResizeEnd() {
38
38
  callback(placeholder.offsetWidth);
39
39
  ghostEl.style.display = "none";
40
40
  document.removeEventListener("mousemove", onResize);
41
- document.removeEventListener("mouseup", onResizeEnd);
41
+ document.removeEventListener("mouseup", _onResizeEnd);
42
42
  };
43
43
 
44
44
  /** ***************** attach handlers *******************/
45
45
  var box = colEl.getBoundingClientRect();
46
46
  if (colEl.parentElement != null) {
47
- var _colEl$parentElement;
48
- var parentBox = (_colEl$parentElement = colEl.parentElement) === null || _colEl$parentElement === void 0 ? void 0 : _colEl$parentElement.getBoundingClientRect();
47
+ var _colEl$closest;
48
+ var parentBox = (_colEl$closest = colEl.closest("[data-ref='tableScroller']")) === null || _colEl$closest === void 0 ? void 0 : _colEl$closest.getBoundingClientRect();
49
49
  if (isRtl) {
50
50
  placeholder.style.left = "unset";
51
- placeholder.style.right = "".concat(box.right - parentBox.right, "px");
51
+ placeholder.style.right = "".concat(parentBox.width - box.right, "px");
52
52
  } else {
53
53
  placeholder.style.right = "unset";
54
- placeholder.style.left = "".concat(box.left - parentBox.left, "px");
54
+ placeholder.style.left = "".concat(box.left, "px");
55
55
  }
56
56
  }
57
57
  placeholder.style.width = "".concat(colEl.offsetWidth, "px");
@@ -59,7 +59,7 @@ var useResizer = function useResizer(colEl, ghostEl, callback) {
59
59
  placeholder.style.maxWidth = colEl.style.maxWidth || "75vw";
60
60
  ghostEl.style.display = "block";
61
61
  document.addEventListener("mousemove", onResize);
62
- document.addEventListener("mouseup", onResizeEnd);
63
- };
62
+ document.addEventListener("mouseup", _onResizeEnd);
63
+ }
64
64
 
65
- export { useResizer };
65
+ export { startResizer };
@@ -6,8 +6,8 @@ import { groupBy } from '@react-fabric/utilities';
6
6
  import { useReducer, useEffect } from 'react';
7
7
 
8
8
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
- var useTableColumns = function useTableColumns(columns) {
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function useTableColumns(columns) {
11
11
  var _useReducer = useReducer(function (state, action) {
12
12
  if (action.type === "columns") {
13
13
  state.columns = action.columns;
@@ -16,7 +16,7 @@ var useTableColumns = function useTableColumns(columns) {
16
16
  var col = state.columns.find(function (col) {
17
17
  return col.id === action.id;
18
18
  });
19
- col && state.columns.splice(state.columns.indexOf(col), 1, _objectSpread(_objectSpread({}, col), {}, {
19
+ if (col) state.columns.splice(state.columns.indexOf(col), 1, _objectSpread(_objectSpread({}, col), {}, {
20
20
  hidden: col.hidden !== true
21
21
  }));
22
22
  }
@@ -58,6 +58,6 @@ var useTableColumns = function useTableColumns(columns) {
58
58
  });
59
59
  }
60
60
  };
61
- };
61
+ }
62
62
 
63
63
  export { useTableColumns };
@@ -1,49 +1,83 @@
1
1
  'use client';
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
5
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
- import { useVirtualizer } from '@tanstack/react-virtual';
6
- import { useRef, useReducer, useCallback } from 'react';
6
+ import { groupBy, compareValues, debounce } from '@react-fabric/utilities';
7
+ import { useVirtualizer, defaultRangeExtractor } from '@tanstack/react-virtual';
8
+ import { useReducer, useRef, useMemo, useState, useCallback, useEffect } from 'react';
7
9
 
8
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
- var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged) {
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ function useVirtualTable(data, options) {
11
13
  var _virtualizer$range;
12
14
  // TODO: refactor data into item list, apply grouping if groupColumn provided
13
15
  // TODO: when grouping maintain map of group with children, {___GROUP___:true, label, items, open}
14
-
15
- var scrollerRef = useRef(null);
16
- var virtualizer = useVirtualizer({
17
- count: data.length,
18
- getScrollElement: function getScrollElement() {
19
- return scrollerRef.current;
20
- },
21
- estimateSize: function estimateSize() {
22
- return 24;
23
- }
24
- });
25
16
  var _useReducer = useReducer(function (state, action) {
17
+ if (action.type === "updateState") {
18
+ state.checked = action.checked;
19
+ }
26
20
  if (action.type === "expand") {
27
21
  if (state.expanded.includes(action.key)) state.expanded.splice(state.expanded.indexOf(action.key), 1);else state.expanded.push(action.key);
28
22
  }
29
23
  if (action.type === "check") {
24
+ var _options$onCheckChang;
30
25
  if (state.checked.includes(action.key)) state.checked.splice(state.checked.indexOf(action.key), 1);else state.checked.push(action.key);
31
- onCheckChanged === null || onCheckChanged === void 0 || onCheckChanged(state.checked);
26
+ (_options$onCheckChang = options.onCheckChanged) === null || _options$onCheckChang === void 0 || _options$onCheckChang.call(options, state.checked);
32
27
  }
33
28
  if (action.type === "checkall") {
29
+ var _options$onCheckChang2;
34
30
  if (state.allChecked !== 0) {
35
31
  state.checked = [];
36
- } else if (keyProperty) {
37
- state.checked = data.map(function (item) {
38
- return item[keyProperty];
32
+ } else if (options.keyProperty) {
33
+ state.checked = state.data.map(function (item) {
34
+ return item[options.keyProperty];
35
+ });
36
+ }
37
+ (_options$onCheckChang2 = options.onCheckChanged) === null || _options$onCheckChang2 === void 0 || _options$onCheckChang2.call(options, state.checked);
38
+ }
39
+ var checkList = state.data.filter(function (hit) {
40
+ return state.checked.includes(hit[options.keyProperty]);
41
+ });
42
+ if (action.type === "groupExpand") {
43
+ var group = state.groups.find(function (group) {
44
+ return group.key === action.key;
45
+ });
46
+ if (group) {
47
+ group.open = !group.open;
48
+ state.groups = state.groups.slice();
49
+ state.items = state.groups.map(function (group) {
50
+ return [group, group.open ? state.grouped[group.key] : undefined];
51
+ }).flat(2).filter(Boolean);
52
+ }
53
+ }
54
+ if (action.type === "reset") {
55
+ state.data = action.data;
56
+ if (action.key) {
57
+ state.grouped = groupBy(state.data, action.key);
58
+ state.groups = Object.keys(state.grouped).sort(compareValues("asc")).map(function (group) {
59
+ return {
60
+ __GROUP__: true,
61
+ open: true,
62
+ key: group,
63
+ itemCount: state.grouped[group].length
64
+ };
39
65
  });
66
+ state.items = state.groups.map(function (group) {
67
+ return [group].concat(_toConsumableArray(state.grouped[group.key]));
68
+ }).flat();
69
+ } else {
70
+ state.items = state.data;
40
71
  }
41
- onCheckChanged === null || onCheckChanged === void 0 || onCheckChanged(state.checked);
42
72
  }
43
73
  return _objectSpread(_objectSpread({}, state), {}, {
44
- allChecked: state.checked.length === data.length ? 1 : state.checked.length ? 2 : 0
74
+ allChecked: checkList.length === state.data.length ? 1 : state.checked.length ? 2 : 0
45
75
  });
46
76
  }, {
77
+ data: data,
78
+ items: [],
79
+ grouped: {},
80
+ groups: [],
47
81
  checked: [],
48
82
  expanded: [],
49
83
  allChecked: 0
@@ -51,19 +85,92 @@ var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged
51
85
  _useReducer2 = _slicedToArray(_useReducer, 2),
52
86
  state = _useReducer2[0],
53
87
  dispatch = _useReducer2[1];
88
+ var activeStickyIndexRef = useRef(0);
89
+ var stickyIndexes = useMemo(function () {
90
+ return state.items.map(function (hit, idx) {
91
+ return "__GROUP__" in hit ? idx : undefined;
92
+ }).filter(Boolean);
93
+ }, [state.items]);
94
+ var isActiveSticky = function isActiveSticky(index) {
95
+ return activeStickyIndexRef.current === index;
96
+ };
97
+ var _useState = useState(false),
98
+ _useState2 = _slicedToArray(_useState, 2),
99
+ hasActiveSticky = _useState2[0],
100
+ setHasActiveSticky = _useState2[1];
101
+ var scrollerRef = useRef(null);
102
+ var virtualizer = useVirtualizer({
103
+ count: state.items.length,
104
+ getScrollElement: function getScrollElement() {
105
+ return scrollerRef.current;
106
+ },
107
+ estimateSize: function estimateSize() {
108
+ return 32;
109
+ },
110
+ rangeExtractor: useCallback(function (range) {
111
+ var _reverse$find;
112
+ activeStickyIndexRef.current = (_reverse$find = _toConsumableArray(stickyIndexes).reverse().find(function (index) {
113
+ return range.startIndex > index;
114
+ })) !== null && _reverse$find !== void 0 ? _reverse$find : 0;
115
+ setHasActiveSticky(range.startIndex !== activeStickyIndexRef.current);
116
+ var next = new Set([activeStickyIndexRef.current].concat(_toConsumableArray(defaultRangeExtractor(range))));
117
+ return _toConsumableArray(next);
118
+ }, [stickyIndexes])
119
+ });
54
120
  var virtualItems = virtualizer.getVirtualItems();
55
121
  var getData = useCallback(function (index) {
56
- return data[index];
57
- }, [data]);
122
+ return state.items[index];
123
+ }, [state.items]);
124
+ useEffect(function () {
125
+ dispatch({
126
+ type: "reset",
127
+ key: options.groupProperty,
128
+ data: data
129
+ });
130
+ }, [data, options.groupProperty]);
131
+ useEffect(function () {
132
+ var _options$checked;
133
+ dispatch({
134
+ type: "updateState",
135
+ checked: (_options$checked = options.checked) !== null && _options$checked !== void 0 ? _options$checked : []
136
+ });
137
+ }, [options.checked]);
138
+ useEffect(function () {
139
+ if (options.onLoadMore) {
140
+ var _virtualItems$, _virtualItems$slice$p;
141
+ var firstItem = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index;
142
+ var lastItem = virtualItems === null || virtualItems === void 0 || (_virtualItems$slice$p = virtualItems.slice(-1).pop()) === null || _virtualItems$slice$p === void 0 ? void 0 : _virtualItems$slice$p.index;
143
+ var canLoadPrevPage = firstItem !== undefined && state.items[firstItem] === null;
144
+ var canLoadNextPage = lastItem !== undefined && lastItem === state.items.length - 1 && state.items.length < options.total;
145
+ var db = debounce(options.onLoadMore);
146
+ if (canLoadPrevPage) {
147
+ db(firstItem);
148
+ } else if (!options.loading && canLoadNextPage) {
149
+ db(lastItem + 1);
150
+ }
151
+ return function () {
152
+ return db.cancel();
153
+ };
154
+ }
155
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
156
+ }, [options.onLoadMore, virtualItems]);
58
157
  return {
59
158
  scrollerRef: scrollerRef,
60
159
  items: virtualItems,
61
160
  checkState: state,
62
161
  getData: getData,
63
162
  virtualizer: virtualizer,
163
+ hasActiveSticky: hasActiveSticky,
164
+ isActiveSticky: isActiveSticky,
64
165
  top: (_virtualizer$range = virtualizer.range) === null || _virtualizer$range === void 0 ? void 0 : _virtualizer$range.startIndex,
65
166
  totalSize: virtualizer.getTotalSize,
66
167
  measureElement: virtualizer.measureElement,
168
+ toggleGroupExpand: function toggleGroupExpand(key) {
169
+ return dispatch({
170
+ type: "groupExpand",
171
+ key: key
172
+ });
173
+ },
67
174
  toggleExpand: function toggleExpand(key) {
68
175
  return dispatch({
69
176
  type: "expand",
@@ -82,6 +189,6 @@ var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged
82
189
  });
83
190
  }
84
191
  };
85
- };
192
+ }
86
193
 
87
194
  export { useVirtualTable };