{"version":3,"file":"BaseTreeMenu.mjs","names":["React","useCallback","useState","useEffect","useRef","makeStyles","useTheme","lighten","CircularProgress","Typography","TreeView","BaseTreeMenuItem","searchTree","findAllParentIds","getNodeIdForRightBorder","FluentIcon","CaretUpSolid8Icon","CaretDownSolid8Icon","cloneDeep","TreeViewModeEnums","useStyles","theme","root","marginBottom","spacing","borderTop","props","treeViewMode","Compact","palette","grey","noChildrenContainer","borderBottom","BaseTreeMenu","menuItems","onSelectNode","onDropNode","menuIndex","selectedNodeId","selectedNodeParentId","sidebarExpanded","childrenKey","expanded","setExpanded","isCurrentActiveTree","setIsCurrentActiveTree","selectedNodeIsHidden","setSelectedNodeIsHidden","tree","setTree","classes","firstRender","handleSelectedNode","e","value","selectedNode","renderTree","node","depth","label","properties","nodeLabel","name","subLabel","nodeSubLabel","iconName","defaultIcon","iconType","type","conditionalIconName","conditionalIconType","conditionalIconColor","nodeId","id","iconColor","color","hex","aggregateThresholdId","isGroupNode","icon","parentId","length","lazyLoad","completedLoadingChildren","marginLeft","errorRetrievingChildren","fontWeight","Array","isArray","map","n","i","handleNodeExpansion","evt","nodeIds","treeCopy","parentNode","initialAllParentNodeIds","allParentNodeIds","selectedNodeShown","every","includes","getExpandedRecursively","reduce","expandedIds","item","isExpanded","push","concat","current","treeSelectedId","String","primary","main","width","height"],"sources":["../../src/treeMenu/BaseTreeMenu.jsx"],"sourcesContent":["import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport {\n  makeStyles,\n  useTheme,\n  lighten,\n  CircularProgress,\n  Typography\n} from '@material-ui/core';\nimport TreeView from '@material-ui/lab/TreeView';\nimport { BaseTreeMenuItem } from './BaseTreeMenuItem';\nimport {\n  searchTree,\n  findAllParentIds,\n  getNodeIdForRightBorder\n} from '../utilities/tree/TreeUtilities';\nimport { FluentIcon } from '../utilities/iconLibrary/FluentIcon';\nimport { CaretUpSolid8Icon, CaretDownSolid8Icon } from '@fluentui/react-icons';\nimport { cloneDeep } from 'lodash-es';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums.ts';\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    marginBottom: theme.spacing(1.75),\n    borderTop: (props) =>\n      props.treeViewMode === TreeViewModeEnums.Compact\n        ? `1px solid ${theme.palette.grey[200]}`\n        : ''\n  },\n  noChildrenContainer: {\n    borderBottom: (props) =>\n      props.treeViewMode === TreeViewModeEnums.Compact\n        ? `1px solid ${theme.palette.grey[200]}`\n        : ''\n  }\n}));\n\nexport const BaseTreeMenu = (props) => {\n  const {\n    menuItems,\n    onSelectNode,\n    onDropNode,\n    menuIndex,\n    selectedNodeId,\n    selectedNodeParentId,\n    sidebarExpanded,\n    treeViewMode,\n    childrenKey = 'children'\n  } = props;\n  const [expanded, setExpanded] = useState(null);\n  const [isCurrentActiveTree, setIsCurrentActiveTree] = useState(false);\n  const [selectedNodeIsHidden, setSelectedNodeIsHidden] = useState(false);\n  const [tree, setTree] = useState(menuItems);\n  const theme = useTheme();\n  const classes = useStyles(props);\n  const firstRender = useRef(true);\n\n  const handleSelectedNode = useCallback(\n    (e, value) => {\n      const selectedNode = searchTree(tree, value);\n      if (onSelectNode) {\n        onSelectNode(selectedNode, menuIndex);\n        setSelectedNodeIsHidden(false);\n      }\n    },\n    [tree, menuIndex, onSelectNode]\n  );\n\n  const renderTree = useCallback(\n    (node, depth = 1) => {\n      let label = node.properties?.nodeLabel || node.properties?.name;\n      let subLabel = node.properties?.nodeSubLabel;\n      let iconName = node.properties?.defaultIcon?.name;\n      let iconType = node.properties?.defaultIcon?.type;\n      let conditionalIconName = node.properties?.conditionalIconName || '';\n      let conditionalIconType = node.properties?.conditionalIconName\n        ? node.properties.conditionalIconType\n        : '';\n      let conditionalIconColor = node.properties?.conditionalIconName\n        ? node.properties?.conditionalIconColor\n        : '';\n      let nodeId = node.id;\n      let iconColor = node.properties?.conditionalIconName\n        ? node.properties?.conditionalIconColor\n        : node.properties?.defaultIcon?.color?.hex;\n      let aggregateThresholdId = node.properties?.aggregateThresholdId || '';\n\n      if (node.isGroupNode) {\n        label = node.properties?.label;\n        subLabel = node.properties?.subLabel;\n        iconName = node.properties?.icon?.name;\n        iconType = node.properties?.icon?.type;\n        iconColor = node.properties?.icon?.color?.hex;\n      }\n\n      return (\n        <BaseTreeMenuItem\n          key={nodeId}\n          nodeId={nodeId}\n          label={label}\n          subLabel={subLabel}\n          iconName={iconName}\n          iconType={iconType}\n          conditionalIconName={conditionalIconName}\n          conditionalIconType={conditionalIconType}\n          conditionalIconColor={conditionalIconColor}\n          parentId={node.parentId}\n          iconColor={iconColor}\n          onNodeSelect={handleSelectedNode}\n          selectedNodeId={selectedNodeId}\n          isSelectedNode={selectedNodeId === node.id}\n          showRightBorderColor={\n            selectedNodeIsHidden &&\n            isCurrentActiveTree &&\n            getNodeIdForRightBorder(expanded, tree, selectedNodeParentId) ===\n              node.id\n          }\n          isCurrentActiveTree={isCurrentActiveTree}\n          sidebarExpanded={sidebarExpanded}\n          depth={depth}\n          hideExpansion={!!!node[childrenKey]?.length}\n          node={node}\n          onDropNode={onDropNode}\n          treeViewMode={treeViewMode}\n          menuIndex={menuIndex}\n          aggregateThresholdId={aggregateThresholdId}\n        >\n          {node.properties?.lazyLoad &&\n            !!!node[childrenKey]?.length &&\n            !node.completedLoadingChildren && (\n              <CircularProgress\n                size={12}\n                style={{ marginLeft: (depth || 1) * theme.spacing(1) }}\n              />\n            )}\n          {node.properties?.lazyLoad &&\n            !!!node[childrenKey]?.length &&\n            node.completedLoadingChildren &&\n            sidebarExpanded &&\n            !node.errorRetrievingChildren && (\n              <div className={classes.noChildrenContainer}>\n                <Typography\n                  variant='caption'\n                  style={{\n                    marginLeft: (depth || 1) * theme.spacing(3),\n                    fontWeight: 400\n                  }}\n                >\n                  No Children\n                </Typography>\n              </div>\n            )}\n          {node.properties?.lazyLoad &&\n            node.completedLoadingChildren &&\n            sidebarExpanded &&\n            node.errorRetrievingChildren && (\n              <div className={classes.noChildrenContainer}>\n                <Typography\n                  variant='caption'\n                  style={{\n                    marginLeft: (depth || 1) * theme.spacing(3),\n                    fontWeight: 400\n                  }}\n                >\n                  {`Error Retrieving ${\n                    !!node[childrenKey]?.length ? `Additional ` : ''\n                  }Children`}\n                </Typography>\n              </div>\n            )}\n          {Array.isArray(node[childrenKey])\n            ? node[childrenKey].map((n, i) => renderTree(n, depth + 1))\n            : null}\n        </BaseTreeMenuItem>\n      );\n    },\n    [\n      handleSelectedNode,\n      selectedNodeId,\n      selectedNodeIsHidden,\n      isCurrentActiveTree,\n      sidebarExpanded,\n      expanded,\n      tree,\n      selectedNodeParentId,\n      theme,\n      classes,\n      onDropNode,\n      treeViewMode,\n      menuIndex,\n      childrenKey\n    ]\n  );\n\n  const handleNodeExpansion = useCallback(\n    async (evt, nodeIds) => {\n      const treeCopy = cloneDeep(tree);\n      setExpanded(nodeIds);\n\n      const parentNode = searchTree(treeCopy, selectedNodeParentId);\n      const initialAllParentNodeIds = selectedNodeParentId\n        ? [selectedNodeParentId]\n        : [];\n      const allParentNodeIds = findAllParentIds(\n        treeCopy,\n        parentNode,\n        initialAllParentNodeIds\n      );\n      const selectedNodeShown = allParentNodeIds.every((id) =>\n        nodeIds.includes(id)\n      );\n      if (\n        isCurrentActiveTree &&\n        allParentNodeIds.length &&\n        !selectedNodeShown\n      ) {\n        setSelectedNodeIsHidden(true);\n      } else {\n        setSelectedNodeIsHidden(false);\n      }\n    },\n    [isCurrentActiveTree, tree, selectedNodeParentId]\n  );\n\n  const getExpandedRecursively = useCallback(\n    (tree) => {\n      if (!tree) return [];\n      return tree.reduce((expandedIds, item) => {\n        if (item?.isExpanded) {\n          expandedIds.push(item.id);\n        }\n        if (item && item[childrenKey]?.length) {\n          expandedIds = expandedIds.concat(\n            getExpandedRecursively(item[childrenKey])\n          );\n        }\n        return expandedIds;\n      }, []);\n    },\n    [childrenKey]\n  );\n\n  useEffect(() => {\n    setTree(menuItems);\n  }, [menuItems]);\n\n  useEffect(() => {\n    if (!tree) return;\n    if (firstRender.current) {\n      let expanded = [];\n      if (tree?.isExpanded) {\n        expanded.push(tree.id);\n      }\n      expanded = expanded.concat(getExpandedRecursively(tree[childrenKey]));\n      setExpanded(expanded);\n      firstRender.current = false;\n    }\n    // Do not reset expanded on subsequent updates\n  }, [getExpandedRecursively, tree, childrenKey]);\n\n  useEffect(() => {\n    if (!!searchTree(tree, selectedNodeId)) {\n      setIsCurrentActiveTree(true);\n    } else {\n      setIsCurrentActiveTree(false);\n    }\n  }, [tree, selectedNodeId]);\n\n  const treeSelectedId =\n    isCurrentActiveTree && selectedNodeId != null\n      ? String(selectedNodeId)\n      : null;\n\n  if (!expanded) {\n    return null;\n  }\n\n  return (\n    <TreeView\n      key={tree}\n      className={classes.root}\n      defaultCollapseIcon={\n        <FluentIcon\n          size='small'\n          component={CaretUpSolid8Icon}\n          style={{\n            color: lighten(theme.palette.primary.main, 0.5),\n            width: theme.spacing(1.5),\n            height: theme.spacing(1.5)\n          }}\n        />\n      }\n      expanded={expanded || []}\n      onNodeToggle={handleNodeExpansion}\n      defaultExpandIcon={\n        <FluentIcon\n          size='small'\n          component={CaretDownSolid8Icon}\n          style={{\n            color: lighten(theme.palette.primary.main, 0.5),\n            width: theme.spacing(1.5),\n            height: theme.spacing(1.5)\n          }}\n        />\n      }\n      selected={treeSelectedId}\n    >\n      {tree && renderTree(tree)}\n    </TreeView>\n  );\n};\n"],"mappings":"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"}