@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
160 lines (157 loc) • 5.88 kB
JavaScript
;
'use client';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTreeItemUtils = exports.itemHasChildren = void 0;
var _store = require("@mui/x-internals/store");
var _TreeViewProvider = require("../../internals/TreeViewProvider");
var _selectors = require("../../internals/plugins/expansion/selectors");
var _selectors2 = require("../../internals/plugins/focus/selectors");
var _selectors3 = require("../../internals/plugins/items/selectors");
var _selectors4 = require("../../internals/plugins/selection/selectors");
var _selectors5 = require("../../internals/plugins/lazyLoading/selectors");
var _selectors6 = require("../../internals/plugins/labelEditing/selectors");
const itemHasChildren = reactChildren => {
if (Array.isArray(reactChildren)) {
return reactChildren.length > 0 && reactChildren.some(itemHasChildren);
}
return Boolean(reactChildren);
};
exports.itemHasChildren = itemHasChildren;
const useTreeItemUtils = ({
itemId,
children
}) => {
const {
store,
publicAPI
} = (0, _TreeViewProvider.useTreeViewContext)();
const isItemExpandable = (0, _store.useStore)(store, _selectors.expansionSelectors.isItemExpandable, itemId);
const isLoading = (0, _store.useStore)(store, _selectors5.lazyLoadingSelectors.isItemLoading, itemId);
const hasError = (0, _store.useStore)(store, _selectors5.lazyLoadingSelectors.itemHasError, itemId);
const isExpandable = itemHasChildren(children) || isItemExpandable;
const isExpanded = (0, _store.useStore)(store, _selectors.expansionSelectors.isItemExpanded, itemId);
const isFocused = (0, _store.useStore)(store, _selectors2.focusSelectors.isItemFocused, itemId);
const isSelected = (0, _store.useStore)(store, _selectors4.selectionSelectors.isItemSelected, itemId);
const isDisabled = (0, _store.useStore)(store, _selectors3.itemsSelectors.isItemDisabled, itemId);
const isEditing = (0, _store.useStore)(store, _selectors6.labelSelectors.isItemBeingEdited, itemId);
const isEditable = (0, _store.useStore)(store, _selectors6.labelSelectors.isItemEditable, itemId);
const status = {
expandable: isExpandable,
expanded: isExpanded,
focused: isFocused,
selected: isSelected,
disabled: isDisabled,
editing: isEditing,
editable: isEditable,
loading: isLoading,
error: hasError
};
const handleExpansion = event => {
if (status.disabled) {
return;
}
if (!status.focused) {
store.focus.focusItem(event, itemId);
}
const multiple = _selectors4.selectionSelectors.isMultiSelectEnabled(store.state) && (event.shiftKey || event.ctrlKey || event.metaKey);
// If already expanded and trying to toggle selection don't close
if (status.expandable && !(multiple && _selectors.expansionSelectors.isItemExpanded(store.state, itemId))) {
// make sure the children selection is propagated again
store.expansion.setItemExpansion({
event,
itemId
});
}
};
const handleSelection = event => {
if (!_selectors4.selectionSelectors.canItemBeSelected(store.state, itemId)) {
return;
}
if (!status.focused && !status.editing) {
store.focus.focusItem(event, itemId);
}
const multiple = _selectors4.selectionSelectors.isMultiSelectEnabled(store.state) && (event.shiftKey || event.ctrlKey || event.metaKey);
if (multiple) {
if (event.shiftKey) {
store.selection.expandSelectionRange(event, itemId);
} else {
store.selection.setItemSelection({
event,
itemId,
keepExistingSelection: true
});
}
} else {
store.selection.setItemSelection({
event,
itemId,
shouldBeSelected: true
});
}
};
const handleCheckboxSelection = event => {
const hasShift = event.nativeEvent.shiftKey;
const isMultiSelectEnabled = _selectors4.selectionSelectors.isMultiSelectEnabled(store.state);
if (isMultiSelectEnabled && hasShift) {
store.selection.expandSelectionRange(event, itemId);
} else {
store.selection.setItemSelection({
event,
itemId,
keepExistingSelection: isMultiSelectEnabled,
shouldBeSelected: event.target.checked
});
}
};
const toggleItemEditing = () => {
// If the store doesn't support label editing, do nothing
if (!store.labelEditing) {
return;
}
if (isEditing) {
store.labelEditing.setEditedItem(null);
} else {
store.labelEditing.setEditedItem(itemId);
}
};
const handleSaveItemLabel = (event, newLabel) => {
// If the store doesn't support label editing, do nothing
if (!store.labelEditing) {
return;
}
// As a side effect of `instance.focusItem` called here and in `handleCancelItemLabelEditing` the `labelInput` is blurred
// The `onBlur` event is triggered, which calls `handleSaveItemLabel` again.
// To avoid creating an unwanted behavior we need to check if the item is being edited before calling `updateItemLabel`
if (_selectors6.labelSelectors.isItemBeingEdited(store.state, itemId)) {
store.labelEditing.updateItemLabel(itemId, newLabel);
toggleItemEditing();
store.focus.focusItem(event, itemId);
}
};
const handleCancelItemLabelEditing = event => {
// If the store doesn't support label editing, do nothing
if (!store.labelEditing) {
return;
}
if (_selectors6.labelSelectors.isItemBeingEdited(store.state, itemId)) {
toggleItemEditing();
store.focus.focusItem(event, itemId);
}
};
const interactions = {
handleExpansion,
handleSelection,
handleCheckboxSelection,
toggleItemEditing,
handleSaveItemLabel,
handleCancelItemLabelEditing
};
return {
interactions,
status,
publicAPI
};
};
exports.useTreeItemUtils = useTreeItemUtils;