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

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 (103) hide show
  1. package/{src/histogram/Histogram.module.css → css/_histogram.css} +16 -13
  2. package/css/styles.css +24 -0
  3. package/dist/cjs/checklist/CheckList.js +23 -0
  4. package/dist/cjs/histogram/Histogram.js +37 -7
  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 +67 -27
  11. package/dist/cjs/pagination/Pagination.js +10 -0
  12. package/dist/cjs/table/AddColumn.js +1 -1
  13. package/dist/cjs/table/BodyCell.js +5 -4
  14. package/dist/cjs/table/BodyRow.js +2 -2
  15. package/dist/cjs/table/CheckboxCell.js +1 -1
  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 +58 -12
  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 +48 -30
  23. package/dist/cjs/tree/TreePanel.js +45 -11
  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 +23 -0
  30. package/dist/esm/histogram/Histogram.js +38 -8
  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 +68 -28
  37. package/dist/esm/pagination/Pagination.js +10 -0
  38. package/dist/esm/table/AddColumn.js +1 -1
  39. package/dist/esm/table/BodyCell.js +5 -4
  40. package/dist/esm/table/BodyRow.js +2 -2
  41. package/dist/esm/table/CheckboxCell.js +1 -1
  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 +59 -13
  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 +51 -33
  49. package/dist/esm/tree/TreePanel.js +46 -12
  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 +16 -8
  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 +44 -5
  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 -19
  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 +22 -0
  76. package/src/histogram/Histogram.tsx +40 -10
  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 +71 -35
  83. package/src/pagination/Pagination.tsx +10 -0
  84. package/src/table/AddColumn.tsx +1 -1
  85. package/src/table/BodyCell.tsx +6 -4
  86. package/src/table/BodyRow.tsx +3 -2
  87. package/src/table/CheckboxCell.tsx +1 -1
  88. package/src/table/ColumnFilters.tsx +105 -0
  89. package/src/table/HeaderCell.tsx +72 -18
  90. package/src/table/Table.tsx +99 -11
  91. package/src/table/types.ts +46 -8
  92. package/src/table/useResizer.ts +5 -3
  93. package/src/table/useVirtualTable.ts +158 -27
  94. package/src/tree/TreeNode.tsx +98 -58
  95. package/src/tree/TreePanel.tsx +77 -6
  96. package/src/tree/types.ts +73 -18
  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 +16 -8
  102. package/dist/cjs/histogram/Histogram.module.css +0 -1
  103. 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, CoreIcons, getIconProps, Badge } from '@react-fabric/core';
5
+ import { 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,32 +19,42 @@ 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
60
  return checkable === true || checkable === "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: CoreIcons.spinner,
76
+ className: "animate-spin 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,
@@ -75,21 +94,17 @@ var TreeNode = function TreeNode(_ref) {
75
94
  icon: node.checked === 2 ? CoreIcons.checkboxInt : node.checked === 1 ? CoreIcons.checkboxOn : CoreIcons.checkboxOff,
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
  };
@@ -5,13 +5,13 @@ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProper
5
5
  import { CoreIcons, 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
10
  import { iconExpandAll, iconCollapseAll } from './types.js';
11
11
  import { useTree } from './useTree.js';
12
12
  import { jsxs, jsx } from 'react/jsx-runtime';
13
13
 
14
- var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "renderer", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onSelect"];
14
+ 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
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,33 +22,51 @@ 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,
27
+ multiple = _ref.multiple,
28
28
  matcher = _ref.matcher,
29
29
  filterPlaceholder = _ref.filterPlaceholder,
30
30
  defaultLeafIcon = _ref.defaultLeafIcon,
31
31
  defaultNodeIcon = _ref.defaultNodeIcon,
32
32
  _ref$expander = _ref.expander,
33
33
  expander = _ref$expander === void 0 ? "box" : _ref$expander,
34
- onChecked = _ref.onChecked;
35
- _ref.onLoad;
36
- var onSelect = _ref.onSelect,
34
+ onChecked = _ref.onChecked,
35
+ onLoad = _ref.onLoad,
36
+ onQuery = _ref.onQuery,
37
+ onSelect = _ref.onSelect,
38
+ onClick = _ref.onClick,
39
+ sorter = _ref.sorter,
40
+ makeLabel = _ref.makeLabel,
41
+ makeIcon = _ref.makeIcon,
42
+ defaultExpanded = _ref.defaultExpanded,
43
+ onExpandToggle = _ref.onExpandToggle,
44
+ leafClassName = _ref.leafClassName,
45
+ nodeClassName = _ref.nodeClassName,
37
46
  aria = _objectWithoutProperties(_ref, _excluded);
38
47
  var _useTree = useTree({
39
48
  items: items,
40
49
  checked: checked,
41
50
  selected: selected,
51
+ multiple: multiple,
42
52
  matcher: matcher,
53
+ sorter: sorter,
54
+ onLoad: onLoad,
55
+ onQuery: onQuery,
43
56
  onSelect: onSelect,
44
- onChecked: onChecked
57
+ onChecked: onChecked,
58
+ defaultExpanded: defaultExpanded,
59
+ onExpandToggle: onExpandToggle
45
60
  }),
46
61
  tree = _useTree.tree,
62
+ query = _useTree.query,
63
+ currentSelected = _useTree.selected,
47
64
  toggleExpand = _useTree.toggleExpand,
48
65
  toggleCheck = _useTree.toggleCheck,
49
66
  expandAll = _useTree.expandAll,
50
67
  collapseAll = _useTree.collapseAll,
51
- select = _useTree.select,
68
+ expandAndLoad = _useTree.expandAndLoad,
69
+ _select = _useTree.select,
52
70
  expand = _useTree.expand,
53
71
  onFilter = _useTree.onFilter;
54
72
  var scrollerRef = useRef(null);
@@ -73,16 +91,28 @@ var TreePanel = function TreePanel(_ref) {
73
91
  open: function open(id) {
74
92
  return expand(id);
75
93
  },
94
+ openAndLoad: function openAndLoad(list) {
95
+ return expandAndLoad(list);
96
+ },
76
97
  select: function select(id) {
77
- return expand(id);
98
+ return _select(id);
78
99
  }
79
100
  };
80
101
  }, []);
102
+ useEffect(function () {
103
+ var index = tree.findIndex(function (n) {
104
+ return n.id === currentSelected;
105
+ });
106
+ virtualizer.scrollToIndex(index, {
107
+ align: "auto"
108
+ });
109
+ }, [currentSelected]);
81
110
  return /*#__PURE__*/jsxs(Section, {
82
111
  children: [/*#__PURE__*/jsxs(Header, {
83
112
  flex: true,
84
113
  className: "items-center p-px justify-end overflow-hidden border-b",
85
114
  children: [searchable && /*#__PURE__*/jsx(Search, {
115
+ value: query,
86
116
  onSearch: onFilter,
87
117
  allowClear: true,
88
118
  placeholder: filterPlaceholder,
@@ -120,6 +150,7 @@ var TreePanel = function TreePanel(_ref) {
120
150
  height: (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start
121
151
  }
122
152
  }), virtualItems.map(function (_ref2) {
153
+ var _makeIcon, _ref3;
123
154
  var index = _ref2.index,
124
155
  key = _ref2.key;
125
156
  return /*#__PURE__*/jsx("div", {
@@ -132,11 +163,14 @@ var TreePanel = function TreePanel(_ref) {
132
163
  checkable: checkable,
133
164
  selectable: selectable,
134
165
  defaultLeafIcon: defaultLeafIcon,
135
- defaultNodeIcon: defaultNodeIcon,
166
+ defaultNodeIcon: (_makeIcon = makeIcon === null || makeIcon === void 0 ? void 0 : makeIcon(tree[index].data)) !== null && _makeIcon !== void 0 ? _makeIcon : defaultNodeIcon,
136
167
  onToggle: toggleExpand,
137
168
  onChecked: toggleCheck,
138
- onSelect: select,
139
- children: tree[index].data && (renderer === null || renderer === void 0 ? void 0 : renderer(tree[index].data)) || tree[index].label
169
+ onSelect: _select,
170
+ onClick: onClick,
171
+ leafClassName: leafClassName,
172
+ nodeClassName: nodeClassName,
173
+ 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
174
  })
141
175
  }, key);
142
176
  })]