@elliemae/ds-treeview 2.0.1 → 2.1.0-rc.3

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 (167) hide show
  1. package/cjs/TreeView.js +5 -103
  2. package/cjs/TreeViewContext.js +44 -47
  3. package/cjs/config/useTreeview.js +137 -0
  4. package/cjs/index.js +1 -7
  5. package/cjs/parts/CheckboxSelectable.js +7 -9
  6. package/cjs/parts/ExpandCaret.js +17 -11
  7. package/cjs/parts/Icon.js +4 -0
  8. package/cjs/parts/NestingSpace.js +15 -22
  9. package/cjs/parts/RadioSelectable.js +7 -9
  10. package/cjs/parts/TreeItem.js +16 -13
  11. package/cjs/parts/TreeList.js +6 -4
  12. package/cjs/plugins/dnd/TreeDndPlugin.js +1 -1
  13. package/cjs/react-desc-prop-types.js +28 -27
  14. package/cjs/related-components/TreeViewSearchBar.js +9 -1
  15. package/cjs/{deprecated/plugins/selectable/helper.js → sharedTypes.js} +0 -0
  16. package/cjs/utils/dnd-helpers.js +2 -4
  17. package/cjs/utils/group-expands-helpers.js +34 -8
  18. package/cjs/utils/keyboard-helpers.js +64 -60
  19. package/cjs/utils/object-helpers.js +25 -7
  20. package/cjs/utils/refs-helpers.js +2 -2
  21. package/cjs/utils/selectable-helper.js +2 -2
  22. package/cjs/utils/tree-helpers.js +42 -27
  23. package/cjs/utils/useDnDHelpers.js +107 -100
  24. package/cjs/utils/useInstanceRefActions.js +3 -2
  25. package/cjs/utils/useTree.js +27 -8
  26. package/esm/TreeView.js +6 -103
  27. package/esm/TreeViewContext.js +44 -47
  28. package/esm/config/useTreeview.js +129 -0
  29. package/esm/index.js +0 -8
  30. package/esm/parts/CheckboxSelectable.js +7 -9
  31. package/esm/parts/ExpandCaret.js +17 -11
  32. package/esm/parts/Icon.js +4 -0
  33. package/esm/parts/NestingSpace.js +15 -21
  34. package/esm/parts/RadioSelectable.js +7 -9
  35. package/esm/parts/TreeItem.js +16 -13
  36. package/esm/parts/TreeList.js +6 -4
  37. package/esm/plugins/dnd/TreeDndPlugin.js +1 -1
  38. package/esm/react-desc-prop-types.js +28 -27
  39. package/esm/related-components/TreeViewSearchBar.js +9 -1
  40. package/esm/{deprecated/plugins/selectable/helper.js → sharedTypes.js} +0 -0
  41. package/esm/utils/dnd-helpers.js +2 -4
  42. package/esm/utils/group-expands-helpers.js +34 -9
  43. package/esm/utils/keyboard-helpers.js +62 -58
  44. package/esm/utils/object-helpers.js +25 -7
  45. package/esm/utils/refs-helpers.js +2 -2
  46. package/esm/utils/selectable-helper.js +2 -2
  47. package/esm/utils/tree-helpers.js +42 -27
  48. package/esm/utils/useDnDHelpers.js +107 -100
  49. package/esm/utils/useInstanceRefActions.js +3 -2
  50. package/esm/utils/useTree.js +27 -8
  51. package/package.json +17 -128
  52. package/types/TreeView.d.ts +4 -148
  53. package/types/TreeViewContext.d.ts +4 -106
  54. package/types/config/useTreeview.d.ts +7 -0
  55. package/types/index.d.ts +0 -1
  56. package/types/parts/CheckboxSelectable.d.ts +5 -6
  57. package/types/parts/ChildrenCountDisplayer.d.ts +6 -6
  58. package/types/parts/ExpandCaret.d.ts +6 -6
  59. package/types/parts/Icon.d.ts +7 -5
  60. package/types/parts/NestingSpace.d.ts +3 -8
  61. package/types/parts/RadioSelectable.d.ts +5 -6
  62. package/types/parts/TreeItem.d.ts +22 -14
  63. package/types/parts/TreeItemText.d.ts +5 -5
  64. package/types/parts/TreeList.d.ts +22 -9
  65. package/types/react-desc-prop-types.d.ts +124 -43
  66. package/types/related-components/TreeViewSearchBar.d.ts +14 -11
  67. package/types/sharedTypes.d.ts +54 -0
  68. package/types/utils/array-helpers.d.ts +2 -2
  69. package/types/utils/dnd-helpers.d.ts +26 -25
  70. package/types/utils/group-expands-helpers.d.ts +13 -10
  71. package/types/utils/keyboard-helpers.d.ts +5 -3
  72. package/types/utils/object-helpers.d.ts +6 -2
  73. package/types/utils/refs-helpers.d.ts +4 -1
  74. package/types/utils/selectable-helper.d.ts +7 -3
  75. package/types/utils/string-helpers.d.ts +1 -1
  76. package/types/utils/tree-helpers.d.ts +25 -11
  77. package/types/utils/useDnDHelpers.d.ts +23 -3
  78. package/types/utils/useInstanceRefActions.d.ts +3 -3
  79. package/types/utils/useTree.d.ts +8 -7
  80. package/cjs/deprecated/TreeView.js +0 -72
  81. package/cjs/deprecated/__testUtils__/utils.js +0 -89
  82. package/cjs/deprecated/index.js +0 -27
  83. package/cjs/deprecated/plugins/dnd/TreeDndPlugin.js +0 -119
  84. package/cjs/deprecated/plugins/dnd/index.js +0 -9
  85. package/cjs/deprecated/plugins/dnd/renderers/DraggableItem.js +0 -67
  86. package/cjs/deprecated/plugins/dnd/renderers/DroppableList.js +0 -181
  87. package/cjs/deprecated/plugins/dnd/utils.js +0 -157
  88. package/cjs/deprecated/plugins/index.js +0 -21
  89. package/cjs/deprecated/plugins/roving/TreeRovingPlugin.js +0 -109
  90. package/cjs/deprecated/plugins/roving/index.js +0 -9
  91. package/cjs/deprecated/plugins/searchable/SearchableTreePlugin.js +0 -109
  92. package/cjs/deprecated/plugins/searchable/index.js +0 -9
  93. package/cjs/deprecated/plugins/searchable/utils.js +0 -7
  94. package/cjs/deprecated/plugins/selectable/SelectablePluginTree.js +0 -290
  95. package/cjs/deprecated/plugins/selectable/index.js +0 -9
  96. package/cjs/deprecated/plugins/selectable/utils.js +0 -19
  97. package/cjs/deprecated/plugins/toolbar/TreeToolbarPlugin.js +0 -128
  98. package/cjs/deprecated/plugins/toolbar/index.js +0 -9
  99. package/cjs/deprecated/plugins/tree/TreeDataPlugin.js +0 -281
  100. package/cjs/deprecated/plugins/tree/index.js +0 -9
  101. package/cjs/deprecated/plugins/tree/useExpandTreeState.js +0 -143
  102. package/cjs/deprecated/plugins/tree/utils.js +0 -43
  103. package/cjs/deprecated/plugins/tree/walkTreeStrategy.js +0 -60
  104. package/cjs/deprecated/plugins/virtualization/TreeVirtualizationPlugin.js +0 -209
  105. package/cjs/deprecated/plugins/virtualization/index.js +0 -9
  106. package/cjs/deprecated/renderers.js +0 -76
  107. package/cjs/prop-types.js +0 -61
  108. package/esm/deprecated/TreeView.js +0 -61
  109. package/esm/deprecated/__testUtils__/utils.js +0 -79
  110. package/esm/deprecated/index.js +0 -14
  111. package/esm/deprecated/plugins/dnd/TreeDndPlugin.js +0 -110
  112. package/esm/deprecated/plugins/dnd/index.js +0 -1
  113. package/esm/deprecated/plugins/dnd/renderers/DraggableItem.js +0 -59
  114. package/esm/deprecated/plugins/dnd/renderers/DroppableList.js +0 -172
  115. package/esm/deprecated/plugins/dnd/utils.js +0 -139
  116. package/esm/deprecated/plugins/index.js +0 -7
  117. package/esm/deprecated/plugins/roving/TreeRovingPlugin.js +0 -96
  118. package/esm/deprecated/plugins/roving/index.js +0 -1
  119. package/esm/deprecated/plugins/searchable/SearchableTreePlugin.js +0 -99
  120. package/esm/deprecated/plugins/searchable/index.js +0 -1
  121. package/esm/deprecated/plugins/searchable/utils.js +0 -3
  122. package/esm/deprecated/plugins/selectable/SelectablePluginTree.js +0 -280
  123. package/esm/deprecated/plugins/selectable/index.js +0 -1
  124. package/esm/deprecated/plugins/selectable/utils.js +0 -15
  125. package/esm/deprecated/plugins/toolbar/TreeToolbarPlugin.js +0 -114
  126. package/esm/deprecated/plugins/toolbar/index.js +0 -1
  127. package/esm/deprecated/plugins/tree/TreeDataPlugin.js +0 -269
  128. package/esm/deprecated/plugins/tree/index.js +0 -1
  129. package/esm/deprecated/plugins/tree/useExpandTreeState.js +0 -135
  130. package/esm/deprecated/plugins/tree/utils.js +0 -28
  131. package/esm/deprecated/plugins/tree/walkTreeStrategy.js +0 -56
  132. package/esm/deprecated/plugins/virtualization/TreeVirtualizationPlugin.js +0 -197
  133. package/esm/deprecated/plugins/virtualization/index.js +0 -1
  134. package/esm/deprecated/renderers.js +0 -59
  135. package/esm/prop-types.js +0 -46
  136. package/types/deprecated/TreeView.d.ts +0 -8
  137. package/types/deprecated/__testUtils__/utils.d.ts +0 -72
  138. package/types/deprecated/index.d.ts +0 -2
  139. package/types/deprecated/plugins/dnd/TreeDndPlugin.d.ts +0 -1
  140. package/types/deprecated/plugins/dnd/index.d.ts +0 -1
  141. package/types/deprecated/plugins/dnd/renderers/DraggableItem.d.ts +0 -3
  142. package/types/deprecated/plugins/dnd/renderers/DroppableList.d.ts +0 -6
  143. package/types/deprecated/plugins/dnd/tests/TreeDndPlugin.test.d.ts +0 -0
  144. package/types/deprecated/plugins/dnd/utils.d.ts +0 -28
  145. package/types/deprecated/plugins/index.d.ts +0 -7
  146. package/types/deprecated/plugins/roving/TreeRovingPlugin.d.ts +0 -1
  147. package/types/deprecated/plugins/roving/index.d.ts +0 -1
  148. package/types/deprecated/plugins/searchable/SearchableTreePlugin.d.ts +0 -1
  149. package/types/deprecated/plugins/searchable/index.d.ts +0 -1
  150. package/types/deprecated/plugins/searchable/utils.d.ts +0 -1
  151. package/types/deprecated/plugins/selectable/SelectablePluginTree.d.ts +0 -1
  152. package/types/deprecated/plugins/selectable/helper.d.ts +0 -0
  153. package/types/deprecated/plugins/selectable/index.d.ts +0 -1
  154. package/types/deprecated/plugins/selectable/tests/SelectablePluginTree.test.d.ts +0 -1
  155. package/types/deprecated/plugins/selectable/utils.d.ts +0 -1
  156. package/types/deprecated/plugins/toolbar/TreeToolbarPlugin.d.ts +0 -1
  157. package/types/deprecated/plugins/toolbar/index.d.ts +0 -1
  158. package/types/deprecated/plugins/tree/TreeDataPlugin.d.ts +0 -1
  159. package/types/deprecated/plugins/tree/index.d.ts +0 -1
  160. package/types/deprecated/plugins/tree/tests/TreeDataPlugin.test.d.ts +0 -1
  161. package/types/deprecated/plugins/tree/useExpandTreeState.d.ts +0 -14
  162. package/types/deprecated/plugins/tree/utils.d.ts +0 -8
  163. package/types/deprecated/plugins/tree/walkTreeStrategy.d.ts +0 -9
  164. package/types/deprecated/plugins/virtualization/TreeVirtualizationPlugin.d.ts +0 -1
  165. package/types/deprecated/plugins/virtualization/index.d.ts +0 -1
  166. package/types/deprecated/renderers.d.ts +0 -19
  167. package/types/prop-types.d.ts +0 -26
package/cjs/TreeView.js CHANGED
@@ -3,128 +3,30 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _jsx = require('@babel/runtime/helpers/jsx');
6
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
- require('core-js/modules/web.dom-collections.iterator.js');
8
- require('core-js/modules/esnext.async-iterator.filter.js');
9
- require('core-js/modules/esnext.iterator.constructor.js');
10
- require('core-js/modules/esnext.iterator.filter.js');
11
- require('core-js/modules/esnext.async-iterator.for-each.js');
12
- require('core-js/modules/esnext.iterator.for-each.js');
13
- var React = require('react');
14
- var reactVirtual = require('react-virtual');
15
- var uuid = require('uuid');
6
+ require('react');
16
7
  var reactDesc = require('react-desc');
17
8
  var reactDescPropTypes = require('./react-desc-prop-types.js');
18
9
  var TreeViewContext = require('./TreeViewContext.js');
19
10
  var TreeDndPlugin = require('./plugins/dnd/TreeDndPlugin.js');
20
- var useTree = require('./utils/useTree.js');
11
+ var useTreeview = require('./config/useTreeview.js');
21
12
  var TreeList = require('./parts/TreeList.js');
22
- var groupExpandsHelpers = require('./utils/group-expands-helpers.js');
23
- var useInstanceRefActions = require('./utils/useInstanceRefActions.js');
24
- var keyboardHelpers = require('./utils/keyboard-helpers.js');
25
13
 
26
14
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
27
15
 
28
16
  var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
29
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
30
17
 
31
18
  var _TreeDnD, _TreeList;
32
-
33
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
34
-
35
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
36
19
  function TreeView(props) {
37
- const treeRef = React.useRef({
38
- actions: {}
39
- });
40
20
  const {
41
- data,
42
- plugins,
43
- onOrderChange,
44
- isMultiSelect,
45
- isSingleSelect,
46
- instanceRef,
47
- selection
21
+ plugins
48
22
  } = props;
49
- const [isDragging, setIsDragging] = React.useState(false);
50
- const [isKeyboardDragging, setIsKeyboardDragging] = React.useState(false);
51
- const [draggedItem, setDraggedItem] = React.useState(null);
52
- const [hoverItem, setHoverItem] = React.useState(null);
53
- const [relativeMouseCord, setRelativeMouseCord] = React.useState(TreeViewContext.defaultRelativeMouseCoord);
54
- const [uniqueTreeViewUUID] = React.useState(uuid.v4());
55
- const [latestToggledItem, setLatestToggledItem] = React.useState(null);
56
- const [selectedItem, setSelectedItem] = React.useState(null);
57
- const [focusedItem, setFocusedItem] = React.useState(null);
58
- const [selectedCheckboxes, setSelectedCheckboxes] = React.useState(_objectSpread({}, selection));
59
- const [expandedGroups, setExpandedGroups] = React.useState({});
60
23
  const {
61
- visibleItems,
62
- tree,
63
- treeRoot,
64
- triggerTreeRerender
65
- } = useTree.useTree(data, props, {
66
- setExpandedGroups
67
- });
68
- const virtualListRef = React.useRef(); // estimateSize should not be really required given what was stated on
69
- // https://github.com/tannerlinsley/react-virtual/issues/23
70
-
71
- const virtualListHelpers = reactVirtual.useVirtual({
72
- size: visibleItems.length,
73
- parentRef: virtualListRef,
74
- overscan: 15
75
- });
76
- const withDragAndDrop = (plugins === null || plugins === void 0 ? void 0 : plugins.includes(TreeDndPlugin.TreeDndPlugin)) && onOrderChange;
77
- const withRadioChecks = isSingleSelect && !isMultiSelect;
78
- const withCheckboxChecks = !isSingleSelect && isMultiSelect;
79
- const ctx = {
80
- props,
81
- setRelativeMouseCord,
82
- relativeMouseCord,
83
- virtualListHelpers,
84
- virtualListRef,
85
- tree,
86
- treeRoot,
87
- visibleItems,
88
- triggerTreeRerender,
89
- isDragging,
90
- setIsDragging,
91
- isKeyboardDragging,
92
- setIsKeyboardDragging,
93
- draggedItem,
94
- setDraggedItem,
95
- withRadioChecks,
96
- withCheckboxChecks,
97
- withDragAndDrop,
98
- uniqueTreeViewUUID,
99
- selectedCheckboxes,
100
- setSelectedCheckboxes,
101
- selectedItem,
102
- setSelectedItem,
103
- expandedGroups,
104
- setExpandedGroups,
105
- latestToggledItem,
106
- setLatestToggledItem,
107
- focusedItem,
108
- setFocusedItem,
109
- hoverItem,
110
- setHoverItem
111
- }; // this hooks can't use the context because the context provider doesn't wrap this
112
- // as such we manually pass the second parameter as fit
113
-
114
- if (instanceRef) instanceRef.current = treeRef.current;
115
- useInstanceRefActions.useInstanceRefActions(treeRef.current, ctx);
116
- keyboardHelpers.useGlobalToggleAllExpandShortcut(treeRoot, triggerTreeRerender, setLatestToggledItem);
117
- groupExpandsHelpers.useNotifyExpandedChange(props, ctx);
118
- React.useEffect(() => {
119
- setTimeout(() => {
120
- ctx.props.onInstanceRefInitialized(treeRef);
121
- }, 100);
122
- }, []);
24
+ ctx
25
+ } = useTreeview.useTreeview(props);
123
26
  return /*#__PURE__*/_jsx__default["default"](TreeViewContext["default"].Provider, {
124
27
  value: ctx
125
28
  }, void 0, plugins !== null && plugins !== void 0 && plugins.includes(TreeDndPlugin.TreeDndPlugin) ? _TreeDnD || (_TreeDnD = /*#__PURE__*/_jsx__default["default"](TreeDndPlugin.TreeDnD, {})) : _TreeList || (_TreeList = /*#__PURE__*/_jsx__default["default"](TreeList.TreeList, {})));
126
29
  }
127
- TreeView.defaultProps = TreeViewContext.defaultProps;
128
30
  const TreeViewWithSchema = reactDesc.describe(TreeView);
129
31
  TreeViewWithSchema.propTypes = reactDescPropTypes.TreeViewPropTypes;
130
32
 
@@ -5,15 +5,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
 
7
7
  /* eslint-disable no-unused-vars */
8
- // import FilePdf from '@elliemae/ds-icons/FilePdf';
8
+
9
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
+ function noop() {}
9
11
 
10
12
  const defaultProps = {
11
13
  plugins: [],
12
14
  selection: {},
13
- // { [id]:[state] } -> e.g. {1:true, 2:'mixed'}
14
15
  instanceRef: /*#__PURE__*/React.createRef(),
15
- disableGroups: false,
16
- disableLeafs: false,
16
+ isItemDisabled: () => false,
17
17
  disableIcons: false,
18
18
  fluid: false,
19
19
  isMultiSelect: false,
@@ -23,30 +23,27 @@ const defaultProps = {
23
23
  sortable: false,
24
24
  isLoading: false,
25
25
  highlightOnlyQuery: false,
26
- onInstanceRefInitialized: istanceRef => {},
27
- onItemClick: (item, e) => {},
28
- onItemFocus: params => {},
29
- // { itemIndex: number, scrollToItem: func }
30
- onVisibleItemsChange: newVisibleItems => {},
31
- onOrderChange: (newData, oldData, draggedItem) => {},
32
- onSelectionChange: (selectionHasmap, item, indexAndScrollTo) => {},
33
- // indexAndScrollTo = { scrollToItem: ()=>{}, itemIndex :number }
34
- onExpandChange: (expandedHashmap, itemToggled) => {},
35
- // expandedHashmap -> {[id]:true, ...[id]:true} itemToggled -> item that caused the change for being toggled
26
+ onItemClick: noop,
27
+ onItemFocus: noop,
28
+ onVisibleItemsChange: noop,
29
+ onOrderChange: noop,
30
+ onSelectionChange: noop,
31
+ onExpandChange: noop,
32
+ onInstanceRefInitialized: noop,
36
33
  rowSize: 'normal',
37
- // ['normal', 'compact']
38
34
  labelOverflow: 'wrap',
39
- // ['wrap', 'wrap-all', 'truncate']
40
35
  noItemsPlaceholder: 'No items found',
41
36
  nameKey: 'name',
42
- // use to retrieve the label text inside ever data item
43
37
  width: '100%',
44
38
  height: '100%',
45
39
  groupIcon: null,
46
- // <Folder />,
47
40
  itemIcon: null,
48
- // <FilePdf />,
49
- searchQuery: ''
41
+ searchQuery: '' // workaround on the typings over the fact that
42
+ // when we instantiate the context we can't have all the props
43
+ // we only have a part of them but the final typings will include missing props
44
+ // this is safe to do because
45
+ // we will "mergeWithDefaults" + "validatePropTypes" when we do instantiate the context
46
+
50
47
  };
51
48
  const defaultRelativeMouseCoord = {
52
49
  isBefore: false,
@@ -58,49 +55,49 @@ const defaultRelativeMouseCoord = {
58
55
  relativeElementDOMRect: null,
59
56
  relativeElementIndex: null
60
57
  };
61
- /** Context for cross component communication */
62
-
63
- const TreeViewContext = /*#__PURE__*/React.createContext({
58
+ const defaultContext = {
64
59
  props: defaultProps,
65
60
  visibleItems: [],
66
61
  withRadioChecks: false,
67
62
  withCheckboxChecks: false,
68
63
  withDragAndDrop: false,
69
64
  relativeMouseCord: defaultRelativeMouseCoord,
70
- setRelativeMouseCord: () => {},
71
- labelRenderer: value => value,
72
- triggerTreeRerender: () => {},
73
- tree: {},
74
- virtualListHelpers: {},
75
- virtualListRef: {},
76
- treeRoot: {},
65
+ setRelativeMouseCord: noop,
66
+ triggerTreeRerender: noop,
67
+ tree: undefined,
68
+ treeRoot: undefined,
69
+ virtualListHelpers: {
70
+ virtualItems: [],
71
+ totalSize: 0,
72
+ scrollToOffset: noop,
73
+ scrollToIndex: noop
74
+ },
75
+ virtualListRef: undefined,
77
76
  isDragging: false,
78
- setIsDragging: () => {},
77
+ setIsDragging: noop,
79
78
  isKeyboardDragging: false,
80
- setIsKeyboardDragging: () => {},
79
+ setIsKeyboardDragging: noop,
81
80
  draggedItem: null,
82
- // item
83
- setDraggedItem: () => {},
81
+ setDraggedItem: noop,
84
82
  uniqueTreeViewUUID: '',
85
83
  selectedItem: null,
86
- // item
87
- setSelectedItem: () => {},
84
+ setSelectedItem: noop,
88
85
  focusedItem: null,
89
- // item
90
- setFocusedItem: () => {},
86
+ setFocusedItem: noop,
91
87
  selectedCheckboxes: {},
92
- // { [id]:[state] } -> e.g. {1:true, 2:'mixed'}
93
- setSelectedCheckboxes: () => {},
88
+ setSelectedCheckboxes: noop,
94
89
  expandedGroups: {},
95
- // { [id]:true } -> e.g. {1:true, 2:true} // false are not listed
96
- setExpandedGroups: () => {},
90
+ setExpandedGroups: noop,
97
91
  latestToggledItem: null,
98
- // item -> if toggle all -> should be undefined
99
- setLatestToggledItem: () => {},
92
+ setLatestToggledItem: noop,
100
93
  hoverItem: null,
101
- // item
102
- setHoverItem: () => {}
103
- });
94
+ setHoverItem: noop,
95
+ handleExpandGroup: noop,
96
+ updateUserExpandedState: noop
97
+ };
98
+ /** Context for cross component communication */
99
+
100
+ const TreeViewContext = /*#__PURE__*/React.createContext(defaultContext);
104
101
 
105
102
  exports["default"] = TreeViewContext;
106
103
  exports.defaultProps = defaultProps;
@@ -0,0 +1,137 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
+ require('core-js/modules/web.dom-collections.iterator.js');
7
+ require('core-js/modules/esnext.async-iterator.filter.js');
8
+ require('core-js/modules/esnext.iterator.constructor.js');
9
+ require('core-js/modules/esnext.iterator.filter.js');
10
+ require('core-js/modules/esnext.async-iterator.for-each.js');
11
+ require('core-js/modules/esnext.iterator.for-each.js');
12
+ var React = require('react');
13
+ var reactVirtual = require('react-virtual');
14
+ var dsPropsHelpers = require('@elliemae/ds-props-helpers');
15
+ var uuid = require('uuid');
16
+ var reactDescPropTypes = require('../react-desc-prop-types.js');
17
+ var TreeViewContext = require('../TreeViewContext.js');
18
+ var TreeDndPlugin = require('../plugins/dnd/TreeDndPlugin.js');
19
+ var useTree = require('../utils/useTree.js');
20
+ var groupExpandsHelpers = require('../utils/group-expands-helpers.js');
21
+ var useInstanceRefActions = require('../utils/useInstanceRefActions.js');
22
+ var keyboardHelpers = require('../utils/keyboard-helpers.js');
23
+
24
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
25
+
26
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
27
+
28
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
29
+
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
31
+ const useTreeview = props => {
32
+ const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, TreeViewContext.defaultProps);
33
+ dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.TreeViewPropTypes);
34
+ const defaultActions = {
35
+ actions: {
36
+ toggleExpandAll: () => {},
37
+ scrollTo: () => {},
38
+ setSelectedItemByVirtualIndex: () => {},
39
+ setFocusedItemByVirtualIndex: () => {}
40
+ }
41
+ };
42
+ const treeRef = React.useRef(defaultActions);
43
+ const {
44
+ data,
45
+ plugins,
46
+ onOrderChange,
47
+ isMultiSelect,
48
+ isSingleSelect,
49
+ instanceRef,
50
+ selection,
51
+ onInstanceRefInitialized
52
+ } = propsWithDefault;
53
+ const [isDragging, setIsDragging] = React.useState(false);
54
+ const [isKeyboardDragging, setIsKeyboardDragging] = React.useState(false);
55
+ const [relativeMouseCord, setRelativeMouseCord] = React.useState(TreeViewContext.defaultRelativeMouseCoord);
56
+ const [uniqueTreeViewUUID] = React.useState(uuid.v4());
57
+ const [draggedItem, setDraggedItem] = React.useState(null);
58
+ const [hoverItem, setHoverItem] = React.useState(null);
59
+ const [latestToggledItem, setLatestToggledItem] = React.useState(null);
60
+ const [selectedItem, setSelectedItem] = React.useState(null);
61
+ const [focusedItem, setFocusedItem] = React.useState(null);
62
+ const [selectedCheckboxes, setSelectedCheckboxes] = React.useState(_objectSpread({}, selection));
63
+ const [expandedGroups, setExpandedGroups] = React.useState({});
64
+ const {
65
+ visibleItems,
66
+ tree,
67
+ treeRoot,
68
+ triggerTreeRerender,
69
+ updateUserExpandedState
70
+ } = useTree.useTree(data, propsWithDefault, {
71
+ setExpandedGroups
72
+ });
73
+ const virtualListRef = React.useRef(); // estimateSize should not be really required given what was stated on
74
+ // https://github.com/tannerlinsley/react-virtual/issues/23
75
+
76
+ const virtualListHelpers = reactVirtual.useVirtual({
77
+ size: visibleItems.length,
78
+ parentRef: virtualListRef,
79
+ overscan: 15
80
+ });
81
+ const withDragAndDrop = !!(plugins !== null && plugins !== void 0 && plugins.includes(TreeDndPlugin.TreeDndPlugin) && onOrderChange);
82
+ const withRadioChecks = isSingleSelect && !isMultiSelect;
83
+ const withCheckboxChecks = !isSingleSelect && isMultiSelect;
84
+ const handleExpandGroup = React.useCallback(groupExpandsHelpers.toggleItemExpand, []);
85
+ const ctx = React.useMemo(() => ({
86
+ props: propsWithDefault,
87
+ setRelativeMouseCord,
88
+ relativeMouseCord,
89
+ virtualListHelpers,
90
+ virtualListRef,
91
+ tree,
92
+ treeRoot,
93
+ visibleItems,
94
+ triggerTreeRerender,
95
+ isDragging,
96
+ setIsDragging,
97
+ isKeyboardDragging,
98
+ setIsKeyboardDragging,
99
+ draggedItem,
100
+ setDraggedItem,
101
+ withRadioChecks,
102
+ withCheckboxChecks,
103
+ withDragAndDrop,
104
+ uniqueTreeViewUUID,
105
+ selectedCheckboxes,
106
+ setSelectedCheckboxes,
107
+ selectedItem,
108
+ setSelectedItem,
109
+ expandedGroups,
110
+ setExpandedGroups,
111
+ latestToggledItem,
112
+ setLatestToggledItem,
113
+ focusedItem,
114
+ setFocusedItem,
115
+ hoverItem,
116
+ setHoverItem,
117
+ handleExpandGroup,
118
+ updateUserExpandedState
119
+ }), [draggedItem, expandedGroups, focusedItem, handleExpandGroup, hoverItem, isDragging, isKeyboardDragging, latestToggledItem, propsWithDefault, relativeMouseCord, selectedCheckboxes, selectedItem, tree, treeRoot, triggerTreeRerender, uniqueTreeViewUUID, virtualListHelpers, visibleItems, withCheckboxChecks, withDragAndDrop, withRadioChecks, updateUserExpandedState]); // this hooks can't use the context because the context provider doesn't wrap this
120
+ // as such we manually pass the second parameter as fit
121
+
122
+ if (instanceRef) instanceRef.current = treeRef.current;
123
+ useInstanceRefActions.useInstanceRefActions(treeRef.current, ctx);
124
+ keyboardHelpers.useGlobalToggleAllExpandShortcut(treeRoot, triggerTreeRerender, setLatestToggledItem, updateUserExpandedState);
125
+ groupExpandsHelpers.useNotifyExpandedChange(propsWithDefault, ctx); // this is an horrible hack.
126
+ // this is required because there is no "on rendered" react-way to check if every children has finished rendering
127
+ // this should be working for now, in the future we may want to review this for a better solution
128
+
129
+ React.useEffect(() => {
130
+ setTimeout(() => onInstanceRefInitialized(treeRef), 100); // eslint-disable-next-line react-hooks/exhaustive-deps
131
+ }, []);
132
+ return React.useMemo(() => ({
133
+ ctx
134
+ }), [ctx]);
135
+ };
136
+
137
+ exports.useTreeview = useTreeview;
package/cjs/index.js CHANGED
@@ -11,13 +11,8 @@ var TreeDataPlugin = require('./plugins/tree/TreeDataPlugin.js');
11
11
  var TreeVirtualizationPlugin = require('./plugins/virtualization/TreeVirtualizationPlugin.js');
12
12
  var SearchableTreePlugin = require('./plugins/searchable/SearchableTreePlugin.js');
13
13
  var TreeViewSearchBar = require('./related-components/TreeViewSearchBar.js');
14
- var index = require('./deprecated/index.js');
15
14
 
16
- /* eslint-disable global-require */
17
- // Polyfill ResizeObserver for demo
18
- if (typeof ResizeObserver === 'undefined') {
19
- global.ResizeObserver = require('resize-observer-polyfill').default;
20
- }
15
+
21
16
 
22
17
  exports.TreeView = TreeView.TreeView;
23
18
  exports.TreeViewWithSchema = TreeView.TreeViewWithSchema;
@@ -30,4 +25,3 @@ exports.TreePluginList = TreeDataPlugin.TreePluginList;
30
25
  exports.TreeVirtualizationPlugin = TreeVirtualizationPlugin.TreeVirtualizationPlugin;
31
26
  exports.SearchableTreePlugin = SearchableTreePlugin.SearchableTreePlugin;
32
27
  exports.TreeViewSearchBar = TreeViewSearchBar.TreeViewSearchBar;
33
- exports.DEPRECATED = index;
@@ -20,9 +20,9 @@ var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
20
20
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
21
21
  var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
22
22
 
23
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
23
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
24
24
 
25
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
25
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
26
26
  const StyledCheckboxWrapper = /*#__PURE__*/styled__default["default"].span.withConfig({
27
27
  componentId: "sc-1tyhs3t-0"
28
28
  })(["padding-top:3px;"]);
@@ -38,11 +38,8 @@ function CheckboxSelectable(props) {
38
38
  const ctx = React.useContext(TreeViewContext["default"]);
39
39
  const {
40
40
  props: {
41
- disableGroups,
42
- // radio allows disabling this, checkbox doesnt? check specs
43
- disableLeafs,
44
- // radio allows disabling this, checkbox doesnt? check specs
45
- onSelectionChange
41
+ onSelectionChange,
42
+ isItemDisabled
46
43
  },
47
44
  virtualListHelpers: {
48
45
  scrollToIndex
@@ -58,7 +55,7 @@ function CheckboxSelectable(props) {
58
55
  triggerTreeRerender();
59
56
  const indexAndScrollTo = {
60
57
  scrollToItem: () => {
61
- scrollToIndex(item.virtualIndex);
58
+ if (typeof item.virtualIndex === 'number') scrollToIndex(item.virtualIndex);
62
59
  },
63
60
  itemIndex
64
61
  };
@@ -75,9 +72,10 @@ function CheckboxSelectable(props) {
75
72
 
76
73
  return false;
77
74
  }, [selectedCheckboxes, id]);
75
+ const isDisabled = React.useMemo(() => isItemDisabled(item), [item, isItemDisabled]);
78
76
  return /*#__PURE__*/_jsx__default["default"](StyledCheckboxWrapper, {}, void 0, /*#__PURE__*/_jsx__default["default"](dsForm.DSCheckbox, {
79
77
  checked: isChecked,
80
- disabled: item.isGroup ? disableGroups : disableLeafs,
78
+ disabled: isDisabled,
81
79
  className: "em-ds-tree-item-checkbox",
82
80
  "data-testid": "tree-item-checkbox",
83
81
  onChange: onCheckboxChange,
@@ -35,6 +35,7 @@ const ExpandCaret = props => {
35
35
  },
36
36
  handleExpandGroup = defaultHandleExpandGroup,
37
37
  triggerTreeRerender,
38
+ updateUserExpandedState,
38
39
  setLatestToggledItem,
39
40
  setFocusedItem,
40
41
  virtualListHelpers: {
@@ -60,18 +61,23 @@ const ExpandCaret = props => {
60
61
  },
61
62
  onClick: e => {
62
63
  e.stopPropagation();
63
- handleExpandGroup(item, triggerTreeRerender, scrollToIndex, e);
64
+ if (e) handleExpandGroup(item, triggerTreeRerender, updateUserExpandedState, scrollToIndex, e);
64
65
  setLatestToggledItem(item);
65
- onItemFocus({
66
- itemIndex: item.virtualIndex,
67
- scrollToItem: function () {
68
- let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
69
- align: 'start'
70
- };
71
- return scrollToIndex(item.virtualIndex, opts);
72
- },
73
- item
74
- });
66
+ const itemVitualIndex = item.virtualIndex;
67
+
68
+ if (typeof itemVitualIndex === 'number') {
69
+ onItemFocus({
70
+ itemIndex: itemVitualIndex,
71
+ scrollToItem: function () {
72
+ let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
73
+ align: 'start'
74
+ };
75
+ return scrollToIndex(itemVitualIndex, opts);
76
+ },
77
+ item
78
+ });
79
+ }
80
+
75
81
  setFocusedItem(item);
76
82
  treeHelpers.focusItem(item);
77
83
  },
package/cjs/parts/Icon.js CHANGED
@@ -26,6 +26,10 @@ const Icon = props => {
26
26
  if (!icon) return null;
27
27
  return /*#__PURE__*/React__default["default"].cloneElement(icon, {
28
28
  'data-testid': isGroupOrHasChildrens ? 'tree-item-group-icon' : 'tree-item-icon',
29
+ // legacy class-name way of handling things,
30
+ // this will eventually be deprecated in favor of styled components
31
+ // untill then, just eslint-ignore and move on
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
29
33
  className: dsUtilities.cx(icon.props.className, 'tree-item-icon')
30
34
  });
31
35
  };
@@ -2,29 +2,17 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- require('core-js/modules/esnext.async-iterator.filter.js');
6
- require('core-js/modules/esnext.iterator.constructor.js');
7
- require('core-js/modules/esnext.iterator.filter.js');
8
- require('core-js/modules/esnext.async-iterator.for-each.js');
9
- require('core-js/modules/esnext.iterator.for-each.js');
10
5
  var _jsx = require('@babel/runtime/helpers/jsx');
11
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
12
6
  require('react');
13
7
 
14
8
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
15
9
 
16
10
  var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
17
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
18
-
19
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
20
-
21
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
11
 
23
12
  const getItemNestingLeftPadding = (level, opts) => {
24
13
  const {
25
14
  spaceForNestingLevel = 1.5
26
- } = _objectSpread({}, opts);
27
-
15
+ } = opts;
28
16
  const groupLeftPadding = spaceForNestingLevel * (level - 1);
29
17
  const finalLeftPadding = groupLeftPadding + spaceForNestingLevel - 0.1; // root level left-padding would be negative and would not be applied
30
18
  // if "root-level" nesting, then defaults to 0 left-padding.
@@ -40,15 +28,20 @@ const NestingSpace = props => {
40
28
  const {
41
29
  treeDepth
42
30
  } = item;
43
- const itemNestingLeftPadding = getItemNestingLeftPadding(treeDepth - 1, {
44
- spaceForNestingLevel
45
- });
46
- return /*#__PURE__*/_jsx__default["default"]("div", {
47
- "data-testid": "tree-item-nested-space",
48
- style: {
49
- width: itemNestingLeftPadding
50
- }
51
- });
31
+
32
+ if (treeDepth) {
33
+ const itemNestingLeftPadding = getItemNestingLeftPadding(treeDepth - 1, {
34
+ spaceForNestingLevel
35
+ });
36
+ return /*#__PURE__*/_jsx__default["default"]("div", {
37
+ "data-testid": "tree-item-nested-space",
38
+ style: {
39
+ width: itemNestingLeftPadding
40
+ }
41
+ });
42
+ }
43
+
44
+ return null;
52
45
  };
53
46
 
54
47
  exports.NestingSpace = NestingSpace;
@@ -17,11 +17,8 @@ function RadioSelectable(props) {
17
17
  const ctx = React.useContext(TreeViewContext["default"]);
18
18
  const {
19
19
  props: {
20
- disableGroups,
21
- // radio allows disabling this, checkbox doesnt? check specs
22
- disableLeafs,
23
- // radio allows disabling this, checkbox doesnt? check specs
24
- onSelectionChange
20
+ onSelectionChange,
21
+ isItemDisabled
25
22
  },
26
23
  virtualListHelpers: {
27
24
  scrollToIndex
@@ -40,21 +37,22 @@ function RadioSelectable(props) {
40
37
  setSelectedCheckboxes(newSelectionHasmap);
41
38
  const indexAndScrollTo = {
42
39
  scrollToItem: () => {
43
- scrollToIndex(item.virtualIndex);
40
+ if (item.virtualIndex) scrollToIndex(item.virtualIndex);
44
41
  },
45
42
  itemIndex
46
43
  };
47
44
  if (onSelectionChange) onSelectionChange(newSelectionHasmap, item, indexAndScrollTo);
48
- }, [item, id, onSelectionChange, scrollToIndex]);
45
+ }, [id, setSelectedCheckboxes, itemIndex, onSelectionChange, item, scrollToIndex]);
49
46
  const radioName = React.useMemo(() => "radios-".concat(uniqueTreeViewUUID), [uniqueTreeViewUUID]);
47
+ const isDisabled = React.useMemo(() => isItemDisabled(item), [item, isItemDisabled]);
50
48
  return /*#__PURE__*/_jsx__default["default"](dsForm.DSRadio, {
51
49
  checked: selectedCheckboxes[id] === true,
52
50
  name: radioName,
53
- disabled: item.isGroup ? disableGroups : disableLeafs,
51
+ disabled: isDisabled,
54
52
  className: "em-ds-tree-item-radio",
55
53
  "data-testid": "tree-item-radio",
56
54
  onChange: onRadioChange,
57
- tabIndex: "0"
55
+ tabIndex: 0
58
56
  });
59
57
  }
60
58