@react-fabric/data 1.0.0-beta.53 → 1.0.0-beta.55

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 (42) hide show
  1. package/dist/cjs/hooks/useFilteredList.js +68 -10
  2. package/dist/cjs/table/HeaderCell.js +3 -2
  3. package/dist/cjs/table/Table.js +9 -3
  4. package/dist/cjs/table/useVirtualTable.js +18 -0
  5. package/dist/cjs/tree/TreeNode.js +2 -2
  6. package/dist/cjs/tree/TreePanel.js +5 -4
  7. package/dist/cjs/tree/useTree.js +62 -15
  8. package/dist/cjs/tree/utils.js +3 -3
  9. package/dist/cjs/virtual/Gallery.js +2 -2
  10. package/dist/cjs/virtual/List.js +2 -2
  11. package/dist/esm/hooks/useFilteredList.js +69 -11
  12. package/dist/esm/table/HeaderCell.js +3 -2
  13. package/dist/esm/table/Table.js +9 -3
  14. package/dist/esm/table/useVirtualTable.js +19 -1
  15. package/dist/esm/tree/TreeNode.js +2 -2
  16. package/dist/esm/tree/TreePanel.js +5 -4
  17. package/dist/esm/tree/useTree.js +63 -16
  18. package/dist/esm/tree/utils.js +3 -3
  19. package/dist/esm/virtual/Gallery.js +2 -2
  20. package/dist/esm/virtual/List.js +2 -2
  21. package/dist/types/hooks/useFilteredList.d.ts +49 -6
  22. package/dist/types/table/HeaderCell.d.ts +1 -1
  23. package/dist/types/table/Table.d.ts +1 -1
  24. package/dist/types/table/types.d.ts +3 -0
  25. package/dist/types/table/useVirtualTable.d.ts +3 -0
  26. package/dist/types/tree/TreePanel.d.ts +1 -1
  27. package/dist/types/tree/types.d.ts +11 -13
  28. package/dist/types/tree/useTree.d.ts +1 -0
  29. package/dist/types/tree/utils.d.ts +1 -1
  30. package/package.json +5 -5
  31. package/src/hooks/useFilteredList.tsx +90 -9
  32. package/src/table/HeaderCell.tsx +3 -2
  33. package/src/table/Table.tsx +7 -2
  34. package/src/table/types.ts +4 -0
  35. package/src/table/useVirtualTable.ts +24 -1
  36. package/src/tree/TreeNode.tsx +3 -5
  37. package/src/tree/TreePanel.tsx +3 -3
  38. package/src/tree/types.ts +12 -12
  39. package/src/tree/useTree.ts +57 -13
  40. package/src/tree/utils.ts +8 -3
  41. package/src/virtual/Gallery.tsx +1 -1
  42. package/src/virtual/List.tsx +1 -1
@@ -6,15 +6,29 @@ var react = require('react');
6
6
 
7
7
  var filterList = function filterList(items) {
8
8
  var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
9
- var matcher = arguments.length > 2 ? arguments[2] : undefined;
9
+ var matchAll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
10
+ var matcher = arguments.length > 3 ? arguments[3] : undefined;
10
11
  var newList = [];
11
12
  items.forEach(function (item) {
12
13
  if (matcher) {
13
14
  return (matcher === null || matcher === void 0 ? void 0 : matcher(item, query)) && newList.push(item);
14
15
  }
15
- if (query && utilities.isString(query)) {
16
- var _item$label;
17
- if (utilities.matchString((_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.toString(), query)) {
16
+ if (query && utilities.isArray(query) && query.length > 0) {
17
+ if (matchAll && query.every(function (q) {
18
+ var _item$label;
19
+ return utilities.matchString((_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.toString(), q);
20
+ })) {
21
+ return newList.push(item);
22
+ }
23
+ if (!matchAll && query.some(function (q) {
24
+ var _item$label2;
25
+ return utilities.matchString((_item$label2 = item.label) !== null && _item$label2 !== void 0 ? _item$label2 : item.toString(), q);
26
+ })) {
27
+ return newList.push(item);
28
+ }
29
+ } else if (query && utilities.isString(query)) {
30
+ var _item$label3;
31
+ if (utilities.matchString((_item$label3 = item.label) !== null && _item$label3 !== void 0 ? _item$label3 : item.toString(), query)) {
18
32
  return newList.push(item);
19
33
  }
20
34
  } else {
@@ -24,6 +38,26 @@ var filterList = function filterList(items) {
24
38
  return newList;
25
39
  };
26
40
 
41
+ /**
42
+ * Custom hook to filter a list of items based on a query.
43
+ * It provides a way to search through the items and returns the filtered list.
44
+ * The hook uses a deferred value to optimize performance during transitions.
45
+ * It also allows for a custom matcher function to define how items should be matched against the query.
46
+ *
47
+ * @param items - The list of items to filter.
48
+ * @param matchAll - Match all phrases in the query list against the items.
49
+ * @returns An object containing the search function, current query, filtered list, and a boolean indicating if a search is in progress.
50
+ *
51
+ * @example
52
+ * ```jsx
53
+ * useFilteredList(items, (item, query) => {
54
+ * return item.name.includes(query);
55
+ * });
56
+ * ```
57
+ *
58
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
59
+ */
60
+
27
61
  /**
28
62
  * Custom hook to filter a list of items based on a query.
29
63
  * It provides a way to search through the items and returns the filtered list.
@@ -43,7 +77,29 @@ var filterList = function filterList(items) {
43
77
  *
44
78
  * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
45
79
  */
46
- var useFilteredList = function useFilteredList(items, matcher) {
80
+
81
+ /**
82
+ * Custom hook to filter a list of items based on a query.
83
+ * It provides a way to search through the items and returns the filtered list.
84
+ * The hook uses a deferred value to optimize performance during transitions.
85
+ * It also allows for a custom matcher function to define how items should be matched against the query.
86
+ *
87
+ * @param items - The list of items to filter.
88
+ * @param matchAll - Match all phrases in the query list against the items.
89
+ * @param matcher - An optional function to match items against the query.
90
+ * @returns An object containing the search function, current query, filtered list, and a boolean indicating if a search is in progress.
91
+ *
92
+ * @example
93
+ * ```jsx
94
+ * useFilteredList(items, (item, query) => {
95
+ * return item.name.includes(query);
96
+ * });
97
+ * ```
98
+ *
99
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
100
+ */
101
+
102
+ function useFilteredList(items, matchAll, matcher) {
47
103
  var _useState = react.useState(),
48
104
  _useState2 = _slicedToArray(_useState, 2),
49
105
  query = _useState2[0],
@@ -57,20 +113,22 @@ var useFilteredList = function useFilteredList(items, matcher) {
57
113
  _useTransition2 = _slicedToArray(_useTransition, 2),
58
114
  isSearching = _useTransition2[0],
59
115
  startTransition = _useTransition2[1];
60
- var filterItems = react.useCallback(function (items, query) {
116
+ var matchingAll = typeof matchAll === "boolean" ? matchAll : true;
117
+ var matcherFn = typeof matchAll === "function" ? matchAll : matcher;
118
+ var filterItems = react.useCallback(function (items, query, matchingAll) {
61
119
  return startTransition(function () {
62
- return setFilteredList(filterList(items, query, matcher));
120
+ return setFilteredList(filterList(items, query, matchingAll, matcherFn));
63
121
  });
64
122
  }, []);
65
123
  react.useEffect(function () {
66
- if (query) filterItems(_items, query);else setFilteredList(items);
67
- }, [query, _items]);
124
+ if (query) filterItems(_items, query, matchingAll);else setFilteredList(items);
125
+ }, [query, matchingAll, _items]);
68
126
  return {
69
127
  onSearch: setQuery,
70
128
  query: query,
71
129
  filteredList: filteredList,
72
130
  isSearching: isSearching
73
131
  };
74
- };
132
+ }
75
133
 
76
134
  exports.useFilteredList = useFilteredList;
@@ -11,6 +11,7 @@ var jsxRuntime = require('react/jsx-runtime');
11
11
 
12
12
  var HeaderCell = function HeaderCell(_ref) {
13
13
  var id = _ref.id,
14
+ field = _ref.field,
14
15
  dataType = _ref.dataType,
15
16
  label = _ref.label,
16
17
  icon = _ref.icon,
@@ -56,7 +57,7 @@ var HeaderCell = function HeaderCell(_ref) {
56
57
  list: filterOptions,
57
58
  filter: filter,
58
59
  onFilter: function onFilter(value) {
59
- return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id, value);
60
+ return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
60
61
  }
61
62
  })
62
63
  }, "filters"));
@@ -87,7 +88,7 @@ var HeaderCell = function HeaderCell(_ref) {
87
88
  list: filterOptions,
88
89
  filter: filter,
89
90
  onFilter: function onFilter(value) {
90
- return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id, value);
91
+ return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
91
92
  }
92
93
  }, "filters")];
93
94
  }
@@ -40,7 +40,10 @@ var Table = function Table(_ref) {
40
40
  onFilter = _ref.onFilter,
41
41
  onScroll = _ref.onScroll,
42
42
  onRowClick = _ref.onRowClick,
43
- onCheckedChanged = _ref.onCheckedChanged;
43
+ onCheckedChanged = _ref.onCheckedChanged,
44
+ _ref$total = _ref.total,
45
+ total = _ref$total === void 0 ? 0 : _ref$total,
46
+ onLoadMore = _ref.onLoadMore;
44
47
  var _useTranslation = reactI18next.useTranslation("data"),
45
48
  t = _useTranslation.t;
46
49
  var fireCheckChanged = core.useDebounce(function (checkedIds) {
@@ -53,6 +56,9 @@ var Table = function Table(_ref) {
53
56
  checked: checked,
54
57
  keyProperty: keyProperty,
55
58
  groupProperty: groupProperty,
59
+ total: total,
60
+ loading: loading,
61
+ onLoadMore: onLoadMore,
56
62
  onCheckChanged: fireCheckChanged
57
63
  }),
58
64
  scrollerRef = _useVirtualTable.scrollerRef,
@@ -126,7 +132,7 @@ var Table = function Table(_ref) {
126
132
  ref: scrollerRef,
127
133
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
128
134
  "data-ref": "tableHeader",
129
- className: "bg-base font-medium sticky top-0 h-8 area-head border-b select-none flex flex-nowrap z-2",
135
+ className: "bg-base font-medium sticky top-0 h-8 area-head border-b select-none flex flex-nowrap z-3",
130
136
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
131
137
  className: wrapperStart,
132
138
  children: [canExpand && /*#__PURE__*/jsxRuntime.jsx("div", {
@@ -180,7 +186,7 @@ var Table = function Table(_ref) {
180
186
  return "__GROUP__" in data ? /*#__PURE__*/jsxRuntime.jsxs("div", {
181
187
  ref: measureElement,
182
188
  "data-index": index,
183
- className: classNames("px-2 py-1 text-md bg-base border-y border-tint-100 cursor-pointer flex items-center gap-1 z-1", isActiveSticky(index) && "sticky top-8"),
189
+ className: classNames("px-2 py-1 text-md bg-base border-y border-tint-100 cursor-pointer flex items-center gap-1 z-2", isActiveSticky(index) && "sticky top-8"),
184
190
  role: "none",
185
191
  onClick: function onClick() {
186
192
  return toggleGroupExpand(data.key);
@@ -137,6 +137,24 @@ var useVirtualTable = function useVirtualTable(data, options) {
137
137
  checked: (_options$checked = options.checked) !== null && _options$checked !== void 0 ? _options$checked : []
138
138
  });
139
139
  }, [options.checked]);
140
+ react.useEffect(function () {
141
+ if (options.onLoadMore) {
142
+ var _virtualItems$, _virtualItems$slice$p;
143
+ var firstItem = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index;
144
+ 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;
145
+ var canLoadPrevPage = firstItem !== undefined && state.items[firstItem] === null;
146
+ var canLoadNextPage = lastItem !== undefined && lastItem === state.items.length - 1 && state.items.length < options.total;
147
+ var db = utilities.debounce(options.onLoadMore);
148
+ if (canLoadPrevPage) {
149
+ db(firstItem);
150
+ } else if (!options.loading && canLoadNextPage) {
151
+ db(lastItem + 1);
152
+ }
153
+ return function () {
154
+ return db.cancel();
155
+ };
156
+ }
157
+ }, [options.onLoadMore, virtualItems]);
140
158
  return {
141
159
  scrollerRef: scrollerRef,
142
160
  items: virtualItems,
@@ -63,7 +63,7 @@ var TreeNode = function TreeNode(_ref) {
63
63
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
64
64
  role: "treeitem",
65
65
  "aria-selected": node.selected,
66
- className: classNames("flex flex-nowrap items-center", node.className, node.leaf ? leafClassName : nodeClassName),
66
+ className: classNames("flex flex-nowrap items-center"),
67
67
  "data-testid": node["data-testid"],
68
68
  "data-test-value": node["data-test-value"],
69
69
  children: [filler, node.loading && /*#__PURE__*/jsxRuntime.jsx("div", {
@@ -93,7 +93,7 @@ var TreeNode = function TreeNode(_ref) {
93
93
  })
94
94
  }), !node.empty && /*#__PURE__*/jsxRuntime.jsxs("div", {
95
95
  role: "none",
96
- className: classNames("group/tool data-[selected]:bg-primary-100 flex flex-nowrap flex-1 overflow-hidden select-none", node.childSelected && "font-medium", node.disabled && "text-muted opacity-65", !node.disabled && (canSelect || onClick) && "hover:bg-primary-50 cursor-pointer"),
96
+ className: classNames("group/tool data-[selected]:bg-primary-100 flex flex-nowrap flex-1 overflow-hidden select-none", node.childSelected && "font-medium", node.disabled && "text-muted opacity-65", node.className, node.leaf ? leafClassName : nodeClassName, !node.disabled && (canSelect || onClick) && "hover:bg-primary-50 cursor-pointer"),
97
97
  "data-selected": node.selected,
98
98
  onClick: node.disabled ? undefined : function () {
99
99
  onClick === null || onClick === void 0 || onClick(node.id, node.data);
@@ -11,7 +11,7 @@ var types = require('./types.js');
11
11
  var useTree = require('./useTree.js');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
13
 
14
- var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "renderer", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onQuery", "onSelect", "onClick", "sorter", "makeLabel", "makeIcon", "defaultExpanded", "onExpandToggle", "leafClassName", "nodeClassName"];
14
+ var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onQuery", "onSelect", "onClick", "sorter", "makeLabel", "makeIcon", "defaultExpanded", "onExpandToggle", "leafClassName", "nodeClassName"];
15
15
  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; }
16
16
  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; }
17
17
  var TreePanel = function TreePanel(_ref) {
@@ -22,7 +22,6 @@ var TreePanel = function TreePanel(_ref) {
22
22
  checked = _ref.checked,
23
23
  checkable = _ref.checkable,
24
24
  noLines = _ref.noLines,
25
- renderer = _ref.renderer,
26
25
  searchable = _ref.searchable,
27
26
  selectable = _ref.selectable,
28
27
  matcher = _ref.matcher,
@@ -58,6 +57,7 @@ var TreePanel = function TreePanel(_ref) {
58
57
  onExpandToggle: onExpandToggle
59
58
  }),
60
59
  tree = _useTree.tree,
60
+ query = _useTree.query,
61
61
  toggleExpand = _useTree.toggleExpand,
62
62
  toggleCheck = _useTree.toggleCheck,
63
63
  expandAll = _useTree.expandAll,
@@ -97,6 +97,7 @@ var TreePanel = function TreePanel(_ref) {
97
97
  flex: true,
98
98
  className: "items-center p-px justify-end overflow-hidden border-b",
99
99
  children: [searchable && /*#__PURE__*/jsxRuntime.jsx(form.Search, {
100
+ value: query,
100
101
  onSearch: onFilter,
101
102
  allowClear: true,
102
103
  placeholder: filterPlaceholder,
@@ -134,7 +135,7 @@ var TreePanel = function TreePanel(_ref) {
134
135
  height: (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start
135
136
  }
136
137
  }), virtualItems.map(function (_ref2) {
137
- var _makeIcon, _ref3, _ref4;
138
+ var _makeIcon, _ref3;
138
139
  var index = _ref2.index,
139
140
  key = _ref2.key;
140
141
  return /*#__PURE__*/jsxRuntime.jsx("div", {
@@ -154,7 +155,7 @@ var TreePanel = function TreePanel(_ref) {
154
155
  onClick: onClick,
155
156
  leafClassName: leafClassName,
156
157
  nodeClassName: nodeClassName,
157
- children: (_ref3 = (_ref4 = tree[index].data && (renderer === null || renderer === void 0 ? void 0 : renderer(tree[index].data))) !== null && _ref4 !== void 0 ? _ref4 : makeLabel === null || makeLabel === void 0 ? void 0 : makeLabel(tree[index].data)) !== null && _ref3 !== void 0 ? _ref3 : tree[index].label
158
+ children: (_ref3 = tree[index].data && (makeLabel === null || makeLabel === void 0 ? void 0 : makeLabel(tree[index].data))) !== null && _ref3 !== void 0 ? _ref3 : tree[index].label
158
159
  })
159
160
  }, key);
160
161
  })]
@@ -78,6 +78,14 @@ var useTree = function useTree(_ref) {
78
78
  });
79
79
  }
80
80
  }, [onLoad]);
81
+ var fireSelected = core.useDebounce(function (nodeId, data) {
82
+ var _componentEvents$curr, _componentEvents$curr2;
83
+ (_componentEvents$curr = (_componentEvents$curr2 = componentEvents.current).onSelect) === null || _componentEvents$curr === void 0 || _componentEvents$curr.call(_componentEvents$curr2, nodeId, data);
84
+ }, [onSelect]);
85
+ var fireChecked = core.useDebounce(function (leafs, nodes, partials) {
86
+ var _componentEvents$curr3, _componentEvents$curr4;
87
+ (_componentEvents$curr3 = (_componentEvents$curr4 = componentEvents.current).onChecked) === null || _componentEvents$curr3 === void 0 || _componentEvents$curr3.call(_componentEvents$curr4, leafs, nodes, partials);
88
+ }, [onChecked]);
81
89
  var _useReducer = react.useReducer(function (state, action) {
82
90
  if (action.type === "load") {
83
91
  state.items = utils.refactorTree(action.items, {
@@ -86,6 +94,9 @@ var useTree = function useTree(_ref) {
86
94
  });
87
95
  state.itemMap = utils.makeTreeMap(state.items);
88
96
  state.tree = utils.flattenTree(state.items);
97
+ state.selected = undefined;
98
+ state.checked = undefined;
99
+ state.query = "";
89
100
  return _objectSpread({}, state);
90
101
  }
91
102
  if (action.type === "toggleExpand") {
@@ -97,10 +108,14 @@ var useTree = function useTree(_ref) {
97
108
  }
98
109
  }
99
110
  if (action.type === "loaded") {
111
+ var _state$checked;
100
112
  state.itemMap = utils.makeTreeMap(state.items);
101
113
  fireExpandToggle(Array.from(state.itemMap.values()));
102
114
  state.tree = utils.flattenTree(state.items);
103
115
  state.selected && utils.updateSelection(state.itemMap, state.selected, true);
116
+ (_state$checked = state.checked) === null || _state$checked === void 0 || _state$checked.forEach(function (id) {
117
+ return utils.updateChecked(state.itemMap, id, 1);
118
+ });
104
119
  return _objectSpread({}, state);
105
120
  }
106
121
  if (action.type === "expand") {
@@ -141,36 +156,58 @@ var useTree = function useTree(_ref) {
141
156
  } else {
142
157
  utils.filterTree(state.itemMap, action.query, matcher);
143
158
  state.tree = utils.flattenTree(state.items);
144
- return _objectSpread({}, state);
145
159
  }
160
+ return _objectSpread(_objectSpread({}, state), {}, {
161
+ query: action.query
162
+ });
163
+ }
164
+ if (action.type === "toggleSelect") {
165
+ if (state.selected) {
166
+ utils.updateSelection(state.itemMap, state.selected);
167
+ }
168
+ if (!onSelect) {
169
+ utils.updateSelection(state.itemMap, action.id, true);
170
+ state.selected = action.id;
171
+ state.tree = utils.flattenTree(state.items);
172
+ } else {
173
+ var _state$itemMap$get;
174
+ fireSelected(action.id, (_state$itemMap$get = state.itemMap.get(action.id)) === null || _state$itemMap$get === void 0 ? void 0 : _state$itemMap$get.data);
175
+ }
176
+ return _objectSpread({}, state);
146
177
  }
147
178
  if (action.type === "select") {
148
- var _componentEvents$curr, _componentEvents$curr2, _state$itemMap$get;
149
179
  if (state.selected) {
150
180
  utils.updateSelection(state.itemMap, state.selected);
151
181
  }
152
182
  utils.updateSelection(state.itemMap, action.id, true);
183
+ state.selected = action.id;
153
184
  state.tree = utils.flattenTree(state.items);
154
- (_componentEvents$curr = (_componentEvents$curr2 = componentEvents.current).onSelect) === null || _componentEvents$curr === void 0 || _componentEvents$curr.call(_componentEvents$curr2, action.id, (_state$itemMap$get = state.itemMap.get(action.id)) === null || _state$itemMap$get === void 0 ? void 0 : _state$itemMap$get.data);
155
- return _objectSpread(_objectSpread({}, state), {}, {
156
- selected: action.id
157
- });
185
+ return _objectSpread({}, state);
158
186
  }
159
187
  if (action.type === "toggleCheck") {
160
- var _componentEvents$curr3, _componentEvents$curr4;
161
188
  utils.updateChecked(state.itemMap, action.id);
162
- var checkList = [[], []];
189
+ var checkList = [[], [], []];
163
190
  Array.from(state.itemMap.values()).filter(function (node) {
164
- return node.checked === 1;
191
+ return node.checked !== 0;
165
192
  }).forEach(function (node) {
166
- return checkList[node.leaf ? 0 : 1].push(node.id);
193
+ return checkList[node.leaf ? 0 : node.checked].push(node.id);
194
+ });
195
+ fireChecked(checkList[0],
196
+ // leafs
197
+ checkList[1],
198
+ // nodes
199
+ checkList[2] // partials
200
+ );
201
+ return _objectSpread(_objectSpread({}, state), {}, {
202
+ checked: checkList[0]
167
203
  });
168
- (_componentEvents$curr3 = (_componentEvents$curr4 = componentEvents.current).onChecked) === null || _componentEvents$curr3 === void 0 || _componentEvents$curr3.call(_componentEvents$curr4, checkList[0], checkList[1]);
169
- return _objectSpread({}, state);
170
204
  }
171
205
  if (action.type === "checked") {
206
+ state.itemMap.forEach(function (item) {
207
+ return item.checked = 0;
208
+ });
172
209
  action.id.forEach(function (id) {
173
- return utils.updateChecked(state.itemMap, id);
210
+ return utils.updateChecked(state.itemMap, id, 1);
174
211
  });
175
212
  return _objectSpread(_objectSpread({}, state), {}, {
176
213
  checked: action.id
@@ -181,7 +218,8 @@ var useTree = function useTree(_ref) {
181
218
  itemMap: new Map(),
182
219
  items: [],
183
220
  tree: [],
184
- checked: []
221
+ checked: [],
222
+ query: ""
185
223
  }),
186
224
  _useReducer2 = _slicedToArray(_useReducer, 2),
187
225
  state = _useReducer2[0],
@@ -202,6 +240,14 @@ var useTree = function useTree(_ref) {
202
240
  type: "expand",
203
241
  id: intialExpand.current.shift()
204
242
  });
243
+ selected && dispatch({
244
+ type: "select",
245
+ id: selected
246
+ });
247
+ checked && dispatch({
248
+ type: "checked",
249
+ id: checked
250
+ });
205
251
  }, [itemList]);
206
252
  react.useEffect(function () {
207
253
  selected && dispatch({
@@ -229,7 +275,7 @@ var useTree = function useTree(_ref) {
229
275
  }, []);
230
276
  var select = react.useCallback(function (id) {
231
277
  dispatch({
232
- type: "select",
278
+ type: "toggleSelect",
233
279
  id: id
234
280
  });
235
281
  }, []);
@@ -257,6 +303,7 @@ var useTree = function useTree(_ref) {
257
303
  }, [], 300);
258
304
  return {
259
305
  tree: state.tree,
306
+ query: state.query,
260
307
  toggleExpand: toggleExpand,
261
308
  expandAll: expandAll,
262
309
  collapseAll: collapseAll,
@@ -105,15 +105,15 @@ var updateSelection = function updateSelection(nodes, id, selected) {
105
105
  while (parent) {
106
106
  var parentNode = nodes.get(parent);
107
107
  parentNode && (parentNode.childSelected = selected);
108
- selected && parentNode && (parentNode.open = true);
108
+ // selected && parentNode && (parentNode.open = true);
109
109
  parent = parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent;
110
110
  }
111
111
  }
112
112
  };
113
- var updateChecked = function updateChecked(list, id) {
113
+ var updateChecked = function updateChecked(list, id, checked) {
114
114
  var node = list.get(id);
115
115
  if (node) {
116
- node.checked = node.checked === 1 ? 0 : 1;
116
+ node.checked = checked === undefined ? node.checked === 0 ? 1 : 0 : checked;
117
117
  // check all children
118
118
  node.children && getChildren(node.children).forEach(function (child) {
119
119
  return child.checked = node.checked;
@@ -92,8 +92,8 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
92
92
  var virtualItems = virtualizer.getVirtualItems();
93
93
  var currentIndex = react.useRef(0);
94
94
  react.useEffect(function () {
95
- var _virtualItems$1$index, _virtualItems$;
96
- currentIndex.current = (_virtualItems$1$index = (_virtualItems$ = virtualItems[1]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index) !== null && _virtualItems$1$index !== void 0 ? _virtualItems$1$index : 0;
95
+ var _virtualItems$2$index, _virtualItems$;
96
+ currentIndex.current = (_virtualItems$2$index = (_virtualItems$ = virtualItems[2]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index) !== null && _virtualItems$2$index !== void 0 ? _virtualItems$2$index : 0;
97
97
  if (scrollerRef.current && virtualItems[0] && scrollerRef.current.scrollTop < virtualItems[0].size) currentIndex.current = 0;
98
98
  }, [virtualItems]);
99
99
  var calculateActiveScroll = react.useCallback(function () {
@@ -68,8 +68,8 @@ var _VirtualList = function _VirtualList(_ref) {
68
68
  var virtualItems = virtualizer.getVirtualItems();
69
69
  var currentIndex = react.useRef(0);
70
70
  react.useEffect(function () {
71
- var _virtualItems$1$index, _virtualItems$;
72
- currentIndex.current = (_virtualItems$1$index = (_virtualItems$ = virtualItems[1]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index) !== null && _virtualItems$1$index !== void 0 ? _virtualItems$1$index : 0;
71
+ var _virtualItems$2$index, _virtualItems$;
72
+ currentIndex.current = (_virtualItems$2$index = (_virtualItems$ = virtualItems[2]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index) !== null && _virtualItems$2$index !== void 0 ? _virtualItems$2$index : 0;
73
73
  if (scrollerRef.current && virtualItems[0] && scrollerRef.current.scrollTop < virtualItems[0].size) currentIndex.current = 0;
74
74
  }, [virtualItems]);
75
75
  var calculateActiveScroll = react.useCallback(function () {
@@ -1,20 +1,34 @@
1
1
  'use client';
2
2
 
3
3
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
- import { isString, matchString } from '@react-fabric/utilities';
4
+ import { isArray, matchString, isString } from '@react-fabric/utilities';
5
5
  import { useState, useDeferredValue, useTransition, useCallback, useEffect } from 'react';
6
6
 
7
7
  var filterList = function filterList(items) {
8
8
  var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
9
- var matcher = arguments.length > 2 ? arguments[2] : undefined;
9
+ var matchAll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
10
+ var matcher = arguments.length > 3 ? arguments[3] : undefined;
10
11
  var newList = [];
11
12
  items.forEach(function (item) {
12
13
  if (matcher) {
13
14
  return (matcher === null || matcher === void 0 ? void 0 : matcher(item, query)) && newList.push(item);
14
15
  }
15
- if (query && isString(query)) {
16
- var _item$label;
17
- if (matchString((_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.toString(), query)) {
16
+ if (query && isArray(query) && query.length > 0) {
17
+ if (matchAll && query.every(function (q) {
18
+ var _item$label;
19
+ return matchString((_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.toString(), q);
20
+ })) {
21
+ return newList.push(item);
22
+ }
23
+ if (!matchAll && query.some(function (q) {
24
+ var _item$label2;
25
+ return matchString((_item$label2 = item.label) !== null && _item$label2 !== void 0 ? _item$label2 : item.toString(), q);
26
+ })) {
27
+ return newList.push(item);
28
+ }
29
+ } else if (query && isString(query)) {
30
+ var _item$label3;
31
+ if (matchString((_item$label3 = item.label) !== null && _item$label3 !== void 0 ? _item$label3 : item.toString(), query)) {
18
32
  return newList.push(item);
19
33
  }
20
34
  } else {
@@ -24,6 +38,26 @@ var filterList = function filterList(items) {
24
38
  return newList;
25
39
  };
26
40
 
41
+ /**
42
+ * Custom hook to filter a list of items based on a query.
43
+ * It provides a way to search through the items and returns the filtered list.
44
+ * The hook uses a deferred value to optimize performance during transitions.
45
+ * It also allows for a custom matcher function to define how items should be matched against the query.
46
+ *
47
+ * @param items - The list of items to filter.
48
+ * @param matchAll - Match all phrases in the query list against the items.
49
+ * @returns An object containing the search function, current query, filtered list, and a boolean indicating if a search is in progress.
50
+ *
51
+ * @example
52
+ * ```jsx
53
+ * useFilteredList(items, (item, query) => {
54
+ * return item.name.includes(query);
55
+ * });
56
+ * ```
57
+ *
58
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
59
+ */
60
+
27
61
  /**
28
62
  * Custom hook to filter a list of items based on a query.
29
63
  * It provides a way to search through the items and returns the filtered list.
@@ -43,7 +77,29 @@ var filterList = function filterList(items) {
43
77
  *
44
78
  * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
45
79
  */
46
- var useFilteredList = function useFilteredList(items, matcher) {
80
+
81
+ /**
82
+ * Custom hook to filter a list of items based on a query.
83
+ * It provides a way to search through the items and returns the filtered list.
84
+ * The hook uses a deferred value to optimize performance during transitions.
85
+ * It also allows for a custom matcher function to define how items should be matched against the query.
86
+ *
87
+ * @param items - The list of items to filter.
88
+ * @param matchAll - Match all phrases in the query list against the items.
89
+ * @param matcher - An optional function to match items against the query.
90
+ * @returns An object containing the search function, current query, filtered list, and a boolean indicating if a search is in progress.
91
+ *
92
+ * @example
93
+ * ```jsx
94
+ * useFilteredList(items, (item, query) => {
95
+ * return item.name.includes(query);
96
+ * });
97
+ * ```
98
+ *
99
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/data-usefilteredlist--docs}
100
+ */
101
+
102
+ function useFilteredList(items, matchAll, matcher) {
47
103
  var _useState = useState(),
48
104
  _useState2 = _slicedToArray(_useState, 2),
49
105
  query = _useState2[0],
@@ -57,20 +113,22 @@ var useFilteredList = function useFilteredList(items, matcher) {
57
113
  _useTransition2 = _slicedToArray(_useTransition, 2),
58
114
  isSearching = _useTransition2[0],
59
115
  startTransition = _useTransition2[1];
60
- var filterItems = useCallback(function (items, query) {
116
+ var matchingAll = typeof matchAll === "boolean" ? matchAll : true;
117
+ var matcherFn = typeof matchAll === "function" ? matchAll : matcher;
118
+ var filterItems = useCallback(function (items, query, matchingAll) {
61
119
  return startTransition(function () {
62
- return setFilteredList(filterList(items, query, matcher));
120
+ return setFilteredList(filterList(items, query, matchingAll, matcherFn));
63
121
  });
64
122
  }, []);
65
123
  useEffect(function () {
66
- if (query) filterItems(_items, query);else setFilteredList(items);
67
- }, [query, _items]);
124
+ if (query) filterItems(_items, query, matchingAll);else setFilteredList(items);
125
+ }, [query, matchingAll, _items]);
68
126
  return {
69
127
  onSearch: setQuery,
70
128
  query: query,
71
129
  filteredList: filteredList,
72
130
  isSearching: isSearching
73
131
  };
74
- };
132
+ }
75
133
 
76
134
  export { useFilteredList };
@@ -11,6 +11,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
11
11
 
12
12
  var HeaderCell = function HeaderCell(_ref) {
13
13
  var id = _ref.id,
14
+ field = _ref.field,
14
15
  dataType = _ref.dataType,
15
16
  label = _ref.label,
16
17
  icon = _ref.icon,
@@ -56,7 +57,7 @@ var HeaderCell = function HeaderCell(_ref) {
56
57
  list: filterOptions,
57
58
  filter: filter,
58
59
  onFilter: function onFilter(value) {
59
- return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id, value);
60
+ return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
60
61
  }
61
62
  })
62
63
  }, "filters"));
@@ -87,7 +88,7 @@ var HeaderCell = function HeaderCell(_ref) {
87
88
  list: filterOptions,
88
89
  filter: filter,
89
90
  onFilter: function onFilter(value) {
90
- return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id, value);
91
+ return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
91
92
  }
92
93
  }, "filters")];
93
94
  }