@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
83 lines (82 loc) • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTreeViewSelectionItemPlugin = void 0;
var _store = require("@mui/x-internals/store");
var _TreeViewProvider = require("../../TreeViewProvider");
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
var _useTreeViewSelection = require("./useTreeViewSelection.selectors");
const selectorCheckboxSelectionStatus = (0, _store.createSelector)((state, itemId) => {
if (_useTreeViewSelection.selectionSelectors.isItemSelected(state, itemId)) {
return 'checked';
}
let hasSelectedDescendant = false;
let hasUnSelectedDescendant = false;
const traverseDescendants = itemToTraverseId => {
if (itemToTraverseId !== itemId) {
if (_useTreeViewSelection.selectionSelectors.isItemSelected(state, itemToTraverseId)) {
hasSelectedDescendant = true;
} else {
hasUnSelectedDescendant = true;
}
}
_useTreeViewItems.itemsSelectors.itemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
};
traverseDescendants(itemId);
const shouldSelectBasedOnDescendants = _useTreeViewSelection.selectionSelectors.propagationRules(state).parents;
if (shouldSelectBasedOnDescendants) {
if (hasSelectedDescendant && hasUnSelectedDescendant) {
return 'indeterminate';
}
if (hasSelectedDescendant && !hasUnSelectedDescendant) {
return 'checked';
}
return 'empty';
}
if (hasSelectedDescendant) {
return 'indeterminate';
}
return 'empty';
});
const useTreeViewSelectionItemPlugin = ({
props
}) => {
const {
itemId
} = props;
const {
store
} = (0, _TreeViewProvider.useTreeViewContext)();
const isCheckboxSelectionEnabled = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.isCheckboxSelectionEnabled);
const isItemSelectionEnabled = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
const checkboxSelectionStatus = (0, _store.useStore)(store, selectorCheckboxSelectionStatus, itemId);
return {
propsEnhancers: {
checkbox: ({
externalEventHandlers,
interactions
}) => {
const handleChange = event => {
externalEventHandlers.onChange?.(event);
if (event.defaultMuiPrevented) {
return;
}
if (!_useTreeViewSelection.selectionSelectors.canItemBeSelected(store.state, itemId)) {
return;
}
interactions.handleCheckboxSelection(event);
};
return {
tabIndex: -1,
onChange: handleChange,
visible: isCheckboxSelectionEnabled,
disabled: !isItemSelectionEnabled,
checked: checkboxSelectionStatus === 'checked',
indeterminate: checkboxSelectionStatus === 'indeterminate'
};
}
}
};
};
exports.useTreeViewSelectionItemPlugin = useTreeViewSelectionItemPlugin;