123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- 'use strict';
- Object.defineProperty(exports, '__esModule', { value: true });
- var vue = require('vue');
- var lodashUnified = require('lodash-unified');
- var menu = require('./menu.js');
- var store = require('./store.js');
- var node = require('./node.js');
- var config = require('./config.js');
- var utils = require('./utils.js');
- var types = require('./types.js');
- var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
- var arrays = require('../../../utils/arrays.js');
- var scroll = require('../../../utils/dom/scroll.js');
- var aria$1 = require('../../../utils/dom/aria.js');
- var event = require('../../../constants/event.js');
- var index = require('../../../hooks/use-namespace/index.js');
- var types$1 = require('../../../utils/types.js');
- var core = require('@vueuse/core');
- var aria = require('../../../constants/aria.js');
- const _sfc_main = vue.defineComponent({
- name: "ElCascaderPanel",
- components: {
- ElCascaderMenu: menu["default"]
- },
- props: {
- ...config.CommonProps,
- border: {
- type: Boolean,
- default: true
- },
- renderLabel: Function
- },
- emits: [event.UPDATE_MODEL_EVENT, event.CHANGE_EVENT, "close", "expand-change"],
- setup(props, { emit, slots }) {
- let manualChecked = false;
- const ns = index.useNamespace("cascader");
- const config$1 = config.useCascaderConfig(props);
- let store$1 = null;
- const initialLoaded = vue.ref(true);
- const menuList = vue.ref([]);
- const checkedValue = vue.ref(null);
- const menus = vue.ref([]);
- const expandingNode = vue.ref(null);
- const checkedNodes = vue.ref([]);
- const isHoverMenu = vue.computed(() => config$1.value.expandTrigger === "hover");
- const renderLabelFn = vue.computed(() => props.renderLabel || slots.default);
- const initStore = () => {
- const { options } = props;
- const cfg = config$1.value;
- manualChecked = false;
- store$1 = new store["default"](options, cfg);
- menus.value = [store$1.getNodes()];
- if (cfg.lazy && types$1.isEmpty(props.options)) {
- initialLoaded.value = false;
- lazyLoad(void 0, (list) => {
- if (list) {
- store$1 = new store["default"](list, cfg);
- menus.value = [store$1.getNodes()];
- }
- initialLoaded.value = true;
- syncCheckedValue(false, true);
- });
- } else {
- syncCheckedValue(false, true);
- }
- };
- const lazyLoad = (node$1, cb) => {
- const cfg = config$1.value;
- node$1 = node$1 || new node["default"]({}, cfg, void 0, true);
- node$1.loading = true;
- const resolve = (dataList) => {
- const _node = node$1;
- const parent = _node.root ? null : _node;
- dataList && (store$1 == null ? void 0 : store$1.appendNodes(dataList, parent));
- _node.loading = false;
- _node.loaded = true;
- _node.childrenData = _node.childrenData || [];
- cb && cb(dataList);
- };
- cfg.lazyLoad(node$1, resolve);
- };
- const expandNode = (node, silent) => {
- var _a;
- const { level } = node;
- const newMenus = menus.value.slice(0, level);
- let newExpandingNode;
- if (node.isLeaf) {
- newExpandingNode = node.pathNodes[level - 2];
- } else {
- newExpandingNode = node;
- newMenus.push(node.children);
- }
- if (((_a = expandingNode.value) == null ? void 0 : _a.uid) !== (newExpandingNode == null ? void 0 : newExpandingNode.uid)) {
- expandingNode.value = node;
- menus.value = newMenus;
- !silent && emit("expand-change", (node == null ? void 0 : node.pathValues) || []);
- }
- };
- const handleCheckChange = (node, checked, emitClose = true) => {
- const { checkStrictly, multiple } = config$1.value;
- const oldNode = checkedNodes.value[0];
- manualChecked = true;
- !multiple && (oldNode == null ? void 0 : oldNode.doCheck(false));
- node.doCheck(checked);
- calculateCheckedValue();
- emitClose && !multiple && !checkStrictly && emit("close");
- !emitClose && !multiple && !checkStrictly && expandParentNode(node);
- };
- const expandParentNode = (node) => {
- if (!node)
- return;
- node = node.parent;
- expandParentNode(node);
- node && expandNode(node);
- };
- const getFlattedNodes = (leafOnly) => {
- return store$1 == null ? void 0 : store$1.getFlattedNodes(leafOnly);
- };
- const getCheckedNodes = (leafOnly) => {
- var _a;
- return (_a = getFlattedNodes(leafOnly)) == null ? void 0 : _a.filter((node) => node.checked !== false);
- };
- const clearCheckedNodes = () => {
- checkedNodes.value.forEach((node) => node.doCheck(false));
- calculateCheckedValue();
- menus.value = menus.value.slice(0, 1);
- expandingNode.value = null;
- emit("expand-change", []);
- };
- const calculateCheckedValue = () => {
- var _a;
- const { checkStrictly, multiple } = config$1.value;
- const oldNodes = checkedNodes.value;
- const newNodes = getCheckedNodes(!checkStrictly);
- const nodes = utils.sortByOriginalOrder(oldNodes, newNodes);
- const values = nodes.map((node) => node.valueByOption);
- checkedNodes.value = nodes;
- checkedValue.value = multiple ? values : (_a = values[0]) != null ? _a : null;
- };
- const syncCheckedValue = (loaded = false, forced = false) => {
- const { modelValue } = props;
- const { lazy, multiple, checkStrictly } = config$1.value;
- const leafOnly = !checkStrictly;
- if (!initialLoaded.value || manualChecked || !forced && lodashUnified.isEqual(modelValue, checkedValue.value))
- return;
- if (lazy && !loaded) {
- const values = arrays.unique(lodashUnified.flattenDeep(arrays.castArray(modelValue)));
- const nodes = values.map((val) => store$1 == null ? void 0 : store$1.getNodeByValue(val)).filter((node) => !!node && !node.loaded && !node.loading);
- if (nodes.length) {
- nodes.forEach((node) => {
- lazyLoad(node, () => syncCheckedValue(false, forced));
- });
- } else {
- syncCheckedValue(true, forced);
- }
- } else {
- const values = multiple ? arrays.castArray(modelValue) : [modelValue];
- const nodes = arrays.unique(values.map((val) => store$1 == null ? void 0 : store$1.getNodeByValue(val, leafOnly)));
- syncMenuState(nodes, forced);
- checkedValue.value = lodashUnified.cloneDeep(modelValue);
- }
- };
- const syncMenuState = (newCheckedNodes, reserveExpandingState = true) => {
- const { checkStrictly } = config$1.value;
- const oldNodes = checkedNodes.value;
- const newNodes = newCheckedNodes.filter((node) => !!node && (checkStrictly || node.isLeaf));
- const oldExpandingNode = store$1 == null ? void 0 : store$1.getSameNode(expandingNode.value);
- const newExpandingNode = reserveExpandingState && oldExpandingNode || newNodes[0];
- if (newExpandingNode) {
- newExpandingNode.pathNodes.forEach((node) => expandNode(node, true));
- } else {
- expandingNode.value = null;
- }
- oldNodes.forEach((node) => node.doCheck(false));
- vue.reactive(newNodes).forEach((node) => node.doCheck(true));
- checkedNodes.value = newNodes;
- vue.nextTick(scrollToExpandingNode);
- };
- const scrollToExpandingNode = () => {
- if (!core.isClient)
- return;
- menuList.value.forEach((menu) => {
- const menuElement = menu == null ? void 0 : menu.$el;
- if (menuElement) {
- const container = menuElement.querySelector(`.${ns.namespace.value}-scrollbar__wrap`);
- const activeNode = menuElement.querySelector(`.${ns.b("node")}.${ns.is("active")}`) || menuElement.querySelector(`.${ns.b("node")}.in-active-path`);
- scroll.scrollIntoView(container, activeNode);
- }
- });
- };
- const handleKeyDown = (e) => {
- const target = e.target;
- const { code } = e;
- switch (code) {
- case aria.EVENT_CODE.up:
- case aria.EVENT_CODE.down: {
- e.preventDefault();
- const distance = code === aria.EVENT_CODE.up ? -1 : 1;
- aria$1.focusNode(aria$1.getSibling(target, distance, `.${ns.b("node")}[tabindex="-1"]`));
- break;
- }
- case aria.EVENT_CODE.left: {
- e.preventDefault();
- const preMenu = menuList.value[utils.getMenuIndex(target) - 1];
- const expandedNode = preMenu == null ? void 0 : preMenu.$el.querySelector(`.${ns.b("node")}[aria-expanded="true"]`);
- aria$1.focusNode(expandedNode);
- break;
- }
- case aria.EVENT_CODE.right: {
- e.preventDefault();
- const nextMenu = menuList.value[utils.getMenuIndex(target) + 1];
- const firstNode = nextMenu == null ? void 0 : nextMenu.$el.querySelector(`.${ns.b("node")}[tabindex="-1"]`);
- aria$1.focusNode(firstNode);
- break;
- }
- case aria.EVENT_CODE.enter:
- case aria.EVENT_CODE.numpadEnter:
- utils.checkNode(target);
- break;
- }
- };
- vue.provide(types.CASCADER_PANEL_INJECTION_KEY, vue.reactive({
- config: config$1,
- expandingNode,
- checkedNodes,
- isHoverMenu,
- initialLoaded,
- renderLabelFn,
- lazyLoad,
- expandNode,
- handleCheckChange
- }));
- vue.watch([config$1, () => props.options], initStore, {
- deep: true,
- immediate: true
- });
- vue.watch(() => props.modelValue, () => {
- manualChecked = false;
- syncCheckedValue();
- }, {
- deep: true
- });
- vue.watch(() => checkedValue.value, (val) => {
- if (!lodashUnified.isEqual(val, props.modelValue)) {
- emit(event.UPDATE_MODEL_EVENT, val);
- emit(event.CHANGE_EVENT, val);
- }
- });
- vue.onBeforeUpdate(() => menuList.value = []);
- vue.onMounted(() => !types$1.isEmpty(props.modelValue) && syncCheckedValue());
- return {
- ns,
- menuList,
- menus,
- checkedNodes,
- handleKeyDown,
- handleCheckChange,
- getFlattedNodes,
- getCheckedNodes,
- clearCheckedNodes,
- calculateCheckedValue,
- scrollToExpandingNode
- };
- }
- });
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
- const _component_el_cascader_menu = vue.resolveComponent("el-cascader-menu");
- return vue.openBlock(), vue.createElementBlock("div", {
- class: vue.normalizeClass([_ctx.ns.b("panel"), _ctx.ns.is("bordered", _ctx.border)]),
- onKeydown: _ctx.handleKeyDown
- }, [
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.menus, (menu, index) => {
- return vue.openBlock(), vue.createBlock(_component_el_cascader_menu, {
- key: index,
- ref_for: true,
- ref: (item) => _ctx.menuList[index] = item,
- index,
- nodes: [...menu]
- }, {
- empty: vue.withCtx(() => [
- vue.renderSlot(_ctx.$slots, "empty")
- ]),
- _: 2
- }, 1032, ["index", "nodes"]);
- }), 128))
- ], 42, ["onKeydown"]);
- }
- var CascaderPanel = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render], ["__file", "index.vue"]]);
- exports["default"] = CascaderPanel;
- //# sourceMappingURL=index.js.map
|