{"version":3,"file":"menu-item.mjs","sources":["../../../../../src/components/ivue-menu/menu-item.vue"],"sourcesContent":["<template>\r\n  <!-- 链接 -->\r\n  <li v-if=\"$router && to\">\r\n    <slot name=\"link\">\r\n      <a\r\n        :class=\"wrapperClasses\"\r\n        :style=\"wrapperStyles\"\r\n        :href=\"linkUrl\"\r\n        :target=\"target\"\r\n        @click.exact=\"handleActive($event, false)\"\r\n        @click.ctrl=\"handleActive($event, true)\"\r\n        @click.meta=\"handleActive($event, true)\"\r\n      >\r\n        <slot></slot>\r\n      </a>\r\n    </slot>\r\n  </li>\r\n\r\n  <!-- 普通标签 -->\r\n  <li\r\n    v-else\r\n    :class=\"wrapperClasses\"\r\n    :style=\"wrapperStyles\"\r\n    @click=\"handleActive\"\r\n  >\r\n    <slot></slot>\r\n  </li>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n  computed,\r\n  getCurrentInstance,\r\n  inject,\r\n  onBeforeMount,\r\n  onMounted,\r\n  ref,\r\n} from 'vue';\r\nimport { mixinsLink } from '../../utils/mixins/mixins-link';\r\nimport { findComponentUpward, findComponentsUpward } from '../../utils/helpers';\r\nimport { oneOf } from '../../utils/assist';\r\n\r\n// ts\r\nimport { MenuContextKey } from './types/menu';\r\nimport { SubmenuContextKey } from './types/submenu';\r\nimport { _ComponentInternalInstance, Props } from './types/menu-item';\r\n\r\nconst prefixCls = 'ivue-menu-item';\r\n\r\nexport default {\r\n  name: prefixCls,\r\n  props: {\r\n    /**\r\n     * 菜单项的唯一标识，必填\r\n     *\r\n     * @type {String | NUmber}\r\n     */\r\n    name: {\r\n      type: [String, Number],\r\n      required: true,\r\n    },\r\n    /**\r\n     * 禁用\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    disabled: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    /**\r\n     * 跳转的链接，支持 vue-router 对象\r\n     *\r\n     * @type {Object | String}\r\n     */\r\n    to: {\r\n      type: [Object, String],\r\n    },\r\n    /**\r\n     * 相当于 a 链接的 target 属性\r\n     *\r\n     * @type {String}\r\n     */\r\n    target: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['_blank', '_self', '_parent', '_top']);\r\n      },\r\n      default: '_self',\r\n    },\r\n    /**\r\n     * 路由跳转时，开启 replace 将不会向 history 添加新记录\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    replace: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n  },\r\n  setup(props: Props) {\r\n    // vm\r\n    const { uid, proxy } = getCurrentInstance() as _ComponentInternalInstance;\r\n\r\n    // inject\r\n    const Menu = inject(MenuContextKey, {\r\n      default: null,\r\n    });\r\n\r\n    const Submenu = inject(SubmenuContextKey, {\r\n      default: null,\r\n    });\r\n\r\n    // route link\r\n    const { handleCheckClick, handleOpenTo, handleLink, linkUrl } = mixinsLink(\r\n      proxy,\r\n      props\r\n    );\r\n\r\n    // 激活\r\n    const active = ref<boolean>(false);\r\n\r\n    // computed\r\n\r\n    // 外部样式\r\n    const wrapperClasses = computed(() => {\r\n      return [\r\n        `${prefixCls}`,\r\n        {\r\n          [`${prefixCls}--active`]: active.value,\r\n          [`${prefixCls}--selected`]: active.value,\r\n          [`${prefixCls}--disabled`]: props.disabled,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 外部样式\r\n    const wrapperStyles = computed(() => {\r\n      const styles: {\r\n        paddingLeft?: string;\r\n      } = {};\r\n\r\n      const len = findComponentsUpward(proxy, 'ivue-menu-submenu').length;\r\n\r\n      if (Submenu.default !== null && Menu.mode !== 'horizontal') {\r\n        styles.paddingLeft = `${43 + (len - 1) * 24}px`;\r\n      }\r\n\r\n      return styles;\r\n    });\r\n\r\n    // methods\r\n\r\n    // 激活\r\n    const handleActive = (event: Event, newWindow = false as boolean) => {\r\n      // 禁用\r\n      if (props.disabled) {\r\n        return;\r\n      }\r\n\r\n      // 打开新窗口\r\n      if (newWindow || props.target === '_blank') {\r\n        // 如果是 newWindow，直接新开窗口就行，无需发送状态\r\n        handleCheckClick(event, newWindow);\r\n\r\n        // 发送选择事件\r\n        Menu.handleEmitSelectEvent(props.name);\r\n      }\r\n      // 没有打开新窗口\r\n      else {\r\n        const parent = findComponentUpward(proxy, 'ivue-menu-submenu');\r\n\r\n        // 选择当前菜单\r\n        if (parent) {\r\n          Submenu.handleMenuItemSelect(props.name);\r\n        }\r\n        // 激活子菜单\r\n        else {\r\n          Menu.menuItemActive(props.name);\r\n        }\r\n\r\n        // 如果是 newWindow，直接新开窗口就行，无需发送状态\r\n        handleCheckClick(event, newWindow);\r\n      }\r\n    };\r\n\r\n    // 激活当前菜单\r\n    const activeName = (name: string | number) => {\r\n      // 激活\r\n      if (props.name === name) {\r\n        active.value = true;\r\n\r\n        if (Submenu.activeName) {\r\n          Submenu.activeName(name);\r\n        }\r\n      }\r\n      // 取消激活\r\n      else {\r\n        active.value = false;\r\n      }\r\n    };\r\n\r\n    // 添加菜单\r\n    const addMenuItem = () => {\r\n      if (Menu.data) {\r\n        // 插入当前菜单\r\n        Menu.data.menuItemList.push({\r\n          uid: uid,\r\n          activeName,\r\n        });\r\n      }\r\n    };\r\n\r\n    // 删除菜单\r\n    const removeMenuItem = () => {\r\n      const { menuItemList } = Menu.data;\r\n\r\n      if (menuItemList && menuItemList.length) {\r\n        const index = menuItemList.findIndex((item) => item.uid === uid);\r\n\r\n        menuItemList.splice(index, 1);\r\n      }\r\n    };\r\n\r\n    // onMounted\r\n    onMounted(() => {\r\n      addMenuItem();\r\n    });\r\n\r\n    // onBeforeMount\r\n    onBeforeMount(() => {\r\n      removeMenuItem();\r\n    });\r\n\r\n    return {\r\n      // data\r\n      active,\r\n\r\n      // computed\r\n      wrapperClasses,\r\n      wrapperStyles,\r\n      linkUrl,\r\n\r\n      // methods\r\n      handleActive,\r\n      handleCheckClick,\r\n      handleOpenTo,\r\n      handleLink,\r\n    };\r\n  },\r\n};\r\n</script>\r\n"],"names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_renderSlot","_createElementVNode","_normalizeClass","_normalizeStyle","_withModifiers"],"mappings":";;;;;;SACE,YAAW,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,QAAA,EAAA;AACD,EAAA,OAAAA,SAAW,EAAA,EAAEC,kBAAA,CAAAC,QAAA,EAAA,IAAA,EAAA;AAAA,IAAvBC,mBAAA,gBAAA,CAAA;AAAA,IACE,IAAA,CAAA,WAAA,MAYO,CAAA,EAAA,eADD,EAAAF,kBAAA,CAAA,MAAA,UAAA,EAAA;AAAA,MAAAG,WATI,IAAE,CAAA,MAAA,EAAA,MAAA,EAAA,IAAA,MAAA;AAAA,QAAAC,mBACF,GAAE,EAAA;AAAA,UACP,KAAA,EAAMC,cAAO,CAAA,MAAA,CAAA,cAAA,CAAA;AAAA,UACb,KAAA,EAAMC,cAAQ,CAAA,MAAA,CAAA,aAAA,CAAA;AAAA,UACd,MAAK,MAAA,CAAA,OAAA;AAAA,UAAA,QAAA,MAAA,CAAA,MAAA;AAAA;YAEO,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAC,cAAA,CAAA,MAAA,KAAA,MAAA,CAAA,YAAA,CAAa,MAAM,EAAA,KAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,CAAA;AAAA,YAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAA,cAAA,CAAA,MAAA,KAAA,MAAA,CAAA,YAAA,CAAA,MAAA,EAAA,IAAA,CAAA,EAAA,CAAA,MAAA,CAAA,CAAA,CAAA;AAAA;WAEhC;AAAA,SAAA,EAAA;AAAA;;;oBAMN,EAAA,EAOKP,mBAAAC,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;AAAA,MAAAC,mBALG,4BAAE,CAAA;AAAA,MAAAE,mBACF,IAAE,EAAA;AAAA,QACP,KAAA,EAAKC,cAAA,CAAA,MAAA,CAAA,cAAA,CAAA;AAAA,QAAA,KAAA,EAAAC,cAAA,CAAA,MAAA,CAAA,aAAA,CAAA;AAAA,QAEN,OAAa,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,KAAA,MAAA,CAAA,YAAA,IAAA,MAAA,CAAA,YAAA,CAAA,GAAA,IAAA,CAAA,CAAA;AAAA,OAAA,EAAA;AAAA;;;;;;;;;"}