hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 17.3 kB
Source Map (JSON)
{"version":3,"file":"tree.mjs","sources":["../../../../../../packages/components/tree/src/tree.vue"],"sourcesContent":["<template>\n <div\n ref=\"el$\"\n :class=\"{\n [namespace]: true,\n 'highlight-current': highlightCurrent,\n 'is-dragging': !!dragState.draggingNode,\n 'is-drop-not-allow': !dragState.allowDrop,\n 'is-drop-inner': dragState.dropType === 'inner'\n }\"\n :style=\"[\n gap ? `--tree-gap: ${gap}` : '',\n ]\"\n role=\"tree\"\n >\n <tree-node\n v-for=\"child in root.childNodes\"\n :key=\"getNodeKey(child)\"\n :node=\"child\"\n :props=\"props\"\n :accordion=\"accordion\"\n :render-after-expand=\"renderAfterExpand\"\n :show-checkbox=\"showCheckbox\"\n :checkbox-disabled=\"checkboxDisabled\"\n :render-content=\"renderContent\"\n @node-expand=\"handleNodeExpand\"\n >\n <template v-if=\"$slots.icon\" #icon=\"params\">\n <slot name=\"icon\" v-bind=\"params\"></slot>\n </template>\n </tree-node>\n <div v-if=\"isEmpty\" class=\"tree-empty-block\">\n <slot name=\"empty\">\n <span class=\"tree-empty-text\">{{ emptyText ?? t('hl.tree.emptyText') }}</span>\n </slot>\n </div>\n <div\n v-show=\"dragState.showDropIndicator\"\n ref=\"dropIndicator$\"\n class=\"tree-drop-indicator\"\n >\n </div>\n </div>\n</template>\n<script lang='ts'>\nimport { defineComponent, ref, provide, computed, watch, getCurrentInstance, inject } from 'vue'\nimport { useLocale, useNamespace } from '@hongluan-ui/hooks'\nimport { formItemContextKey } from '@hongluan-ui/tokens'\nimport { selectKey } from '@hongluan-ui/components/select/src/token'\nimport TreeStore from './model/tree-store'\nimport { getNodeKey as getNodeKeyUtil, handleCurrentChange } from './model/util'\nimport TreeNode from './tree-node.vue'\nimport { useNodeExpandEventBroadcast } from './model/useNodeExpandEventBroadcast'\nimport { useDragNodeHandler } from './model/useDragNode'\nimport { useKeydown } from './model/useKeydown'\n\nimport type { ComponentInternalInstance, PropType } from 'vue'\nimport type Node from './model/node'\nimport type {\n TreeComponentProps,\n TreeNodeData,\n TreeKey,\n TreeData,\n} from './tree.type'\n\nimport type { Nullable } from '@hongluan-ui/utils'\n\nexport default defineComponent({\n name: 'Tree',\n components: { TreeNode },\n props: {\n data: {\n type: Array,\n default: () => [],\n },\n emptyText: {\n type: String,\n },\n renderAfterExpand: {\n type: Boolean,\n default: true,\n },\n nodeKey: String,\n checkStrictly: Boolean,\n defaultExpandAll: Boolean,\n expandOnClickNode: {\n type: Boolean,\n default: true,\n },\n checkOnClickNode: Boolean,\n checkDescendants: {\n type: Boolean,\n default: false,\n },\n autoExpandParent: {\n type: Boolean,\n default: true,\n },\n defaultCheckedKeys: Array as PropType<TreeComponentProps['defaultCheckedKeys']>,\n defaultExpandedKeys: Array as PropType<TreeComponentProps['defaultExpandedKeys']>,\n currentNodeKey: [String, Number] as PropType<string | number>,\n renderContent: Function,\n showCheckbox: {\n type: Boolean,\n default: false,\n },\n checkboxDisabled: {\n type: Boolean,\n default: false,\n },\n draggable: {\n type: Boolean,\n default: false,\n },\n allowDrag: Function,\n allowDrop: Function,\n props: {\n type: Object as PropType<TreeComponentProps['props']>,\n default: () => ({\n children: 'children',\n label: 'label',\n disabled: 'disabled',\n hideCheckbox: 'hideCheckbox',\n }),\n },\n lazy: {\n type: Boolean,\n default: false,\n },\n highlightCurrent: Boolean,\n load: Function as PropType<TreeComponentProps['load']>,\n filterNodeMethod: Function as PropType<TreeComponentProps['filterNodeMethod']>,\n accordion: Boolean,\n indent: {\n type: Number,\n default: 1,\n },\n iconClass: String,\n gap: String,\n },\n emits: [\n 'check-change',\n 'current-change',\n 'node-click',\n 'node-contextmenu',\n 'node-collapse',\n 'node-expand',\n 'check',\n 'node-drag-start',\n 'node-drag-end',\n 'node-drop',\n 'node-drag-leave',\n 'node-drag-enter',\n 'node-drag-over',\n ],\n setup(props, ctx) {\n const { t } = useLocale()\n const selectInfo: Record<string, any> = inject(selectKey, null)\n\n const store = ref<TreeStore>(new TreeStore({\n key: props.nodeKey,\n data: props.data,\n lazy: props.lazy,\n props: props.props,\n load: props.load,\n currentNodeKey: props.currentNodeKey,\n checkStrictly: props.checkStrictly,\n checkDescendants: props.checkDescendants,\n defaultCheckedKeys: props.defaultCheckedKeys,\n defaultExpandedKeys: props.defaultExpandedKeys,\n autoExpandParent: props.autoExpandParent,\n defaultExpandAll: props.defaultExpandAll,\n filterNodeMethod: props.filterNodeMethod,\n }))\n\n store.value.initialize()\n\n const root = ref<Node>(store.value.root)\n const currentNode = ref<Node>(null)\n const el$ = ref<Nullable<HTMLElement>>(null)\n const dropIndicator$ = ref<Nullable<HTMLElement>>(null)\n\n const { broadcastExpanded } = useNodeExpandEventBroadcast(props)\n\n const { dragState } = useDragNodeHandler({\n props, ctx, el$, dropIndicator$, store,\n })\n\n useKeydown({ el$ }, store)\n\n const isEmpty = computed(() => {\n const { childNodes } = root.value\n const hasFilteredOptions = selectInfo\n ? selectInfo.hasFilteredOptions !== 0\n : false\n return (!childNodes ||\n childNodes.length === 0 ||\n childNodes.every(({ visible }) => !visible)) &&\n !hasFilteredOptions\n })\n\n watch(\n () => props.currentNodeKey,\n newVal => {\n store.value.setCurrentNodeKey(newVal)\n },\n )\n\n watch(() => props.defaultCheckedKeys, newVal => {\n store.value.setDefaultCheckedKey(newVal)\n })\n\n watch(() => props.defaultExpandedKeys, newVal => {\n store.value.defaultExpandedKeys = newVal\n store.value.setDefaultExpandedKeys(newVal)\n })\n\n watch(() => props.data, newVal => {\n store.value.setData(newVal)\n }, { deep: true })\n\n watch(() => props.checkStrictly, newVal => {\n store.value.checkStrictly = newVal\n })\n\n const filter = value => {\n if (!props.filterNodeMethod) throw new Error('[Tree] filterNodeMethod is required when filter')\n store.value.filter(value)\n }\n\n const getNodeKey = (node: Node) => {\n return getNodeKeyUtil(props.nodeKey, node.data)\n }\n\n const getNodePath = (data: TreeKey | TreeNodeData) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in getNodePath')\n const node = store.value.getNode(data)\n if (!node) return []\n const path = [node.data]\n let parent = node.parent\n while (parent && parent !== root.value) {\n path.push(parent.data)\n parent = parent.parent\n }\n return path.reverse()\n }\n\n const getCheckedNodes = (leafOnly: boolean, includeHalfChecked: boolean): TreeNodeData[] => {\n return store.value.getCheckedNodes(leafOnly, includeHalfChecked)\n }\n\n const getCheckedKeys = (leafOnly: boolean): TreeKey[] => {\n return store.value.getCheckedKeys(leafOnly)\n }\n\n const getCurrentNode = (): TreeNodeData => {\n const currentNode = store.value.getCurrentNode()\n return currentNode ? currentNode.data : null\n }\n\n const getCurrentKey = (): any => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in getCurrentKey')\n const currentNode = getCurrentNode()\n return currentNode ? currentNode[props.nodeKey] : null\n }\n\n const setCheckedNodes = (nodes: Node[], leafOnly: boolean) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in setCheckedNodes')\n store.value.setCheckedNodes(nodes, leafOnly)\n }\n\n const setCheckedKeys = (keys: TreeKey[], leafOnly?: boolean) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in setCheckedKeys')\n store.value.setCheckedKeys(keys, leafOnly)\n }\n\n const setChecked = (data: TreeKey | TreeNodeData, checked: boolean, deep: boolean) => {\n store.value.setChecked(data, checked, deep)\n }\n\n const getHalfCheckedNodes = (): TreeNodeData[] => {\n return store.value.getHalfCheckedNodes()\n }\n\n const getHalfCheckedKeys = (): TreeKey[] => {\n return store.value.getHalfCheckedKeys()\n }\n\n const setCurrentNode = (node: Node, shouldAutoExpandParent = true) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in setCurrentNode')\n\n handleCurrentChange(store, ctx.emit, () => {\n broadcastExpanded(node)\n store.value.setUserCurrentNode(node, shouldAutoExpandParent)\n })\n }\n\n const setCurrentKey = (key?: TreeKey, shouldAutoExpandParent = true) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in setCurrentKey')\n\n handleCurrentChange(store, ctx.emit, () => {\n broadcastExpanded()\n store.value.setCurrentNodeKey(key, shouldAutoExpandParent)\n })\n }\n\n const getNode = (data: TreeKey | TreeNodeData): Node => {\n return store.value.getNode(data)\n }\n\n const remove = (data: TreeNodeData | Node) => {\n store.value.remove(data)\n }\n\n const append = (data: TreeNodeData, parentNode: TreeNodeData | TreeKey | Node) => {\n store.value.append(data, parentNode)\n }\n\n const insertBefore = (data: TreeNodeData, refNode: TreeKey | TreeNodeData | Node) => {\n store.value.insertBefore(data, refNode)\n }\n\n const insertAfter = (data: TreeNodeData, refNode: TreeKey | TreeNodeData | Node) => {\n store.value.insertAfter(data, refNode)\n }\n\n const handleNodeExpand = (nodeData: TreeNodeData, node: Node, instance: ComponentInternalInstance) => {\n broadcastExpanded(node)\n ctx.emit('node-expand', nodeData, node, instance)\n }\n\n const updateKeyChildren = (key: TreeKey, data: TreeData) => {\n if (!props.nodeKey) throw new Error('[Tree] nodeKey is required in updateKeyChild')\n store.value.updateChildren(key, data)\n }\n\n provide('RootTree', {\n ctx,\n props,\n store,\n root,\n currentNode,\n instance: getCurrentInstance(),\n } as any)\n provide(formItemContextKey, undefined)\n\n const { namespace } = useNamespace('tree')\n\n return {\n namespace,\n // ref\n store,\n root,\n currentNode,\n dragState,\n el$,\n dropIndicator$,\n\n // computed\n isEmpty,\n\n // methods\n filter,\n getNodeKey,\n getNodePath,\n getCheckedNodes,\n getCheckedKeys,\n getCurrentNode,\n getCurrentKey,\n setCheckedNodes,\n setCheckedKeys,\n setChecked,\n getHalfCheckedNodes,\n getHalfCheckedKeys,\n setCurrentNode,\n setCurrentKey,\n getNode,\n remove,\n append,\n insertBefore,\n insertAfter,\n handleNodeExpand,\n updateKeyChildren,\n\n t,\n }\n },\n})\n</script>\n"],"names":["getNodeKey","getNodeKeyUtil","_createElementBlock","_normalizeClass","_normalizeStyle","_Fragment","_createBlock","_renderSlot"],"mappings":"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"}