@react-fabric/data 1.0.0-beta.54 → 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.
- package/dist/cjs/hooks/useFilteredList.js +68 -10
- package/dist/cjs/table/HeaderCell.js +3 -2
- package/dist/cjs/table/Table.js +7 -1
- package/dist/cjs/table/useVirtualTable.js +18 -0
- package/dist/cjs/tree/TreeNode.js +2 -2
- package/dist/cjs/tree/TreePanel.js +5 -4
- package/dist/cjs/tree/useTree.js +62 -15
- package/dist/cjs/tree/utils.js +3 -3
- package/dist/cjs/virtual/Gallery.js +2 -2
- package/dist/cjs/virtual/List.js +2 -2
- package/dist/esm/hooks/useFilteredList.js +69 -11
- package/dist/esm/table/HeaderCell.js +3 -2
- package/dist/esm/table/Table.js +7 -1
- package/dist/esm/table/useVirtualTable.js +19 -1
- package/dist/esm/tree/TreeNode.js +2 -2
- package/dist/esm/tree/TreePanel.js +5 -4
- package/dist/esm/tree/useTree.js +63 -16
- package/dist/esm/tree/utils.js +3 -3
- package/dist/esm/virtual/Gallery.js +2 -2
- package/dist/esm/virtual/List.js +2 -2
- package/dist/types/hooks/useFilteredList.d.ts +49 -6
- package/dist/types/table/HeaderCell.d.ts +1 -1
- package/dist/types/table/Table.d.ts +1 -1
- package/dist/types/table/types.d.ts +3 -0
- package/dist/types/table/useVirtualTable.d.ts +3 -0
- package/dist/types/tree/TreePanel.d.ts +1 -1
- package/dist/types/tree/types.d.ts +11 -13
- package/dist/types/tree/useTree.d.ts +1 -0
- package/dist/types/tree/utils.d.ts +1 -1
- package/package.json +5 -5
- package/src/hooks/useFilteredList.tsx +90 -9
- package/src/table/HeaderCell.tsx +3 -2
- package/src/table/Table.tsx +5 -0
- package/src/table/types.ts +4 -0
- package/src/table/useVirtualTable.ts +24 -1
- package/src/tree/TreeNode.tsx +3 -5
- package/src/tree/TreePanel.tsx +3 -3
- package/src/tree/types.ts +12 -12
- package/src/tree/useTree.ts +57 -13
- package/src/tree/utils.ts +8 -3
- package/src/virtual/Gallery.tsx +1 -1
- 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
|
|
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.
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
}
|
package/dist/cjs/table/Table.js
CHANGED
|
@@ -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,
|
|
@@ -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"
|
|
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", "
|
|
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
|
|
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 =
|
|
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
|
})]
|
package/dist/cjs/tree/useTree.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
191
|
+
return node.checked !== 0;
|
|
165
192
|
}).forEach(function (node) {
|
|
166
|
-
return checkList[node.leaf ? 0 :
|
|
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: "
|
|
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,
|
package/dist/cjs/tree/utils.js
CHANGED
|
@@ -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 ===
|
|
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$
|
|
96
|
-
currentIndex.current = (_virtualItems$
|
|
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 () {
|
package/dist/cjs/virtual/List.js
CHANGED
|
@@ -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$
|
|
72
|
-
currentIndex.current = (_virtualItems$
|
|
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 {
|
|
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
|
|
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 &&
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
}
|
package/dist/esm/table/Table.js
CHANGED
|
@@ -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 = useTranslation("data"),
|
|
45
48
|
t = _useTranslation.t;
|
|
46
49
|
var fireCheckChanged = 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,
|