UNPKG

@mui/x-tree-view

Version:

The community edition of the MUI X Tree View components.

83 lines (82 loc) 2.97 kB
"use strict"; 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;