@react-fabric/data 1.0.0-beta.6 → 1.0.0-beta.61

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 (104) hide show
  1. package/{src/histogram/Histogram.module.css → css/_histogram.css} +16 -13
  2. package/{dist/esm/tree/types.js → css/styles.css} +2 -7
  3. package/dist/cjs/checklist/CheckList.js +27 -4
  4. package/dist/cjs/histogram/Histogram.js +39 -9
  5. package/dist/cjs/hooks/useFilteredList.js +88 -10
  6. package/dist/cjs/hooks/usePagination.js +27 -4
  7. package/dist/cjs/hooks/useSelectableList.js +29 -0
  8. package/dist/cjs/i18n/ar.json.js +8 -1
  9. package/dist/cjs/i18n/en.json.js +8 -1
  10. package/dist/cjs/json/JsonViewer.js +68 -28
  11. package/dist/cjs/pagination/Pagination.js +14 -4
  12. package/dist/cjs/table/AddColumn.js +3 -3
  13. package/dist/cjs/table/BodyCell.js +14 -6
  14. package/dist/cjs/table/BodyRow.js +4 -4
  15. package/dist/cjs/table/CheckboxCell.js +2 -2
  16. package/dist/cjs/table/ColumnFilters.js +97 -0
  17. package/dist/cjs/table/HeaderCell.js +71 -43
  18. package/dist/cjs/table/Table.js +62 -13
  19. package/dist/cjs/table/types.js +29 -0
  20. package/dist/cjs/table/useResizer.js +4 -4
  21. package/dist/cjs/table/useVirtualTable.js +127 -19
  22. package/dist/cjs/tree/TreeNode.js +50 -32
  23. package/dist/cjs/tree/TreePanel.js +52 -19
  24. package/dist/cjs/tree/useTree.js +199 -38
  25. package/dist/cjs/tree/utils.js +39 -12
  26. package/dist/cjs/virtual/Gallery.js +97 -45
  27. package/dist/cjs/virtual/List.js +93 -39
  28. package/dist/cjs/virtual/Scroller.js +16 -8
  29. package/dist/esm/checklist/CheckList.js +28 -5
  30. package/dist/esm/histogram/Histogram.js +41 -11
  31. package/dist/esm/hooks/useFilteredList.js +89 -11
  32. package/dist/esm/hooks/usePagination.js +27 -4
  33. package/dist/esm/hooks/useSelectableList.js +29 -0
  34. package/dist/esm/i18n/ar.json.js +8 -2
  35. package/dist/esm/i18n/en.json.js +8 -2
  36. package/dist/esm/json/JsonViewer.js +69 -29
  37. package/dist/esm/pagination/Pagination.js +15 -5
  38. package/dist/esm/table/AddColumn.js +4 -4
  39. package/dist/esm/table/BodyCell.js +15 -7
  40. package/dist/esm/table/BodyRow.js +4 -4
  41. package/dist/esm/table/CheckboxCell.js +3 -3
  42. package/dist/esm/table/ColumnFilters.js +97 -0
  43. package/dist/esm/table/HeaderCell.js +72 -44
  44. package/dist/esm/table/Table.js +63 -14
  45. package/dist/esm/table/types.js +29 -0
  46. package/dist/esm/table/useResizer.js +4 -4
  47. package/dist/esm/table/useVirtualTable.js +129 -21
  48. package/dist/esm/tree/TreeNode.js +53 -35
  49. package/dist/esm/tree/TreePanel.js +54 -21
  50. package/dist/esm/tree/useTree.js +202 -41
  51. package/dist/esm/tree/utils.js +40 -13
  52. package/dist/esm/virtual/Gallery.js +97 -45
  53. package/dist/esm/virtual/List.js +93 -39
  54. package/dist/esm/virtual/Scroller.js +17 -9
  55. package/dist/types/checklist/CheckList.d.ts +22 -0
  56. package/dist/types/histogram/Histogram.d.ts +28 -1
  57. package/dist/types/hooks/useFilteredList.d.ts +66 -5
  58. package/dist/types/hooks/usePagination.d.ts +19 -0
  59. package/dist/types/hooks/useSelectableList.d.ts +29 -0
  60. package/dist/types/json/JsonViewer.d.ts +27 -2
  61. package/dist/types/pagination/Pagination.d.ts +10 -1
  62. package/dist/types/table/ColumnFilters.d.ts +9 -0
  63. package/dist/types/table/HeaderCell.d.ts +1 -1
  64. package/dist/types/table/Table.d.ts +14 -1
  65. package/dist/types/table/types.d.ts +46 -7
  66. package/dist/types/table/useVirtualTable.d.ts +23 -9
  67. package/dist/types/tree/TreeNode.d.ts +1 -1
  68. package/dist/types/tree/TreePanel.d.ts +42 -1
  69. package/dist/types/tree/types.d.ts +65 -21
  70. package/dist/types/tree/useTree.d.ts +9 -10
  71. package/dist/types/tree/utils.d.ts +10 -3
  72. package/dist/types/virtual/Gallery.d.ts +42 -3
  73. package/dist/types/virtual/List.d.ts +42 -3
  74. package/package.json +16 -14
  75. package/src/checklist/CheckList.tsx +39 -7
  76. package/src/histogram/Histogram.tsx +43 -19
  77. package/src/hooks/useFilteredList.tsx +109 -9
  78. package/src/hooks/usePagination.tsx +32 -7
  79. package/src/hooks/useSelectableList.ts +29 -0
  80. package/src/i18n/ar.json +5 -0
  81. package/src/i18n/en.json +5 -0
  82. package/src/json/JsonViewer.tsx +76 -37
  83. package/src/pagination/Pagination.tsx +15 -5
  84. package/src/table/AddColumn.tsx +4 -4
  85. package/src/table/BodyCell.tsx +24 -7
  86. package/src/table/BodyRow.tsx +7 -4
  87. package/src/table/CheckboxCell.tsx +5 -5
  88. package/src/table/ColumnFilters.tsx +105 -0
  89. package/src/table/HeaderCell.tsx +74 -21
  90. package/src/table/Table.tsx +107 -12
  91. package/src/table/types.ts +49 -10
  92. package/src/table/useResizer.ts +5 -3
  93. package/src/table/useVirtualTable.ts +158 -27
  94. package/src/tree/TreeNode.tsx +96 -62
  95. package/src/tree/TreePanel.tsx +88 -22
  96. package/src/tree/types.ts +73 -23
  97. package/src/tree/useTree.ts +220 -44
  98. package/src/tree/utils.ts +58 -20
  99. package/src/virtual/Gallery.tsx +118 -54
  100. package/src/virtual/List.tsx +99 -39
  101. package/src/virtual/Scroller.tsx +25 -9
  102. package/dist/cjs/histogram/Histogram.module.css +0 -1
  103. package/dist/cjs/tree/types.js +0 -30
  104. package/dist/esm/histogram/Histogram.module.css +0 -1
@@ -1,49 +1,85 @@
1
1
  'use client';
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
5
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
- import { useVirtualizer } from '@tanstack/react-virtual';
6
- import { useRef, useReducer, useCallback } from 'react';
6
+ import { groupBy, compareValues, debounce } from '@react-fabric/utilities';
7
+ import { useVirtualizer, defaultRangeExtractor } from '@tanstack/react-virtual';
8
+ import { useReducer, useRef, useMemo, useState, useCallback, useEffect } from 'react';
7
9
 
8
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
- var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged) {
12
+ var useVirtualTable = function useVirtualTable(data, options) {
11
13
  var _virtualizer$range;
12
14
  // TODO: refactor data into item list, apply grouping if groupColumn provided
13
15
  // TODO: when grouping maintain map of group with children, {___GROUP___:true, label, items, open}
14
16
 
15
- var scrollerRef = useRef(null);
16
- var virtualizer = useVirtualizer({
17
- count: data.length,
18
- getScrollElement: function getScrollElement() {
19
- return scrollerRef.current;
20
- },
21
- estimateSize: function estimateSize() {
22
- return 24;
23
- }
24
- });
25
17
  var _useReducer = useReducer(function (state, action) {
18
+ if (action.type === "updateState") {
19
+ state.checked = action.checked;
20
+ }
26
21
  if (action.type === "expand") {
27
22
  if (state.expanded.includes(action.key)) state.expanded.splice(state.expanded.indexOf(action.key), 1);else state.expanded.push(action.key);
28
23
  }
29
24
  if (action.type === "check") {
25
+ var _options$onCheckChang;
30
26
  if (state.checked.includes(action.key)) state.checked.splice(state.checked.indexOf(action.key), 1);else state.checked.push(action.key);
31
- onCheckChanged === null || onCheckChanged === void 0 || onCheckChanged(state.checked);
27
+ (_options$onCheckChang = options.onCheckChanged) === null || _options$onCheckChang === void 0 || _options$onCheckChang.call(options, state.checked);
32
28
  }
33
29
  if (action.type === "checkall") {
30
+ var _options$onCheckChang2;
34
31
  if (state.allChecked !== 0) {
35
32
  state.checked = [];
36
- } else if (keyProperty) {
37
- state.checked = data.map(function (item) {
38
- return item[keyProperty];
33
+ } else if (options.keyProperty) {
34
+ state.checked = state.data.map(function (item) {
35
+ return item[options.keyProperty];
36
+ });
37
+ }
38
+ (_options$onCheckChang2 = options.onCheckChanged) === null || _options$onCheckChang2 === void 0 || _options$onCheckChang2.call(options, state.checked);
39
+ }
40
+ var checkList = state.data.filter(function (hit) {
41
+ return state.checked.includes(hit[options.keyProperty]);
42
+ });
43
+ if (action.type === "groupExpand") {
44
+ var group = state.groups.find(function (group) {
45
+ return group.key === action.key;
46
+ });
47
+ if (group) {
48
+ group.open = !group.open;
49
+ state.groups = state.groups.slice();
50
+ state.items = state.groups.map(function (group) {
51
+ return [group, group.open ? state.grouped[group.key] : undefined];
52
+ }).flat(2).filter(Boolean);
53
+ }
54
+ }
55
+ if (action.type === "reset") {
56
+ state.data = action.data;
57
+ if (action.key) {
58
+ state.grouped = groupBy(state.data, action.key);
59
+ state.groups = Object.keys(state.grouped).sort(compareValues("asc")).map(function (group) {
60
+ return {
61
+ __GROUP__: true,
62
+ open: true,
63
+ key: group,
64
+ items: state.grouped[group],
65
+ itemCount: state.grouped[group].length
66
+ };
39
67
  });
68
+ state.items = state.groups.map(function (group) {
69
+ return [group].concat(_toConsumableArray(state.grouped[group.key]));
70
+ }).flat();
71
+ } else {
72
+ state.items = state.data;
40
73
  }
41
- onCheckChanged === null || onCheckChanged === void 0 || onCheckChanged(state.checked);
42
74
  }
43
75
  return _objectSpread(_objectSpread({}, state), {}, {
44
- allChecked: state.checked.length === data.length ? 1 : state.checked.length ? 2 : 0
76
+ allChecked: checkList.length === state.data.length ? 1 : state.checked.length ? 2 : 0
45
77
  });
46
78
  }, {
79
+ data: data,
80
+ items: [],
81
+ grouped: {},
82
+ groups: [],
47
83
  checked: [],
48
84
  expanded: [],
49
85
  allChecked: 0
@@ -51,19 +87,91 @@ var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged
51
87
  _useReducer2 = _slicedToArray(_useReducer, 2),
52
88
  state = _useReducer2[0],
53
89
  dispatch = _useReducer2[1];
90
+ var activeStickyIndexRef = useRef(0);
91
+ var stickyIndexes = useMemo(function () {
92
+ return state.items.map(function (hit, idx) {
93
+ return "__GROUP__" in hit ? idx : undefined;
94
+ }).filter(Boolean);
95
+ }, [state.items]);
96
+ var isActiveSticky = function isActiveSticky(index) {
97
+ return activeStickyIndexRef.current === index;
98
+ };
99
+ var _useState = useState(false),
100
+ _useState2 = _slicedToArray(_useState, 2),
101
+ hasActiveSticky = _useState2[0],
102
+ setHasActiveSticky = _useState2[1];
103
+ var scrollerRef = useRef(null);
104
+ var virtualizer = useVirtualizer({
105
+ count: state.items.length,
106
+ getScrollElement: function getScrollElement() {
107
+ return scrollerRef.current;
108
+ },
109
+ estimateSize: function estimateSize() {
110
+ return 32;
111
+ },
112
+ rangeExtractor: useCallback(function (range) {
113
+ var _reverse$find;
114
+ activeStickyIndexRef.current = (_reverse$find = _toConsumableArray(stickyIndexes).reverse().find(function (index) {
115
+ return range.startIndex > index;
116
+ })) !== null && _reverse$find !== void 0 ? _reverse$find : 0;
117
+ setHasActiveSticky(range.startIndex !== activeStickyIndexRef.current);
118
+ var next = new Set([activeStickyIndexRef.current].concat(_toConsumableArray(defaultRangeExtractor(range))));
119
+ return _toConsumableArray(next);
120
+ }, [stickyIndexes])
121
+ });
54
122
  var virtualItems = virtualizer.getVirtualItems();
55
123
  var getData = useCallback(function (index) {
56
- return data[index];
57
- }, [data]);
124
+ return state.items[index];
125
+ }, [state.items]);
126
+ useEffect(function () {
127
+ dispatch({
128
+ type: "reset",
129
+ key: options.groupProperty,
130
+ data: data
131
+ });
132
+ }, [data, options.groupProperty]);
133
+ useEffect(function () {
134
+ var _options$checked;
135
+ dispatch({
136
+ type: "updateState",
137
+ checked: (_options$checked = options.checked) !== null && _options$checked !== void 0 ? _options$checked : []
138
+ });
139
+ }, [options.checked]);
140
+ 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 = 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]);
58
158
  return {
59
159
  scrollerRef: scrollerRef,
60
160
  items: virtualItems,
61
161
  checkState: state,
62
162
  getData: getData,
63
163
  virtualizer: virtualizer,
164
+ hasActiveSticky: hasActiveSticky,
165
+ isActiveSticky: isActiveSticky,
64
166
  top: (_virtualizer$range = virtualizer.range) === null || _virtualizer$range === void 0 ? void 0 : _virtualizer$range.startIndex,
65
167
  totalSize: virtualizer.getTotalSize,
66
168
  measureElement: virtualizer.measureElement,
169
+ toggleGroupExpand: function toggleGroupExpand(key) {
170
+ return dispatch({
171
+ type: "groupExpand",
172
+ key: key
173
+ });
174
+ },
67
175
  toggleExpand: function toggleExpand(key) {
68
176
  return dispatch({
69
177
  type: "expand",
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
- import { getBadgeProps, Icon, CoreIcons, Badge } from '@react-fabric/core';
4
+ import { getBadgeProps, Icon, getIconProps, Badge } from '@react-fabric/core';
5
+ import { isTrue, isString, isEmpty } from '@react-fabric/utilities';
5
6
  import classNames from 'classnames';
6
- import { useMemo } from 'react';
7
- import { jsxs, jsx } from 'react/jsx-runtime';
7
+ import { useMemo, isValidElement } from 'react';
8
+ import { useTranslation } from 'react-i18next';
9
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
10
 
9
11
  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; }
10
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; }
@@ -17,35 +19,45 @@ var TreeNode = function TreeNode(_ref) {
17
19
  defaultLeafIcon = _ref.defaultLeafIcon,
18
20
  defaultNodeIcon = _ref.defaultNodeIcon,
19
21
  onToggle = _ref.onToggle,
22
+ onClick = _ref.onClick,
20
23
  onSelect = _ref.onSelect,
21
24
  onChecked = _ref.onChecked,
22
- children = _ref.children;
25
+ children = _ref.children,
26
+ leafClassName = _ref.leafClassName,
27
+ nodeClassName = _ref.nodeClassName;
28
+ var _useTranslation = useTranslation("data"),
29
+ t = _useTranslation.t;
23
30
  var badgeProps = useMemo(function () {
24
31
  return getBadgeProps(node.badge);
25
32
  }, [node.badge]);
26
33
  var filler = useMemo(function () {
27
- return node.lines.slice(noLines ? 1 : 0).map(function (line, idx) {
28
- return /*#__PURE__*/jsxs("svg", {
29
- viewBox: "0 0 24 24",
30
- className: "flex-initial w-6 fill-tint-200",
31
- children: [line === 0 && /*#__PURE__*/jsx("path", {
32
- d: ""
33
- }), !noLines && line === 1 && /*#__PURE__*/jsx("path", {
34
- d: "M7.45 26.1v-28.2h1.1v28.2h-1.1z"
35
- }), !noLines && line === 2 && /*#__PURE__*/jsx("path", {
36
- d: "M14.989 12.389l0.161-0.389-0.161-0.389-0.389-0.161h-6.050v-13.55h-1.1v14.1l0.161 0.389 0.389 0.161h6.6z"
37
- }), !noLines && line === 3 && /*#__PURE__*/jsx("path", {
38
- d: "M8.55 12.55h6.050l0.389-0.161 0.161-0.389-0.161-0.389-0.389-0.161h-6.050v-13.55h-1.1v28.2h1.1z"
39
- })]
34
+ return node.lines.slice(1).map(function (line, idx) {
35
+ return /*#__PURE__*/jsx("div", {
36
+ className: classNames("flex-initial self-stretch flex items-center w-6 relative", !noLines && line > 0 && "before:absolute before:top-0 before:start-[7px] before:bg-tint-200 before:min-h-[50%] before:w-0.5 before:scale-x-[.625]", !noLines && line !== 2 && "before:h-full"),
37
+ children: /*#__PURE__*/jsxs("svg", {
38
+ viewBox: "0 0 24 24",
39
+ className: "fill-tint-200 rtl:-scale-x-100",
40
+ children: [line === 0 && /*#__PURE__*/jsx("path", {
41
+ d: ""
42
+ }), !noLines && line === 1 && /*#__PURE__*/jsx("path", {
43
+ d: "M7.45 26.1v-28.2h1.1v28.2h-1.1z"
44
+ }), !noLines && line === 2 && /*#__PURE__*/jsx("path", {
45
+ d: "M14.989 12.389l0.161-0.389-0.161-0.389-0.389-0.161h-6.050v-13.55h-1.1v14.1l0.161 0.389 0.389 0.161h6.6z"
46
+ }), !noLines && line === 3 && /*#__PURE__*/jsx("path", {
47
+ d: "M8.55 12.55h6.050l0.389-0.161 0.161-0.389-0.161-0.389-0.389-0.161h-6.050v-13.55h-1.1v28.2h1.1z"
48
+ })]
49
+ })
40
50
  }, idx);
41
51
  });
42
52
  }, [noLines, node.lines]);
43
53
  var nodeIcon = useMemo(function () {
44
54
  if (node.icon) return node.icon;
45
- return node.leaf ? defaultLeafIcon : defaultNodeIcon;
55
+ return {
56
+ icon: node.leaf ? defaultLeafIcon : defaultNodeIcon
57
+ };
46
58
  }, [defaultLeafIcon, defaultNodeIcon, node.icon]);
47
59
  var canCheck = useMemo(function () {
48
- return checkable === true || checkable === "leafOnly" && node.leaf;
60
+ return isTrue(checkable) || checkable === "leafOnly" && node.leaf;
49
61
  }, [node.leaf, checkable]);
50
62
  var canSelect = useMemo(function () {
51
63
  return !node.disabled && (selectable === true || selectable === "leafOnly" && node.leaf);
@@ -53,10 +65,17 @@ var TreeNode = function TreeNode(_ref) {
53
65
  return /*#__PURE__*/jsxs("div", {
54
66
  role: "treeitem",
55
67
  "aria-selected": node.selected,
56
- className: "flex flex-nowrap",
68
+ className: classNames("flex flex-nowrap items-center"),
57
69
  "data-testid": node["data-testid"],
58
70
  "data-test-value": node["data-test-value"],
59
- children: [filler, !node.leaf && !node.childFiltered && /*#__PURE__*/jsx("div", {
71
+ "data-id": node.id,
72
+ children: [filler, node.loading && /*#__PURE__*/jsx("div", {
73
+ className: "flex-initial w-6",
74
+ children: /*#__PURE__*/jsx(Icon, {
75
+ icon: "icon-[svg-spinners--eclipse]",
76
+ className: "text-muted"
77
+ })
78
+ }), !node.leaf && !node.childFiltered && !node.loading && /*#__PURE__*/jsx("div", {
60
79
  className: "flex-initial w-6",
61
80
  children: /*#__PURE__*/jsx(Icon, {
62
81
  rtlFlip: true,
@@ -72,24 +91,20 @@ var TreeNode = function TreeNode(_ref) {
72
91
  onClick: function onClick() {
73
92
  return !node.disabled && onChecked(node.id);
74
93
  },
75
- icon: node.checked === 2 ? CoreIcons.checkboxInt : node.checked === 1 ? CoreIcons.checkboxOn : CoreIcons.checkboxOff,
94
+ icon: node.checked === 2 ? "icon-[mdi--checkbox-intermediate]" : node.checked === 1 ? "icon-[mdi--checkbox-marked]" : "icon-[mdi--checkbox-blank-outline]",
76
95
  className: classNames(node.disabled ? "text-muted" : "text-primary-500 hover:text-primary-600")
77
96
  })
78
- }), /*#__PURE__*/jsxs("div", {
97
+ }), !node.empty && /*#__PURE__*/jsxs("div", {
79
98
  role: "none",
80
- className: classNames("group data-[selected]:bg-primary-100 flex flex-nowrap flex-1 items-center overflow-hidden select-none", node.childSelected && "font-medium", canSelect && "hover:bg-primary-50 cursor-pointer"),
99
+ 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"),
81
100
  "data-selected": node.selected,
82
- onClick: function onClick() {
83
- return canSelect ? onSelect(node.id) : canCheck ? onChecked(node.id) : onToggle(node.id);
101
+ onClick: node.disabled ? undefined : function (e) {
102
+ onClick === null || onClick === void 0 || onClick(node.id, node.data);
103
+ canSelect ? onSelect(node.id, e.shiftKey) : canCheck ? onChecked(node.id) : onToggle(node.id);
84
104
  },
85
- children: [nodeIcon && /*#__PURE__*/jsx("div", {
86
- className: "flex-content w-6",
87
- children: /*#__PURE__*/jsx(Icon, {
88
- icon: nodeIcon,
89
- bg: node.iconBg,
90
- color: node.iconColor,
91
- rtlFlip: node.rtlFlip
92
- })
105
+ children: [nodeIcon && /*#__PURE__*/jsxs("div", {
106
+ className: "flex-content max-w-6 me-1 self-center leading-none",
107
+ children: [/*#__PURE__*/isValidElement(nodeIcon) && nodeIcon, isString(nodeIcon) && /*#__PURE__*/jsx(Icon, _objectSpread({}, getIconProps(nodeIcon)))]
93
108
  }), node.childSelected && !node.open && /*#__PURE__*/jsx("span", {
94
109
  className: " flex-content text-primary-500",
95
110
  children: "\u2022"
@@ -97,9 +112,12 @@ var TreeNode = function TreeNode(_ref) {
97
112
  role: "none",
98
113
  className: "flex-1 truncate",
99
114
  children: children
100
- }), node.badge && /*#__PURE__*/jsx(Badge, _objectSpread(_objectSpread({}, badgeProps), {}, {
115
+ }), !isEmpty(node.badge) && /*#__PURE__*/jsx(Badge, _objectSpread(_objectSpread({}, badgeProps), {}, {
101
116
  className: classNames("me-1 self-center flex-content bg-opacity-50", badgeProps.className)
102
117
  }))]
118
+ }), node.empty && /*#__PURE__*/jsx("div", {
119
+ className: "text-muted text-sm select-none",
120
+ children: t("tree.noItems")
103
121
  })]
104
122
  });
105
123
  };
@@ -2,16 +2,15 @@
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
5
- import { CoreIcons, Section, Header, Icon, ButtonGroup, Button } from '@react-fabric/core';
5
+ import { Section, Header, Icon, ButtonGroup, Button } from '@react-fabric/core';
6
6
  import { Search } from '@react-fabric/form';
7
7
  import { useVirtualizer } from '@tanstack/react-virtual';
8
- import { useRef, useMemo, useImperativeHandle } from 'react';
8
+ import { useRef, useMemo, useImperativeHandle, useEffect } from 'react';
9
9
  import { TreeNode } from './TreeNode.js';
10
- import { iconExpandAll, iconCollapseAll } from './types.js';
11
10
  import { useTree } from './useTree.js';
12
11
  import { jsxs, jsx } from 'react/jsx-runtime';
13
12
 
14
- var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "renderer", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onSelect"];
13
+ var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "searchable", "selectable", "multiple", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onQuery", "onSelect", "onClick", "sorter", "makeLabel", "makeIcon", "defaultExpanded", "onExpandToggle", "leafClassName", "nodeClassName"];
15
14
  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
15
  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
16
  var TreePanel = function TreePanel(_ref) {
@@ -22,33 +21,51 @@ var TreePanel = function TreePanel(_ref) {
22
21
  checked = _ref.checked,
23
22
  checkable = _ref.checkable,
24
23
  noLines = _ref.noLines,
25
- renderer = _ref.renderer,
26
24
  searchable = _ref.searchable,
27
25
  selectable = _ref.selectable,
26
+ multiple = _ref.multiple,
28
27
  matcher = _ref.matcher,
29
28
  filterPlaceholder = _ref.filterPlaceholder,
30
29
  defaultLeafIcon = _ref.defaultLeafIcon,
31
30
  defaultNodeIcon = _ref.defaultNodeIcon,
32
31
  _ref$expander = _ref.expander,
33
32
  expander = _ref$expander === void 0 ? "box" : _ref$expander,
34
- onChecked = _ref.onChecked;
35
- _ref.onLoad;
36
- var onSelect = _ref.onSelect,
33
+ onChecked = _ref.onChecked,
34
+ onLoad = _ref.onLoad,
35
+ onQuery = _ref.onQuery,
36
+ onSelect = _ref.onSelect,
37
+ onClick = _ref.onClick,
38
+ sorter = _ref.sorter,
39
+ makeLabel = _ref.makeLabel,
40
+ makeIcon = _ref.makeIcon,
41
+ defaultExpanded = _ref.defaultExpanded,
42
+ onExpandToggle = _ref.onExpandToggle,
43
+ leafClassName = _ref.leafClassName,
44
+ nodeClassName = _ref.nodeClassName,
37
45
  aria = _objectWithoutProperties(_ref, _excluded);
38
46
  var _useTree = useTree({
39
47
  items: items,
40
48
  checked: checked,
41
49
  selected: selected,
50
+ multiple: multiple,
42
51
  matcher: matcher,
52
+ sorter: sorter,
53
+ onLoad: onLoad,
54
+ onQuery: onQuery,
43
55
  onSelect: onSelect,
44
- onChecked: onChecked
56
+ onChecked: onChecked,
57
+ defaultExpanded: defaultExpanded,
58
+ onExpandToggle: onExpandToggle
45
59
  }),
46
60
  tree = _useTree.tree,
61
+ query = _useTree.query,
62
+ currentSelected = _useTree.selected,
47
63
  toggleExpand = _useTree.toggleExpand,
48
64
  toggleCheck = _useTree.toggleCheck,
49
65
  expandAll = _useTree.expandAll,
50
66
  collapseAll = _useTree.collapseAll,
51
- select = _useTree.select,
67
+ expandAndLoad = _useTree.expandAndLoad,
68
+ _select = _useTree.select,
52
69
  expand = _useTree.expand,
53
70
  onFilter = _useTree.onFilter;
54
71
  var scrollerRef = useRef(null);
@@ -63,32 +80,44 @@ var TreePanel = function TreePanel(_ref) {
63
80
  });
64
81
  var virtualItems = virtualizer.getVirtualItems();
65
82
  var expanders = useMemo(function () {
66
- if (expander === "caret") return [CoreIcons.caretRight, CoreIcons.caretDown];
67
- if (expander === "chevron") return [CoreIcons.chevronRight, CoreIcons.chevronDown];
68
- if (expander === "folder") return [CoreIcons.folderClosed, CoreIcons.folderOpen];
69
- return [CoreIcons.expand, CoreIcons.collapse];
83
+ if (expander === "caret") return ["icon-[mdi--menu-right]", "icon-[mdi--menu-down]"];
84
+ if (expander === "chevron") return ["icon-[mdi--chevron-right]", "icon-[mdi--chevron-down]"];
85
+ if (expander === "folder") return ["icon-[mdi--folder-outline]", "icon-[mdi--folder-open-outline]"];
86
+ return ["icon-[mdi--plus-box-outline]", "icon-[mdi--minus-box-outline]"];
70
87
  }, [expander]);
71
88
  useImperativeHandle(ref, function () {
72
89
  return {
73
90
  open: function open(id) {
74
91
  return expand(id);
75
92
  },
93
+ openAndLoad: function openAndLoad(list) {
94
+ return expandAndLoad(list);
95
+ },
76
96
  select: function select(id) {
77
- return expand(id);
97
+ return _select(id);
78
98
  }
79
99
  };
80
100
  }, []);
101
+ useEffect(function () {
102
+ var index = tree.findIndex(function (n) {
103
+ return n.id === currentSelected;
104
+ });
105
+ virtualizer.scrollToIndex(index, {
106
+ align: "auto"
107
+ });
108
+ }, [currentSelected]);
81
109
  return /*#__PURE__*/jsxs(Section, {
82
110
  children: [/*#__PURE__*/jsxs(Header, {
83
111
  flex: true,
84
112
  className: "items-center p-px justify-end overflow-hidden border-b",
85
113
  children: [searchable && /*#__PURE__*/jsx(Search, {
114
+ value: query,
86
115
  onSearch: onFilter,
87
116
  allowClear: true,
88
117
  placeholder: filterPlaceholder,
89
118
  noBorder: true,
90
119
  decorateStart: /*#__PURE__*/jsx(Icon, {
91
- icon: CoreIcons.filter,
120
+ icon: "icon-[mdi--filter-variant]",
92
121
  className: "p-1"
93
122
  })
94
123
  }), /*#__PURE__*/jsxs(ButtonGroup, {
@@ -97,12 +126,12 @@ var TreePanel = function TreePanel(_ref) {
97
126
  children: [/*#__PURE__*/jsx(Button, {
98
127
  size: "sm",
99
128
  "aria-label": "expand all",
100
- icon: iconExpandAll,
129
+ icon: "icon-[mdi--arrow-expand-vertical]",
101
130
  onClick: expandAll
102
131
  }), /*#__PURE__*/jsx(Button, {
103
132
  size: "sm",
104
133
  "aria-label": "collapse all",
105
- icon: iconCollapseAll,
134
+ icon: "icon-[mdi--arrow-collapse-vertical]",
106
135
  onClick: collapseAll
107
136
  })]
108
137
  })]
@@ -120,6 +149,7 @@ var TreePanel = function TreePanel(_ref) {
120
149
  height: (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start
121
150
  }
122
151
  }), virtualItems.map(function (_ref2) {
152
+ var _makeIcon, _ref3;
123
153
  var index = _ref2.index,
124
154
  key = _ref2.key;
125
155
  return /*#__PURE__*/jsx("div", {
@@ -132,11 +162,14 @@ var TreePanel = function TreePanel(_ref) {
132
162
  checkable: checkable,
133
163
  selectable: selectable,
134
164
  defaultLeafIcon: defaultLeafIcon,
135
- defaultNodeIcon: defaultNodeIcon,
165
+ defaultNodeIcon: (_makeIcon = makeIcon === null || makeIcon === void 0 ? void 0 : makeIcon(tree[index].data)) !== null && _makeIcon !== void 0 ? _makeIcon : defaultNodeIcon,
136
166
  onToggle: toggleExpand,
137
167
  onChecked: toggleCheck,
138
- onSelect: select,
139
- children: tree[index].data && (renderer === null || renderer === void 0 ? void 0 : renderer(tree[index].data)) || tree[index].label
168
+ onSelect: _select,
169
+ onClick: onClick,
170
+ leafClassName: leafClassName,
171
+ nodeClassName: nodeClassName,
172
+ children: (_ref3 = tree[index].data && (makeLabel === null || makeLabel === void 0 ? void 0 : makeLabel(tree[index].data))) !== null && _ref3 !== void 0 ? _ref3 : tree[index].label
140
173
  })
141
174
  }, key);
142
175
  })]