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