{"version":3,"file":"option-list.mjs","sources":["../../../../components/auto-complete/components/option-list.tsx"],"sourcesContent":["import { ref, computed, defineComponent, PropType, h, watch, onBeforeUnmount } from 'vue';\nimport { isString, isFunction, escapeRegExp } from 'lodash-es';\nimport HighlightOption from './highlight-option';\nimport { useConfig, usePrefixClass, CommonClassNameType } from '@tdesign/shared-hooks';\nimport { AutoCompleteOptionObj, TdAutoCompleteProps } from '../type';\nimport log from '@tdesign/common-js/log/index';\n\nimport { on, off } from '@tdesign/shared-utils';\n\nimport { ARROW_UP_REG, ARROW_DOWN_REG, ENTER_REG } from '@tdesign/common-js/common';\n\nexport default defineComponent({\n  name: 'AutoCompleteOptionList',\n  props: {\n    sizeClassNames: Object as PropType<CommonClassNameType['SIZE']>,\n    value: String,\n    size: String as PropType<TdAutoCompleteProps['size']>,\n    options: Array as PropType<TdAutoCompleteProps['options']>,\n    popupVisible: Boolean,\n    highlightKeyword: Boolean,\n    filterable: Boolean,\n    filter: Function as PropType<TdAutoCompleteProps['filter']>,\n    empty: [String, Function] as PropType<TdAutoCompleteProps['empty']>,\n  },\n  emits: ['select'],\n  setup(props, { emit, slots, expose }) {\n    const active = ref('');\n    const classPrefix = usePrefixClass();\n    const { globalConfig } = useConfig('autoComplete');\n\n    const classes = computed(() => `${classPrefix.value}-select__list`);\n    const optionClasses = computed(() => [\n      `${classPrefix.value}-select-option`,\n      {\n        [props.sizeClassNames.value[props.size]]: props.size,\n      },\n    ]);\n\n    // 整理数据格式\n    const tOptions = computed<AutoCompleteOptionObj[]>(() => {\n      let options = (props.options || []).map((item) => {\n        let option: AutoCompleteOptionObj = {};\n        if (isString(item)) {\n          option = { text: item, label: item };\n        } else {\n          if (item.text && !isString(item.text)) {\n            log.warn('AutoComplete', '`text` must be a string.');\n          }\n          if (!item.text) {\n            if (isString(item.label)) {\n              option = { ...item, text: item.label };\n            } else {\n              log.warn('AutoComplete', 'one of `label` and `text` must be a existed string.');\n            }\n          } else {\n            option = item;\n          }\n        }\n        return option;\n      });\n      // 自定义过滤规则\n      if (props.filter) {\n        options = options.filter((option) => props.filter(props.value, option));\n      } else if (props.filterable) {\n        // 默认过滤规则\n        const regExp = new RegExp(escapeRegExp(props.value), 'i');\n        options = options.filter((item) => regExp.test(item.text));\n      }\n      return options;\n    });\n\n    const onOptionClick = (e: MouseEvent) => {\n      let liNode = e.target as HTMLElement;\n      while (liNode && liNode.tagName !== 'LI') {\n        liNode = liNode.parentNode as HTMLElement;\n      }\n      const keyword = liNode.getAttribute('title');\n      active.value = keyword;\n      emit('select', keyword, { e });\n    };\n\n    // 键盘事件，上下选择\n    const onKeyInnerPress = (e: KeyboardEvent) => {\n      if (ARROW_UP_REG.test(e.code) || ARROW_UP_REG.test(e.key)) {\n        const index = tOptions.value.findIndex((item) => item.text === active.value);\n        const newIndex = index - 1 < 0 ? tOptions.value.length - 1 : index - 1;\n        active.value = tOptions.value[newIndex]?.text;\n      } else if (ARROW_DOWN_REG.test(e.code) || ARROW_DOWN_REG.test(e.key)) {\n        const index = tOptions.value.findIndex((item) => item.text === active.value);\n        const newIndex = index + 1 >= tOptions.value.length ? 0 : index + 1;\n        active.value = tOptions.value[newIndex]?.text;\n      } else if (ENTER_REG.test(e.code) || ENTER_REG.test(e.key)) {\n        if (active.value) {\n          emit('select', active.value, { e });\n        }\n      }\n    };\n\n    const addKeyboardListener = () => {\n      on(document, 'keydown', onKeyInnerPress);\n    };\n\n    const removeKeyboardListener = () => {\n      off(document, 'keydown', onKeyInnerPress);\n    };\n\n    expose({\n      addKeyboardListener,\n      removeKeyboardListener,\n    });\n\n    watch(\n      () => props.popupVisible,\n      () => {\n        if (props.popupVisible) {\n          addKeyboardListener();\n        } else {\n          removeKeyboardListener();\n        }\n      },\n      { immediate: true },\n    );\n\n    watch(\n      () => props.value,\n      () => {\n        if (!props.value) {\n          active.value = '';\n        }\n      },\n      { immediate: true },\n    );\n\n    onBeforeUnmount(() => {\n      removeKeyboardListener();\n    });\n\n    return () => {\n      if (!tOptions.value.length) {\n        return (\n          <div class={`${classPrefix.value}-auto-complete__panel--empty`}>\n            {props.empty || globalConfig.value.empty}\n          </div>\n        );\n      }\n\n      return (\n        <ul class={classes.value}>\n          {tOptions.value.map((item) => {\n            const cls = [...optionClasses.value];\n            if (item.text === active.value) {\n              cls.push(`${classPrefix.value}-select-option--hover`);\n            }\n            let labelNode: any = item.label;\n            if (isFunction(item.label)) {\n              labelNode = item.label(h);\n            } else if (slots.option) {\n              labelNode = slots.option?.({ option: item });\n            }\n            const content = labelNode || item.text;\n            return (\n              <li key={item.text} class={cls} title={item.text} onClick={onOptionClick}>\n                {isString(content) && props.highlightKeyword ? (\n                  <HighlightOption content={content} keyword={props.value} />\n                ) : (\n                  content\n                )}\n              </li>\n            );\n          })}\n        </ul>\n      );\n    };\n  },\n});\n"],"names":["defineComponent","name","props","sizeClassNames","Object","value","String","size","options","Array","popupVisible","Boolean","highlightKeyword","filterable","filter","Function","empty","emits","setup","_ref","emit","slots","expose","active","ref","classPrefix","usePrefixClass","_useConfig","useConfig","globalConfig","classes","computed","concat","optionClasses","_defineProperty","tOptions","map","item","option","isString","text","label","log","warn","_objectSpread","regExp","RegExp","escapeRegExp","test","onOptionClick","e","liNode","target","tagName","parentNode","keyword","getAttribute","onKeyInnerPress","ARROW_UP_REG","code","key","_tOptions$value$newIn","index","findIndex","newIndex","length","ARROW_DOWN_REG","_tOptions$value$_newI","ENTER_REG","addKeyboardListener","on","document","removeKeyboardListener","off","watch","immediate","onBeforeUnmount","_createVNode","cls","_toConsumableArray","push","labelNode","isFunction","h","_slots$option","call","content","HighlightOption"],"mappings":"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"}