@mui/x-tree-view 8.0.0-alpha.12 → 8.0.0-alpha.14
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/CHANGELOG.md +430 -0
- package/RichTreeView/RichTreeView.js +24 -5
- package/SimpleTreeView/SimpleTreeView.js +8 -6
- package/TreeItem/TreeItem.d.ts +2 -0
- package/TreeItem/TreeItem.js +46 -5
- package/TreeItem/TreeItem.types.d.ts +14 -0
- package/TreeItemIcon/TreeItemIcon.js +2 -0
- package/esm/RichTreeView/RichTreeView.js +24 -5
- package/esm/SimpleTreeView/SimpleTreeView.js +8 -6
- package/esm/TreeItem/TreeItem.d.ts +2 -0
- package/esm/TreeItem/TreeItem.js +45 -4
- package/esm/TreeItem/TreeItem.types.d.ts +14 -0
- package/esm/TreeItemIcon/TreeItemIcon.js +2 -0
- package/esm/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
- package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +21 -9
- package/esm/hooks/useTreeViewApiRef.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/internals/hooks/useSelector.js +4 -1
- package/esm/internals/index.d.ts +6 -1
- package/esm/internals/index.js +4 -1
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +13 -0
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
- package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +27 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +1 -0
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
- package/esm/internals/utils/selectors.d.ts +7 -0
- package/esm/internals/utils/selectors.js +9 -0
- package/esm/useTreeItem/useTreeItem.d.ts +1 -1
- package/esm/useTreeItem/useTreeItem.js +13 -0
- package/esm/useTreeItem/useTreeItem.types.d.ts +21 -0
- package/esm/utils/cache.d.ts +38 -0
- package/esm/utils/cache.js +31 -0
- package/esm/utils/index.d.ts +1 -0
- package/esm/utils/index.js +1 -0
- package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +22 -10
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/index.js +1 -1
- package/internals/hooks/useSelector.js +5 -1
- package/internals/index.d.ts +6 -1
- package/internals/index.js +33 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +14 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
- package/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/internals/plugins/useTreeViewLazyLoading/index.js +5 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +33 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +5 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
- package/internals/utils/selectors.d.ts +7 -0
- package/internals/utils/selectors.js +9 -0
- package/modern/RichTreeView/RichTreeView.js +24 -5
- package/modern/SimpleTreeView/SimpleTreeView.js +8 -6
- package/modern/TreeItem/TreeItem.d.ts +2 -0
- package/modern/TreeItem/TreeItem.js +45 -4
- package/modern/TreeItem/TreeItem.types.d.ts +14 -0
- package/modern/TreeItemIcon/TreeItemIcon.js +2 -0
- package/modern/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
- package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +21 -9
- package/modern/hooks/useTreeViewApiRef.d.ts +1 -1
- package/modern/index.js +1 -1
- package/modern/internals/hooks/useSelector.js +4 -1
- package/modern/internals/index.d.ts +6 -1
- package/modern/internals/index.js +4 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +13 -0
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
- package/modern/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +27 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +1 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
- package/modern/internals/utils/selectors.d.ts +7 -0
- package/modern/internals/utils/selectors.js +9 -0
- package/modern/useTreeItem/useTreeItem.d.ts +1 -1
- package/modern/useTreeItem/useTreeItem.js +13 -0
- package/modern/useTreeItem/useTreeItem.types.d.ts +21 -0
- package/modern/utils/cache.d.ts +38 -0
- package/modern/utils/cache.js +31 -0
- package/modern/utils/index.d.ts +1 -0
- package/modern/utils/index.js +1 -0
- package/package.json +2 -2
- package/tsconfig.build.tsbuildinfo +1 -1
- package/useTreeItem/useTreeItem.d.ts +1 -1
- package/useTreeItem/useTreeItem.js +13 -0
- package/useTreeItem/useTreeItem.types.d.ts +21 -0
- package/utils/cache.d.ts +38 -0
- package/utils/cache.js +38 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +16 -0
package/TreeItem/TreeItem.js
CHANGED
|
@@ -6,12 +6,13 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", {
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
|
-
exports.TreeItemRoot = exports.TreeItemLabel = exports.TreeItemIconContainer = exports.TreeItemGroupTransition = exports.TreeItemContent = exports.TreeItemCheckbox = exports.TreeItem = void 0;
|
|
9
|
+
exports.TreeItemRoot = exports.TreeItemLoadingContainer = exports.TreeItemLabel = exports.TreeItemIconContainer = exports.TreeItemGroupTransition = exports.TreeItemErrorContainer = exports.TreeItemContent = exports.TreeItemCheckbox = exports.TreeItem = void 0;
|
|
10
10
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
11
11
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
12
12
|
var React = _interopRequireWildcard(require("react"));
|
|
13
13
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
14
14
|
var _clsx = _interopRequireDefault(require("clsx"));
|
|
15
|
+
var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
|
|
15
16
|
var _unsupportedProp = _interopRequireDefault(require("@mui/utils/unsupportedProp"));
|
|
16
17
|
var _styles = require("@mui/material/styles");
|
|
17
18
|
var _Collapse = _interopRequireDefault(require("@mui/material/Collapse"));
|
|
@@ -139,6 +140,7 @@ const TreeItemIconContainer = exports.TreeItemIconContainer = (0, _zeroStyled.st
|
|
|
139
140
|
display: 'flex',
|
|
140
141
|
flexShrink: 0,
|
|
141
142
|
justifyContent: 'center',
|
|
143
|
+
position: 'relative',
|
|
142
144
|
'& svg': {
|
|
143
145
|
fontSize: 18
|
|
144
146
|
}
|
|
@@ -151,6 +153,25 @@ const TreeItemGroupTransition = exports.TreeItemGroupTransition = (0, _zeroStyle
|
|
|
151
153
|
margin: 0,
|
|
152
154
|
padding: 0
|
|
153
155
|
});
|
|
156
|
+
const TreeItemErrorContainer = exports.TreeItemErrorContainer = (0, _zeroStyled.styled)('div', {
|
|
157
|
+
name: 'MuiTreeItem',
|
|
158
|
+
slot: 'ErrorIcon',
|
|
159
|
+
overridesResolver: (props, styles) => styles.errorIcon
|
|
160
|
+
})({
|
|
161
|
+
position: 'absolute',
|
|
162
|
+
right: -3,
|
|
163
|
+
width: 7,
|
|
164
|
+
height: 7,
|
|
165
|
+
borderRadius: '50%',
|
|
166
|
+
backgroundColor: 'red'
|
|
167
|
+
});
|
|
168
|
+
const TreeItemLoadingContainer = exports.TreeItemLoadingContainer = (0, _zeroStyled.styled)(_CircularProgress.default, {
|
|
169
|
+
name: 'MuiTreeItem',
|
|
170
|
+
slot: 'LoadingIcon',
|
|
171
|
+
overridesResolver: (props, styles) => styles.loadingIcon
|
|
172
|
+
})({
|
|
173
|
+
color: 'text.primary'
|
|
174
|
+
});
|
|
154
175
|
const TreeItemCheckbox = exports.TreeItemCheckbox = (0, _zeroStyled.styled)(/*#__PURE__*/React.forwardRef((props, ref) => {
|
|
155
176
|
const {
|
|
156
177
|
visible
|
|
@@ -187,7 +208,9 @@ const useUtilityClasses = ownerState => {
|
|
|
187
208
|
label: ['label'],
|
|
188
209
|
groupTransition: ['groupTransition'],
|
|
189
210
|
labelInput: ['labelInput'],
|
|
190
|
-
dragAndDropOverlay: ['dragAndDropOverlay']
|
|
211
|
+
dragAndDropOverlay: ['dragAndDropOverlay'],
|
|
212
|
+
errorIcon: ['errorIcon'],
|
|
213
|
+
loadingIcon: ['loadingIcon']
|
|
191
214
|
};
|
|
192
215
|
return (0, _composeClasses.default)(slots, _treeItemClasses.getTreeItemUtilityClass, classes);
|
|
193
216
|
};
|
|
@@ -226,6 +249,8 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
226
249
|
getGroupTransitionProps,
|
|
227
250
|
getLabelInputProps,
|
|
228
251
|
getDragAndDropOverlayProps,
|
|
252
|
+
getErrorContainerProps,
|
|
253
|
+
getLoadingContainerProps,
|
|
229
254
|
status
|
|
230
255
|
} = (0, _useTreeItem.useTreeItem)({
|
|
231
256
|
id,
|
|
@@ -304,15 +329,31 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
304
329
|
ownerState: {},
|
|
305
330
|
className: classes.dragAndDropOverlay
|
|
306
331
|
});
|
|
332
|
+
const ErrorIcon = slots.errorIcon ?? TreeItemErrorContainer;
|
|
333
|
+
const errorContainerProps = (0, _useSlotProps.default)({
|
|
334
|
+
elementType: ErrorIcon,
|
|
335
|
+
getSlotProps: getErrorContainerProps,
|
|
336
|
+
externalSlotProps: slotProps.errorIcon,
|
|
337
|
+
ownerState: {},
|
|
338
|
+
className: classes.errorIcon
|
|
339
|
+
});
|
|
340
|
+
const LoadingIcon = slots.loadingIcon ?? TreeItemLoadingContainer;
|
|
341
|
+
const loadingContainerProps = (0, _useSlotProps.default)({
|
|
342
|
+
elementType: LoadingIcon,
|
|
343
|
+
getSlotProps: getLoadingContainerProps,
|
|
344
|
+
externalSlotProps: slotProps.loadingIcon,
|
|
345
|
+
ownerState: {},
|
|
346
|
+
className: classes.loadingIcon
|
|
347
|
+
});
|
|
307
348
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItemProvider.TreeItemProvider, (0, _extends2.default)({}, getContextProviderProps(), {
|
|
308
349
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, (0, _extends2.default)({}, rootProps, {
|
|
309
350
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Content, (0, _extends2.default)({}, contentProps, {
|
|
310
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.
|
|
311
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItemIcon.TreeItemIcon, {
|
|
351
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(IconContainer, (0, _extends2.default)({}, iconContainerProps, {
|
|
352
|
+
children: [status.error && /*#__PURE__*/(0, _jsxRuntime.jsx)(ErrorIcon, (0, _extends2.default)({}, errorContainerProps)), status.loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(LoadingIcon, (0, _extends2.default)({}, loadingContainerProps)) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItemIcon.TreeItemIcon, {
|
|
312
353
|
status: status,
|
|
313
354
|
slots: slots,
|
|
314
355
|
slotProps: slotProps
|
|
315
|
-
})
|
|
356
|
+
})]
|
|
316
357
|
})), /*#__PURE__*/(0, _jsxRuntime.jsx)(Checkbox, (0, _extends2.default)({}, checkboxProps)), status.editing ? /*#__PURE__*/(0, _jsxRuntime.jsx)(LabelInput, (0, _extends2.default)({}, labelInputProps)) : /*#__PURE__*/(0, _jsxRuntime.jsx)(Label, (0, _extends2.default)({}, labelProps)), /*#__PURE__*/(0, _jsxRuntime.jsx)(DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
|
|
317
358
|
})), children && /*#__PURE__*/(0, _jsxRuntime.jsx)(TreeItemGroupTransition, (0, _extends2.default)({
|
|
318
359
|
as: GroupTransition
|
|
@@ -49,6 +49,18 @@ export interface TreeItemSlots extends TreeItemIconSlots {
|
|
|
49
49
|
* @default TreeItemDragAndDropOverlay
|
|
50
50
|
*/
|
|
51
51
|
dragAndDropOverlay?: React.ElementType;
|
|
52
|
+
/**
|
|
53
|
+
* The component that is rendered when the item is in an error state.
|
|
54
|
+
* Warning: This slot is only useful when using the `<RichTreeViewPro />` component is lazy loading is enabled.
|
|
55
|
+
* @default TreeItemErrorContainer
|
|
56
|
+
*/
|
|
57
|
+
errorIcon?: React.ElementType;
|
|
58
|
+
/**
|
|
59
|
+
* The component that is rendered when the item is in an loading state.
|
|
60
|
+
* Warning: This slot is only useful when using the `<RichTreeViewPro />` component is lazy loading is enabled.
|
|
61
|
+
* @default TreeItemLoadingContainer
|
|
62
|
+
*/
|
|
63
|
+
loadingIcon?: React.ElementType;
|
|
52
64
|
}
|
|
53
65
|
export interface TreeItemSlotProps extends TreeItemIconSlotProps {
|
|
54
66
|
root?: SlotComponentProps<'li', {}, {}>;
|
|
@@ -59,6 +71,8 @@ export interface TreeItemSlotProps extends TreeItemIconSlotProps {
|
|
|
59
71
|
label?: SlotComponentProps<'div', {}, {}>;
|
|
60
72
|
labelInput?: SlotComponentProps<'input', {}, {}>;
|
|
61
73
|
dragAndDropOverlay?: SlotComponentProps<'div', {}, {}>;
|
|
74
|
+
errorIcon?: SlotComponentProps<'div', {}, {}>;
|
|
75
|
+
loadingIcon?: SlotComponentProps<'div', {}, {}>;
|
|
62
76
|
}
|
|
63
77
|
export interface TreeItemProps extends Omit<UseTreeItemParameters, 'rootRef'>, Omit<React.HTMLAttributes<HTMLLIElement>, 'onFocus'> {
|
|
64
78
|
className?: string;
|
|
@@ -70,9 +70,11 @@ process.env.NODE_ENV !== "production" ? TreeItemIcon.propTypes = {
|
|
|
70
70
|
disabled: _propTypes.default.bool.isRequired,
|
|
71
71
|
editable: _propTypes.default.bool.isRequired,
|
|
72
72
|
editing: _propTypes.default.bool.isRequired,
|
|
73
|
+
error: _propTypes.default.bool.isRequired,
|
|
73
74
|
expandable: _propTypes.default.bool.isRequired,
|
|
74
75
|
expanded: _propTypes.default.bool.isRequired,
|
|
75
76
|
focused: _propTypes.default.bool.isRequired,
|
|
77
|
+
loading: _propTypes.default.bool.isRequired,
|
|
76
78
|
selected: _propTypes.default.bool.isRequired
|
|
77
79
|
}).isRequired
|
|
78
80
|
} : void 0;
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
|
+
import Alert from '@mui/material/Alert';
|
|
7
|
+
import Typography from '@mui/material/Typography';
|
|
6
8
|
import composeClasses from '@mui/utils/composeClasses';
|
|
7
9
|
import useSlotProps from '@mui/utils/useSlotProps';
|
|
8
10
|
import { warnOnce } from '@mui/x-internals/warning';
|
|
@@ -12,6 +14,8 @@ import { useTreeView } from "../internals/useTreeView/index.js";
|
|
|
12
14
|
import { TreeViewProvider } from "../internals/TreeViewProvider/index.js";
|
|
13
15
|
import { RICH_TREE_VIEW_PLUGINS } from "./RichTreeView.plugins.js";
|
|
14
16
|
import { RichTreeViewItems } from "../internals/components/RichTreeViewItems.js";
|
|
17
|
+
import { useSelector } from "../internals/hooks/useSelector.js";
|
|
18
|
+
import { selectorGetTreeViewError, selectorIsTreeViewLoading } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
|
|
15
19
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
20
|
const useThemeProps = createUseThemeProps('MuiRichTreeView');
|
|
17
21
|
const useUtilityClasses = ownerState => {
|
|
@@ -62,6 +66,8 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
62
66
|
rootRef: ref,
|
|
63
67
|
props
|
|
64
68
|
});
|
|
69
|
+
const isLoading = useSelector(contextValue.store, selectorIsTreeViewLoading);
|
|
70
|
+
const treeViewError = useSelector(contextValue.store, selectorGetTreeViewError);
|
|
65
71
|
const {
|
|
66
72
|
slots,
|
|
67
73
|
slotProps
|
|
@@ -75,6 +81,17 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
75
81
|
getSlotProps: getRootProps,
|
|
76
82
|
ownerState: props
|
|
77
83
|
});
|
|
84
|
+
if (isLoading) {
|
|
85
|
+
return /*#__PURE__*/_jsx(Typography, {
|
|
86
|
+
children: "Loading..."
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (treeViewError) {
|
|
90
|
+
return /*#__PURE__*/_jsx(Alert, {
|
|
91
|
+
severity: "error",
|
|
92
|
+
children: treeViewError.message
|
|
93
|
+
});
|
|
94
|
+
}
|
|
78
95
|
return /*#__PURE__*/_jsx(TreeViewProvider, {
|
|
79
96
|
value: contextValue,
|
|
80
97
|
children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {
|
|
@@ -100,8 +117,10 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
100
117
|
getItemDOMElement: PropTypes.func.isRequired,
|
|
101
118
|
getItemOrderedChildrenIds: PropTypes.func.isRequired,
|
|
102
119
|
getItemTree: PropTypes.func.isRequired,
|
|
103
|
-
|
|
120
|
+
getParentId: PropTypes.func.isRequired,
|
|
121
|
+
setIsItemDisabled: PropTypes.func.isRequired,
|
|
104
122
|
setItemExpansion: PropTypes.func.isRequired,
|
|
123
|
+
setItemSelection: PropTypes.func.isRequired,
|
|
105
124
|
updateItemLabel: PropTypes.func.isRequired
|
|
106
125
|
})
|
|
107
126
|
}),
|
|
@@ -205,7 +224,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
205
224
|
multiSelect: PropTypes.bool,
|
|
206
225
|
/**
|
|
207
226
|
* Callback fired when Tree Items are expanded/collapsed.
|
|
208
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
227
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
209
228
|
* @param {array} itemIds The ids of the expanded items.
|
|
210
229
|
*/
|
|
211
230
|
onExpandedItemsChange: PropTypes.func,
|
|
@@ -217,7 +236,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
217
236
|
onItemClick: PropTypes.func,
|
|
218
237
|
/**
|
|
219
238
|
* Callback fired when a Tree Item is expanded or collapsed.
|
|
220
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
239
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
221
240
|
* @param {array} itemId The itemId of the modified item.
|
|
222
241
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
223
242
|
*/
|
|
@@ -236,14 +255,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
236
255
|
onItemLabelChange: PropTypes.func,
|
|
237
256
|
/**
|
|
238
257
|
* Callback fired when a Tree Item is selected or deselected.
|
|
239
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
258
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
240
259
|
* @param {array} itemId The itemId of the modified item.
|
|
241
260
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
242
261
|
*/
|
|
243
262
|
onItemSelectionToggle: PropTypes.func,
|
|
244
263
|
/**
|
|
245
264
|
* Callback fired when Tree Items are selected/deselected.
|
|
246
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
265
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
247
266
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
248
267
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
249
268
|
*/
|
|
@@ -99,8 +99,10 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
99
99
|
getItemDOMElement: PropTypes.func.isRequired,
|
|
100
100
|
getItemOrderedChildrenIds: PropTypes.func.isRequired,
|
|
101
101
|
getItemTree: PropTypes.func.isRequired,
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
getParentId: PropTypes.func.isRequired,
|
|
103
|
+
setIsItemDisabled: PropTypes.func.isRequired,
|
|
104
|
+
setItemExpansion: PropTypes.func.isRequired,
|
|
105
|
+
setItemSelection: PropTypes.func.isRequired
|
|
104
106
|
})
|
|
105
107
|
}),
|
|
106
108
|
/**
|
|
@@ -173,7 +175,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
173
175
|
multiSelect: PropTypes.bool,
|
|
174
176
|
/**
|
|
175
177
|
* Callback fired when Tree Items are expanded/collapsed.
|
|
176
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
178
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
177
179
|
* @param {array} itemIds The ids of the expanded items.
|
|
178
180
|
*/
|
|
179
181
|
onExpandedItemsChange: PropTypes.func,
|
|
@@ -185,7 +187,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
185
187
|
onItemClick: PropTypes.func,
|
|
186
188
|
/**
|
|
187
189
|
* Callback fired when a Tree Item is expanded or collapsed.
|
|
188
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
190
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
189
191
|
* @param {array} itemId The itemId of the modified item.
|
|
190
192
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
191
193
|
*/
|
|
@@ -198,14 +200,14 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
198
200
|
onItemFocus: PropTypes.func,
|
|
199
201
|
/**
|
|
200
202
|
* Callback fired when a Tree Item is selected or deselected.
|
|
201
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
203
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
202
204
|
* @param {array} itemId The itemId of the modified item.
|
|
203
205
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
204
206
|
*/
|
|
205
207
|
onItemSelectionToggle: PropTypes.func,
|
|
206
208
|
/**
|
|
207
209
|
* Callback fired when Tree Items are selected/deselected.
|
|
208
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
210
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
209
211
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
210
212
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
211
213
|
*/
|
|
@@ -11,6 +11,8 @@ export declare const TreeItemLabel: import("@emotion/styled").StyledComponent<im
|
|
|
11
11
|
}, React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
12
12
|
export declare const TreeItemIconContainer: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.ClassAttributes<HTMLDivElement> | keyof React.HTMLAttributes<HTMLDivElement>>, {}>;
|
|
13
13
|
export declare const TreeItemGroupTransition: import("@emotion/styled").StyledComponent<Pick<import("@mui/material").CollapseProps, keyof import("@mui/material").CollapseProps> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
14
|
+
export declare const TreeItemErrorContainer: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.ClassAttributes<HTMLDivElement> | keyof React.HTMLAttributes<HTMLDivElement>>, {}>;
|
|
15
|
+
export declare const TreeItemLoadingContainer: import("@emotion/styled").StyledComponent<Pick<import("@mui/material").CircularProgressProps, keyof import("@mui/material").CircularProgressProps> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
14
16
|
export declare const TreeItemCheckbox: import("@emotion/styled").StyledComponent<Pick<Omit<CheckboxProps & {
|
|
15
17
|
visible?: boolean;
|
|
16
18
|
}, "ref"> & React.RefAttributes<HTMLButtonElement>, "hidden" | "visible" | "color" | "content" | "size" | "style" | "icon" | "translate" | "disabled" | "form" | "slot" | "title" | "action" | "checked" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "name" | "readOnly" | "required" | "value" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "enterKeyHint" | "id" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "popover" | "popoverTargetAction" | "popoverTarget" | "inert" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onToggle" | "onBeforeToggle" | "onTransitionCancel" | "onTransitionCancelCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "onTransitionRun" | "onTransitionRunCapture" | "onTransitionStart" | "onTransitionStartCapture" | "component" | "sx" | "classes" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "checkedIcon" | "inputProps" | "inputRef" | "indeterminate" | "indeterminateIcon" | keyof React.RefAttributes<HTMLButtonElement>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
package/esm/TreeItem/TreeItem.js
CHANGED
|
@@ -7,6 +7,7 @@ const _excluded = ["visible"],
|
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import PropTypes from 'prop-types';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
|
+
import CircularProgress from '@mui/material/CircularProgress';
|
|
10
11
|
import unsupportedProp from '@mui/utils/unsupportedProp';
|
|
11
12
|
import { alpha } from '@mui/material/styles';
|
|
12
13
|
import Collapse from '@mui/material/Collapse';
|
|
@@ -132,6 +133,7 @@ export const TreeItemIconContainer = styled('div', {
|
|
|
132
133
|
display: 'flex',
|
|
133
134
|
flexShrink: 0,
|
|
134
135
|
justifyContent: 'center',
|
|
136
|
+
position: 'relative',
|
|
135
137
|
'& svg': {
|
|
136
138
|
fontSize: 18
|
|
137
139
|
}
|
|
@@ -144,6 +146,25 @@ export const TreeItemGroupTransition = styled(Collapse, {
|
|
|
144
146
|
margin: 0,
|
|
145
147
|
padding: 0
|
|
146
148
|
});
|
|
149
|
+
export const TreeItemErrorContainer = styled('div', {
|
|
150
|
+
name: 'MuiTreeItem',
|
|
151
|
+
slot: 'ErrorIcon',
|
|
152
|
+
overridesResolver: (props, styles) => styles.errorIcon
|
|
153
|
+
})({
|
|
154
|
+
position: 'absolute',
|
|
155
|
+
right: -3,
|
|
156
|
+
width: 7,
|
|
157
|
+
height: 7,
|
|
158
|
+
borderRadius: '50%',
|
|
159
|
+
backgroundColor: 'red'
|
|
160
|
+
});
|
|
161
|
+
export const TreeItemLoadingContainer = styled(CircularProgress, {
|
|
162
|
+
name: 'MuiTreeItem',
|
|
163
|
+
slot: 'LoadingIcon',
|
|
164
|
+
overridesResolver: (props, styles) => styles.loadingIcon
|
|
165
|
+
})({
|
|
166
|
+
color: 'text.primary'
|
|
167
|
+
});
|
|
147
168
|
export const TreeItemCheckbox = styled(/*#__PURE__*/React.forwardRef((props, ref) => {
|
|
148
169
|
const {
|
|
149
170
|
visible
|
|
@@ -180,7 +201,9 @@ const useUtilityClasses = ownerState => {
|
|
|
180
201
|
label: ['label'],
|
|
181
202
|
groupTransition: ['groupTransition'],
|
|
182
203
|
labelInput: ['labelInput'],
|
|
183
|
-
dragAndDropOverlay: ['dragAndDropOverlay']
|
|
204
|
+
dragAndDropOverlay: ['dragAndDropOverlay'],
|
|
205
|
+
errorIcon: ['errorIcon'],
|
|
206
|
+
loadingIcon: ['loadingIcon']
|
|
184
207
|
};
|
|
185
208
|
return composeClasses(slots, getTreeItemUtilityClass, classes);
|
|
186
209
|
};
|
|
@@ -219,6 +242,8 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
219
242
|
getGroupTransitionProps,
|
|
220
243
|
getLabelInputProps,
|
|
221
244
|
getDragAndDropOverlayProps,
|
|
245
|
+
getErrorContainerProps,
|
|
246
|
+
getLoadingContainerProps,
|
|
222
247
|
status
|
|
223
248
|
} = useTreeItem({
|
|
224
249
|
id,
|
|
@@ -297,15 +322,31 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
297
322
|
ownerState: {},
|
|
298
323
|
className: classes.dragAndDropOverlay
|
|
299
324
|
});
|
|
325
|
+
const ErrorIcon = slots.errorIcon ?? TreeItemErrorContainer;
|
|
326
|
+
const errorContainerProps = useSlotProps({
|
|
327
|
+
elementType: ErrorIcon,
|
|
328
|
+
getSlotProps: getErrorContainerProps,
|
|
329
|
+
externalSlotProps: slotProps.errorIcon,
|
|
330
|
+
ownerState: {},
|
|
331
|
+
className: classes.errorIcon
|
|
332
|
+
});
|
|
333
|
+
const LoadingIcon = slots.loadingIcon ?? TreeItemLoadingContainer;
|
|
334
|
+
const loadingContainerProps = useSlotProps({
|
|
335
|
+
elementType: LoadingIcon,
|
|
336
|
+
getSlotProps: getLoadingContainerProps,
|
|
337
|
+
externalSlotProps: slotProps.loadingIcon,
|
|
338
|
+
ownerState: {},
|
|
339
|
+
className: classes.loadingIcon
|
|
340
|
+
});
|
|
300
341
|
return /*#__PURE__*/_jsx(TreeItemProvider, _extends({}, getContextProviderProps(), {
|
|
301
342
|
children: /*#__PURE__*/_jsxs(Root, _extends({}, rootProps, {
|
|
302
343
|
children: [/*#__PURE__*/_jsxs(Content, _extends({}, contentProps, {
|
|
303
|
-
children: [/*#__PURE__*/
|
|
304
|
-
children: /*#__PURE__*/_jsx(TreeItemIcon, {
|
|
344
|
+
children: [/*#__PURE__*/_jsxs(IconContainer, _extends({}, iconContainerProps, {
|
|
345
|
+
children: [status.error && /*#__PURE__*/_jsx(ErrorIcon, _extends({}, errorContainerProps)), status.loading ? /*#__PURE__*/_jsx(LoadingIcon, _extends({}, loadingContainerProps)) : /*#__PURE__*/_jsx(TreeItemIcon, {
|
|
305
346
|
status: status,
|
|
306
347
|
slots: slots,
|
|
307
348
|
slotProps: slotProps
|
|
308
|
-
})
|
|
349
|
+
})]
|
|
309
350
|
})), /*#__PURE__*/_jsx(Checkbox, _extends({}, checkboxProps)), status.editing ? /*#__PURE__*/_jsx(LabelInput, _extends({}, labelInputProps)) : /*#__PURE__*/_jsx(Label, _extends({}, labelProps)), /*#__PURE__*/_jsx(DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
|
|
310
351
|
})), children && /*#__PURE__*/_jsx(TreeItemGroupTransition, _extends({
|
|
311
352
|
as: GroupTransition
|
|
@@ -49,6 +49,18 @@ export interface TreeItemSlots extends TreeItemIconSlots {
|
|
|
49
49
|
* @default TreeItemDragAndDropOverlay
|
|
50
50
|
*/
|
|
51
51
|
dragAndDropOverlay?: React.ElementType;
|
|
52
|
+
/**
|
|
53
|
+
* The component that is rendered when the item is in an error state.
|
|
54
|
+
* Warning: This slot is only useful when using the `<RichTreeViewPro />` component is lazy loading is enabled.
|
|
55
|
+
* @default TreeItemErrorContainer
|
|
56
|
+
*/
|
|
57
|
+
errorIcon?: React.ElementType;
|
|
58
|
+
/**
|
|
59
|
+
* The component that is rendered when the item is in an loading state.
|
|
60
|
+
* Warning: This slot is only useful when using the `<RichTreeViewPro />` component is lazy loading is enabled.
|
|
61
|
+
* @default TreeItemLoadingContainer
|
|
62
|
+
*/
|
|
63
|
+
loadingIcon?: React.ElementType;
|
|
52
64
|
}
|
|
53
65
|
export interface TreeItemSlotProps extends TreeItemIconSlotProps {
|
|
54
66
|
root?: SlotComponentProps<'li', {}, {}>;
|
|
@@ -59,6 +71,8 @@ export interface TreeItemSlotProps extends TreeItemIconSlotProps {
|
|
|
59
71
|
label?: SlotComponentProps<'div', {}, {}>;
|
|
60
72
|
labelInput?: SlotComponentProps<'input', {}, {}>;
|
|
61
73
|
dragAndDropOverlay?: SlotComponentProps<'div', {}, {}>;
|
|
74
|
+
errorIcon?: SlotComponentProps<'div', {}, {}>;
|
|
75
|
+
loadingIcon?: SlotComponentProps<'div', {}, {}>;
|
|
62
76
|
}
|
|
63
77
|
export interface TreeItemProps extends Omit<UseTreeItemParameters, 'rootRef'>, Omit<React.HTMLAttributes<HTMLLIElement>, 'onFocus'> {
|
|
64
78
|
className?: string;
|
|
@@ -63,9 +63,11 @@ process.env.NODE_ENV !== "production" ? TreeItemIcon.propTypes = {
|
|
|
63
63
|
disabled: PropTypes.bool.isRequired,
|
|
64
64
|
editable: PropTypes.bool.isRequired,
|
|
65
65
|
editing: PropTypes.bool.isRequired,
|
|
66
|
+
error: PropTypes.bool.isRequired,
|
|
66
67
|
expandable: PropTypes.bool.isRequired,
|
|
67
68
|
expanded: PropTypes.bool.isRequired,
|
|
68
69
|
focused: PropTypes.bool.isRequired,
|
|
70
|
+
loading: PropTypes.bool.isRequired,
|
|
69
71
|
selected: PropTypes.bool.isRequired
|
|
70
72
|
}).isRequired
|
|
71
73
|
} : void 0;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import type { UseTreeViewLazyLoadingSignature } from '../../internals/plugins/useTreeViewLazyLoading';
|
|
2
3
|
import type { UseTreeViewSelectionSignature } from '../../internals/plugins/useTreeViewSelection';
|
|
3
4
|
import type { UseTreeViewExpansionSignature } from '../../internals/plugins/useTreeViewExpansion';
|
|
4
5
|
import type { UseTreeViewItemsSignature } from '../../internals/plugins/useTreeViewItems';
|
|
@@ -21,7 +22,7 @@ type UseTreeItemUtilsMinimalPlugins = readonly [UseTreeViewSelectionSignature, U
|
|
|
21
22
|
/**
|
|
22
23
|
* Plugins that `useTreeItemUtils` can use if they are present, but are not required.
|
|
23
24
|
*/
|
|
24
|
-
export type UseTreeItemUtilsOptionalPlugins = readonly [UseTreeViewLabelSignature];
|
|
25
|
+
export type UseTreeItemUtilsOptionalPlugins = readonly [UseTreeViewLabelSignature, UseTreeViewLazyLoadingSignature];
|
|
25
26
|
interface UseTreeItemUtilsReturnValue<TSignatures extends UseTreeItemUtilsMinimalPlugins, TOptionalSignatures extends UseTreeItemUtilsOptionalPlugins> {
|
|
26
27
|
interactions: UseTreeItemInteractions;
|
|
27
28
|
status: UseTreeItemStatus;
|
|
@@ -30,7 +31,7 @@ interface UseTreeItemUtilsReturnValue<TSignatures extends UseTreeItemUtilsMinima
|
|
|
30
31
|
*/
|
|
31
32
|
publicAPI: TreeViewPublicAPI<TSignatures, TOptionalSignatures>;
|
|
32
33
|
}
|
|
33
|
-
export declare const
|
|
34
|
+
export declare const itemHasChildren: (reactChildren: React.ReactNode) => boolean;
|
|
34
35
|
export declare const useTreeItemUtils: <TSignatures extends UseTreeItemUtilsMinimalPlugins = UseTreeItemUtilsMinimalPlugins, TOptionalSignatures extends UseTreeItemUtilsOptionalPlugins = UseTreeItemUtilsOptionalPlugins>({
|
|
35
36
|
itemId,
|
|
36
37
|
children
|
|
@@ -4,10 +4,11 @@ import { useTreeViewContext } from "../../internals/TreeViewProvider/index.js";
|
|
|
4
4
|
import { useTreeViewLabel } from "../../internals/plugins/useTreeViewLabel/index.js";
|
|
5
5
|
import { hasPlugin } from "../../internals/utils/plugins.js";
|
|
6
6
|
import { useSelector } from "../../internals/hooks/useSelector.js";
|
|
7
|
-
import { selectorIsItemExpanded } from "../../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
7
|
+
import { selectorIsItemExpandable, selectorIsItemExpanded } from "../../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
8
8
|
import { selectorIsItemFocused } from "../../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js";
|
|
9
9
|
import { selectorIsItemDisabled } from "../../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
|
|
10
10
|
import { selectorIsItemSelected } from "../../internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js";
|
|
11
|
+
import { selectorGetTreeItemError, selectorIsItemLoading, selectorIsLazyLoadingEnabled } from "../../internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js";
|
|
11
12
|
import { selectorIsItemBeingEdited, selectorIsItemEditable } from "../../internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js";
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -18,9 +19,9 @@ import { selectorIsItemBeingEdited, selectorIsItemEditable } from "../../interna
|
|
|
18
19
|
* Plugins that `useTreeItemUtils` can use if they are present, but are not required.
|
|
19
20
|
*/
|
|
20
21
|
|
|
21
|
-
export const
|
|
22
|
+
export const itemHasChildren = reactChildren => {
|
|
22
23
|
if (Array.isArray(reactChildren)) {
|
|
23
|
-
return reactChildren.length > 0 && reactChildren.some(
|
|
24
|
+
return reactChildren.length > 0 && reactChildren.some(itemHasChildren);
|
|
24
25
|
}
|
|
25
26
|
return Boolean(reactChildren);
|
|
26
27
|
};
|
|
@@ -37,6 +38,11 @@ export const useTreeItemUtils = ({
|
|
|
37
38
|
},
|
|
38
39
|
publicAPI
|
|
39
40
|
} = useTreeViewContext();
|
|
41
|
+
const isItemExpandable = useSelector(store, selectorIsItemExpandable, itemId);
|
|
42
|
+
const isLazyLoadingEnabled = useSelector(store, selectorIsLazyLoadingEnabled);
|
|
43
|
+
const loading = useSelector(store, state => isLazyLoadingEnabled ? selectorIsItemLoading(state, itemId) : false);
|
|
44
|
+
const error = useSelector(store, state => isLazyLoadingEnabled ? Boolean(selectorGetTreeItemError(state, itemId)) : false);
|
|
45
|
+
const isExpandable = itemHasChildren(children) || isItemExpandable;
|
|
40
46
|
const isExpanded = useSelector(store, selectorIsItemExpanded, itemId);
|
|
41
47
|
const isFocused = useSelector(store, selectorIsItemFocused, itemId);
|
|
42
48
|
const isSelected = useSelector(store, selectorIsItemSelected, itemId);
|
|
@@ -47,13 +53,15 @@ export const useTreeItemUtils = ({
|
|
|
47
53
|
isItemEditable: label.isItemEditable
|
|
48
54
|
}));
|
|
49
55
|
const status = {
|
|
50
|
-
expandable:
|
|
56
|
+
expandable: isExpandable,
|
|
51
57
|
expanded: isExpanded,
|
|
52
58
|
focused: isFocused,
|
|
53
59
|
selected: isSelected,
|
|
54
60
|
disabled: isDisabled,
|
|
55
61
|
editing: isEditing,
|
|
56
|
-
editable: isEditable
|
|
62
|
+
editable: isEditable,
|
|
63
|
+
loading,
|
|
64
|
+
error
|
|
57
65
|
};
|
|
58
66
|
const handleExpansion = event => {
|
|
59
67
|
if (status.disabled) {
|
|
@@ -66,7 +74,11 @@ export const useTreeItemUtils = ({
|
|
|
66
74
|
|
|
67
75
|
// If already expanded and trying to toggle selection don't close
|
|
68
76
|
if (status.expandable && !(multiple && selectorIsItemExpanded(store.value, itemId))) {
|
|
69
|
-
|
|
77
|
+
// make sure the children selection is propagated again
|
|
78
|
+
instance.setItemExpansion({
|
|
79
|
+
event,
|
|
80
|
+
itemId
|
|
81
|
+
});
|
|
70
82
|
}
|
|
71
83
|
};
|
|
72
84
|
const handleSelection = event => {
|
|
@@ -81,14 +93,14 @@ export const useTreeItemUtils = ({
|
|
|
81
93
|
if (event.shiftKey) {
|
|
82
94
|
instance.expandSelectionRange(event, itemId);
|
|
83
95
|
} else {
|
|
84
|
-
instance.
|
|
96
|
+
instance.setItemSelection({
|
|
85
97
|
event,
|
|
86
98
|
itemId,
|
|
87
99
|
keepExistingSelection: true
|
|
88
100
|
});
|
|
89
101
|
}
|
|
90
102
|
} else {
|
|
91
|
-
instance.
|
|
103
|
+
instance.setItemSelection({
|
|
92
104
|
event,
|
|
93
105
|
itemId,
|
|
94
106
|
shouldBeSelected: true
|
|
@@ -100,7 +112,7 @@ export const useTreeItemUtils = ({
|
|
|
100
112
|
if (multiSelect && hasShift) {
|
|
101
113
|
instance.expandSelectionRange(event, itemId);
|
|
102
114
|
} else {
|
|
103
|
-
instance.
|
|
115
|
+
instance.setItemSelection({
|
|
104
116
|
event,
|
|
105
117
|
itemId,
|
|
106
118
|
keepExistingSelection: multiSelect,
|
|
@@ -4,4 +4,4 @@ import { RichTreeViewPluginSignatures } from "../RichTreeView/RichTreeView.plugi
|
|
|
4
4
|
/**
|
|
5
5
|
* Hook that instantiates a [[TreeViewApiRef]].
|
|
6
6
|
*/
|
|
7
|
-
export declare const useTreeViewApiRef: <TSignatures extends readonly TreeViewAnyPluginSignature[] =
|
|
7
|
+
export declare const useTreeViewApiRef: <TSignatures extends readonly TreeViewAnyPluginSignature[] = RichTreeViewPluginSignatures>() => React.RefObject<TreeViewPublicAPI<TSignatures> | undefined>;
|
package/esm/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// use-sync-external-store has no exports field defined
|
|
2
|
+
// See https://github.com/facebook/react/issues/30698
|
|
3
|
+
// eslint-disable-next-line import/extensions
|
|
4
|
+
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js';
|
|
2
5
|
const defaultCompare = Object.is;
|
|
3
6
|
export const useSelector = (store, selector, args = undefined, equals = defaultCompare) => {
|
|
4
7
|
const selectorWithArgs = state => selector(state, args);
|
package/esm/internals/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { useTreeView } from "./useTreeView/index.js";
|
|
|
2
2
|
export { TreeViewProvider, useTreeViewContext } from "./TreeViewProvider/index.js";
|
|
3
3
|
export { RichTreeViewItems } from "./components/RichTreeViewItems.js";
|
|
4
4
|
export type { RichTreeViewItemsSlots, RichTreeViewItemsSlotProps } from './components/RichTreeViewItems';
|
|
5
|
-
export { unstable_resetCleanupTracking } from "./hooks/useInstanceEventHandler.js";
|
|
5
|
+
export { unstable_resetCleanupTracking, useInstanceEventHandler } from "./hooks/useInstanceEventHandler.js";
|
|
6
6
|
export { useSelector } from "./hooks/useSelector.js";
|
|
7
7
|
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewState, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, TreeViewItemPlugin, TreeViewUsedStore } from './models';
|
|
8
8
|
export type { TreeViewCorePluginParameters } from './corePlugins';
|
|
@@ -21,6 +21,11 @@ export { selectorItemMetaLookup, selectorItemMeta, selectorItemIndex, selectorIt
|
|
|
21
21
|
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsState } from './plugins/useTreeViewItems';
|
|
22
22
|
export { useTreeViewLabel } from "./plugins/useTreeViewLabel/index.js";
|
|
23
23
|
export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from './plugins/useTreeViewLabel';
|
|
24
|
+
export { selectorIsItemExpanded } from "./plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
25
|
+
export { selectorIsItemSelected } from "./plugins/useTreeViewSelection/useTreeViewSelection.selectors.js";
|
|
26
|
+
export { selectorDataSourceState, selectorGetTreeItemError } from "./plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js";
|
|
27
|
+
export type { UseTreeViewLazyLoadingSignature } from './plugins/useTreeViewLazyLoading';
|
|
28
|
+
export type { UseTreeViewLazyLoadingParameters } from './plugins/useTreeViewLazyLoading';
|
|
24
29
|
export { useTreeViewJSXItems } from "./plugins/useTreeViewJSXItems/index.js";
|
|
25
30
|
export type { UseTreeViewJSXItemsSignature, UseTreeViewJSXItemsParameters } from './plugins/useTreeViewJSXItems';
|
|
26
31
|
export { createSelector } from "./utils/selectors.js";
|
package/esm/internals/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { useTreeView } from "./useTreeView/index.js";
|
|
2
2
|
export { TreeViewProvider, useTreeViewContext } from "./TreeViewProvider/index.js";
|
|
3
3
|
export { RichTreeViewItems } from "./components/RichTreeViewItems.js";
|
|
4
|
-
export { unstable_resetCleanupTracking } from "./hooks/useInstanceEventHandler.js";
|
|
4
|
+
export { unstable_resetCleanupTracking, useInstanceEventHandler } from "./hooks/useInstanceEventHandler.js";
|
|
5
5
|
export { useSelector } from "./hooks/useSelector.js";
|
|
6
6
|
|
|
7
7
|
// Core plugins
|
|
@@ -15,6 +15,9 @@ export { useTreeViewIcons } from "./plugins/useTreeViewIcons/index.js";
|
|
|
15
15
|
export { useTreeViewItems, buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "./plugins/useTreeViewItems/index.js";
|
|
16
16
|
export { selectorItemMetaLookup, selectorItemMeta, selectorItemIndex, selectorItemOrderedChildrenIds } from "./plugins/useTreeViewItems/useTreeViewItems.selectors.js";
|
|
17
17
|
export { useTreeViewLabel } from "./plugins/useTreeViewLabel/index.js";
|
|
18
|
+
export { selectorIsItemExpanded } from "./plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
19
|
+
export { selectorIsItemSelected } from "./plugins/useTreeViewSelection/useTreeViewSelection.selectors.js";
|
|
20
|
+
export { selectorDataSourceState, selectorGetTreeItemError } from "./plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js";
|
|
18
21
|
export { useTreeViewJSXItems } from "./plugins/useTreeViewJSXItems/index.js";
|
|
19
22
|
export { createSelector } from "./utils/selectors.js";
|
|
20
23
|
export { isTargetInDescendants } from "./utils/tree.js";
|