@elliemae/ds-treeview 2.0.2 → 2.1.0-rc.4
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.
- package/cjs/TreeView.js +5 -103
- package/cjs/TreeViewContext.js +44 -47
- package/cjs/config/useTreeview.js +137 -0
- package/cjs/index.js +1 -7
- package/cjs/parts/CheckboxSelectable.js +5 -7
- package/cjs/parts/ExpandCaret.js +17 -11
- package/cjs/parts/Icon.js +4 -0
- package/cjs/parts/NestingSpace.js +15 -22
- package/cjs/parts/RadioSelectable.js +7 -9
- package/cjs/parts/TreeItem.js +14 -11
- package/cjs/parts/TreeList.js +4 -2
- package/cjs/plugins/dnd/TreeDndPlugin.js +1 -1
- package/cjs/react-desc-prop-types.js +28 -27
- package/cjs/related-components/TreeViewSearchBar.js +9 -1
- package/cjs/{deprecated/plugins/selectable/helper.js → sharedTypes.js} +0 -0
- package/cjs/utils/dnd-helpers.js +2 -4
- package/cjs/utils/group-expands-helpers.js +34 -8
- package/cjs/utils/keyboard-helpers.js +64 -60
- package/cjs/utils/object-helpers.js +25 -7
- package/cjs/utils/refs-helpers.js +2 -2
- package/cjs/utils/tree-helpers.js +42 -27
- package/cjs/utils/useDnDHelpers.js +107 -100
- package/cjs/utils/useInstanceRefActions.js +3 -2
- package/cjs/utils/useTree.js +25 -6
- package/esm/TreeView.js +6 -103
- package/esm/TreeViewContext.js +44 -47
- package/esm/config/useTreeview.js +129 -0
- package/esm/index.js +0 -8
- package/esm/parts/CheckboxSelectable.js +5 -7
- package/esm/parts/ExpandCaret.js +17 -11
- package/esm/parts/Icon.js +4 -0
- package/esm/parts/NestingSpace.js +15 -21
- package/esm/parts/RadioSelectable.js +7 -9
- package/esm/parts/TreeItem.js +14 -11
- package/esm/parts/TreeList.js +4 -2
- package/esm/plugins/dnd/TreeDndPlugin.js +1 -1
- package/esm/react-desc-prop-types.js +28 -27
- package/esm/related-components/TreeViewSearchBar.js +9 -1
- package/esm/{deprecated/plugins/selectable/helper.js → sharedTypes.js} +0 -0
- package/esm/utils/dnd-helpers.js +2 -4
- package/esm/utils/group-expands-helpers.js +34 -9
- package/esm/utils/keyboard-helpers.js +62 -58
- package/esm/utils/object-helpers.js +25 -7
- package/esm/utils/refs-helpers.js +2 -2
- package/esm/utils/tree-helpers.js +42 -27
- package/esm/utils/useDnDHelpers.js +107 -100
- package/esm/utils/useInstanceRefActions.js +3 -2
- package/esm/utils/useTree.js +25 -6
- package/package.json +17 -128
- package/types/TreeView.d.ts +4 -148
- package/types/TreeViewContext.d.ts +4 -106
- package/types/config/useTreeview.d.ts +7 -0
- package/types/index.d.ts +0 -1
- package/types/parts/CheckboxSelectable.d.ts +5 -6
- package/types/parts/ChildrenCountDisplayer.d.ts +6 -6
- package/types/parts/ExpandCaret.d.ts +6 -6
- package/types/parts/Icon.d.ts +7 -5
- package/types/parts/NestingSpace.d.ts +3 -8
- package/types/parts/RadioSelectable.d.ts +5 -6
- package/types/parts/TreeItem.d.ts +22 -14
- package/types/parts/TreeItemText.d.ts +5 -5
- package/types/parts/TreeList.d.ts +22 -9
- package/types/react-desc-prop-types.d.ts +124 -43
- package/types/related-components/TreeViewSearchBar.d.ts +14 -11
- package/types/sharedTypes.d.ts +54 -0
- package/types/utils/array-helpers.d.ts +2 -2
- package/types/utils/dnd-helpers.d.ts +26 -25
- package/types/utils/group-expands-helpers.d.ts +13 -10
- package/types/utils/keyboard-helpers.d.ts +5 -3
- package/types/utils/object-helpers.d.ts +6 -2
- package/types/utils/refs-helpers.d.ts +4 -1
- package/types/utils/selectable-helper.d.ts +7 -3
- package/types/utils/string-helpers.d.ts +1 -1
- package/types/utils/tree-helpers.d.ts +25 -11
- package/types/utils/useDnDHelpers.d.ts +23 -3
- package/types/utils/useInstanceRefActions.d.ts +3 -3
- package/types/utils/useTree.d.ts +8 -7
- package/cjs/deprecated/TreeView.js +0 -72
- package/cjs/deprecated/__testUtils__/utils.js +0 -89
- package/cjs/deprecated/index.js +0 -27
- package/cjs/deprecated/plugins/dnd/TreeDndPlugin.js +0 -119
- package/cjs/deprecated/plugins/dnd/index.js +0 -9
- package/cjs/deprecated/plugins/dnd/renderers/DraggableItem.js +0 -67
- package/cjs/deprecated/plugins/dnd/renderers/DroppableList.js +0 -181
- package/cjs/deprecated/plugins/dnd/utils.js +0 -157
- package/cjs/deprecated/plugins/index.js +0 -21
- package/cjs/deprecated/plugins/roving/TreeRovingPlugin.js +0 -109
- package/cjs/deprecated/plugins/roving/index.js +0 -9
- package/cjs/deprecated/plugins/searchable/SearchableTreePlugin.js +0 -109
- package/cjs/deprecated/plugins/searchable/index.js +0 -9
- package/cjs/deprecated/plugins/searchable/utils.js +0 -7
- package/cjs/deprecated/plugins/selectable/SelectablePluginTree.js +0 -290
- package/cjs/deprecated/plugins/selectable/index.js +0 -9
- package/cjs/deprecated/plugins/selectable/utils.js +0 -19
- package/cjs/deprecated/plugins/toolbar/TreeToolbarPlugin.js +0 -128
- package/cjs/deprecated/plugins/toolbar/index.js +0 -9
- package/cjs/deprecated/plugins/tree/TreeDataPlugin.js +0 -281
- package/cjs/deprecated/plugins/tree/index.js +0 -9
- package/cjs/deprecated/plugins/tree/useExpandTreeState.js +0 -143
- package/cjs/deprecated/plugins/tree/utils.js +0 -43
- package/cjs/deprecated/plugins/tree/walkTreeStrategy.js +0 -60
- package/cjs/deprecated/plugins/virtualization/TreeVirtualizationPlugin.js +0 -209
- package/cjs/deprecated/plugins/virtualization/index.js +0 -9
- package/cjs/deprecated/renderers.js +0 -76
- package/cjs/prop-types.js +0 -61
- package/esm/deprecated/TreeView.js +0 -61
- package/esm/deprecated/__testUtils__/utils.js +0 -79
- package/esm/deprecated/index.js +0 -14
- package/esm/deprecated/plugins/dnd/TreeDndPlugin.js +0 -110
- package/esm/deprecated/plugins/dnd/index.js +0 -1
- package/esm/deprecated/plugins/dnd/renderers/DraggableItem.js +0 -59
- package/esm/deprecated/plugins/dnd/renderers/DroppableList.js +0 -172
- package/esm/deprecated/plugins/dnd/utils.js +0 -139
- package/esm/deprecated/plugins/index.js +0 -7
- package/esm/deprecated/plugins/roving/TreeRovingPlugin.js +0 -96
- package/esm/deprecated/plugins/roving/index.js +0 -1
- package/esm/deprecated/plugins/searchable/SearchableTreePlugin.js +0 -99
- package/esm/deprecated/plugins/searchable/index.js +0 -1
- package/esm/deprecated/plugins/searchable/utils.js +0 -3
- package/esm/deprecated/plugins/selectable/SelectablePluginTree.js +0 -280
- package/esm/deprecated/plugins/selectable/index.js +0 -1
- package/esm/deprecated/plugins/selectable/utils.js +0 -15
- package/esm/deprecated/plugins/toolbar/TreeToolbarPlugin.js +0 -114
- package/esm/deprecated/plugins/toolbar/index.js +0 -1
- package/esm/deprecated/plugins/tree/TreeDataPlugin.js +0 -269
- package/esm/deprecated/plugins/tree/index.js +0 -1
- package/esm/deprecated/plugins/tree/useExpandTreeState.js +0 -135
- package/esm/deprecated/plugins/tree/utils.js +0 -28
- package/esm/deprecated/plugins/tree/walkTreeStrategy.js +0 -56
- package/esm/deprecated/plugins/virtualization/TreeVirtualizationPlugin.js +0 -197
- package/esm/deprecated/plugins/virtualization/index.js +0 -1
- package/esm/deprecated/renderers.js +0 -59
- package/esm/prop-types.js +0 -46
- package/types/deprecated/TreeView.d.ts +0 -8
- package/types/deprecated/__testUtils__/utils.d.ts +0 -72
- package/types/deprecated/index.d.ts +0 -2
- package/types/deprecated/plugins/dnd/TreeDndPlugin.d.ts +0 -1
- package/types/deprecated/plugins/dnd/index.d.ts +0 -1
- package/types/deprecated/plugins/dnd/renderers/DraggableItem.d.ts +0 -3
- package/types/deprecated/plugins/dnd/renderers/DroppableList.d.ts +0 -6
- package/types/deprecated/plugins/dnd/tests/TreeDndPlugin.test.d.ts +0 -0
- package/types/deprecated/plugins/dnd/utils.d.ts +0 -28
- package/types/deprecated/plugins/index.d.ts +0 -7
- package/types/deprecated/plugins/roving/TreeRovingPlugin.d.ts +0 -1
- package/types/deprecated/plugins/roving/index.d.ts +0 -1
- package/types/deprecated/plugins/searchable/SearchableTreePlugin.d.ts +0 -1
- package/types/deprecated/plugins/searchable/index.d.ts +0 -1
- package/types/deprecated/plugins/searchable/utils.d.ts +0 -1
- package/types/deprecated/plugins/selectable/SelectablePluginTree.d.ts +0 -1
- package/types/deprecated/plugins/selectable/helper.d.ts +0 -0
- package/types/deprecated/plugins/selectable/index.d.ts +0 -1
- package/types/deprecated/plugins/selectable/tests/SelectablePluginTree.test.d.ts +0 -1
- package/types/deprecated/plugins/selectable/utils.d.ts +0 -1
- package/types/deprecated/plugins/toolbar/TreeToolbarPlugin.d.ts +0 -1
- package/types/deprecated/plugins/toolbar/index.d.ts +0 -1
- package/types/deprecated/plugins/tree/TreeDataPlugin.d.ts +0 -1
- package/types/deprecated/plugins/tree/index.d.ts +0 -1
- package/types/deprecated/plugins/tree/tests/TreeDataPlugin.test.d.ts +0 -1
- package/types/deprecated/plugins/tree/useExpandTreeState.d.ts +0 -14
- package/types/deprecated/plugins/tree/utils.d.ts +0 -8
- package/types/deprecated/plugins/tree/walkTreeStrategy.d.ts +0 -9
- package/types/deprecated/plugins/virtualization/TreeVirtualizationPlugin.d.ts +0 -1
- package/types/deprecated/plugins/virtualization/index.d.ts +0 -1
- package/types/deprecated/renderers.d.ts +0 -19
- package/types/prop-types.d.ts +0 -26
package/cjs/parts/TreeItem.js
CHANGED
|
@@ -36,9 +36,11 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
|
|
|
36
36
|
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; }
|
|
37
37
|
const TreeListItem = dsClassnames.aggregatedClasses('li', {
|
|
38
38
|
'data-testid': cssClassesConstants.treeItemBlockName,
|
|
39
|
-
role: 'treeitem'
|
|
39
|
+
role: 'treeitem' // temp fix untill we move to styled components
|
|
40
|
+
|
|
40
41
|
})(cssClassesConstants.treeItemBlockName);
|
|
41
|
-
const TreeListItemAddonsWrapper = dsClassnames.aggregatedClasses('div')(cssClassesConstants.treeItemBlockName, 'addons'
|
|
42
|
+
const TreeListItemAddonsWrapper = dsClassnames.aggregatedClasses('div')(cssClassesConstants.treeItemBlockName, 'addons' // temp fix untill we move to styled components
|
|
43
|
+
);
|
|
42
44
|
const DnDHandle = reactSortableHoc.SortableHandle(_ref => {
|
|
43
45
|
let {
|
|
44
46
|
id
|
|
@@ -72,7 +74,7 @@ const TreeItem = props => {
|
|
|
72
74
|
const {
|
|
73
75
|
nodeItemRef
|
|
74
76
|
} = node.model;
|
|
75
|
-
const openFolderOnHoverTimeout = React.useRef();
|
|
77
|
+
const openFolderOnHoverTimeout = React.useRef(null);
|
|
76
78
|
const [isDraggingOverThis, setIsDraggingOverThis] = React.useState(false);
|
|
77
79
|
const onItemKeyDown = keyboardHelpers.useOnItemKeyDown(item);
|
|
78
80
|
const ctx = React.useContext(TreeViewContext["default"]);
|
|
@@ -118,8 +120,8 @@ const TreeItem = props => {
|
|
|
118
120
|
if (isBefore) className += '-drop-before';else if (isAfter) className += '-drop-after';else className += '-drop-in';
|
|
119
121
|
return className;
|
|
120
122
|
}, [withDragAndDrop, relativeMouseCord, isDraggingOverThis]);
|
|
121
|
-
const selectedClassName = React.useMemo(() => (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id) === item.id ? 'selected' : '', [selectedItem]);
|
|
122
|
-
const hoverClassName = React.useMemo(() => (hoverItem === null || hoverItem === void 0 ? void 0 : hoverItem.id) !== item.id || withDragAndDrop && isDragging ? '' : 'hover', [hoverItem, withDragAndDrop, isDragging]);
|
|
123
|
+
const selectedClassName = React.useMemo(() => (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id) === item.id ? 'selected' : '', [item.id, selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id]);
|
|
124
|
+
const hoverClassName = React.useMemo(() => (hoverItem === null || hoverItem === void 0 ? void 0 : hoverItem.id) !== item.id || withDragAndDrop && isDragging ? '' : 'hover', [hoverItem === null || hoverItem === void 0 ? void 0 : hoverItem.id, item.id, withDragAndDrop, isDragging]);
|
|
123
125
|
const fixedHeightClassname = React.useMemo(() => {
|
|
124
126
|
if (labelOverflow === 'truncate') {
|
|
125
127
|
if (rowSize === 'compact') return "".concat(cssClassesConstants.DSTreeViewPrefix, "-").concat(cssClassesConstants.treeItemBlockName, "--fixed-height-compact");
|
|
@@ -133,21 +135,22 @@ const TreeItem = props => {
|
|
|
133
135
|
onItemClick(item, e);
|
|
134
136
|
setFocusedItem(item);
|
|
135
137
|
setSelectedItem(item);
|
|
138
|
+
const itemVirtualIndex = typeof item.virtualIndex === 'number' ? item.virtualIndex : -1;
|
|
136
139
|
onItemFocus({
|
|
137
|
-
itemIndex:
|
|
140
|
+
itemIndex: itemVirtualIndex,
|
|
138
141
|
scrollToItem: function () {
|
|
139
142
|
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
140
143
|
align: 'start'
|
|
141
144
|
};
|
|
142
|
-
return scrollToIndex(
|
|
145
|
+
return scrollToIndex(itemVirtualIndex, opts);
|
|
143
146
|
},
|
|
144
147
|
item
|
|
145
148
|
});
|
|
146
149
|
}, [item, scrollToIndex, onItemClick, onItemFocus, setSelectedItem, setFocusedItem]);
|
|
147
150
|
return /*#__PURE__*/jsxRuntime.jsxs(TreeListItem, {
|
|
148
|
-
tabIndex:
|
|
151
|
+
tabIndex: 0,
|
|
149
152
|
onMouseMove: event => {
|
|
150
|
-
if (withDragAndDrop) {
|
|
153
|
+
if (withDragAndDrop && onMouseDragOverItem) {
|
|
151
154
|
onMouseDragOverItem({
|
|
152
155
|
event,
|
|
153
156
|
item,
|
|
@@ -174,8 +177,8 @@ const TreeItem = props => {
|
|
|
174
177
|
ref: setItemRefs,
|
|
175
178
|
style: _objectSpread({}, itemWrapperStyle),
|
|
176
179
|
className: finalClassName,
|
|
177
|
-
"aria-expanded": item.isExpanded,
|
|
178
|
-
"aria-selected": selectedCheckboxes[item.id],
|
|
180
|
+
"aria-expanded": !!item.isExpanded,
|
|
181
|
+
"aria-selected": !!selectedCheckboxes[item.id],
|
|
179
182
|
"data-id": item.id,
|
|
180
183
|
"data-index": item.virtualIndex,
|
|
181
184
|
onKeyDown: onItemKeyDown,
|
package/cjs/parts/TreeList.js
CHANGED
|
@@ -16,8 +16,8 @@ var reactSortableHoc = require('@elliemae/react-sortable-hoc');
|
|
|
16
16
|
var dsClassnames = require('@elliemae/ds-classnames');
|
|
17
17
|
var dsCircularProgressIndicator = require('@elliemae/ds-circular-progress-indicator');
|
|
18
18
|
var TreeViewContext = require('../TreeViewContext.js');
|
|
19
|
-
var TreeItem = require('./TreeItem.js');
|
|
20
19
|
var cssClassesConstants = require('../config/cssClassesConstants.js');
|
|
20
|
+
var TreeItem = require('./TreeItem.js');
|
|
21
21
|
var jsxRuntime = require('react/jsx-runtime');
|
|
22
22
|
|
|
23
23
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -31,7 +31,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
31
31
|
const treeListNoItemsBn = "".concat(cssClassesConstants.treeListBlockName, "-no-items");
|
|
32
32
|
const TreeListNoItems = dsClassnames.aggregatedClasses('div', {
|
|
33
33
|
'data-testid': treeListNoItemsBn
|
|
34
|
-
})(treeListNoItemsBn);
|
|
34
|
+
})(treeListNoItemsBn); // React.ComponentProps<'ul'> uses LegacyRef typings that existed pre-hook era
|
|
35
|
+
// we omit the LegacyRef typings in favor of hook-era typings
|
|
36
|
+
|
|
35
37
|
const TreeListWrapper = dsClassnames.aggregatedClasses('ul', {
|
|
36
38
|
'data-testid': cssClassesConstants.treeListBlockName,
|
|
37
39
|
role: 'tree'
|
|
@@ -34,7 +34,7 @@ const TreeDnD = () => {
|
|
|
34
34
|
onSortStart: onSortStart,
|
|
35
35
|
onMouseDragOverItem: onMouseDragOverItem,
|
|
36
36
|
onSortEnd: onSortEnd,
|
|
37
|
-
getContainer: () => virtualListRef.current,
|
|
37
|
+
getContainer: () => virtualListRef === null || virtualListRef === void 0 ? void 0 : virtualListRef.current,
|
|
38
38
|
keyCodes: dndHelpers.keyCodes
|
|
39
39
|
});
|
|
40
40
|
};
|
|
@@ -5,49 +5,50 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var reactDesc = require('react-desc');
|
|
6
6
|
|
|
7
7
|
/* eslint-disable max-lines */
|
|
8
|
-
const InstanceActionsPropTypes = reactDesc.PropTypes.shape({
|
|
9
|
-
toggleExpandAll: reactDesc.PropTypes.func,
|
|
10
|
-
scrollTo: reactDesc.PropTypes.func
|
|
11
|
-
});
|
|
12
|
-
const TreeViewItemPropType = reactDesc.PropTypes.shape({
|
|
13
|
-
children: reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.object),
|
|
14
|
-
id: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.number]),
|
|
15
|
-
isGroup: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.oneOf([undefined, null]), reactDesc.PropTypes.bool]),
|
|
16
|
-
name: reactDesc.PropTypes.string,
|
|
17
|
-
node: reactDesc.PropTypes.object
|
|
18
|
-
});
|
|
19
|
-
const TreeViewInstancePropType = reactDesc.PropTypes.shape({
|
|
20
|
-
current: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.oneOf([null]), reactDesc.PropTypes.shape({
|
|
21
|
-
actions: InstanceActionsPropTypes.isRequired
|
|
22
|
-
})])
|
|
23
|
-
});
|
|
24
8
|
const TreeViewPropTypes = {
|
|
25
|
-
data: reactDesc.PropTypes.arrayOf(
|
|
9
|
+
data: reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.shape({
|
|
10
|
+
children: reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.object),
|
|
11
|
+
id: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.number]),
|
|
12
|
+
isGroup: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.oneOf([undefined, null]), reactDesc.PropTypes.bool]),
|
|
13
|
+
name: reactDesc.PropTypes.string,
|
|
14
|
+
node: reactDesc.PropTypes.object
|
|
15
|
+
})).description('data to populate tree view').isRequired,
|
|
26
16
|
plugins: reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.string).description('list of enabled plugins').defaultValue([]),
|
|
27
17
|
selection: reactDesc.PropTypes.object.description('pre selected items').defaultValue({}),
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
18
|
+
expanded: reactDesc.PropTypes.object.description('control what items are expanded').defaultValue(undefined),
|
|
19
|
+
instanceRef: reactDesc.PropTypes.shape({
|
|
20
|
+
current: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.oneOf([null, undefined]), reactDesc.PropTypes.shape({
|
|
21
|
+
actions: reactDesc.PropTypes.shape({
|
|
22
|
+
toggleExpandAll: reactDesc.PropTypes.func,
|
|
23
|
+
scrollTo: reactDesc.PropTypes.func
|
|
24
|
+
}).description('').isRequired
|
|
25
|
+
})])
|
|
26
|
+
}).description('instance ref'),
|
|
27
|
+
isItemDisabled: reactDesc.PropTypes.func.description('Function that receives an item, and returns whether that item should be disabled').defaultValue('() => false'),
|
|
31
28
|
disableIcons: reactDesc.PropTypes.bool.description('disable icons').defaultValue(false),
|
|
32
29
|
fluid: reactDesc.PropTypes.bool.description('whether is fluid or not').defaultValue(false),
|
|
33
30
|
isMultiSelect: reactDesc.PropTypes.bool.description('whether the tree view is multi select or not').defaultValue(false),
|
|
34
31
|
isSingleSelect: reactDesc.PropTypes.bool.description('wheter the tree view is single select or not').defaultValue(false),
|
|
32
|
+
isLoading: reactDesc.PropTypes.bool.description('wheter the tree should show the loading state or not').defaultValue(false),
|
|
35
33
|
restrictDragAndDrop: reactDesc.PropTypes.bool.description('whether to restrict DnD functionality or not').defaultValue(false),
|
|
36
34
|
showChildrenAmount: reactDesc.PropTypes.bool.description('whether to show the amount of children or not').defaultValue(false),
|
|
37
35
|
sortable: reactDesc.PropTypes.bool.description('whether the sortable functionality is active or not').defaultValue(false),
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
onItemClick: reactDesc.PropTypes.func.description('function executed when clicking on an item').defaultValue('() => {}'),
|
|
37
|
+
onItemFocus: reactDesc.PropTypes.func.description('function executed when focusing on an item').defaultValue('() => {}'),
|
|
38
|
+
onVisibleItemsChange: reactDesc.PropTypes.func.description('function executed when the visible items change').defaultValue('() => {}'),
|
|
39
|
+
onOrderChange: reactDesc.PropTypes.func.description('function executed when the items order changes').defaultValue('() => {}'),
|
|
40
|
+
onSelectionChange: reactDesc.PropTypes.func.description('function executed when the selection changes').defaultValue('() => {}'),
|
|
41
|
+
onExpandChange: reactDesc.PropTypes.func.description('function executed when expanding an item').defaultValue('() => {}'),
|
|
42
|
+
onInstanceRefInitialized: reactDesc.PropTypes.func.description('function executed when instanceRef has terminated instanciation').defaultValue('() => {}'),
|
|
45
43
|
rowSize: reactDesc.PropTypes.oneOf(['normal', 'compact']).description('size of the row').defaultValue('normal'),
|
|
44
|
+
labelOverflow: reactDesc.PropTypes.oneOf(['wrap', 'wrap-all', 'truncate']).description('label truncation preference').defaultValue('wrap'),
|
|
46
45
|
width: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.number, reactDesc.PropTypes.string]).description('components width').defaultValue('100%'),
|
|
47
46
|
height: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.number, reactDesc.PropTypes.string]).description('components height').defaultValue('100%'),
|
|
48
47
|
groupIcon: reactDesc.PropTypes.node.description('icon for groups'),
|
|
49
48
|
itemIcon: reactDesc.PropTypes.node.description('icon for items'),
|
|
50
49
|
searchQuery: reactDesc.PropTypes.string.description('search query value'),
|
|
50
|
+
noItemsPlaceholder: reactDesc.PropTypes.string.description('message to be shown when there are no items in the treeview to be displayed').defaultValue('No items found'),
|
|
51
|
+
name: reactDesc.PropTypes.string.description('property key to identifier for items labels').defaultValue('name'),
|
|
51
52
|
highlightOnlyQuery: reactDesc.PropTypes.bool.description('whether to highlight results or not').defaultValue(false)
|
|
52
53
|
};
|
|
53
54
|
|
|
@@ -35,6 +35,14 @@ function TreeViewSearchBar(props) {
|
|
|
35
35
|
totalResults: totalResults,
|
|
36
36
|
value: value
|
|
37
37
|
});
|
|
38
|
-
}
|
|
38
|
+
} // TreeViewSearchBar.propTypes = {
|
|
39
|
+
// value: PropTypes.string.isRequired,
|
|
40
|
+
// handleChange: PropTypes.func.isRequired,
|
|
41
|
+
// onNext: PropTypes.func.isRequired,
|
|
42
|
+
// onPrevious: PropTypes.func.isRequired,
|
|
43
|
+
// onClear: PropTypes.func.isRequired,
|
|
44
|
+
// currentResultIndex: PropTypes.number.isRequired,
|
|
45
|
+
// totalResults: PropTypes.number.isRequired,
|
|
46
|
+
// };
|
|
39
47
|
|
|
40
48
|
exports.TreeViewSearchBar = TreeViewSearchBar;
|
|
File without changes
|
package/cjs/utils/dnd-helpers.js
CHANGED
|
@@ -115,11 +115,9 @@ const isDropValid = _ref3 => {
|
|
|
115
115
|
const inferKeyboardKinshipDrop = _ref4 => {
|
|
116
116
|
let {
|
|
117
117
|
items,
|
|
118
|
-
newIndex
|
|
119
|
-
|
|
118
|
+
newIndex
|
|
120
119
|
} = _ref4;
|
|
121
|
-
const kinship = {};
|
|
122
|
-
|
|
120
|
+
const kinship = {};
|
|
123
121
|
const itemBefore = items[newIndex];
|
|
124
122
|
const itemBeforeModel = itemBefore.node.model;
|
|
125
123
|
const isGroupAndIsExpanded = itemBeforeModel.isExpanded && itemBeforeModel.children.length > 0;
|
|
@@ -5,8 +5,22 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var React = require('react');
|
|
6
6
|
|
|
7
7
|
/* eslint-disable max-params */
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const updateExpandedState = (treeRoot, onExpandChange) => {
|
|
9
|
+
const shouldContinueWalking = true;
|
|
10
|
+
const newExpandedHashMap = {
|
|
11
|
+
__ds_tree_root: true
|
|
12
|
+
};
|
|
13
|
+
treeRoot.walk(node => {
|
|
14
|
+
if (!node.isRoot() && node.model.isGroup && node.model.isExpanded) {
|
|
15
|
+
newExpandedHashMap[node.model.id] = true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return shouldContinueWalking;
|
|
19
|
+
});
|
|
20
|
+
if (onExpandChange) onExpandChange(newExpandedHashMap, null);
|
|
21
|
+
};
|
|
22
|
+
const toggleItemExpand = function (itemToToggle, triggerTreeRerender, updateUserExpandedState) {
|
|
23
|
+
let scrollTo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : () => {};
|
|
10
24
|
const {
|
|
11
25
|
node: {
|
|
12
26
|
model: {
|
|
@@ -19,8 +33,9 @@ const toggleItemExpand = function (itemToToggle, triggerTreeRerender) {
|
|
|
19
33
|
if (itemToToggle.node.model.isGroup) {
|
|
20
34
|
itemToToggle.node.model.isExpanded = !isExpanded;
|
|
21
35
|
triggerTreeRerender();
|
|
36
|
+
updateUserExpandedState();
|
|
22
37
|
setTimeout(() => {
|
|
23
|
-
scrollTo(virtualIndex, {
|
|
38
|
+
if (typeof virtualIndex === 'number') scrollTo(virtualIndex, {
|
|
24
39
|
align: 'start'
|
|
25
40
|
});
|
|
26
41
|
});
|
|
@@ -33,46 +48,56 @@ const collapseItemModel = modelToCollapse => {
|
|
|
33
48
|
if (modelToCollapse.isGroup) modelToCollapse.isExpanded = false;
|
|
34
49
|
};
|
|
35
50
|
const expandAll = (treeRoot, triggerTreeRerender) => {
|
|
51
|
+
const shouldContinueWalking = true;
|
|
36
52
|
treeRoot.walk(node => {
|
|
37
53
|
if (!node.isRoot()) expandItemModel(node.model);
|
|
54
|
+
return shouldContinueWalking;
|
|
38
55
|
});
|
|
39
56
|
triggerTreeRerender();
|
|
40
57
|
};
|
|
41
58
|
const collapseAll = (treeRoot, triggerTreeRerender) => {
|
|
59
|
+
const shouldContinueWalking = true; // tree-model ask we return true if we want to continue walking
|
|
60
|
+
|
|
42
61
|
treeRoot.walk(node => {
|
|
43
62
|
if (!node.isRoot()) collapseItemModel(node.model);
|
|
63
|
+
return shouldContinueWalking;
|
|
44
64
|
});
|
|
45
65
|
triggerTreeRerender();
|
|
46
66
|
};
|
|
47
67
|
const getToggleExpandShouldExpand = treeRoot => {
|
|
48
68
|
let shouldExpand = false;
|
|
69
|
+
const shouldContinueWalking = true; // tree-model ask we return true if we want to continue walking
|
|
70
|
+
|
|
49
71
|
treeRoot.walk(node => {
|
|
50
72
|
if (!node.isRoot()) {
|
|
51
73
|
if (!node.model.isExpanded && node.model.isGroup) {
|
|
52
74
|
shouldExpand = true; // eslint-disable-next-line no-useless-return
|
|
53
75
|
|
|
54
|
-
return;
|
|
76
|
+
return shouldContinueWalking;
|
|
55
77
|
}
|
|
56
78
|
}
|
|
79
|
+
|
|
80
|
+
return shouldContinueWalking;
|
|
57
81
|
});
|
|
58
82
|
return shouldExpand;
|
|
59
83
|
};
|
|
60
|
-
const toggleExpandAllHelper = (isExpand, treeRoot, triggerTreeRerender, setLatestToggledItem) => {
|
|
84
|
+
const toggleExpandAllHelper = (isExpand, treeRoot, triggerTreeRerender, setLatestToggledItem, updateUserExpandedState) => {
|
|
61
85
|
if (isExpand === true) expandAll(treeRoot, triggerTreeRerender);else if (isExpand === false) collapseAll(treeRoot, triggerTreeRerender);else {
|
|
62
86
|
const shouldExpand = getToggleExpandShouldExpand(treeRoot);
|
|
63
87
|
if (shouldExpand === true) expandAll(treeRoot, triggerTreeRerender);else collapseAll(treeRoot, triggerTreeRerender);
|
|
64
88
|
}
|
|
65
89
|
setLatestToggledItem(null);
|
|
90
|
+
updateUserExpandedState();
|
|
66
91
|
};
|
|
67
92
|
const useNotifyExpandedChange = (propsWithDefaults, _ref) => {
|
|
68
93
|
let {
|
|
69
94
|
latestToggledItem,
|
|
70
95
|
expandedGroups
|
|
71
96
|
} = _ref;
|
|
72
|
-
const notifyExpandedChange = React.useCallback(expandedGroupHashmap => propsWithDefaults.onExpandChange(expandedGroupHashmap, latestToggledItem), [propsWithDefaults, latestToggledItem]);
|
|
97
|
+
const notifyExpandedChange = React.useCallback(expandedGroupHashmap => propsWithDefaults === null || propsWithDefaults === void 0 ? void 0 : propsWithDefaults.onExpandChange(expandedGroupHashmap || {}, latestToggledItem), [propsWithDefaults, latestToggledItem]);
|
|
73
98
|
React.useEffect(() => {
|
|
74
|
-
notifyExpandedChange(expandedGroups);
|
|
75
|
-
}, [expandedGroups]);
|
|
99
|
+
if (!propsWithDefaults.expanded) notifyExpandedChange(expandedGroups);
|
|
100
|
+
}, [expandedGroups, notifyExpandedChange, propsWithDefaults.expanded]);
|
|
76
101
|
};
|
|
77
102
|
|
|
78
103
|
exports.collapseAll = collapseAll;
|
|
@@ -82,4 +107,5 @@ exports.expandItemModel = expandItemModel;
|
|
|
82
107
|
exports.getToggleExpandShouldExpand = getToggleExpandShouldExpand;
|
|
83
108
|
exports.toggleExpandAllHelper = toggleExpandAllHelper;
|
|
84
109
|
exports.toggleItemExpand = toggleItemExpand;
|
|
110
|
+
exports.updateExpandedState = updateExpandedState;
|
|
85
111
|
exports.useNotifyExpandedChange = useNotifyExpandedChange;
|
|
@@ -7,7 +7,8 @@ var TreeViewContext = require('../TreeViewContext.js');
|
|
|
7
7
|
var treeHelpers = require('./tree-helpers.js');
|
|
8
8
|
var groupExpandsHelpers = require('./group-expands-helpers.js');
|
|
9
9
|
|
|
10
|
-
/* eslint-disable max-
|
|
10
|
+
/* eslint-disable max-params */
|
|
11
|
+
// 9 tab
|
|
11
12
|
// 13 enter
|
|
12
13
|
// 32 space
|
|
13
14
|
// 37 left arrow
|
|
@@ -18,7 +19,6 @@ var groupExpandsHelpers = require('./group-expands-helpers.js');
|
|
|
18
19
|
// 36 home
|
|
19
20
|
// 56 number 8
|
|
20
21
|
// 106 (NumPad) *
|
|
21
|
-
|
|
22
22
|
const useOnItemKeyDown = item => {
|
|
23
23
|
const ctx = React.useContext(TreeViewContext["default"]);
|
|
24
24
|
const {
|
|
@@ -31,6 +31,7 @@ const useOnItemKeyDown = item => {
|
|
|
31
31
|
setFocusedItem,
|
|
32
32
|
setSelectedItem,
|
|
33
33
|
setLatestToggledItem,
|
|
34
|
+
updateUserExpandedState,
|
|
34
35
|
virtualListHelpers: {
|
|
35
36
|
scrollToIndex
|
|
36
37
|
}
|
|
@@ -48,7 +49,7 @@ const useOnItemKeyDown = item => {
|
|
|
48
49
|
return scrollToIndex(newFocusItem.virtualIndex, opts);
|
|
49
50
|
},
|
|
50
51
|
item: newFocusItem
|
|
51
|
-
}), [onItemFocus]);
|
|
52
|
+
}), [onItemFocus, scrollToIndex]);
|
|
52
53
|
const onItemKeyDown = React.useCallback(e => {
|
|
53
54
|
const {
|
|
54
55
|
keyCode
|
|
@@ -61,14 +62,14 @@ const useOnItemKeyDown = item => {
|
|
|
61
62
|
|
|
62
63
|
if (keyCode === 37) {
|
|
63
64
|
if (isGroup && isExpanded) {
|
|
64
|
-
groupExpandsHelpers.toggleItemExpand(item, triggerTreeRerender, scrollToIndex);
|
|
65
|
+
groupExpandsHelpers.toggleItemExpand(item, triggerTreeRerender, updateUserExpandedState, scrollToIndex);
|
|
65
66
|
setLatestToggledItem(item);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
if (keyCode === 39) {
|
|
70
71
|
if (isGroup && !isExpanded) {
|
|
71
|
-
groupExpandsHelpers.toggleItemExpand(item, triggerTreeRerender, scrollToIndex);
|
|
72
|
+
groupExpandsHelpers.toggleItemExpand(item, triggerTreeRerender, updateUserExpandedState, scrollToIndex);
|
|
72
73
|
setLatestToggledItem(item);
|
|
73
74
|
}
|
|
74
75
|
}
|
|
@@ -76,73 +77,76 @@ const useOnItemKeyDown = item => {
|
|
|
76
77
|
const {
|
|
77
78
|
virtualIndex
|
|
78
79
|
} = item;
|
|
79
|
-
const lastItemIndex = visibleItems.length - 1;
|
|
80
|
-
|
|
81
|
-
if (keyCode === 38) {
|
|
82
|
-
const isLoopedFocus = virtualIndex === 0;
|
|
83
|
-
const newFocusIndex = isLoopedFocus ? lastItemIndex : virtualIndex - 1;
|
|
84
|
-
const newFocusItem = visibleItems[newFocusIndex];
|
|
85
|
-
scrollToIndex(newFocusIndex);
|
|
86
80
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
81
|
+
if (typeof virtualIndex === 'number') {
|
|
82
|
+
const lastItemIndex = visibleItems.length - 1;
|
|
83
|
+
|
|
84
|
+
if (keyCode === 38) {
|
|
85
|
+
const isLoopedFocus = virtualIndex === 0;
|
|
86
|
+
const newFocusIndex = isLoopedFocus ? lastItemIndex : virtualIndex - 1;
|
|
87
|
+
const newFocusItem = visibleItems[newFocusIndex];
|
|
88
|
+
scrollToIndex(newFocusIndex);
|
|
89
|
+
|
|
90
|
+
if (isLoopedFocus) {
|
|
91
|
+
// when looping the list from start to end we need to wait a bit before focusing
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
setFocusedItem(newFocusItem);
|
|
94
|
+
treeHelpers.focusItem(newFocusItem);
|
|
95
|
+
onItemFocusCurry(newFocusItem);
|
|
96
|
+
}, 300);
|
|
97
|
+
} else {
|
|
90
98
|
setFocusedItem(newFocusItem);
|
|
91
|
-
treeHelpers.focusItem(newFocusItem);
|
|
92
99
|
onItemFocusCurry(newFocusItem);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
setFocusedItem(newFocusItem);
|
|
96
|
-
onItemFocusCurry(newFocusItem);
|
|
97
|
-
treeHelpers.focusItem(newFocusItem);
|
|
100
|
+
treeHelpers.focusItem(newFocusItem);
|
|
101
|
+
}
|
|
98
102
|
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (keyCode === 40) {
|
|
102
|
-
const isLoopedFocus = virtualIndex === lastItemIndex;
|
|
103
|
-
const newFocusIndex = isLoopedFocus ? 0 : virtualIndex + 1;
|
|
104
|
-
const newFocusItem = visibleItems[newFocusIndex];
|
|
105
|
-
scrollToIndex(newFocusIndex);
|
|
106
103
|
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
104
|
+
if (keyCode === 40) {
|
|
105
|
+
const isLoopedFocus = virtualIndex === lastItemIndex;
|
|
106
|
+
const newFocusIndex = isLoopedFocus ? 0 : virtualIndex + 1;
|
|
107
|
+
const newFocusItem = visibleItems[newFocusIndex];
|
|
108
|
+
scrollToIndex(newFocusIndex);
|
|
109
|
+
|
|
110
|
+
if (isLoopedFocus) {
|
|
111
|
+
// when looping the list from start to end we need to wait a bit before focusing
|
|
112
|
+
setTimeout(() => {
|
|
113
|
+
setFocusedItem(newFocusItem);
|
|
114
|
+
onItemFocusCurry(newFocusItem);
|
|
115
|
+
treeHelpers.focusItem(newFocusItem);
|
|
116
|
+
}, 300);
|
|
117
|
+
} else {
|
|
110
118
|
setFocusedItem(newFocusItem);
|
|
111
119
|
onItemFocusCurry(newFocusItem);
|
|
112
120
|
treeHelpers.focusItem(newFocusItem);
|
|
113
|
-
}
|
|
114
|
-
} else {
|
|
115
|
-
setFocusedItem(newFocusItem);
|
|
116
|
-
onItemFocusCurry(newFocusItem);
|
|
117
|
-
treeHelpers.focusItem(newFocusItem);
|
|
121
|
+
}
|
|
118
122
|
}
|
|
119
|
-
}
|
|
120
123
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
if (keyCode === 35) {
|
|
125
|
+
if (virtualIndex !== lastItemIndex) {
|
|
126
|
+
const newFocusItem = visibleItems[lastItemIndex];
|
|
127
|
+
scrollToIndex(lastItemIndex);
|
|
128
|
+
setTimeout(() => {
|
|
129
|
+
setFocusedItem(newFocusItem);
|
|
130
|
+
onItemFocusCurry(newFocusItem);
|
|
131
|
+
treeHelpers.focusItem(newFocusItem);
|
|
132
|
+
}, 300);
|
|
133
|
+
}
|
|
130
134
|
}
|
|
131
|
-
}
|
|
132
135
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
136
|
+
if (keyCode === 36) {
|
|
137
|
+
if (virtualIndex !== 0) {
|
|
138
|
+
const newFocusItem = visibleItems[0];
|
|
139
|
+
scrollToIndex(0);
|
|
140
|
+
setTimeout(() => {
|
|
141
|
+
setFocusedItem(newFocusItem);
|
|
142
|
+
onItemFocusCurry(newFocusItem);
|
|
143
|
+
treeHelpers.focusItem(newFocusItem);
|
|
144
|
+
}, 300);
|
|
145
|
+
}
|
|
142
146
|
}
|
|
143
147
|
}
|
|
144
148
|
}
|
|
145
|
-
}, [
|
|
149
|
+
}, [isDragging, setSelectedItem, item, isGroup, isExpanded, triggerTreeRerender, scrollToIndex, setLatestToggledItem, visibleItems, setFocusedItem, onItemFocusCurry, updateUserExpandedState]);
|
|
146
150
|
return onItemKeyDown;
|
|
147
151
|
};
|
|
148
152
|
const useGlobalKeyboardListener = func => {
|
|
@@ -151,7 +155,7 @@ const useGlobalKeyboardListener = func => {
|
|
|
151
155
|
return () => document.removeEventListener('keydown', func);
|
|
152
156
|
}, [func]);
|
|
153
157
|
};
|
|
154
|
-
const useGlobalToggleAllExpandShortcut = (treeRoot, triggerTreeRerender, setLatestToggledItem) => {
|
|
158
|
+
const useGlobalToggleAllExpandShortcut = (treeRoot, triggerTreeRerender, setLatestToggledItem, updateUserExpandedState) => {
|
|
155
159
|
const memoizedToggleAllKeyboardShortcut = React.useCallback(e => {
|
|
156
160
|
const {
|
|
157
161
|
shiftKey,
|
|
@@ -159,9 +163,9 @@ const useGlobalToggleAllExpandShortcut = (treeRoot, triggerTreeRerender, setLate
|
|
|
159
163
|
} = e;
|
|
160
164
|
|
|
161
165
|
if (shiftKey && keyCode === 56) {
|
|
162
|
-
groupExpandsHelpers.toggleExpandAllHelper('toggle', treeRoot, triggerTreeRerender, setLatestToggledItem);
|
|
166
|
+
groupExpandsHelpers.toggleExpandAllHelper('toggle', treeRoot, triggerTreeRerender, setLatestToggledItem, updateUserExpandedState);
|
|
163
167
|
}
|
|
164
|
-
}, [treeRoot, triggerTreeRerender]);
|
|
168
|
+
}, [setLatestToggledItem, treeRoot, triggerTreeRerender, updateUserExpandedState]);
|
|
165
169
|
return useGlobalKeyboardListener(memoizedToggleAllKeyboardShortcut);
|
|
166
170
|
};
|
|
167
171
|
|
|
@@ -7,8 +7,6 @@ require('core-js/modules/esnext.iterator.constructor.js');
|
|
|
7
7
|
require('core-js/modules/esnext.iterator.for-each.js');
|
|
8
8
|
require('core-js/modules/esnext.async-iterator.reduce.js');
|
|
9
9
|
require('core-js/modules/esnext.iterator.reduce.js');
|
|
10
|
-
require('core-js/modules/esnext.async-iterator.filter.js');
|
|
11
|
-
require('core-js/modules/esnext.iterator.filter.js');
|
|
12
10
|
|
|
13
11
|
/* eslint-disable no-sequences */
|
|
14
12
|
|
|
@@ -17,6 +15,20 @@ require('core-js/modules/esnext.iterator.filter.js');
|
|
|
17
15
|
/* eslint-disable no-restricted-syntax */
|
|
18
16
|
|
|
19
17
|
/* eslint-disable guard-for-in */
|
|
18
|
+
function isObjectADate(o) {
|
|
19
|
+
var _o$constructor;
|
|
20
|
+
|
|
21
|
+
return (o === null || o === void 0 ? void 0 : (_o$constructor = o.constructor) === null || _o$constructor === void 0 ? void 0 : _o$constructor.name) === 'Date';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isObjectAnArray(o) {
|
|
25
|
+
return Array.isArray(o);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isObjectAString(o) {
|
|
29
|
+
return typeof o === 'object';
|
|
30
|
+
}
|
|
31
|
+
|
|
20
32
|
const unfreeze = o => {
|
|
21
33
|
let oo;
|
|
22
34
|
|
|
@@ -24,16 +36,16 @@ const unfreeze = o => {
|
|
|
24
36
|
oo = null;
|
|
25
37
|
} else if (o === undefined) {
|
|
26
38
|
oo = undefined;
|
|
27
|
-
} else if (o
|
|
39
|
+
} else if (isObjectADate(o)) {
|
|
28
40
|
oo = new Date(o);
|
|
29
|
-
} else if (o
|
|
41
|
+
} else if (isObjectAnArray(o)) {
|
|
30
42
|
oo = [];
|
|
31
43
|
o.forEach(v => {
|
|
32
44
|
oo.push(v);
|
|
33
45
|
});
|
|
34
|
-
} else if (o
|
|
46
|
+
} else if (isObjectAString(o)) {
|
|
35
47
|
oo = String(o);
|
|
36
|
-
} else if (
|
|
48
|
+
} else if (isObjectAString(o)) {
|
|
37
49
|
oo = {};
|
|
38
50
|
|
|
39
51
|
for (const property in o) {
|
|
@@ -45,7 +57,13 @@ const unfreeze = o => {
|
|
|
45
57
|
|
|
46
58
|
return oo;
|
|
47
59
|
};
|
|
48
|
-
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
function filterObject(obj, predicate) {
|
|
62
|
+
return Object.keys(obj).reduce((res, key) => {
|
|
63
|
+
if (predicate(obj[key])) res[key] = obj[key];
|
|
64
|
+
return res;
|
|
65
|
+
}, {});
|
|
66
|
+
}
|
|
49
67
|
|
|
50
68
|
exports.filterObject = filterObject;
|
|
51
69
|
exports.unfreeze = unfreeze;
|
|
@@ -15,8 +15,8 @@ const setMultipleRefs = function () {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
const filteredRefs = refs.filter(Boolean);
|
|
18
|
-
if (!filteredRefs.length) return
|
|
19
|
-
if (filteredRefs.length === 0) return
|
|
18
|
+
if (!filteredRefs.length) return () => {};
|
|
19
|
+
if (filteredRefs.length === 0) return () => {};
|
|
20
20
|
return newRef => {
|
|
21
21
|
filteredRefs.forEach(refToBeUpdated => {
|
|
22
22
|
if (typeof refToBeUpdated === 'function') {
|