UNPKG

@mui/x-tree-view

Version:

The community edition of the MUI X Tree View components.

49 lines • 1.86 kB
import { createSelectorMemoized } from '@mui/x-internals/store'; import { itemsSelectors } from "../items/selectors.mjs"; import { TREE_VIEW_ROOT_PARENT_ID } from "../items/index.mjs"; const expandedItemMapSelector = createSelectorMemoized(state => state.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: state => state.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: state => state.expansionTrigger, /** * Checks whether an item is expanded. */ isItemExpanded: (state, itemId) => expandedItemMapSelector(state).has(itemId), /** * Checks whether an item is expandable. */ isItemExpandable: (state, itemId) => itemsSelectors.itemMeta(state, itemId)?.expandable ?? false };