@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
88 lines (87 loc) • 3.29 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTreeViewSelectionItemPlugin = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _fastObjectShallowCompare = require("@mui/x-internals/fastObjectShallowCompare");
var _TreeViewProvider = require("../../TreeViewProvider");
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
var _useTreeViewSelection = require("./useTreeViewSelection.selectors");
var _useSelector = require("../../hooks/useSelector");
function selectorItemCheckboxStatus(state, itemId) {
const isCheckboxSelectionEnabled = (0, _useTreeViewSelection.selectorIsCheckboxSelectionEnabled)(state);
const isSelectionEnabledForItem = (0, _useTreeViewSelection.selectorIsItemSelectionEnabled)(state, itemId);
if ((0, _useTreeViewSelection.selectorIsItemSelected)(state, itemId)) {
return {
disabled: !isSelectionEnabledForItem,
visible: isCheckboxSelectionEnabled,
indeterminate: false,
checked: true
};
}
const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId);
if (children.length === 0) {
return {
disabled: !isSelectionEnabledForItem,
visible: isCheckboxSelectionEnabled,
indeterminate: false,
checked: false
};
}
let hasSelectedDescendant = false;
let hasUnSelectedDescendant = false;
const traverseDescendants = itemToTraverseId => {
if (itemToTraverseId !== itemId) {
if ((0, _useTreeViewSelection.selectorIsItemSelected)(state, itemToTraverseId)) {
hasSelectedDescendant = true;
} else {
hasUnSelectedDescendant = true;
}
}
(0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemToTraverseId).forEach(traverseDescendants);
};
traverseDescendants(itemId);
return {
disabled: !isSelectionEnabledForItem,
visible: isCheckboxSelectionEnabled,
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant,
checked: (0, _useTreeViewSelection.selectorSelectionPropagationRules)(state).parents ? hasSelectedDescendant && !hasUnSelectedDescendant : false
};
}
const useTreeViewSelectionItemPlugin = ({
props
}) => {
const {
itemId
} = props;
const {
store
} = (0, _TreeViewProvider.useTreeViewContext)();
const checkboxStatus = (0, _useSelector.useSelector)(store, selectorItemCheckboxStatus, itemId, _fastObjectShallowCompare.fastObjectShallowCompare);
return {
propsEnhancers: {
checkbox: ({
externalEventHandlers,
interactions
}) => {
const handleChange = event => {
externalEventHandlers.onChange?.(event);
if (event.defaultMuiPrevented) {
return;
}
if (!(0, _useTreeViewSelection.selectorIsItemSelectionEnabled)(store.value, itemId)) {
return;
}
interactions.handleCheckboxSelection(event);
};
return (0, _extends2.default)({
tabIndex: -1,
onChange: handleChange
}, checkboxStatus);
}
}
};
};
exports.useTreeViewSelectionItemPlugin = useTreeViewSelectionItemPlugin;