{"version":3,"file":"v-menu.mjs","sources":["../../src/menu/v-menu.ts"],"sourcesContent":["import { ref, Slot } from 'vue';\nimport type { TdMenuItemProps } from './type';\n\ntype MenuValue = string | number;\ntype MenuNode = MenuValue | VMenuData;\n\ninterface VMenuData {\n  value: MenuValue;\n  parent?: MenuNode;\n  children: VMenuData[];\n  vnode?: Slot;\n}\n\ninterface VMenuItem extends TdMenuItemProps {\n  value?: MenuValue;\n  parent: MenuValue;\n  vnode?: Slot;\n}\n\nconst getTreePaths = (node: VMenuData, val: MenuValue, ans: MenuValue[]): MenuValue[] => {\n  if (!node) return;\n  for (let i = 0; i < node.children.length; ++i) {\n    const child = node.children[i];\n    if (child.value === val) return [...ans, node.value];\n    const target = getTreePaths(child, val, [...ans, node.value]);\n    if (target) return target;\n  }\n};\n\nconst getTreeSameParentNodes = (node: VMenuData, val: MenuValue): VMenuData[] => {\n  if (!node) return [];\n  for (let i = 0; i < node.children.length; ++i) {\n    const child = node.children[i];\n    if (child.value === val) return node.children;\n    const target = getTreeSameParentNodes(child, val);\n    if (target) return target;\n  }\n};\n\nconst DFS = (root: VMenuData, val: MenuValue): VMenuData => {\n  if (root.value === val) return root;\n  if (root.children.length > 0) {\n    for (let i = 0, len = root.children.length; i < len; i++) {\n      const res = DFS(root.children[i], val);\n      if (res) return res;\n    }\n  }\n};\n\nexport default class VMenu {\n  data: VMenuData = null;\n\n  cache: Set<VMenuData> = new Set();\n\n  isMutex = ref(false);\n\n  expandValues: Set<MenuValue> = null;\n\n  constructor(options: Record<string, any>) {\n    const root: VMenuData = {\n      value: null,\n      parent: null,\n      children: [],\n    };\n    this.data = root;\n    this.isMutex = options?.isMutex;\n    this.expandValues = new Set(options?.expandValues);\n  }\n\n  add(item: VMenuItem) {\n    const { value, parent, vnode } = item;\n    const node: VMenuData = {\n      value,\n      parent,\n      children: [],\n      vnode,\n      ...item,\n    };\n\n    this.cache.forEach((data, v2, set) => {\n      if (item.value === data.parent) {\n        node.children.push(data);\n        set.delete(data);\n      }\n    });\n    if (item.parent == null) {\n      this.data.children.push(node);\n      node.parent = this.data;\n    } else if (this.data.children.length > 0) {\n      const pNode = DFS(this.data, parent);\n      if (pNode && !pNode.children.some((child) => child.value === node.value)) {\n        pNode.children.push(node);\n      } else {\n        this.cache.add(node);\n      }\n    } else {\n      this.cache.add(node);\n    }\n  }\n\n  select(val: MenuValue) {\n    const activeValues = getTreePaths(this.data, val, []) || [];\n\n    activeValues.push(val);\n    return activeValues.filter((val) => val != null);\n  }\n\n  expand(val: MenuValue) {\n    if (this.expandValues.has(val)) {\n      this.expandValues.delete(val);\n      return [...this.expandValues];\n    }\n\n    this.expandValues.add(val);\n\n    if (!this.isMutex.value) {\n      return [...this.expandValues];\n    }\n\n    const sameParentNodes = getTreeSameParentNodes(this.data, val) || [];\n    const sameLevelSubmenuValues = new Set(\n      sameParentNodes.filter((node) => node.children?.length > 0 && node.value !== val).map((child) => child.value),\n    );\n\n    this.expandValues.forEach((val) => {\n      const isHit = sameLevelSubmenuValues.has(val);\n      if (isHit) {\n        this.expandValues.delete(val);\n      }\n    });\n    return [...this.expandValues];\n  }\n\n  getChild(value: MenuValue) {\n    const target = DFS(this.data, value);\n\n    return target ? target.children : [];\n  }\n}\n"],"names":["_classCallCheck","_defineProperty","value","parent","children","_createClass","vnode","node","pNode","activeValues","_this"],"mappings":"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"}