{"version":3,"file":"menu.mjs","sources":["../../src/menu/menu.tsx"],"sourcesContent":["import { defineComponent, ref, computed, provide, watchEffect, watch, onMounted, toRefs } from 'vue';\nimport props from './props';\nimport { MenuValue } from './type';\nimport { TdMenuInterface, TdOpenType } from './const';\nimport { renderContent, renderTNodeJSX } from '../utils/render-tnode';\nimport VMenu from './v-menu';\nimport log from '../_common/js/log/log';\nimport { usePrefixClass } from '../hooks/useConfig';\nimport useVModel from '../hooks/useVModel';\nimport useDefaultValue from '../hooks/useDefaultValue';\nimport isNumber from 'lodash/isNumber';\nimport isArray from 'lodash/isArray';\n\nexport default defineComponent({\n  name: 'XMenu',\n  props: { ...props, onCollapsed: Function },\n  setup(props, ctx) {\n    const classPrefix = usePrefixClass();\n    watchEffect(() => {\n      if (ctx.slots.options) {\n        log.warnOnce('TMenu', '`options` slot is going to be deprecated, please use `operations` for slot instead.');\n      }\n    });\n    const mode = ref(props.expandType);\n    const theme = computed(() => props.theme);\n    const isMutex = computed(() => props.expandMutex);\n    const collapsed = computed(() => props.collapsed);\n    const menuClass = computed(() => [\n      `${classPrefix.value}-default-menu`,\n      `${classPrefix.value}-menu--${props.theme}`,\n      {\n        [`${classPrefix.value}-is-collapsed`]: props.collapsed,\n      },\n    ]);\n    const innerClasses = computed(() => [`${classPrefix.value}-menu`, `${classPrefix.value}-menu--scroll`]);\n    const expandWidth = computed(() => {\n      const { width } = props;\n      const format = (val: string | number) => (isNumber(val) ? `${val}px` : val);\n      if (isArray(width)) return width.map((item) => format(item));\n\n      return [format(width), '64px'];\n    });\n\n    const styles = computed(() => ({\n      height: '100%',\n      width: props.collapsed ? expandWidth.value[1] : expandWidth.value[0],\n    }));\n\n    const { value, modelValue, expanded } = toRefs(props);\n    const [activeValue, setActiveValue] = useVModel(value, modelValue, props.defaultValue, props.onChange);\n    const [expandValues, setExpand] = useDefaultValue(expanded, props.defaultExpanded, props.onExpand, 'expanded');\n    const activeValues = ref([]);\n\n    watchEffect(() => {\n      mode.value = props.collapsed ? 'popup' : props.expandType;\n      props.onCollapsed?.({ collapsed: props.collapsed });\n    });\n\n    const vMenu = new VMenu({ isMutex, expandValues: expandValues.value ? [...expandValues.value] : [] });\n    provide<TdMenuInterface>('TdMenu', {\n      activeValue,\n      activeValues,\n      expandValues,\n      mode,\n      theme,\n      isHead: false,\n      vMenu,\n      collapsed,\n      select: (value: MenuValue) => {\n        if (value !== activeValue.value) {\n          setActiveValue(value);\n        }\n      },\n      open: (value: MenuValue, type: TdOpenType) => {\n        if (mode.value === 'normal') {\n          setExpand(vMenu.expand(value));\n        } else if (type === 'add') {\n          if (expandValues.value.indexOf(value) === -1) {\n            // 可能初始expanded里包含了该value\n            setExpand([...expandValues.value, value]);\n          }\n        } else if (type === 'remove') {\n          const index = expandValues.value.indexOf(value);\n          const tmp = [...expandValues.value];\n          tmp.splice(index, 1);\n          setExpand(tmp);\n        }\n      },\n    });\n\n    // watch\n    watch(\n      () => props.expanded,\n      (value) => {\n        vMenu.expandValues = new Set(value);\n      },\n    );\n    watch(\n      () => props.collapsed,\n      (newValue, oldValue) => {\n        if (!newValue && oldValue) {\n          // 如果重新打开菜单，就将原本已经展开的子菜单重新展开\n          setExpand([...vMenu.expandValues]);\n        }\n      },\n    );\n\n    const updateActiveValues = (value: MenuValue) => {\n      activeValues.value = vMenu.select(value);\n    };\n    watch(activeValue, updateActiveValues);\n\n    // timelifes\n    onMounted(() => {\n      activeValues.value = vMenu.select(activeValue.value);\n    });\n\n    return {\n      styles,\n      classPrefix,\n      menuClass,\n      innerClasses,\n      activeValue,\n      activeValues,\n      expandValues,\n    };\n  },\n  render() {\n    const operations = renderContent(this, 'operations', 'options');\n    const logo = renderTNodeJSX(this, 'logo');\n    return (\n      <div class={this.menuClass} style={this.styles}>\n        <div class={`${this.classPrefix}-default-menu__inner`}>\n          {logo && <div class={`${this.classPrefix}-menu__logo`}>{logo}</div>}\n          <ul class={this.innerClasses}>{renderContent(this, 'default', 'content')}</ul>\n          {operations && <div class={`${this.classPrefix}-menu__operations`}>{operations}</div>}\n        </div>\n      </div>\n    );\n  },\n});\n"],"names":["name","props","onCollapsed","setup","watchEffect","log","height","width","activeValue","setActiveValue","expandValues","setExpand","isMutex","activeValues","mode","theme","isHead","vMenu","collapsed","select","value","open","tmp","watch","onMounted","styles","classPrefix","menuClass","innerClasses","_createVNode"],"mappings":"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"}