@react-fabric/data 1.0.0-beta.5 → 1.0.0-beta.51

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 (88) 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 +25 -16
  4. package/dist/cjs/histogram/Histogram.js +20 -10
  5. package/dist/cjs/hooks/usePagination.js +7 -4
  6. package/dist/cjs/json/JsonViewer.js +40 -27
  7. package/dist/cjs/table/AddColumn.js +1 -1
  8. package/dist/cjs/table/BodyCell.js +38 -5
  9. package/dist/cjs/table/BodyRow.js +107 -0
  10. package/dist/cjs/table/CheckboxCell.js +1 -1
  11. package/dist/cjs/table/ColumnFilters.js +97 -0
  12. package/dist/cjs/table/HeaderCell.js +70 -37
  13. package/dist/cjs/table/Table.js +113 -71
  14. package/dist/cjs/table/useResizer.js +4 -4
  15. package/dist/cjs/table/useVirtualTable.js +122 -18
  16. package/dist/cjs/tree/TreeNode.js +45 -25
  17. package/dist/cjs/tree/TreePanel.js +28 -10
  18. package/dist/cjs/tree/useTree.js +97 -15
  19. package/dist/cjs/tree/utils.js +20 -5
  20. package/dist/cjs/virtual/Gallery.js +51 -35
  21. package/dist/cjs/virtual/List.js +44 -31
  22. package/dist/esm/checklist/CheckList.js +27 -18
  23. package/dist/esm/histogram/Histogram.js +21 -11
  24. package/dist/esm/hooks/usePagination.js +7 -4
  25. package/dist/esm/json/JsonViewer.js +41 -28
  26. package/dist/esm/table/AddColumn.js +1 -1
  27. package/dist/esm/table/BodyCell.js +38 -5
  28. package/dist/esm/table/BodyRow.js +107 -0
  29. package/dist/esm/table/CheckboxCell.js +1 -1
  30. package/dist/esm/table/ColumnFilters.js +97 -0
  31. package/dist/esm/table/HeaderCell.js +71 -38
  32. package/dist/esm/table/Table.js +115 -73
  33. package/dist/esm/table/useResizer.js +4 -4
  34. package/dist/esm/table/useVirtualTable.js +124 -20
  35. package/dist/esm/tree/TreeNode.js +47 -27
  36. package/dist/esm/tree/TreePanel.js +28 -10
  37. package/dist/esm/tree/useTree.js +99 -17
  38. package/dist/esm/tree/utils.js +20 -5
  39. package/dist/esm/virtual/Gallery.js +51 -35
  40. package/dist/esm/virtual/List.js +44 -31
  41. package/dist/types/checklist/CheckList.d.ts +2 -2
  42. package/dist/types/histogram/Histogram.d.ts +3 -4
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/json/JsonViewer.d.ts +0 -1
  45. package/dist/types/table/AddColumn.d.ts +2 -2
  46. package/dist/types/table/BodyCell.d.ts +4 -3
  47. package/dist/types/table/BodyRow.d.ts +20 -0
  48. package/dist/types/table/ColumnFilters.d.ts +9 -0
  49. package/dist/types/table/EmptyCell.d.ts +2 -2
  50. package/dist/types/table/HeaderCell.d.ts +2 -2
  51. package/dist/types/table/Table.d.ts +1 -1
  52. package/dist/types/table/types.d.ts +20 -7
  53. package/dist/types/table/useTableColumns.d.ts +6 -6
  54. package/dist/types/table/useVirtualTable.d.ts +23 -7
  55. package/dist/types/tree/TreeNode.d.ts +1 -1
  56. package/dist/types/tree/TreePanel.d.ts +1 -1
  57. package/dist/types/tree/types.d.ts +25 -5
  58. package/dist/types/tree/useTree.d.ts +2 -9
  59. package/dist/types/tree/utils.d.ts +4 -1
  60. package/dist/types/virtual/Gallery.d.ts +12 -4
  61. package/dist/types/virtual/List.d.ts +8 -4
  62. package/package.json +13 -10
  63. package/src/checklist/CheckList.tsx +81 -77
  64. package/src/histogram/Histogram.tsx +17 -11
  65. package/src/hooks/usePagination.tsx +13 -7
  66. package/src/index.ts +1 -1
  67. package/src/json/JsonViewer.tsx +45 -35
  68. package/src/table/AddColumn.tsx +3 -3
  69. package/src/table/BodyCell.tsx +34 -5
  70. package/src/table/BodyRow.tsx +143 -0
  71. package/src/table/CheckboxCell.tsx +1 -1
  72. package/src/table/ColumnFilters.tsx +105 -0
  73. package/src/table/EmptyCell.tsx +2 -2
  74. package/src/table/HeaderCell.tsx +72 -14
  75. package/src/table/Table.tsx +164 -77
  76. package/src/table/types.ts +24 -6
  77. package/src/table/useResizer.ts +5 -3
  78. package/src/table/useTableColumns.ts +7 -7
  79. package/src/table/useVirtualTable.ts +146 -24
  80. package/src/tree/TreeNode.tsx +98 -56
  81. package/src/tree/TreePanel.tsx +23 -3
  82. package/src/tree/types.ts +32 -4
  83. package/src/tree/useTree.ts +109 -26
  84. package/src/tree/utils.ts +23 -8
  85. package/src/virtual/Gallery.tsx +63 -42
  86. package/src/virtual/List.tsx +44 -32
  87. package/dist/cjs/histogram/Histogram.module.css +0 -1
  88. package/dist/esm/histogram/Histogram.module.css +0 -1
@@ -11,7 +11,7 @@ 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", "renderer", "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) {
@@ -31,24 +31,38 @@ var TreePanel = function TreePanel(_ref) {
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,
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,
47
61
  toggleExpand = _useTree.toggleExpand,
48
62
  toggleCheck = _useTree.toggleCheck,
49
63
  expandAll = _useTree.expandAll,
50
64
  collapseAll = _useTree.collapseAll,
51
- select = _useTree.select,
65
+ _select = _useTree.select,
52
66
  expand = _useTree.expand,
53
67
  onFilter = _useTree.onFilter;
54
68
  var scrollerRef = useRef(null);
@@ -74,7 +88,7 @@ var TreePanel = function TreePanel(_ref) {
74
88
  return expand(id);
75
89
  },
76
90
  select: function select(id) {
77
- return expand(id);
91
+ return _select(id);
78
92
  }
79
93
  };
80
94
  }, []);
@@ -120,6 +134,7 @@ var TreePanel = function TreePanel(_ref) {
120
134
  height: (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start
121
135
  }
122
136
  }), virtualItems.map(function (_ref2) {
137
+ var _makeIcon, _ref3, _ref4;
123
138
  var index = _ref2.index,
124
139
  key = _ref2.key;
125
140
  return /*#__PURE__*/jsx("div", {
@@ -132,11 +147,14 @@ var TreePanel = function TreePanel(_ref) {
132
147
  checkable: checkable,
133
148
  selectable: selectable,
134
149
  defaultLeafIcon: defaultLeafIcon,
135
- defaultNodeIcon: defaultNodeIcon,
150
+ defaultNodeIcon: (_makeIcon = makeIcon === null || makeIcon === void 0 ? void 0 : makeIcon(tree[index].data)) !== null && _makeIcon !== void 0 ? _makeIcon : defaultNodeIcon,
136
151
  onToggle: toggleExpand,
137
152
  onChecked: toggleCheck,
138
- onSelect: select,
139
- children: tree[index].data && (renderer === null || renderer === void 0 ? void 0 : renderer(tree[index].data)) || tree[index].label
153
+ onSelect: _select,
154
+ onClick: onClick,
155
+ leafClassName: leafClassName,
156
+ nodeClassName: nodeClassName,
157
+ children: (_ref3 = (_ref4 = tree[index].data && (renderer === null || renderer === void 0 ? void 0 : renderer(tree[index].data))) !== null && _ref4 !== void 0 ? _ref4 : makeLabel === null || makeLabel === void 0 ? void 0 : makeLabel(tree[index].data)) !== null && _ref3 !== void 0 ? _ref3 : tree[index].label
140
158
  })
141
159
  }, key);
142
160
  })]
@@ -5,8 +5,8 @@ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
5
  import { useDebounce } from '@react-fabric/core';
6
6
  import { EMPTY_ARRAY } from '@react-fabric/utilities';
7
7
  import memoizeOne from 'memoize-one';
8
- import { useRef, useReducer, useEffect, useCallback } from 'react';
9
- import { refactorTree, makeTreeMap, flattenTree, filterTree, updateSelection, updateChecked } from './utils.js';
8
+ import { useRef, useCallback, useReducer, useEffect } from 'react';
9
+ import { refactorTree, makeTreeMap, flattenTree, updateSelection, filterTree, updateChecked } from './utils.js';
10
10
 
11
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; }
12
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; }
@@ -19,39 +19,110 @@ var useTree = function useTree(_ref) {
19
19
  _ref$checked = _ref.checked,
20
20
  checked = _ref$checked === void 0 ? EMPTY_ARRAY : _ref$checked,
21
21
  selected = _ref.selected,
22
+ sorter = _ref.sorter,
22
23
  matcher = _ref.matcher,
24
+ onLoad = _ref.onLoad,
25
+ onQuery = _ref.onQuery,
23
26
  onSelect = _ref.onSelect,
24
- onChecked = _ref.onChecked;
27
+ onChecked = _ref.onChecked,
28
+ defaultExpanded = _ref.defaultExpanded,
29
+ onExpandToggle = _ref.onExpandToggle;
25
30
  var componentEvents = useRef({
26
31
  onSelect: onSelect,
27
32
  onChecked: onChecked
28
33
  });
34
+ var intialExpand = useRef(defaultExpanded !== null && defaultExpanded !== void 0 ? defaultExpanded : EMPTY_ARRAY);
29
35
  var itemList = createItemList(items);
36
+ var fireExpandToggle = useCallback(function (itemMap) {
37
+ var expandedList = itemMap.filter(function (node) {
38
+ return node.open;
39
+ }).map(function (node) {
40
+ return node.id;
41
+ });
42
+ setTimeout(function () {
43
+ return onExpandToggle === null || onExpandToggle === void 0 ? void 0 : onExpandToggle(expandedList);
44
+ }, 100);
45
+ }, [onExpandToggle]);
46
+ var loadChildren = useCallback(function (node) {
47
+ var _node$children;
48
+ if (node.open && !node.leaf && !((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length)) {
49
+ node.loading = true;
50
+ void Promise.resolve(onLoad === null || onLoad === void 0 ? void 0 : onLoad(node.id)).then(function () {
51
+ var resp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EMPTY_ARRAY;
52
+ node.children = refactorTree(resp, {
53
+ sorter: sorter,
54
+ defaultExpanded: defaultExpanded
55
+ }, {
56
+ level: node.level + 1,
57
+ parent: node.id
58
+ });
59
+ })["finally"](function () {
60
+ var _intialExpand$current;
61
+ node.loading = false;
62
+ dispatch({
63
+ type: "loaded"
64
+ });
65
+ ((_intialExpand$current = intialExpand.current) === null || _intialExpand$current === void 0 ? void 0 : _intialExpand$current.length) > 0 && dispatch({
66
+ type: "expand",
67
+ id: intialExpand.current.shift()
68
+ });
69
+ });
70
+ } else {
71
+ var _intialExpand$current2;
72
+ dispatch({
73
+ type: "loaded"
74
+ });
75
+ ((_intialExpand$current2 = intialExpand.current) === null || _intialExpand$current2 === void 0 ? void 0 : _intialExpand$current2.length) > 0 && dispatch({
76
+ type: "expand",
77
+ id: intialExpand.current.shift()
78
+ });
79
+ }
80
+ }, [onLoad]);
30
81
  var _useReducer = useReducer(function (state, action) {
31
82
  if (action.type === "load") {
32
- state.items = refactorTree(action.items);
83
+ state.items = refactorTree(action.items, {
84
+ sorter: sorter,
85
+ defaultExpanded: defaultExpanded
86
+ });
33
87
  state.itemMap = makeTreeMap(state.items);
34
88
  state.tree = flattenTree(state.items);
35
89
  return _objectSpread({}, state);
36
90
  }
37
91
  if (action.type === "toggleExpand") {
38
92
  var node = state.itemMap.get(action.id);
39
- node && (node.open = !node.open);
93
+ if (node && !node.leaf) {
94
+ node && (node.open = !node.open);
95
+ loadChildren(node);
96
+ return _objectSpread({}, state);
97
+ }
98
+ }
99
+ if (action.type === "loaded") {
100
+ state.itemMap = makeTreeMap(state.items);
101
+ fireExpandToggle(Array.from(state.itemMap.values()));
40
102
  state.tree = flattenTree(state.items);
103
+ state.selected && updateSelection(state.itemMap, state.selected, true);
41
104
  return _objectSpread({}, state);
42
105
  }
43
106
  if (action.type === "expand") {
44
- // TODO: check if children available, if not call onLoad to fetch node children
45
107
  var _node = state.itemMap.get(action.id);
46
- _node && (_node.open = true);
47
- state.tree = flattenTree(state.items);
48
- return _objectSpread({}, state);
108
+ if (_node && !_node.leaf) {
109
+ _node.open = true;
110
+ var parentId = _node.parent;
111
+ while (parentId) {
112
+ var _node2 = state.itemMap.get(parentId);
113
+ _node2 && (_node2.open = true);
114
+ parentId = _node2 === null || _node2 === void 0 ? void 0 : _node2.parent;
115
+ }
116
+ loadChildren(_node);
117
+ return _objectSpread({}, state);
118
+ }
49
119
  }
50
120
  if (action.type === "expandAll") {
51
- // TODO: prevent opening dynamic nodes that dont have children
52
121
  state.itemMap.forEach(function (node) {
53
- !node.leaf && (node.open = true);
122
+ var _node$children2;
123
+ !node.leaf && ((_node$children2 = node.children) === null || _node$children2 === void 0 ? void 0 : _node$children2.length) && (node.open = true);
54
124
  });
125
+ fireExpandToggle(Array.from(state.itemMap.values()));
55
126
  state.tree = flattenTree(state.items);
56
127
  return _objectSpread({}, state);
57
128
  }
@@ -59,22 +130,28 @@ var useTree = function useTree(_ref) {
59
130
  state.itemMap.forEach(function (node) {
60
131
  !node.leaf && (node.open = false);
61
132
  });
133
+ fireExpandToggle([]);
62
134
  state.tree = flattenTree(state.items);
63
135
  return _objectSpread({}, state);
64
136
  }
65
137
  if (action.type === "filter") {
66
- filterTree(state.itemMap, action.query, matcher);
67
- state.tree = flattenTree(state.items);
68
- return _objectSpread({}, state);
138
+ if (onQuery) {
139
+ var _action$query;
140
+ onQuery((_action$query = action.query) !== null && _action$query !== void 0 ? _action$query : "");
141
+ } else {
142
+ filterTree(state.itemMap, action.query, matcher);
143
+ state.tree = flattenTree(state.items);
144
+ return _objectSpread({}, state);
145
+ }
69
146
  }
70
147
  if (action.type === "select") {
71
- var _componentEvents$curr, _componentEvents$curr2;
148
+ var _componentEvents$curr, _componentEvents$curr2, _state$itemMap$get;
72
149
  if (state.selected) {
73
150
  updateSelection(state.itemMap, state.selected);
74
151
  }
75
152
  updateSelection(state.itemMap, action.id, true);
76
153
  state.tree = flattenTree(state.items);
77
- (_componentEvents$curr = (_componentEvents$curr2 = componentEvents.current).onSelect) === null || _componentEvents$curr === void 0 || _componentEvents$curr.call(_componentEvents$curr2, action.id);
154
+ (_componentEvents$curr = (_componentEvents$curr2 = componentEvents.current).onSelect) === null || _componentEvents$curr === void 0 || _componentEvents$curr.call(_componentEvents$curr2, action.id, (_state$itemMap$get = state.itemMap.get(action.id)) === null || _state$itemMap$get === void 0 ? void 0 : _state$itemMap$get.data);
78
155
  return _objectSpread(_objectSpread({}, state), {}, {
79
156
  selected: action.id
80
157
  });
@@ -116,10 +193,15 @@ var useTree = function useTree(_ref) {
116
193
  };
117
194
  }, [onSelect, onChecked]);
118
195
  useEffect(function () {
196
+ var _intialExpand$current3;
119
197
  dispatch({
120
198
  type: "load",
121
199
  items: itemList
122
200
  });
201
+ itemList.length && ((_intialExpand$current3 = intialExpand.current) === null || _intialExpand$current3 === void 0 ? void 0 : _intialExpand$current3.length) > 0 && dispatch({
202
+ type: "expand",
203
+ id: intialExpand.current.shift()
204
+ });
123
205
  }, [itemList]);
124
206
  useEffect(function () {
125
207
  selected && dispatch({
@@ -172,7 +254,7 @@ var useTree = function useTree(_ref) {
172
254
  type: "filter",
173
255
  query: query
174
256
  });
175
- }, []);
257
+ }, [], 300);
176
258
  return {
177
259
  tree: state.tree,
178
260
  toggleExpand: toggleExpand,
@@ -6,7 +6,7 @@ import { isString, matchString, compareValues } from '@react-fabric/utilities';
6
6
 
7
7
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
8
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
- var sorter = function sorter(a, b) {
9
+ var defaultSorter = function defaultSorter(a, b) {
10
10
  if (!!a.leaf !== !!b.leaf) return a.leaf ? 1 : -1;
11
11
  return compareValues()(a.label, b.label);
12
12
  };
@@ -28,15 +28,21 @@ var getIntermediate = function getIntermediate() {
28
28
  };
29
29
 
30
30
  // convert node item to internal node used by the tree
31
- var refactorTree = function refactorTree(nodes) {
32
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
31
+ var refactorTree = function refactorTree(nodes, _ref) {
32
+ var _ref$sorter = _ref.sorter,
33
+ sorter = _ref$sorter === void 0 ? defaultSorter : _ref$sorter,
34
+ _ref$defaultExpanded = _ref.defaultExpanded,
35
+ defaultExpanded = _ref$defaultExpanded === void 0 ? [] : _ref$defaultExpanded;
36
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
33
37
  level: 0,
34
38
  parent: undefined
35
39
  };
36
40
  var list = [];
37
- nodes.sort(sorter).forEach(function (node) {
41
+ if (sorter !== false) nodes = nodes.sort(sorter);
42
+ nodes.forEach(function (node) {
43
+ var _node$children;
38
44
  list.push(_objectSpread(_objectSpread({
39
- open: false,
45
+ open: defaultExpanded.includes(node.id) && !!((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length),
40
46
  level: options.level,
41
47
  parent: options.parent,
42
48
  checked: 0,
@@ -47,6 +53,9 @@ var refactorTree = function refactorTree(nodes) {
47
53
  }, node), {}, {
48
54
  leaf: !!node.leaf,
49
55
  children: node.children && refactorTree(node.children, {
56
+ sorter: sorter,
57
+ defaultExpanded: defaultExpanded
58
+ }, {
50
59
  level: options.level + 1,
51
60
  parent: node.id
52
61
  })
@@ -72,11 +81,17 @@ var flattenTree = function flattenTree(nodes) {
72
81
  return !node.filtered;
73
82
  });
74
83
  filtered.forEach(function (node, idx) {
84
+ var _node$children2;
75
85
  node.lines = [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 2 : 3]);
76
86
  list.push(node);
77
87
  (node.open || node.childFiltered) && node.children && list.push.apply(list, _toConsumableArray(flattenTree(node.children.filter(function (child) {
78
88
  return !child.filtered;
79
89
  }), [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 0 : 1]))));
90
+ node.open && ((_node$children2 = node.children) === null || _node$children2 === void 0 ? void 0 : _node$children2.length) === 0 && list.push({
91
+ empty: true,
92
+ leaf: true,
93
+ lines: [].concat(_toConsumableArray(lines), [idx === filtered.length - 1 ? 0 : 1, 2])
94
+ });
80
95
  });
81
96
  return list;
82
97
  };
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
 
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
4
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
4
6
  import { useEffectDebugger, useDebounce, Skeleton } from '@react-fabric/core';
5
7
  import { debounce } from '@react-fabric/utilities';
6
8
  import { useVirtualizer } from '@tanstack/react-virtual';
@@ -10,6 +12,9 @@ import { useDeferredValue, useMemo, useRef, useState, useEffect, useCallback, us
10
12
  import { Scroller } from './Scroller.js';
11
13
  import { jsx, jsxs } from 'react/jsx-runtime';
12
14
 
15
+ var _excluded = ["items", "children", "columns", "fullWidth", "maxWidth", "minWidth", "total", "padding", "defaultHeight", "defaultWidth", "hideScroller", "initialScroll", "loading", "onLoadMore", "onScroll", "galleryRef"];
16
+ 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; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
18
  var createItemList = memoizeOne(function (items) {
14
19
  return items;
15
20
  });
@@ -18,6 +23,11 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
18
23
  var items = _ref.items,
19
24
  children = _ref.children,
20
25
  columns = _ref.columns,
26
+ fullWidth = _ref.fullWidth,
27
+ maxWidth = _ref.maxWidth,
28
+ minWidth = _ref.minWidth,
29
+ _ref$total = _ref.total,
30
+ total = _ref$total === void 0 ? 0 : _ref$total,
21
31
  _ref$padding = _ref.padding,
22
32
  padding = _ref$padding === void 0 ? "md" : _ref$padding,
23
33
  _ref$defaultHeight = _ref.defaultHeight,
@@ -29,16 +39,17 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
29
39
  loading = _ref.loading,
30
40
  onLoadMore = _ref.onLoadMore,
31
41
  onScroll = _ref.onScroll,
32
- galleryRef = _ref.galleryRef;
42
+ galleryRef = _ref.galleryRef,
43
+ aria = _objectWithoutProperties(_ref, _excluded);
33
44
  var count = useDeferredValue(items.length);
34
45
  var extraSize = useMemo(function () {
35
- return onLoadMore ? 64 : 0;
46
+ return onLoadMore ? 8 : 0;
36
47
  }, [onLoadMore]);
37
- var itemList = createItemList(items.map(function (item, idx) {
48
+ var itemList = createItemList(items.map(function (item, index) {
38
49
  return {
39
- index: idx,
40
- data: item,
41
- isLast: idx + 1 === items.length
50
+ index: index,
51
+ item: item,
52
+ isLast: index + 1 === items.length
42
53
  };
43
54
  }));
44
55
  var scrollerRef = useRef(null);
@@ -55,8 +66,9 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
55
66
  if (scrollerRef.current) {
56
67
  var el = scrollerRef.current;
57
68
  var handler = function handler() {
58
- var _el$offsetWidth;
59
- setColumnCount(columns !== null && columns !== void 0 ? columns : Math.max(1, Math.floor((((_el$offsetWidth = el === null || el === void 0 ? void 0 : el.offsetWidth) !== null && _el$offsetWidth !== void 0 ? _el$offsetWidth : 800) - 32) / width)));
69
+ var _getComputedStyle$pad, _el$firstElementChild, _el$offsetWidth;
70
+ var pad = parseInt((_getComputedStyle$pad = getComputedStyle((_el$firstElementChild = el.firstElementChild) === null || _el$firstElementChild === void 0 ? void 0 : _el$firstElementChild.firstElementChild).padding) !== null && _getComputedStyle$pad !== void 0 ? _getComputedStyle$pad : 8);
71
+ setColumnCount(columns !== null && columns !== void 0 ? columns : Math.max(1, Math.floor((((_el$offsetWidth = el === null || el === void 0 ? void 0 : el.offsetWidth) !== null && _el$offsetWidth !== void 0 ? _el$offsetWidth : 800) - 32 - (isNaN(pad) ? 8 : pad) * 2) / width)));
60
72
  };
61
73
  var ob = new ResizeObserver(handler);
62
74
  handler();
@@ -74,7 +86,8 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
74
86
  },
75
87
  estimateSize: function estimateSize() {
76
88
  return height;
77
- }
89
+ },
90
+ overscan: 2
78
91
  });
79
92
  var virtualItems = virtualizer.getVirtualItems();
80
93
  var currentIndex = useRef(0);
@@ -112,26 +125,25 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
112
125
  setScrollActive(calculateActiveScroll());
113
126
  }, [count, calculateActiveScroll]);
114
127
  useEffect(function () {
115
- var db = debounce(function () {
116
- var lastItem = virtualItems === null || virtualItems === void 0 ? void 0 : virtualItems.slice(-1).pop();
117
- if (lastItem && !loading && lastItem.index * columnCount + columnCount >= count - 1) onLoadMore === null || onLoadMore === void 0 || onLoadMore();
118
- });
119
- db();
120
- return function () {
121
- return db.cancel();
122
- };
123
- }, [onLoadMore, loading, itemList, virtualItems, count, columnCount]);
124
- useEffect(function () {
125
- var _virtualItems$2;
126
- var firstItem = (_virtualItems$2 = virtualItems[0]) === null || _virtualItems$2 === void 0 ? void 0 : _virtualItems$2.index;
127
- if (onLoadMore && firstItem !== undefined && items[firstItem * columnCount] === null) {
128
+ if (onLoadMore) {
129
+ var _virtualItems$2, _virtualItems$slice$p;
130
+ var firstItem = (_virtualItems$2 = virtualItems[0]) === null || _virtualItems$2 === void 0 ? void 0 : _virtualItems$2.index;
131
+ 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;
132
+ var firstIndex = firstItem * columnCount;
133
+ var lastIndex = (lastItem !== null && lastItem !== void 0 ? lastItem : 0) * columnCount + columnCount;
134
+ var canLoadPrevPage = firstItem !== undefined && items[firstIndex] === null;
135
+ var canLoadNextPage = lastItem !== undefined && lastIndex >= count - 1 && count < total;
128
136
  var db = debounce(onLoadMore);
129
- db(firstItem * columnCount);
137
+ if (canLoadPrevPage) {
138
+ db(firstIndex);
139
+ } else if (!loading && canLoadNextPage) {
140
+ db(lastIndex + 1);
141
+ }
130
142
  return function () {
131
143
  return db.cancel();
132
144
  };
133
145
  }
134
- }, [onLoadMore, items, columnCount, virtualItems, count]);
146
+ }, [onLoadMore, virtualItems]);
135
147
  useLayoutEffect(function () {
136
148
  setTimeout(function () {
137
149
  initialScroll && virtualizer.scrollToIndex(Math.floor(initialScroll / columnCount), {
@@ -143,14 +155,14 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
143
155
  return {
144
156
  scrollToItem: function scrollToItem(index) {
145
157
  virtualizer.scrollToIndex(Math.floor(index / columnCount), {
146
- align: "start"
158
+ align: "auto"
147
159
  });
148
160
  },
149
161
  hilight: function hilight(index) {
150
162
  var _scrollerRef$current2;
151
163
  (_scrollerRef$current2 = scrollerRef.current) === null || _scrollerRef$current2 === void 0 || (_scrollerRef$current2 = _scrollerRef$current2.querySelector(".hilight")) === null || _scrollerRef$current2 === void 0 || _scrollerRef$current2.classList.remove("hilight", "ring-1");
152
164
  virtualizer.scrollToIndex(Math.floor(index / columnCount), {
153
- align: "start"
165
+ align: "auto"
154
166
  });
155
167
  setTimeout(function () {
156
168
  var _scrollerRef$current3;
@@ -163,17 +175,22 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
163
175
  }
164
176
  };
165
177
  }, [virtualizer, columnCount]);
166
- return /*#__PURE__*/jsx("div", {
178
+ return /*#__PURE__*/jsx("div", _objectSpread(_objectSpread({
167
179
  ref: scrollerRef,
168
180
  onScroll: handleScroll,
169
- className: classNames("area-content bg-base overflow-auto contain-strict"),
181
+ className: classNames("area-content bg-base overflow-auto")
182
+ }, aria), {}, {
170
183
  children: /*#__PURE__*/jsxs("div", {
171
184
  className: classNames("inline-flex flex-nowrap gap-2 justify-center min-h-full min-w-full"),
172
185
  children: [/*#__PURE__*/jsx("div", {
173
- className: classNames("box-content", padding === "sm" && "p-1", padding === "md" && "p-2", padding === "lg" && "p-4"),
186
+ className: classNames("box-content", fullWidth && "flex-1", padding === "sm" && "p-1", padding === "md" && "p-2", padding === "lg" && "p-4"),
187
+ style: {
188
+ minWidth: minWidth,
189
+ maxWidth: maxWidth
190
+ },
174
191
  children: /*#__PURE__*/jsxs("div", {
175
192
  style: {
176
- height: virtualizer.getTotalSize()
193
+ height: virtualizer.getTotalSize() + extraSize
177
194
  },
178
195
  children: [/*#__PURE__*/jsx("div", {
179
196
  style: {
@@ -181,12 +198,11 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
181
198
  }
182
199
  }), virtualItems.map(function (_ref3) {
183
200
  var key = _ref3.key,
184
- index = _ref3.index,
185
- measureElement = _ref3.measureElement;
201
+ index = _ref3.index;
186
202
  return /*#__PURE__*/jsx("div", {
187
- className: "flex",
203
+ className: "flex justify-center",
188
204
  "data-index": index,
189
- ref: measureElement,
205
+ ref: virtualizer.measureElement,
190
206
  children: columnMap.map(function (col) {
191
207
  return /*#__PURE__*/jsx("div", {
192
208
  "data-index": index * columnCount + col,
@@ -220,7 +236,7 @@ var _VirtualGallery = function _VirtualGallery(_ref) {
220
236
  })
221
237
  })]
222
238
  })
223
- });
239
+ }));
224
240
  };
225
241
  _VirtualGallery.displayName = "VirtualGallery";
226
242
  var GenericMemo = memo;