@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
80 lines • 2.82 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { fastObjectShallowCompare } from '@mui/x-internals/fastObjectShallowCompare';
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
import { selectorIsCheckboxSelectionEnabled, selectorIsItemSelected, selectorIsItemSelectionEnabled, selectorSelectionPropagationRules } from "./useTreeViewSelection.selectors.js";
import { useSelector } from "../../hooks/useSelector.js";
function selectorItemCheckboxStatus(state, itemId) {
const isCheckboxSelectionEnabled = selectorIsCheckboxSelectionEnabled(state);
const isSelectionEnabledForItem = selectorIsItemSelectionEnabled(state, itemId);
if (selectorIsItemSelected(state, itemId)) {
return {
disabled: !isSelectionEnabledForItem,
visible: isCheckboxSelectionEnabled,
indeterminate: false,
checked: true
};
}
const children = 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 (selectorIsItemSelected(state, itemToTraverseId)) {
hasSelectedDescendant = true;
} else {
hasUnSelectedDescendant = true;
}
}
selectorItemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
};
traverseDescendants(itemId);
return {
disabled: !isSelectionEnabledForItem,
visible: isCheckboxSelectionEnabled,
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant,
checked: selectorSelectionPropagationRules(state).parents ? hasSelectedDescendant && !hasUnSelectedDescendant : false
};
}
export const useTreeViewSelectionItemPlugin = ({
props
}) => {
const {
itemId
} = props;
const {
store
} = useTreeViewContext();
const checkboxStatus = useSelector(store, selectorItemCheckboxStatus, itemId, fastObjectShallowCompare);
return {
propsEnhancers: {
checkbox: ({
externalEventHandlers,
interactions
}) => {
const handleChange = event => {
externalEventHandlers.onChange?.(event);
if (event.defaultMuiPrevented) {
return;
}
if (!selectorIsItemSelectionEnabled(store.value, itemId)) {
return;
}
interactions.handleCheckboxSelection(event);
};
return _extends({
tabIndex: -1,
onChange: handleChange
}, checkboxStatus);
}
}
};
};