@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
49 lines • 1.86 kB
JavaScript
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
};