UNPKG

@mui/x-tree-view

Version:

The community edition of the MUI X Tree View components.

49 lines 2.03 kB
import { createSelector, createSelectorMemoized } from '@mui/x-internals/store'; import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js"; import { TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewItems/index.js"; const expandedItemMapSelector = createSelectorMemoized(state => state.expansion.expandedItems, expandedItems => { const expandedItemsMap = new Map(); expandedItems.forEach(id => { expandedItemsMap.set(id, true); }); return expandedItemsMap; }); export const expansionSelectors = { /** * Gets the expanded items as provided to the component. */ expandedItemsRaw: createSelector(state => state.expansion.expandedItems), /** * Gets the expanded items as a Map. */ expandedItemsMap: expandedItemMapSelector, /** * Gets the items to render as a flat list (the descendants of an expanded item are listed as siblings of the item). */ flatList: createSelectorMemoized(itemsSelectors.itemOrderedChildrenIdsLookup, expandedItemMapSelector, (itemOrderedChildrenIds, expandedItemsMap) => { function appendChildren(itemId) { if (!expandedItemsMap.has(itemId)) { return [itemId]; } const itemsWithDescendants = [itemId]; const children = itemOrderedChildrenIds[itemId] || []; for (const childId of children) { itemsWithDescendants.push(...appendChildren(childId)); } return itemsWithDescendants; } return (itemOrderedChildrenIds[TREE_VIEW_ROOT_PARENT_ID] ?? []).flatMap(appendChildren); }), /** * Gets the slot that triggers the item's expansion when clicked. */ triggerSlot: createSelector(state => state.expansion.expansionTrigger), /** * Checks whether an item is expanded. */ isItemExpanded: createSelector(expandedItemMapSelector, (expandedItemsMap, itemId) => expandedItemsMap.has(itemId)), /** * Checks whether an item is expandable. */ isItemExpandable: createSelector(itemsSelectors.itemMeta, (itemMeta, _itemId) => itemMeta?.expandable ?? false) };