currentItemUuid?: string;
items?: Array<TreeItem<T>>;
level?: number;
+ itemsMap?: Map<string, TreeItem<T>>;
onContextMenu: (event: React.MouseEvent<HTMLElement>, item: TreeItem<T>) => void;
render: (item: TreeItem<T>, level?: number) => ReactElement<{}>;
showSelection?: boolean | ((item: TreeItem<T>) => boolean);
toggleItemActive: Function;
getToggableIconClassNames: Function;
getProperArrowAnimation: Function;
+ itemsMap?: Map<string, TreeItem<any>>;
classes: any;
}
-
const FLAT_TREE_ACTIONS = {
toggleOpen: 'TOGGLE_OPEN',
contextMenu: 'CONTEXT_MENU',
const [action, id] = getActionAndId(event);
if (action && id) {
+ const item = props.itemsMap ? props.itemsMap[id] : { id };
+
switch (action) {
case FLAT_TREE_ACTIONS.toggleOpen:
- props.handleToggleItemOpen({ id } as any, event);
+ props.handleToggleItemOpen(item as any, event);
break;
case FLAT_TREE_ACTIONS.toggleActive:
- props.toggleItemActive(event, { id } as any);
+ props.toggleItemActive(event, item as any);
break;
default:
break;
class Component<T> extends React.Component<TreeProps<T> & WithStyles<CssRules>, {}> {
render(): ReactElement<any> {
const level = this.props.level ? this.props.level : 0;
- const { classes, render, items, toggleItemActive, toggleItemOpen, disableRipple, currentItemUuid, useRadioButtons } = this.props;
+ const { classes, render, items, toggleItemActive, toggleItemOpen, disableRipple, currentItemUuid, useRadioButtons, itemsMap } = this.props;
const { list, listItem, loader, toggableIconContainer, renderContainer } = classes;
const showSelection = typeof this.props.showSelection === 'function'
? this.props.showSelection
it.flatTree ?
<FlatTree
it={it}
+ itemsMap={itemsMap}
classes={this.props.classes}
levelIndentation={levelIndentation}
onContextMenu={this.props.onContextMenu}
}
const flatTree = (depth: number, items?: any): [] => {
- return items ? items.reduce((prev: any, next: any) => {
- const { items } = next;
+ return items ? items
+ .map(addToItemsIdMap)
+ .reduce((prev: any, next: any) => {
+ const { items } = next;
- return [
- ...prev,
- { ...next, depth },
- ...(next.open ? flatTree(depth + 1, items) : []),
- ];
- }, []) : [];
+ return [
+ ...prev,
+ { ...next, depth },
+ ...(next.open ? flatTree(depth + 1, items) : []),
+ ];
+ }, []) : [];
+};
+
+const itemsIdMap = new Map();
+const addToItemsIdMap = <T>(item: TreeItem<T>) => {
+ itemsIdMap[item.id] = item;
+ return item;
};
const memoizedMapStateToProps = () => {
let prevTree: Ttree<any>;
- let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple'>;
- return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple'> => {
+ let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple' | 'itemsMap'>;
+ return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple' | 'itemsMap'> => {
const tree = state.treePicker[props.pickerId] || createTree();
if (tree !== prevTree) {
prevTree = tree;
disableRipple: true,
items: getNodeChildrenIds('')(tree)
.map(treePickerToTreeItems(tree))
+ .map(addToItemsIdMap)
.map(parentItem => ({
...parentItem,
flatTree: true,
items: flatTree(2, parentItem.items || []),
- }))
+ })),
+ itemsMap: itemsIdMap,
};
}
return mappedProps;