@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
@@ -2,11 +2,12 @@
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
5
6
  import { useDebounce } from '@react-fabric/core';
6
- import { EMPTY_ARRAY } from '@react-fabric/utilities';
7
+ import { EMPTY_ARRAY, isEmpty } from '@react-fabric/utilities';
7
8
  import memoizeOne from 'memoize-one';
8
- import { useRef, useReducer, useEffect, useCallback } from 'react';
9
- import { refactorTree, makeTreeMap, flattenTree, filterTree, updateSelection, updateChecked } from './utils.js';
9
+ import { useEffectEvent, useRef, useCallback, useReducer, useEffect } from 'react';
10
+ import { refactorTree, makeTreeMap, flattenTree, updateSelection, updateChecked, filterTree } from './utils.js';
10
11
 
11
12
  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
13
  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 +20,137 @@ var useTree = function useTree(_ref) {
19
20
  _ref$checked = _ref.checked,
20
21
  checked = _ref$checked === void 0 ? EMPTY_ARRAY : _ref$checked,
21
22
  selected = _ref.selected,
23
+ multiple = _ref.multiple,
24
+ sorter = _ref.sorter,
22
25
  matcher = _ref.matcher,
26
+ onLoad = _ref.onLoad,
27
+ onQuery = _ref.onQuery,
23
28
  onSelect = _ref.onSelect,
24
- onChecked = _ref.onChecked;
25
- var componentEvents = useRef({
26
- onSelect: onSelect,
27
- onChecked: onChecked
29
+ onChecked = _ref.onChecked,
30
+ defaultExpanded = _ref.defaultExpanded,
31
+ onExpandToggle = _ref.onExpandToggle;
32
+ var eventSelect = useEffectEvent(onSelect !== null && onSelect !== void 0 ? onSelect : function () {
33
+ return undefined;
28
34
  });
35
+ var eventChecked = useEffectEvent(onChecked !== null && onChecked !== void 0 ? onChecked : function () {
36
+ return undefined;
37
+ });
38
+ var intialExpand = useRef(_toConsumableArray(defaultExpanded !== null && defaultExpanded !== void 0 ? defaultExpanded : EMPTY_ARRAY));
29
39
  var itemList = createItemList(items);
40
+ var fireExpandToggle = useCallback(function (itemMap) {
41
+ var expandedList = itemMap.filter(function (node) {
42
+ return node.open;
43
+ }).map(function (node) {
44
+ return node.id;
45
+ });
46
+ setTimeout(function () {
47
+ return onExpandToggle === null || onExpandToggle === void 0 ? void 0 : onExpandToggle(expandedList);
48
+ }, 100);
49
+ }, [onExpandToggle]);
50
+ var loadChildren = useCallback(function (node) {
51
+ var _node$children;
52
+ if (node.open && !node.leaf && !((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length)) {
53
+ node.loading = true;
54
+ // delay onload callback to avoid state issues
55
+ setTimeout(function () {
56
+ void Promise.resolve(onLoad === null || onLoad === void 0 ? void 0 : onLoad(node.id)).then(function () {
57
+ var resp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EMPTY_ARRAY;
58
+ node.children = refactorTree(resp, {
59
+ sorter: sorter,
60
+ defaultExpanded: defaultExpanded
61
+ }, {
62
+ level: node.level + 1,
63
+ parent: node.id
64
+ });
65
+ })["finally"](function () {
66
+ var _intialExpand$current;
67
+ node.loading = false;
68
+ dispatch({
69
+ type: "loaded"
70
+ });
71
+ ((_intialExpand$current = intialExpand.current) === null || _intialExpand$current === void 0 ? void 0 : _intialExpand$current.length) > 0 && dispatch({
72
+ type: "expand",
73
+ id: intialExpand.current.shift()
74
+ });
75
+ });
76
+ }, 100);
77
+ } else {
78
+ var _intialExpand$current2;
79
+ dispatch({
80
+ type: "loaded"
81
+ });
82
+ ((_intialExpand$current2 = intialExpand.current) === null || _intialExpand$current2 === void 0 ? void 0 : _intialExpand$current2.length) > 0 && dispatch({
83
+ type: "expand",
84
+ id: intialExpand.current.shift()
85
+ });
86
+ }
87
+ }, [onLoad]);
88
+ var fireSelected = useDebounce(function (nodeId, data) {
89
+ eventSelect(nodeId, data);
90
+ }, []);
91
+ var fireChecked = useDebounce(function (leafs, nodes, partials) {
92
+ eventChecked(leafs, nodes, partials);
93
+ }, []);
94
+ var fireQuery = useDebounce(function (query) {
95
+ onQuery === null || onQuery === void 0 || onQuery(query);
96
+ }, [onQuery]);
30
97
  var _useReducer = useReducer(function (state, action) {
31
98
  if (action.type === "load") {
32
- state.items = refactorTree(action.items);
99
+ state.items = refactorTree(action.items, {
100
+ sorter: sorter,
101
+ defaultExpanded: defaultExpanded
102
+ });
33
103
  state.itemMap = makeTreeMap(state.items);
34
104
  state.tree = flattenTree(state.items);
105
+ state.selected = undefined;
106
+ state.checked = undefined;
107
+ state.query = "";
35
108
  return _objectSpread({}, state);
36
109
  }
37
110
  if (action.type === "toggleExpand") {
38
111
  var node = state.itemMap.get(action.id);
39
- node && (node.open = !node.open);
112
+ if (node && !node.leaf) {
113
+ node && (node.open = !node.open);
114
+ loadChildren(node);
115
+ return _objectSpread({}, state);
116
+ }
117
+ }
118
+ if (action.type === "loaded") {
119
+ var _state$checked;
120
+ state.itemMap = makeTreeMap(state.items);
121
+ fireExpandToggle(Array.from(state.itemMap.values()));
40
122
  state.tree = flattenTree(state.items);
123
+ state.selected = selected;
124
+ updateSelection({
125
+ nodes: state.itemMap,
126
+ multiple: multiple,
127
+ selected: selected
128
+ });
129
+ (_state$checked = state.checked) === null || _state$checked === void 0 || _state$checked.forEach(function (id) {
130
+ return updateChecked(state.itemMap, id, 1);
131
+ });
41
132
  return _objectSpread({}, state);
42
133
  }
43
134
  if (action.type === "expand") {
44
- // TODO: check if children available, if not call onLoad to fetch node children
45
135
  var _node = state.itemMap.get(action.id);
46
- _node && (_node.open = true);
47
- state.tree = flattenTree(state.items);
48
- return _objectSpread({}, state);
136
+ if (_node && !_node.leaf) {
137
+ _node.open = true;
138
+ var parentId = _node.parent;
139
+ while (parentId) {
140
+ var _node2 = state.itemMap.get(parentId);
141
+ _node2 && (_node2.open = true);
142
+ parentId = _node2 === null || _node2 === void 0 ? void 0 : _node2.parent;
143
+ }
144
+ loadChildren(_node);
145
+ return _objectSpread({}, state);
146
+ }
49
147
  }
50
148
  if (action.type === "expandAll") {
51
- // TODO: prevent opening dynamic nodes that dont have children
52
149
  state.itemMap.forEach(function (node) {
53
- !node.leaf && (node.open = true);
150
+ var _node$children2;
151
+ !node.leaf && ((_node$children2 = node.children) === null || _node$children2 === void 0 ? void 0 : _node$children2.length) && (node.open = true);
54
152
  });
153
+ fireExpandToggle(Array.from(state.itemMap.values()));
55
154
  state.tree = flattenTree(state.items);
56
155
  return _objectSpread({}, state);
57
156
  }
@@ -59,41 +158,81 @@ var useTree = function useTree(_ref) {
59
158
  state.itemMap.forEach(function (node) {
60
159
  !node.leaf && (node.open = false);
61
160
  });
161
+ fireExpandToggle([]);
62
162
  state.tree = flattenTree(state.items);
63
163
  return _objectSpread({}, state);
64
164
  }
65
165
  if (action.type === "filter") {
66
- filterTree(state.itemMap, action.query, matcher);
166
+ if (onQuery) {
167
+ // TODO: onQuery should provide new tree listing
168
+ // save current tree state as preQueryState
169
+ // on clearing filter restore preQueryState
170
+ if (!isEmpty(action.query)) {
171
+ // state.prevItems = state.items;
172
+ fireQuery(action.query);
173
+ }
174
+ } else {
175
+ filterTree(state.itemMap, action.query, matcher);
176
+ state.tree = flattenTree(state.items);
177
+ }
178
+ return _objectSpread(_objectSpread({}, state), {}, {
179
+ query: action.query
180
+ });
181
+ }
182
+ if (action.type === "toggleSelect") {
183
+ var _state$itemMap$get;
184
+ if (multiple) {
185
+ var _state$selected, _state$selected$filte, _state$selected2, _state$selected3;
186
+ var isSelected = (_state$selected = state.selected) === null || _state$selected === void 0 ? void 0 : _state$selected.includes(action.id);
187
+ if (action.shiftKey && isSelected) state.selected = (_state$selected$filte = (_state$selected2 = state.selected) === null || _state$selected2 === void 0 ? void 0 : _state$selected2.filter(function (id) {
188
+ return id !== action.id;
189
+ })) !== null && _state$selected$filte !== void 0 ? _state$selected$filte : [];else if (action.shiftKey && !isSelected) state.selected = [].concat(_toConsumableArray((_state$selected3 = state.selected) !== null && _state$selected3 !== void 0 ? _state$selected3 : []), [action.id]);else state.selected = [action.id];
190
+ } else {
191
+ state.selected = action.id;
192
+ }
193
+ updateSelection({
194
+ nodes: state.itemMap,
195
+ selected: state.selected,
196
+ multiple: multiple
197
+ });
67
198
  state.tree = flattenTree(state.items);
199
+ fireSelected(state.selected, (_state$itemMap$get = state.itemMap.get(action.id)) === null || _state$itemMap$get === void 0 ? void 0 : _state$itemMap$get.data);
68
200
  return _objectSpread({}, state);
69
201
  }
70
202
  if (action.type === "select") {
71
- var _componentEvents$curr, _componentEvents$curr2;
72
- if (state.selected) {
73
- updateSelection(state.itemMap, state.selected);
74
- }
75
- updateSelection(state.itemMap, action.id, true);
76
- 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);
78
- return _objectSpread(_objectSpread({}, state), {}, {
203
+ state.selected = action.id;
204
+ updateSelection({
205
+ nodes: state.itemMap,
206
+ multiple: multiple,
79
207
  selected: action.id
80
208
  });
209
+ state.tree = flattenTree(state.items);
210
+ return _objectSpread({}, state);
81
211
  }
82
212
  if (action.type === "toggleCheck") {
83
- var _componentEvents$curr3, _componentEvents$curr4;
84
213
  updateChecked(state.itemMap, action.id);
85
- var checkList = [[], []];
214
+ var checkList = [[], [], []];
86
215
  Array.from(state.itemMap.values()).filter(function (node) {
87
- return node.checked === 1;
216
+ return node.checked !== 0;
88
217
  }).forEach(function (node) {
89
- return checkList[node.leaf ? 0 : 1].push(node.id);
218
+ return checkList[node.leaf ? 0 : node.checked].push(node.id);
219
+ });
220
+ fireChecked(checkList[0],
221
+ // leafs
222
+ checkList[1],
223
+ // nodes
224
+ checkList[2] // partials
225
+ );
226
+ return _objectSpread(_objectSpread({}, state), {}, {
227
+ checked: checkList[0]
90
228
  });
91
- (_componentEvents$curr3 = (_componentEvents$curr4 = componentEvents.current).onChecked) === null || _componentEvents$curr3 === void 0 || _componentEvents$curr3.call(_componentEvents$curr4, checkList[0], checkList[1]);
92
- return _objectSpread({}, state);
93
229
  }
94
230
  if (action.type === "checked") {
231
+ state.itemMap.forEach(function (item) {
232
+ return item.checked = 0;
233
+ });
95
234
  action.id.forEach(function (id) {
96
- return updateChecked(state.itemMap, id);
235
+ return updateChecked(state.itemMap, id, 1);
97
236
  });
98
237
  return _objectSpread(_objectSpread({}, state), {}, {
99
238
  checked: action.id
@@ -104,22 +243,30 @@ var useTree = function useTree(_ref) {
104
243
  itemMap: new Map(),
105
244
  items: [],
106
245
  tree: [],
107
- checked: []
246
+ checked: [],
247
+ query: ""
108
248
  }),
109
249
  _useReducer2 = _slicedToArray(_useReducer, 2),
110
250
  state = _useReducer2[0],
111
251
  dispatch = _useReducer2[1];
112
252
  useEffect(function () {
113
- componentEvents.current = {
114
- onSelect: onSelect,
115
- onChecked: onChecked
116
- };
117
- }, [onSelect, onChecked]);
118
- useEffect(function () {
253
+ var _intialExpand$current3;
119
254
  dispatch({
120
255
  type: "load",
121
256
  items: itemList
122
257
  });
258
+ itemList.length && ((_intialExpand$current3 = intialExpand.current) === null || _intialExpand$current3 === void 0 ? void 0 : _intialExpand$current3.length) > 0 && dispatch({
259
+ type: "expand",
260
+ id: intialExpand.current.shift()
261
+ });
262
+ selected && dispatch({
263
+ type: "select",
264
+ id: selected
265
+ });
266
+ checked && dispatch({
267
+ type: "checked",
268
+ id: checked
269
+ });
123
270
  }, [itemList]);
124
271
  useEffect(function () {
125
272
  selected && dispatch({
@@ -146,9 +293,11 @@ var useTree = function useTree(_ref) {
146
293
  });
147
294
  }, []);
148
295
  var select = useCallback(function (id) {
296
+ var shiftKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
149
297
  dispatch({
150
- type: "select",
151
- id: id
298
+ type: "toggleSelect",
299
+ id: id,
300
+ shiftKey: shiftKey
152
301
  });
153
302
  }, []);
154
303
  var expand = useCallback(function (id) {
@@ -157,6 +306,15 @@ var useTree = function useTree(_ref) {
157
306
  id: id
158
307
  });
159
308
  }, []);
309
+ var expandAndLoad = useCallback(function (expandList) {
310
+ if (expandList.length > 0) {
311
+ intialExpand.current = _toConsumableArray(expandList);
312
+ dispatch({
313
+ type: "expand",
314
+ id: intialExpand.current.shift()
315
+ });
316
+ }
317
+ }, []);
160
318
  var expandAll = useCallback(function () {
161
319
  dispatch({
162
320
  type: "expandAll"
@@ -172,13 +330,16 @@ var useTree = function useTree(_ref) {
172
330
  type: "filter",
173
331
  query: query
174
332
  });
175
- }, []);
333
+ }, [], 300);
176
334
  return {
177
335
  tree: state.tree,
336
+ query: state.query,
337
+ selected: state.selected,
178
338
  toggleExpand: toggleExpand,
179
339
  expandAll: expandAll,
180
340
  collapseAll: collapseAll,
181
341
  toggleCheck: toggleCheck,
342
+ expandAndLoad: expandAndLoad,
182
343
  select: select,
183
344
  expand: expand,
184
345
  onFilter: onFilter
@@ -2,11 +2,11 @@
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
5
- import { isString, matchString, compareValues } from '@react-fabric/utilities';
5
+ import { isArray, 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,33 +81,51 @@ 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
  };
83
- var updateSelection = function updateSelection(nodes, id, selected) {
84
- var node = nodes.get(id);
98
+ var selectNode = function selectNode(nodes, id) {
99
+ var node = nodes.get(id !== null && id !== void 0 ? id : "");
85
100
  if (node) {
86
101
  // change selection
87
- node.selected = selected;
102
+ node.selected = true;
88
103
  // update all parent childSelected flag
89
104
  var parent = node.parent;
90
105
  while (parent) {
91
106
  var parentNode = nodes.get(parent);
92
- parentNode && (parentNode.childSelected = selected);
93
- selected && parentNode && (parentNode.open = true);
107
+ parentNode && (parentNode.childSelected = true);
108
+ // selected && parentNode && (parentNode.open = true);
94
109
  parent = parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent;
95
110
  }
96
111
  }
97
112
  };
98
- var updateChecked = function updateChecked(list, id) {
113
+ var updateSelection = function updateSelection(_ref2) {
114
+ var nodes = _ref2.nodes,
115
+ multiple = _ref2.multiple,
116
+ selected = _ref2.selected;
117
+ nodes.forEach(function (node) {
118
+ node.selected = undefined;
119
+ node.childSelected = undefined;
120
+ });
121
+ multiple && isArray(selected) ? selected === null || selected === void 0 ? void 0 : selected.forEach(function (id) {
122
+ return selectNode(nodes, id);
123
+ }) : selectNode(nodes, selected);
124
+ };
125
+ var updateChecked = function updateChecked(list, id, checked) {
99
126
  var node = list.get(id);
100
127
  if (node) {
101
- node.checked = node.checked === 1 ? 0 : 1;
128
+ node.checked = (checked !== null && checked !== void 0 ? checked : node.checked === 0) ? 1 : 0;
102
129
  // check all children
103
130
  node.children && getChildren(node.children).forEach(function (child) {
104
131
  return child.checked = node.checked;