UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 8.15 kB
{"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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"}