UNPKG

@mui/x-tree-view

Version:

The community edition of the MUI X Tree View components.

80 lines 2.82 kB
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); } } }; };