UNPKG

element-plus

Version:

A Component Library for Vue 3

319 lines (314 loc) 12.3 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var shared = require('@vue/shared'); var index = require('../../collapse-transition/index.js'); var index$1 = require('../../checkbox/index.js'); var index$2 = require('../../icon/index.js'); var iconsVue = require('@element-plus/icons-vue'); require('../../../utils/index.js'); require('../../../hooks/index.js'); var treeNodeContent = require('./tree-node-content.js'); var util = require('./model/util.js'); var useNodeExpandEventBroadcast = require('./model/useNodeExpandEventBroadcast.js'); var useDragNode = require('./model/useDragNode.js'); var node = require('./model/node.js'); var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js'); var index$3 = require('../../../hooks/use-namespace/index.js'); var error = require('../../../utils/error.js'); const _sfc_main = vue.defineComponent({ name: "ElTreeNode", components: { ElCollapseTransition: index["default"], ElCheckbox: index$1.ElCheckbox, NodeContent: treeNodeContent["default"], ElIcon: index$2.ElIcon, Loading: iconsVue.Loading }, props: { node: { type: node["default"], default: () => ({}) }, props: { type: Object, default: () => ({}) }, accordion: Boolean, renderContent: Function, renderAfterExpand: Boolean, showCheckbox: { type: Boolean, default: false } }, emits: ["node-expand"], setup(props, ctx) { const ns = index$3.useNamespace("tree"); const { broadcastExpanded } = useNodeExpandEventBroadcast.useNodeExpandEventBroadcast(props); const tree = vue.inject("RootTree"); const expanded = vue.ref(false); const childNodeRendered = vue.ref(false); const oldChecked = vue.ref(null); const oldIndeterminate = vue.ref(null); const node$ = vue.ref(null); const dragEvents = vue.inject(useDragNode.dragEventsKey); const instance = vue.getCurrentInstance(); vue.provide("NodeInstance", instance); if (!tree) { error.debugWarn("Tree", "Can not find node's tree."); } if (props.node.expanded) { expanded.value = true; childNodeRendered.value = true; } const childrenKey = tree.props["children"] || "children"; vue.watch(() => { const children = props.node.data[childrenKey]; return children && [...children]; }, () => { props.node.updateChildren(); }); vue.watch(() => props.node.indeterminate, (val) => { handleSelectChange(props.node.checked, val); }); vue.watch(() => props.node.checked, (val) => { handleSelectChange(val, props.node.indeterminate); }); vue.watch(() => props.node.expanded, (val) => { vue.nextTick(() => expanded.value = val); if (val) { childNodeRendered.value = true; } }); const getNodeKey = (node) => { return util.getNodeKey(tree.props.nodeKey, node.data); }; const getNodeClass = (node) => { const nodeClassFunc = props.props.class; if (!nodeClassFunc) { return {}; } let className; if (shared.isFunction(nodeClassFunc)) { const { data } = node; className = nodeClassFunc(data, node); } else { className = nodeClassFunc; } if (shared.isString(className)) { return { [className]: true }; } else { return className; } }; const handleSelectChange = (checked, indeterminate) => { if (oldChecked.value !== checked || oldIndeterminate.value !== indeterminate) { tree.ctx.emit("check-change", props.node.data, checked, indeterminate); } oldChecked.value = checked; oldIndeterminate.value = indeterminate; }; const handleClick = (e) => { util.handleCurrentChange(tree.store, tree.ctx.emit, () => tree.store.value.setCurrentNode(props.node)); tree.currentNode.value = props.node; if (tree.props.expandOnClickNode) { handleExpandIconClick(); } if (tree.props.checkOnClickNode && !props.node.disabled) { handleCheckChange(null, { target: { checked: !props.node.checked } }); } tree.ctx.emit("node-click", props.node.data, props.node, instance, e); }; const handleContextMenu = (event) => { if (tree.instance.vnode.props["onNodeContextmenu"]) { event.stopPropagation(); event.preventDefault(); } tree.ctx.emit("node-contextmenu", event, props.node.data, props.node, instance); }; const handleExpandIconClick = () => { if (props.node.isLeaf) return; if (expanded.value) { tree.ctx.emit("node-collapse", props.node.data, props.node, instance); props.node.collapse(); } else { props.node.expand(); ctx.emit("node-expand", props.node.data, props.node, instance); } }; const handleCheckChange = (value, ev) => { props.node.setChecked(ev.target.checked, !tree.props.checkStrictly); vue.nextTick(() => { const store = tree.store.value; tree.ctx.emit("check", props.node.data, { checkedNodes: store.getCheckedNodes(), checkedKeys: store.getCheckedKeys(), halfCheckedNodes: store.getHalfCheckedNodes(), halfCheckedKeys: store.getHalfCheckedKeys() }); }); }; const handleChildNodeExpand = (nodeData, node, instance2) => { broadcastExpanded(node); tree.ctx.emit("node-expand", nodeData, node, instance2); }; const handleDragStart = (event) => { if (!tree.props.draggable) return; dragEvents.treeNodeDragStart({ event, treeNode: props }); }; const handleDragOver = (event) => { event.preventDefault(); if (!tree.props.draggable) return; dragEvents.treeNodeDragOver({ event, treeNode: { $el: node$.value, node: props.node } }); }; const handleDrop = (event) => { event.preventDefault(); }; const handleDragEnd = (event) => { if (!tree.props.draggable) return; dragEvents.treeNodeDragEnd(event); }; return { ns, node$, tree, expanded, childNodeRendered, oldChecked, oldIndeterminate, getNodeKey, getNodeClass, handleSelectChange, handleClick, handleContextMenu, handleExpandIconClick, handleCheckChange, handleChildNodeExpand, handleDragStart, handleDragOver, handleDrop, handleDragEnd, CaretRight: iconsVue.CaretRight }; } }); const _hoisted_1 = ["aria-expanded", "aria-disabled", "aria-checked", "draggable", "data-key"]; const _hoisted_2 = ["aria-expanded"]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_icon = vue.resolveComponent("el-icon"); const _component_el_checkbox = vue.resolveComponent("el-checkbox"); const _component_loading = vue.resolveComponent("loading"); const _component_node_content = vue.resolveComponent("node-content"); const _component_el_tree_node = vue.resolveComponent("el-tree-node"); const _component_el_collapse_transition = vue.resolveComponent("el-collapse-transition"); return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { ref: "node$", class: vue.normalizeClass([ _ctx.ns.b("node"), _ctx.ns.is("expanded", _ctx.expanded), _ctx.ns.is("current", _ctx.node.isCurrent), _ctx.ns.is("hidden", !_ctx.node.visible), _ctx.ns.is("focusable", !_ctx.node.disabled), _ctx.ns.is("checked", !_ctx.node.disabled && _ctx.node.checked), _ctx.getNodeClass(_ctx.node) ]), role: "treeitem", tabindex: "-1", "aria-expanded": _ctx.expanded, "aria-disabled": _ctx.node.disabled, "aria-checked": _ctx.node.checked, draggable: _ctx.tree.props.draggable, "data-key": _ctx.getNodeKey(_ctx.node), onClick: _cache[1] || (_cache[1] = vue.withModifiers((...args) => _ctx.handleClick && _ctx.handleClick(...args), ["stop"])), onContextmenu: _cache[2] || (_cache[2] = (...args) => _ctx.handleContextMenu && _ctx.handleContextMenu(...args)), onDragstart: _cache[3] || (_cache[3] = vue.withModifiers((...args) => _ctx.handleDragStart && _ctx.handleDragStart(...args), ["stop"])), onDragover: _cache[4] || (_cache[4] = vue.withModifiers((...args) => _ctx.handleDragOver && _ctx.handleDragOver(...args), ["stop"])), onDragend: _cache[5] || (_cache[5] = vue.withModifiers((...args) => _ctx.handleDragEnd && _ctx.handleDragEnd(...args), ["stop"])), onDrop: _cache[6] || (_cache[6] = vue.withModifiers((...args) => _ctx.handleDrop && _ctx.handleDrop(...args), ["stop"])) }, [ vue.createElementVNode("div", { class: vue.normalizeClass(_ctx.ns.be("node", "content")), style: vue.normalizeStyle({ paddingLeft: (_ctx.node.level - 1) * _ctx.tree.props.indent + "px" }) }, [ _ctx.tree.props.icon || _ctx.CaretRight ? (vue.openBlock(), vue.createBlock(_component_el_icon, { key: 0, class: vue.normalizeClass([ _ctx.ns.be("node", "expand-icon"), _ctx.ns.is("leaf", _ctx.node.isLeaf), { expanded: !_ctx.node.isLeaf && _ctx.expanded } ]), onClick: vue.withModifiers(_ctx.handleExpandIconClick, ["stop"]) }, { default: vue.withCtx(() => [ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.tree.props.icon || _ctx.CaretRight))) ]), _: 1 }, 8, ["class", "onClick"])) : vue.createCommentVNode("v-if", true), _ctx.showCheckbox ? (vue.openBlock(), vue.createBlock(_component_el_checkbox, { key: 1, "model-value": _ctx.node.checked, indeterminate: _ctx.node.indeterminate, disabled: !!_ctx.node.disabled, onClick: _cache[0] || (_cache[0] = vue.withModifiers(() => { }, ["stop"])), onChange: _ctx.handleCheckChange }, null, 8, ["model-value", "indeterminate", "disabled", "onChange"])) : vue.createCommentVNode("v-if", true), _ctx.node.loading ? (vue.openBlock(), vue.createBlock(_component_el_icon, { key: 2, class: vue.normalizeClass([_ctx.ns.be("node", "loading-icon"), _ctx.ns.is("loading")]) }, { default: vue.withCtx(() => [ vue.createVNode(_component_loading) ]), _: 1 }, 8, ["class"])) : vue.createCommentVNode("v-if", true), vue.createVNode(_component_node_content, { node: _ctx.node, "render-content": _ctx.renderContent }, null, 8, ["node", "render-content"]) ], 6), vue.createVNode(_component_el_collapse_transition, null, { default: vue.withCtx(() => [ !_ctx.renderAfterExpand || _ctx.childNodeRendered ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { key: 0, class: vue.normalizeClass(_ctx.ns.be("node", "children")), role: "group", "aria-expanded": _ctx.expanded }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.node.childNodes, (child) => { return vue.openBlock(), vue.createBlock(_component_el_tree_node, { key: _ctx.getNodeKey(child), "render-content": _ctx.renderContent, "render-after-expand": _ctx.renderAfterExpand, "show-checkbox": _ctx.showCheckbox, node: child, accordion: _ctx.accordion, props: _ctx.props, onNodeExpand: _ctx.handleChildNodeExpand }, null, 8, ["render-content", "render-after-expand", "show-checkbox", "node", "accordion", "props", "onNodeExpand"]); }), 128)) ], 10, _hoisted_2)), [ [vue.vShow, _ctx.expanded] ]) : vue.createCommentVNode("v-if", true) ]), _: 1 }) ], 42, _hoisted_1)), [ [vue.vShow, _ctx.node.visible] ]); } var ElTreeNode = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/tree/src/tree-node.vue"]]); exports["default"] = ElTreeNode; //# sourceMappingURL=tree-node.js.map