@react-fabric/data 1.0.0-beta.9 → 1.0.2

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
@@ -2,98 +2,240 @@
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
4
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
5
6
  var core = require('@react-fabric/core');
6
7
  var utilities = require('@react-fabric/utilities');
7
- var memoizeOne = require('memoize-one');
8
+ var memoize = require('memoize-one');
8
9
  var react = require('react');
9
10
  var utils = require('./utils.js');
10
11
 
11
12
  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; }
12
- 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; }
13
- var createItemList = memoizeOne(function (items) {
13
+ 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; }
14
+ var createItemList = memoize(function (items) {
14
15
  return items;
15
16
  });
16
- var useTree = function useTree(_ref) {
17
+ function useTree(_ref) {
17
18
  var _ref$items = _ref.items,
18
19
  items = _ref$items === void 0 ? utilities.EMPTY_ARRAY : _ref$items,
19
20
  _ref$checked = _ref.checked,
20
21
  checked = _ref$checked === void 0 ? utilities.EMPTY_ARRAY : _ref$checked,
21
22
  selected = _ref.selected,
23
+ multiple = _ref.multiple,
24
+ sorter = _ref.sorter,
22
25
  matcher = _ref.matcher,
26
+ onLoad = _ref.onLoad,
27
+ onQuery = _ref.onQuery,
23
28
  onSelect = _ref.onSelect,
24
- onChecked = _ref.onChecked;
25
- var componentEvents = react.useRef({
26
- onSelect: onSelect,
27
- onChecked: onChecked
28
- });
29
+ onChecked = _ref.onChecked,
30
+ defaultExpanded = _ref.defaultExpanded,
31
+ onExpandToggle = _ref.onExpandToggle;
32
+ var eventSelect = onSelect !== null && onSelect !== void 0 ? onSelect : function () {
33
+ return undefined;
34
+ };
35
+ var eventChecked = onChecked !== null && onChecked !== void 0 ? onChecked : function () {
36
+ return undefined;
37
+ };
38
+ var intialExpandRef = react.useRef(_toConsumableArray(defaultExpanded !== null && defaultExpanded !== void 0 ? defaultExpanded : utilities.EMPTY_ARRAY));
29
39
  var itemList = createItemList(items);
40
+ var fireExpandToggle = react.useCallback(function (itemMap) {
41
+ var expandedList = itemMap.filter(function (node) {
42
+ return node.open;
43
+ }).map(function (node) {
44
+ return node.id;
45
+ });
46
+ setTimeout(function () {
47
+ return onExpandToggle === null || onExpandToggle === void 0 ? void 0 : onExpandToggle(expandedList);
48
+ }, 100);
49
+ }, [onExpandToggle]);
50
+ var loadChildren = react.useCallback(function (node) {
51
+ var _node$children;
52
+ if (node.open && !node.leaf && !((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length)) {
53
+ node.loading = true;
54
+ // delay onload callback to avoid state issues
55
+ setTimeout(function () {
56
+ void Promise.resolve(onLoad === null || onLoad === void 0 ? void 0 : onLoad(node.id)).then(function () {
57
+ var resp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : utilities.EMPTY_ARRAY;
58
+ node.children = utils.refactorTree(resp, {
59
+ sorter: sorter,
60
+ defaultExpanded: defaultExpanded
61
+ }, {
62
+ level: node.level + 1,
63
+ parent: node.id
64
+ });
65
+ })["finally"](function () {
66
+ var _intialExpandRef$curr;
67
+ node.loading = false;
68
+ dispatch({
69
+ type: "loaded"
70
+ });
71
+ if (((_intialExpandRef$curr = intialExpandRef.current) === null || _intialExpandRef$curr === void 0 ? void 0 : _intialExpandRef$curr.length) > 0) dispatch({
72
+ type: "expand",
73
+ id: intialExpandRef.current.shift()
74
+ });
75
+ });
76
+ }, 100);
77
+ } else {
78
+ var _intialExpandRef$curr2;
79
+ dispatch({
80
+ type: "loaded"
81
+ });
82
+ if (((_intialExpandRef$curr2 = intialExpandRef.current) === null || _intialExpandRef$curr2 === void 0 ? void 0 : _intialExpandRef$curr2.length) > 0) dispatch({
83
+ type: "expand",
84
+ id: intialExpandRef.current.shift()
85
+ });
86
+ }
87
+ },
88
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
89
+ [onLoad]);
90
+ var fireSelected = core.useDebounce(function (nodeId, data) {
91
+ eventSelect(nodeId, data);
92
+ }, []);
93
+ var fireChecked = core.useDebounce(function (leafs, nodes, partials) {
94
+ eventChecked(leafs, nodes, partials);
95
+ }, []);
96
+ var fireQuery = core.useDebounce(function (query) {
97
+ onQuery === null || onQuery === void 0 || onQuery(query);
98
+ }, [onQuery]);
30
99
  var _useReducer = react.useReducer(function (state, action) {
31
100
  if (action.type === "load") {
32
- state.items = utils.refactorTree(action.items);
101
+ state.items = utils.refactorTree(action.items, {
102
+ sorter: sorter,
103
+ defaultExpanded: defaultExpanded
104
+ });
33
105
  state.itemMap = utils.makeTreeMap(state.items);
34
106
  state.tree = utils.flattenTree(state.items);
107
+ state.selected = undefined;
108
+ state.checked = undefined;
109
+ state.query = "";
35
110
  return _objectSpread({}, state);
36
111
  }
37
112
  if (action.type === "toggleExpand") {
38
113
  var node = state.itemMap.get(action.id);
39
- node && (node.open = !node.open);
114
+ if (node && !node.leaf) {
115
+ if (node) node.open = !node.open;
116
+ loadChildren(node);
117
+ return _objectSpread({}, state);
118
+ }
119
+ }
120
+ if (action.type === "loaded") {
121
+ var _state$checked;
122
+ state.itemMap = utils.makeTreeMap(state.items);
123
+ fireExpandToggle(Array.from(state.itemMap.values()));
40
124
  state.tree = utils.flattenTree(state.items);
125
+ state.selected = selected;
126
+ utils.updateSelection({
127
+ nodes: state.itemMap,
128
+ multiple: multiple,
129
+ selected: selected
130
+ });
131
+ (_state$checked = state.checked) === null || _state$checked === void 0 || _state$checked.forEach(function (id) {
132
+ return utils.updateChecked(state.itemMap, id, 1);
133
+ });
41
134
  return _objectSpread({}, state);
42
135
  }
43
136
  if (action.type === "expand") {
44
- // TODO: check if children available, if not call onLoad to fetch node children
45
137
  var _node = state.itemMap.get(action.id);
46
- _node && (_node.open = true);
47
- state.tree = utils.flattenTree(state.items);
48
- return _objectSpread({}, state);
138
+ if (_node && !_node.leaf) {
139
+ _node.open = true;
140
+ var parentId = _node.parent;
141
+ while (parentId) {
142
+ var _node2 = state.itemMap.get(parentId);
143
+ if (_node2) _node2.open = true;
144
+ parentId = _node2 === null || _node2 === void 0 ? void 0 : _node2.parent;
145
+ }
146
+ loadChildren(_node);
147
+ return _objectSpread({}, state);
148
+ }
49
149
  }
50
150
  if (action.type === "expandAll") {
51
- // TODO: prevent opening dynamic nodes that dont have children
52
151
  state.itemMap.forEach(function (node) {
53
- !node.leaf && (node.open = true);
152
+ var _node$children2;
153
+ if (!node.leaf && (_node$children2 = node.children) !== null && _node$children2 !== void 0 && _node$children2.length) node.open = true;
54
154
  });
155
+ fireExpandToggle(Array.from(state.itemMap.values()));
55
156
  state.tree = utils.flattenTree(state.items);
56
157
  return _objectSpread({}, state);
57
158
  }
58
159
  if (action.type === "collapseAll") {
59
160
  state.itemMap.forEach(function (node) {
60
- !node.leaf && (node.open = false);
161
+ if (!node.leaf) node.open = false;
61
162
  });
163
+ fireExpandToggle([]);
62
164
  state.tree = utils.flattenTree(state.items);
63
165
  return _objectSpread({}, state);
64
166
  }
65
167
  if (action.type === "filter") {
66
- utils.filterTree(state.itemMap, action.query, matcher);
168
+ if (onQuery) {
169
+ // TODO: onQuery should provide new tree listing
170
+ // save current tree state as preQueryState
171
+ // on clearing filter restore preQueryState
172
+ if (!utilities.isEmpty(action.query)) {
173
+ // state.prevItems = state.items;
174
+ fireQuery(action.query);
175
+ }
176
+ } else {
177
+ utils.filterTree(state.itemMap, action.query, matcher);
178
+ state.tree = utils.flattenTree(state.items);
179
+ }
180
+ return _objectSpread(_objectSpread({}, state), {}, {
181
+ query: action.query
182
+ });
183
+ }
184
+ if (action.type === "toggleSelect") {
185
+ var _state$itemMap$get;
186
+ if (multiple) {
187
+ var _state$selected, _state$selected$filte, _state$selected2, _state$selected3;
188
+ var isSelected = (_state$selected = state.selected) === null || _state$selected === void 0 ? void 0 : _state$selected.includes(action.id);
189
+ // @ts-expect-error ignore
190
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
191
+ if (action.shiftKey && isSelected) state.selected = (_state$selected$filte = (_state$selected2 = state.selected) === null || _state$selected2 === void 0 ? void 0 : _state$selected2.filter(function (id) {
192
+ return id !== action.id;
193
+ })) !== null && _state$selected$filte !== void 0 ? _state$selected$filte : [];else if (action.shiftKey && !isSelected) state.selected = [].concat(_toConsumableArray((_state$selected3 = state.selected) !== null && _state$selected3 !== void 0 ? _state$selected3 : []), [action.id]);else state.selected = [action.id];
194
+ } else {
195
+ state.selected = action.id;
196
+ }
197
+ utils.updateSelection({
198
+ nodes: state.itemMap,
199
+ selected: state.selected,
200
+ multiple: multiple
201
+ });
67
202
  state.tree = utils.flattenTree(state.items);
203
+ fireSelected(state.selected, (_state$itemMap$get = state.itemMap.get(action.id)) === null || _state$itemMap$get === void 0 ? void 0 : _state$itemMap$get.data);
68
204
  return _objectSpread({}, state);
69
205
  }
70
206
  if (action.type === "select") {
71
- var _componentEvents$curr, _componentEvents$curr2;
72
- if (state.selected) {
73
- utils.updateSelection(state.itemMap, state.selected);
74
- }
75
- utils.updateSelection(state.itemMap, action.id, true);
76
- state.tree = utils.flattenTree(state.items);
77
- (_componentEvents$curr = (_componentEvents$curr2 = componentEvents.current).onSelect) === null || _componentEvents$curr === void 0 || _componentEvents$curr.call(_componentEvents$curr2, action.id);
78
- return _objectSpread(_objectSpread({}, state), {}, {
207
+ state.selected = action.id;
208
+ utils.updateSelection({
209
+ nodes: state.itemMap,
210
+ multiple: multiple,
79
211
  selected: action.id
80
212
  });
213
+ state.tree = utils.flattenTree(state.items);
214
+ return _objectSpread({}, state);
81
215
  }
82
216
  if (action.type === "toggleCheck") {
83
- var _componentEvents$curr3, _componentEvents$curr4;
84
217
  utils.updateChecked(state.itemMap, action.id);
85
- var checkList = [[], []];
218
+ var checkList = [[], [], []];
86
219
  Array.from(state.itemMap.values()).filter(function (node) {
87
- return node.checked === 1;
220
+ return node.checked !== 0;
88
221
  }).forEach(function (node) {
89
- return checkList[node.leaf ? 0 : 1].push(node.id);
222
+ return checkList[node.leaf ? 0 : node.checked].push(node.id);
223
+ });
224
+ fireChecked(checkList[0],
225
+ // leafs
226
+ checkList[1],
227
+ // nodes
228
+ checkList[2]);
229
+ return _objectSpread(_objectSpread({}, state), {}, {
230
+ checked: checkList[0]
90
231
  });
91
- (_componentEvents$curr3 = (_componentEvents$curr4 = componentEvents.current).onChecked) === null || _componentEvents$curr3 === void 0 || _componentEvents$curr3.call(_componentEvents$curr4, checkList[0], checkList[1]);
92
- return _objectSpread({}, state);
93
232
  }
94
233
  if (action.type === "checked") {
234
+ state.itemMap.forEach(function (item) {
235
+ return item.checked = 0;
236
+ });
95
237
  action.id.forEach(function (id) {
96
- return utils.updateChecked(state.itemMap, id);
238
+ return utils.updateChecked(state.itemMap, id, 1);
97
239
  });
98
240
  return _objectSpread(_objectSpread({}, state), {}, {
99
241
  checked: action.id
@@ -104,31 +246,40 @@ var useTree = function useTree(_ref) {
104
246
  itemMap: new Map(),
105
247
  items: [],
106
248
  tree: [],
107
- checked: []
249
+ checked: [],
250
+ query: ""
108
251
  }),
109
252
  _useReducer2 = _slicedToArray(_useReducer, 2),
110
253
  state = _useReducer2[0],
111
254
  dispatch = _useReducer2[1];
112
255
  react.useEffect(function () {
113
- componentEvents.current = {
114
- onSelect: onSelect,
115
- onChecked: onChecked
116
- };
117
- }, [onSelect, onChecked]);
118
- react.useEffect(function () {
256
+ var _intialExpandRef$curr3;
119
257
  dispatch({
120
258
  type: "load",
121
259
  items: itemList
122
260
  });
261
+ if (itemList.length && ((_intialExpandRef$curr3 = intialExpandRef.current) === null || _intialExpandRef$curr3 === void 0 ? void 0 : _intialExpandRef$curr3.length) > 0) dispatch({
262
+ type: "expand",
263
+ id: intialExpandRef.current.shift()
264
+ });
265
+ if (selected) dispatch({
266
+ type: "select",
267
+ id: selected
268
+ });
269
+ if (checked) dispatch({
270
+ type: "checked",
271
+ id: checked
272
+ });
273
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
123
274
  }, [itemList]);
124
275
  react.useEffect(function () {
125
- selected && dispatch({
276
+ if (selected) dispatch({
126
277
  type: "select",
127
278
  id: selected
128
279
  });
129
280
  }, [selected]);
130
281
  react.useEffect(function () {
131
- checked && dispatch({
282
+ if (checked) dispatch({
132
283
  type: "checked",
133
284
  id: checked
134
285
  });
@@ -146,9 +297,11 @@ var useTree = function useTree(_ref) {
146
297
  });
147
298
  }, []);
148
299
  var select = react.useCallback(function (id) {
300
+ var shiftKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
149
301
  dispatch({
150
- type: "select",
151
- id: id
302
+ type: "toggleSelect",
303
+ id: id,
304
+ shiftKey: shiftKey
152
305
  });
153
306
  }, []);
154
307
  var expand = react.useCallback(function (id) {
@@ -157,6 +310,15 @@ var useTree = function useTree(_ref) {
157
310
  id: id
158
311
  });
159
312
  }, []);
313
+ var expandAndLoad = react.useCallback(function (expandList) {
314
+ if (expandList.length > 0) {
315
+ intialExpandRef.current = _toConsumableArray(expandList);
316
+ dispatch({
317
+ type: "expand",
318
+ id: intialExpandRef.current.shift()
319
+ });
320
+ }
321
+ }, []);
160
322
  var expandAll = react.useCallback(function () {
161
323
  dispatch({
162
324
  type: "expandAll"
@@ -172,17 +334,20 @@ var useTree = function useTree(_ref) {
172
334
  type: "filter",
173
335
  query: query
174
336
  });
175
- }, []);
337
+ }, [], 300);
176
338
  return {
177
339
  tree: state.tree,
340
+ query: state.query,
341
+ selected: state.selected,
178
342
  toggleExpand: toggleExpand,
179
343
  expandAll: expandAll,
180
344
  collapseAll: collapseAll,
181
345
  toggleCheck: toggleCheck,
346
+ expandAndLoad: expandAndLoad,
182
347
  select: select,
183
348
  expand: expand,
184
349
  onFilter: onFilter
185
350
  };
186
- };
351
+ }
187
352
 
188
353
  exports.useTree = useTree;
@@ -5,18 +5,18 @@ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
5
5
  var utilities = require('@react-fabric/utilities');
6
6
 
7
7
  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; }
8
- 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; }
9
- var sorter = function sorter(a, b) {
8
+ 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; }
9
+ function defaultSorter(a, b) {
10
10
  if (!!a.leaf !== !!b.leaf) return a.leaf ? 1 : -1;
11
11
  return utilities.compareValues()(a.label, b.label);
12
- };
13
- var getChildren = function getChildren() {
12
+ }
13
+ function getChildren() {
14
14
  var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
15
15
  return list.map(function (item) {
16
16
  return [item].concat(_toConsumableArray(getChildren(item.children)));
17
17
  }).flat(99).filter(Boolean);
18
- };
19
- var getIntermediate = function getIntermediate() {
18
+ }
19
+ function getIntermediate() {
20
20
  var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
21
21
  var checks = list.map(function (item) {
22
22
  return item.checked;
@@ -25,18 +25,24 @@ var getIntermediate = function getIntermediate() {
25
25
  var someInt = checks.includes(2);
26
26
  var someOn = checks.includes(1);
27
27
  return someOff && someOn || someInt ? 2 : someOn ? 1 : 0;
28
- };
28
+ }
29
29
 
30
30
  // convert node item to internal node used by the tree
31
- var refactorTree = function refactorTree(nodes) {
32
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
31
+ function refactorTree(nodes, _ref) {
32
+ var _ref$sorter = _ref.sorter,
33
+ sorter = _ref$sorter === void 0 ? defaultSorter : _ref$sorter,
34
+ _ref$defaultExpanded = _ref.defaultExpanded,
35
+ defaultExpanded = _ref$defaultExpanded === void 0 ? [] : _ref$defaultExpanded;
36
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
33
37
  level: 0,
34
38
  parent: undefined
35
39
  };
36
40
  var list = [];
37
- nodes.sort(sorter).forEach(function (node) {
41
+ if (sorter !== false) nodes = nodes.sort(sorter);
42
+ nodes.forEach(function (node) {
43
+ var _node$children;
38
44
  list.push(_objectSpread(_objectSpread({
39
- open: false,
45
+ open: defaultExpanded.includes(node.id) && !!((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length),
40
46
  level: options.level,
41
47
  parent: options.parent,
42
48
  checked: 0,
@@ -47,71 +53,92 @@ var refactorTree = function refactorTree(nodes) {
47
53
  }, node), {}, {
48
54
  leaf: !!node.leaf,
49
55
  children: node.children && refactorTree(node.children, {
56
+ sorter: sorter,
57
+ defaultExpanded: defaultExpanded
58
+ }, {
50
59
  level: options.level + 1,
51
60
  parent: node.id
52
61
  })
53
62
  }));
54
63
  });
55
64
  return list;
56
- };
57
- var makeTreeMap = function makeTreeMap(nodes) {
65
+ }
66
+ function makeTreeMap(nodes) {
58
67
  var map = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();
59
68
  nodes.forEach(function (node) {
60
69
  if (map.has(node.id)) throw new Error("Node with id [".concat(node.id, "] already exists, please make sure all ids are unique"));
61
70
  map.set(node.id, node);
62
- node.children && makeTreeMap(node.children, map);
71
+ if (node.children) makeTreeMap(node.children, map);
63
72
  });
64
73
  return map;
65
- };
74
+ }
66
75
 
67
76
  // make flat list to be rendered by virtual list
68
- var flattenTree = function flattenTree(nodes) {
77
+ function flattenTree(nodes) {
69
78
  var lines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
70
79
  var list = [];
71
80
  var filtered = nodes.filter(function (node) {
72
81
  return !node.filtered;
73
82
  });
74
83
  filtered.forEach(function (node, idx) {
84
+ var _node$children2;
75
85
  node.lines = [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 2 : 3]);
76
86
  list.push(node);
77
- (node.open || node.childFiltered) && node.children && list.push.apply(list, _toConsumableArray(flattenTree(node.children.filter(function (child) {
87
+ if ((node.open || node.childFiltered) && node.children) list.push.apply(list, _toConsumableArray(flattenTree(node.children.filter(function (child) {
78
88
  return !child.filtered;
79
89
  }), [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 0 : 1]))));
90
+ if (node.open && ((_node$children2 = node.children) === null || _node$children2 === void 0 ? void 0 : _node$children2.length) === 0) list.push({
91
+ empty: true,
92
+ leaf: true,
93
+ lines: [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 0 : 1, 2])
94
+ });
80
95
  });
81
96
  return list;
82
- };
83
- var updateSelection = function updateSelection(nodes, id, selected) {
84
- var node = nodes.get(id);
97
+ }
98
+ function selectNode(nodes, id) {
99
+ var node = nodes.get(id !== null && id !== void 0 ? id : "");
85
100
  if (node) {
86
101
  // change selection
87
- node.selected = selected;
102
+ node.selected = true;
88
103
  // update all parent childSelected flag
89
104
  var parent = node.parent;
90
105
  while (parent) {
91
106
  var parentNode = nodes.get(parent);
92
- parentNode && (parentNode.childSelected = selected);
93
- selected && parentNode && (parentNode.open = true);
107
+ if (parentNode) parentNode.childSelected = true;
108
+ // selected && parentNode && (parentNode.open = true);
94
109
  parent = parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent;
95
110
  }
96
111
  }
97
- };
98
- var updateChecked = function updateChecked(list, id) {
112
+ }
113
+ function updateSelection(_ref2) {
114
+ var nodes = _ref2.nodes,
115
+ multiple = _ref2.multiple,
116
+ selected = _ref2.selected;
117
+ nodes.forEach(function (node) {
118
+ node.selected = undefined;
119
+ node.childSelected = undefined;
120
+ });
121
+ if (multiple && utilities.isArray(selected)) selected === null || selected === void 0 || selected.forEach(function (id) {
122
+ return selectNode(nodes, id);
123
+ });else selectNode(nodes, selected);
124
+ }
125
+ function updateChecked(list, id, checked) {
99
126
  var node = list.get(id);
100
127
  if (node) {
101
- node.checked = node.checked === 1 ? 0 : 1;
128
+ node.checked = (checked !== null && checked !== void 0 ? checked : node.checked === 0) ? 1 : 0;
102
129
  // check all children
103
- node.children && getChildren(node.children).forEach(function (child) {
130
+ if (node.children) getChildren(node.children).forEach(function (child) {
104
131
  return child.checked = node.checked;
105
132
  });
106
133
  var parent = node.parent;
107
134
  while (parent) {
108
135
  var parentNode = list.get(parent);
109
- parentNode && (parentNode.checked = getIntermediate(parentNode.children));
136
+ if (parentNode) parentNode.checked = getIntermediate(parentNode.children);
110
137
  parent = parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent;
111
138
  }
112
139
  }
113
- };
114
- var filterTree = function filterTree(nodes, query, matcher) {
140
+ }
141
+ function filterTree(nodes, query, matcher) {
115
142
  nodes.forEach(function (node) {
116
143
  if (query) {
117
144
  if (node.parentFiltered) return;
@@ -120,11 +147,13 @@ var filterTree = function filterTree(nodes, query, matcher) {
120
147
  var parent = node.parent;
121
148
  while (parent) {
122
149
  var parentNode = nodes.get(parent);
123
- parentNode && (parentNode.filtered = false);
124
- parentNode && (parentNode.childFiltered = true);
150
+ if (parentNode) {
151
+ parentNode.filtered = false;
152
+ parentNode.childFiltered = true;
153
+ }
125
154
  parent = parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent;
126
155
  }
127
- node.children && getChildren(node.children).forEach(function (child) {
156
+ if (node.children) getChildren(node.children).forEach(function (child) {
128
157
  child.parentFiltered = true;
129
158
  child.filtered = false;
130
159
  });
@@ -135,7 +164,7 @@ var filterTree = function filterTree(nodes, query, matcher) {
135
164
  node.parentFiltered = undefined;
136
165
  }
137
166
  });
138
- };
167
+ }
139
168
 
140
169
  exports.filterTree = filterTree;
141
170
  exports.flattenTree = flattenTree;
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var utilities = require('@react-fabric/utilities');
4
+
5
+ /**
6
+ * React Fabric
7
+ * @version 1.0.0
8
+ * @license MIT
9
+ * @copyright 2024 Adarsh Pastakia
10
+ *
11
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ * of this software and associated documentation files (the "Software"), to deal
13
+ * in the Software without restriction, including without limitation the rights
14
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ * copies of the Software, and to permit persons to whom the Software is
16
+ * furnished to do so, subject to the following conditions:
17
+ *
18
+ * The above copyright notice and this permission notice shall be included in all
19
+ * copies or substantial portions of the Software.
20
+ *
21
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ * SOFTWARE.
28
+ */
29
+
30
+
31
+ /**
32
+ * Resolves a color value to a CSS color string.
33
+ *
34
+ * If the input is a valid CSS color (e.g., `"#ff0000"`, `"rgb(255,0,0)"`), it is returned as-is.
35
+ * Otherwise, it is treated as a design token name and resolved to a CSS custom property
36
+ * (e.g., `"primary-500"` → `"var(--color-primary-500)"`).
37
+ *
38
+ * @param {ColorUnion} color - The color value to resolve. Accepts CSS color strings or design token names.
39
+ * @returns The resolved CSS color string, or `undefined` if color is falsy.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * getColor("primary-500"); // "var(--color-primary-500)"
44
+ * getColor("#ff0000"); // "#ff0000"
45
+ * getColor("red"); // "var(--color-red)"
46
+ * getColor(undefined); // undefined
47
+ * ```
48
+ */
49
+ function getColor(color) {
50
+ if (!color) return undefined;
51
+ if (color && utilities.isColor(color)) {
52
+ return color;
53
+ }
54
+ if (color.startsWith("--")) return "var(".concat(color, ")");
55
+ return "var(--color-".concat(color, ")");
56
+ }
57
+
58
+ exports.getColor = getColor;