hongluan-business-ui
Version:
Hongluan Business Component Library for Vue 3
195 lines (190 loc) • 6.69 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var hongluanUi = require('hongluan-ui');
var util = require('../../../utils/util.js');
var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
const _sfc_main = vue.defineComponent({
name: "TreeSelector",
components: {
HlSelector: hongluanUi.HlSelector,
HlTree: hongluanUi.HlTree,
HlScrollbar: hongluanUi.HlScrollbar
},
props: {
modelValue: [Array, String, Number, Object],
treeProps: Object,
clearable: Boolean,
placeholder: String,
placement: String,
collapseTags: Boolean,
filterable: Boolean,
size: {
type: String,
default: null
},
popperClass: {
type: String,
default: ""
},
disabled: Boolean
},
emits: ["update:modelValue", "change"],
setup(props, { emit }) {
const { prefix } = util.usePrefix();
const hlSelector = vue.ref(null);
const selectorTree = vue.ref(null);
const treeStyle = vue.ref({});
const propsLabel = vue.computed(() => {
return props.treeProps.props.label || "label";
});
const formItem = vue.inject(hongluanUi.formItemContextKey, {});
vue.watch(() => props.modelValue, () => {
setSelected();
});
vue.watch(() => props.treeProps.data, () => {
setSelected();
});
const valueChange = (value) => {
var _a;
emit("update:modelValue", value);
emit("change", value);
(_a = formItem.validate) == null ? void 0 : _a.call(formItem, hongluanUi.FormItemEvents.change);
};
const nodeClick = (data, node, component) => {
const treeProps = props.treeProps;
const children = data[treeProps.props.children];
const value = data[treeProps.nodeKey];
if ((children && children.length || treeProps.lazy && !data["isLeaf"]) && !treeProps.checkStrictly) {
component.proxy.handleExpandIconClick();
} else if (!treeProps.showCheckbox && !data.disabled) {
if (value !== props.modelValue) {
valueChange(value);
}
hlSelector.value.togglePopperVisible(false);
}
};
const checkChange = () => {
const leafOnly = !props.treeProps.checkStrictly;
const keys = selectorTree.value.getCheckedKeys(leafOnly);
valueChange(keys);
};
const setSelected = () => {
if (props.treeProps.showCheckbox && Array.isArray(props.modelValue)) {
selectorTree.value.setCheckedKeys(props.modelValue);
const selectedNodes = selectorTree.value.getCheckedNodes(!props.treeProps.checkStrictly);
hlSelector.value.setValue(selectedNodes);
} else {
const selectedNode = selectorTree.value.getNode(props.modelValue);
hlSelector.value.setValue(selectedNode ? selectedNode.data[propsLabel.value] : "");
}
};
const resizePopper = (inputWrapper) => {
treeStyle.value.width = 30 + inputWrapper.offsetWidth + "px";
};
const onInput = (val) => {
if (props.filterable) {
selectorTree.value.filter(val);
}
};
const onClear = () => {
if (props.filterable) {
selectorTree.value.filter("");
}
selectorTree.value.setCheckedNodes([]);
valueChange(props.treeProps.showCheckbox ? [] : "");
};
const removeTag = (tag) => {
let treeNodes = selectorTree.value.getCheckedNodes(!props.treeProps.checkStrictly);
treeNodes = treeNodes.filter((n) => n !== tag.text);
selectorTree.value.setCheckedNodes(treeNodes);
};
vue.onMounted(() => {
setSelected();
});
return {
prefix,
hlSelector,
selectorTree,
treeStyle,
propsLabel,
onInput,
onClear,
removeTag,
nodeClick,
checkChange,
resizePopper
};
}
});
const _hoisted_1 = { class: "tree-node-label" };
const _hoisted_2 = { key: 0 };
const _hoisted_3 = { key: 1 };
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_hl_tree = vue.resolveComponent("hl-tree");
const _component_hl_scrollbar = vue.resolveComponent("hl-scrollbar");
const _component_hl_selector = vue.resolveComponent("hl-selector");
return vue.openBlock(), vue.createBlock(_component_hl_selector, {
ref: "hlSelector",
"popper-class": `${_ctx.prefix}-tree-selector-popper ${_ctx.popperClass}`,
size: _ctx.size,
disabled: _ctx.disabled,
clearable: _ctx.clearable,
placeholder: _ctx.placeholder,
placement: _ctx.placement,
"collapse-tags": _ctx.collapseTags,
filterable: _ctx.filterable,
multiple: _ctx.treeProps.showCheckbox,
onResize: _ctx.resizePopper,
onInput: _ctx.onInput,
onClear: _ctx.onClear,
onRemoveTag: _ctx.removeTag
}, vue.createSlots({
default: vue.withCtx(() => [
vue.createVNode(_component_hl_scrollbar, {
ref: "scrollbar",
"wrap-class": "selector-dropdown-wrap",
"view-class": "selector-dropdown-list"
}, {
default: vue.withCtx(() => [
vue.createVNode(_component_hl_tree, vue.mergeProps({
ref: "selectorTree",
class: "selector-tree",
"node-key": "id"
}, _ctx.treeProps, {
style: _ctx.treeStyle,
onNodeClick: _ctx.nodeClick,
onCheckChange: _ctx.checkChange
}), {
default: vue.withCtx(({ node, data }) => [
vue.renderSlot(_ctx.$slots, "tree-node", {
node,
data
}, () => [
vue.createElementVNode("span", _hoisted_1, vue.toDisplayString(node.label), 1)
])
]),
_: 3
}, 16, ["style", "onNodeClick", "onCheckChange"])
]),
_: 3
}, 512)
]),
tag: vue.withCtx(({ tag }) => [
vue.renderSlot(_ctx.$slots, "tag", { tag }, () => [
tag.key === "-1" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2, vue.toDisplayString(tag.text), 1)) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_3, vue.toDisplayString(tag.text[_ctx.propsLabel]), 1))
])
]),
_: 2
}, [
_ctx.$slots.prefix ? {
name: "prefix",
fn: vue.withCtx(() => [
vue.renderSlot(_ctx.$slots, "prefix")
])
} : void 0
]), 1032, ["popper-class", "size", "disabled", "clearable", "placeholder", "placement", "collapse-tags", "filterable", "multiple", "onResize", "onInput", "onClear", "onRemoveTag"]);
}
var TreeSelector = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render]]);
exports["default"] = TreeSelector;
//# sourceMappingURL=index.js.map