128 lines
5.3 KiB
JavaScript
Raw Normal View History

2025-02-28 19:43:11 +08:00
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const vue_1 = require("vue");
const vdirs_1 = require("vdirs");
const focus_detector_1 = __importDefault(require("../../_internal/focus-detector"));
const _utils_1 = require("../../_utils");
const empty_1 = require("../../empty");
const _internal_1 = require("../../_internal");
const CascaderSubmenu_1 = __importDefault(require("./CascaderSubmenu"));
const interface_1 = require("./interface");
exports.default = (0, vue_1.defineComponent)({
name: 'NCascaderMenu',
props: {
value: [String, Number, Array],
placement: {
type: String,
default: 'bottom-start'
},
show: Boolean,
menuModel: {
type: Array,
required: true
},
loading: Boolean,
onFocus: {
type: Function,
required: true
},
onBlur: {
type: Function,
required: true
},
onKeydown: {
type: Function,
required: true
},
onMousedown: {
type: Function,
required: true
},
onTabout: {
type: Function,
required: true
}
},
setup(props) {
const { localeRef, isMountedRef, mergedClsPrefixRef, syncCascaderMenuPosition, handleCascaderMenuClickOutside, mergedThemeRef
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
} = (0, vue_1.inject)(interface_1.cascaderInjectionKey);
const submenuInstRefs = [];
const maskInstRef = (0, vue_1.ref)(null);
const selfElRef = (0, vue_1.ref)(null);
function handleResize() {
syncCascaderMenuPosition();
}
(0, _utils_1.useOnResize)(selfElRef, handleResize);
function showErrorMessage(label) {
var _a;
const { value: { loadingRequiredMessage } } = localeRef;
(_a = maskInstRef.value) === null || _a === void 0 ? void 0 : _a.showOnce(loadingRequiredMessage(label));
}
function handleClickOutside(e) {
handleCascaderMenuClickOutside(e);
}
function handleFocusin(e) {
const { value: selfEl } = selfElRef;
if (!selfEl)
return;
if (!selfEl.contains(e.relatedTarget)) {
props.onFocus(e);
}
}
function handleFocusout(e) {
const { value: selfEl } = selfElRef;
if (!selfEl)
return;
if (!selfEl.contains(e.relatedTarget)) {
props.onBlur(e);
}
}
const exposedRef = {
scroll(depth, index, elSize) {
const submenuInst = submenuInstRefs[depth];
if (submenuInst) {
submenuInst.scroll(index, elSize);
}
},
showErrorMessage
};
return Object.assign({ isMounted: isMountedRef, mergedClsPrefix: mergedClsPrefixRef, selfElRef,
submenuInstRefs,
maskInstRef, mergedTheme: mergedThemeRef, handleFocusin,
handleFocusout,
handleClickOutside }, exposedRef);
},
render() {
const { submenuInstRefs, mergedClsPrefix, mergedTheme } = this;
return ((0, vue_1.h)(vue_1.Transition, { name: "fade-in-scale-up-transition", appear: this.isMounted }, {
default: () => {
if (!this.show)
return null;
return (0, vue_1.withDirectives)((0, vue_1.h)("div", { tabindex: "0", ref: "selfElRef", class: `${mergedClsPrefix}-cascader-menu`, onMousedown: this.onMousedown, onFocusin: this.handleFocusin, onFocusout: this.handleFocusout, onKeydown: this.onKeydown },
this.menuModel[0].length ? ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-cascader-submenu-wrapper` },
this.menuModel.map((submenuOptions, index) => ((0, vue_1.h)(CascaderSubmenu_1.default, { ref: ((instance) => {
if (instance) {
submenuInstRefs[index] = instance;
}
}), key: index, tmNodes: submenuOptions, depth: index + 1 }))),
(0, vue_1.h)(_internal_1.NBaseMenuMask, { clsPrefix: mergedClsPrefix, ref: "maskInstRef" }))) : ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-cascader-menu__empty` }, (0, _utils_1.resolveSlot)(this.$slots.empty, () => [
(0, vue_1.h)(empty_1.NEmpty, { theme: mergedTheme.peers.Empty, themeOverrides: mergedTheme.peerOverrides.Empty })
]))),
(0, _utils_1.resolveWrappedSlot)(this.$slots.action, (children) => children && ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-cascader-menu-action`, "data-action": true }, children))),
(0, vue_1.h)(focus_detector_1.default, { onFocus: this.onTabout })), [
[
vdirs_1.clickoutside,
this.handleClickOutside,
undefined,
{ capture: true }
]
]);
}
}));
}
});