UNPKG

tdesign-mobile-vue

Version:
254 lines (246 loc) 11.2 kB
/** * tdesign v1.9.3 * (c) 2025 TDesign Group * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var vue = require('vue'); var core = require('@vueuse/core'); var tdesignIconsVueNext = require('tdesign-icons-vue-next'); var config = require('../config.js'); var dropdownMenu_context = require('./context.js'); var hooks_useExpose = require('../hooks/useExpose.js'); var dropdownMenu_domUtils = require('./dom-utils.js'); var hooks_tnode = require('../hooks/tnode.js'); var dropdownMenu_props = require('./props.js'); var hooks_useClass = require('../hooks/useClass.js'); var get = require('../_chunks/dep-7fa39e6f.js'); var camelCase = require('../_chunks/dep-a7319409.js'); require('../hooks/render-tnode.js'); require('../_chunks/dep-ef223206.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-c3cb976c.js'); require('../_chunks/dep-2f809ed9.js'); require('../_chunks/dep-757b152c.js'); require('../_chunks/dep-5be9198d.js'); require('../_chunks/dep-6df33aaf.js'); require('../_chunks/dep-3d4c38f1.js'); require('../_chunks/dep-afa9f3f2.js'); require('../_chunks/dep-ae809b86.js'); require('../_chunks/dep-2b08c0a6.js'); require('../_chunks/dep-88fe047a.js'); require('../_chunks/dep-675798b4.js'); require('../_chunks/dep-ccc9ad3d.js'); require('../_chunks/dep-d950aa21.js'); require('../_chunks/dep-a697b1b9.js'); require('../_chunks/dep-4dfb9b9c.js'); require('../_chunks/dep-7c911ba3.js'); require('../_common/js/utils/general.js'); require('../_chunks/dep-21f18d3b.js'); require('../_chunks/dep-b9642a56.js'); require('../_common/js/global-config/mobile/default-config.js'); require('../_common/js/global-config/mobile/locale/zh_CN.js'); require('../_chunks/dep-28b1e09d.js'); require('../_chunks/dep-57aa1aa0.js'); require('dayjs'); require('../_chunks/dep-85204fa0.js'); require('../_chunks/dep-f6b14f80.js'); require('../_chunks/dep-a8d60643.js'); require('../_chunks/dep-49f0a63e.js'); require('../_chunks/dep-c65deed7.js'); require('../_chunks/dep-94eeec5a.js'); require('../_chunks/dep-060bf1cf.js'); require('../_chunks/dep-0e05e959.js'); require('../_chunks/dep-324da301.js'); require('../_chunks/dep-da6dc2cf.js'); require('../_chunks/dep-0528a76d.js'); require('../_chunks/dep-288156c7.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var prefix = config["default"].prefix; var _DropdownMenu = vue.defineComponent({ name: "".concat(prefix, "-dropdown-menu"), components: { CaretDownSmallIcon: tdesignIconsVueNext.CaretDownSmallIcon, CaretUpSmallIcon: tdesignIconsVueNext.CaretUpSmallIcon }, props: _objectSpread({ onMenuOpened: Function, onMenuClosed: Function }, dropdownMenu_props["default"]), emits: ["menuOpened", "menuClosed"], setup: function setup(props, _ref) { var slots = _ref.slots; var dropdownMenuClass = hooks_useClass.usePrefixClass("dropdown-menu"); var renderContent = hooks_tnode.useContent(); var state = vue.reactive({ activeId: null, barRect: {}, childCount: 0, itemsLabel: [] }); var menuItems = vue.ref([]); var updateItems = function updateItems() { if (slots.default) { var itemName = "".concat(prefix, "-dropdown-item"); var children = slots.default(); menuItems.value = children.filter(function (child) { var _child$type; var childTypeName = child === null || child === void 0 || (_child$type = child.type) === null || _child$type === void 0 ? void 0 : _child$type.name; return (childTypeName === null || childTypeName === void 0 ? void 0 : childTypeName.includes) && childTypeName.includes(itemName); }); } }; vue.watch(function () { var _slots$default; return slots === null || slots === void 0 || (_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots); }, updateItems, { deep: true, immediate: true }); var menuTitles = vue.computed(function () { var _menuItems$value; return (_menuItems$value = menuItems.value) === null || _menuItems$value === void 0 ? void 0 : _menuItems$value.map(function (item, index) { var _keys$label2; var _item$props = item.props, keys = _item$props.keys, label = _item$props.label, value = _item$props.value, modelValue = _item$props.modelValue, defaultValue = _item$props.defaultValue, disabled = _item$props.disabled, options = _item$props.options; var currentValue = value || modelValue || defaultValue; var target = options === null || options === void 0 ? void 0 : options.find(function (item2) { var _keys$value; return get.get(item2, (_keys$value = keys === null || keys === void 0 ? void 0 : keys.value) !== null && _keys$value !== void 0 ? _keys$value : "value") === currentValue; }); if (state.itemsLabel.length < index + 1) { var _keys$label; var targetLabel = target && get.get(target, (_keys$label = keys === null || keys === void 0 ? void 0 : keys.label) !== null && _keys$label !== void 0 ? _keys$label : "label") || ""; var computedLabel = label || targetLabel; state.itemsLabel.push(computedLabel); return { labelProps: label, label: computedLabel, disabled: disabled !== void 0 && disabled !== false }; } return { labelProps: label, label: label || get.get(target, (_keys$label2 = keys === null || keys === void 0 ? void 0 : keys.label) !== null && _keys$label2 !== void 0 ? _keys$label2 : "label"), disabled: disabled !== void 0 && disabled !== false }; }); }); vue.provide("dropdownMenuProps", props); vue.provide("dropdownMenuState", state); var classes = vue.computed(function () { return ["".concat(dropdownMenuClass.value)]; }); var refBar = vue.ref(); var styleBarItem = vue.computed(function () { return function (item, idx) { return ["".concat(dropdownMenuClass.value, "__item"), _defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(dropdownMenuClass.value, "__item--disabled"), item.disabled), "".concat(dropdownMenuClass.value, "__item--active"), idx === state.activeId)]; }; }); var styleIcon = vue.computed(function () { return function (item, idx) { return ["".concat(dropdownMenuClass.value, "__icon"), _defineProperty__default["default"]({}, "".concat(dropdownMenuClass.value, "__icon--active"), idx === state.activeId)]; }; }); var expandMenu = function expandMenu(item, idx) { var _props$onMenuOpened; var disabled = item.disabled; if (disabled) return; if (state.activeId === idx) { var _props$onMenuClosed; collapseMenu(); (_props$onMenuClosed = props.onMenuClosed) === null || _props$onMenuClosed === void 0 || _props$onMenuClosed.call(props, { trigger: "menu" }); return; } (_props$onMenuOpened = props.onMenuOpened) === null || _props$onMenuOpened === void 0 || _props$onMenuOpened.call(props, "menuOpened"); state.activeId = idx; state.itemsLabel[idx] = item.label; var bar = refBar.value; var barRect = dropdownMenu_domUtils.findRelativeRect(bar); state.barRect = barRect; var container = dropdownMenu_domUtils.findRelativeContainer(bar) || document.body; dropdownMenu_context.context.recordMenuExpanded(container, control, dropdownMenu_context.DropdownMenuExpandState.expanded); }; var collapseMenu = function collapseMenu() { menuTitles.value.forEach(function (item, index) { item.label = state.itemsLabel[index]; }); state.activeId = null; var bar = refBar.value; var container = dropdownMenu_domUtils.findRelativeContainer(bar) || document.body; dropdownMenu_context.context.recordMenuExpanded(container, control, dropdownMenu_context.DropdownMenuExpandState.collapsed); }; core.onClickOutside(refBar, function () { var _props$onMenuClosed2; if (state.activeId === null) return; collapseMenu(); (_props$onMenuClosed2 = props.onMenuClosed) === null || _props$onMenuClosed2 === void 0 || _props$onMenuClosed2.call(props, { trigger: "outside" }); }); var control = { expandMenu: expandMenu, collapseMenu: collapseMenu, emitEvents: function emitEvents(emit, trigger) { var eventHandler = props["on".concat(camelCase.camelCase(emit))]; eventHandler === null || eventHandler === void 0 || eventHandler(trigger); } }; vue.provide("dropdownMenuControl", control); hooks_useExpose["default"]({ toggle: function toggle(idx) { if (idx != null) { var item = menuTitles.value[idx]; expandMenu(item, idx); } else { collapseMenu(); } } }); hooks_useExpose["default"]({ expandMenu: expandMenu, collapseMenu: collapseMenu }); return function () { var defaultSlot = renderContent("default", "content"); var renderDownIcon = function renderDownIcon(item, idx) { if (props.direction === "down") { return vue.createVNode(vue.resolveComponent("caret-down-small-icon"), { "class": styleIcon.value(item, idx) }, null); } return vue.createVNode(vue.resolveComponent("caret-up-small-icon"), { "class": styleIcon.value(item, idx) }, null); }; return vue.createVNode("div", { "ref": refBar, "class": classes.value }, [(menuTitles.value || []).map(function (item, idx) { return vue.createVNode("div", { "class": styleBarItem.value(item, idx), "onClick": function onClick() { return expandMenu(item, idx); } }, [vue.createVNode("div", { "class": "".concat(dropdownMenuClass.value, "__title") }, [item.labelProps || item.label]), renderDownIcon(item, idx)]); }), defaultSlot]); }; } }); exports["default"] = _DropdownMenu; //# sourceMappingURL=dropdown-menu.js.map