{"version":3,"file":"useSelect.mjs","names":["isUndefined"],"sources":["../../../../../../packages/components/select-v2/src/useSelect.ts"],"sourcesContent":["import {\n  computed,\n  nextTick,\n  onMounted,\n  reactive,\n  ref,\n  useSlots,\n  watch,\n  watchEffect,\n} from 'vue'\nimport { findLastIndex, get, isEqual } from 'lodash-unified'\nimport { useDebounceFn, useResizeObserver } from '@vueuse/core'\nimport {\n  ValidateComponentsMap,\n  debugWarn,\n  escapeStringRegexp,\n  getEventCode,\n  isArray,\n  isEmpty,\n  isFunction,\n  isNumber,\n  isObject,\n  isUndefined,\n} from '@element-plus/utils'\nimport {\n  useComposition,\n  useEmptyValues,\n  useFocusController,\n  useLocale,\n  useNamespace,\n} from '@element-plus/hooks'\nimport {\n  CHANGE_EVENT,\n  EVENT_CODE,\n  MINIMUM_INPUT_WIDTH,\n  UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport {\n  useFormDisabled,\n  useFormItem,\n  useFormItemInputId,\n  useFormSize,\n} from '@element-plus/components/form'\nimport { useAllowCreate } from './useAllowCreate'\nimport { useProps } from './useProps'\n\nimport type { Option, OptionType, SelectStates } from './select.types'\nimport type { SelectV2Props } from './token'\nimport type { SelectV2EmitFn } from './defaults'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { SelectDropdownInstance } from './select-dropdown'\n\nconst useSelect = (props: SelectV2Props, emit: SelectV2EmitFn) => {\n  // inject\n  const { t } = useLocale()\n  const slots = useSlots()\n  const nsSelect = useNamespace('select')\n  const nsInput = useNamespace('input')\n  const { form: elForm, formItem: elFormItem } = useFormItem()\n  const { inputId } = useFormItemInputId(props, {\n    formItemContext: elFormItem,\n  })\n  const { aliasProps, getLabel, getValue, getDisabled, getOptions } =\n    useProps(props)\n  const { valueOnClear, isEmptyValue } = useEmptyValues(props)\n\n  const states: SelectStates = reactive({\n    inputValue: '',\n    cachedOptions: [],\n    createdOptions: [],\n    hoveringIndex: -1,\n    inputHovering: false,\n    selectionWidth: 0,\n    collapseItemWidth: 0,\n    previousQuery: null,\n    previousValue: undefined,\n    selectedLabel: '',\n    menuVisibleOnFocus: false,\n    isBeforeHide: false,\n  })\n\n  // data refs\n  const popperSize = ref(-1)\n  const debouncing = ref(false)\n\n  // DOM & Component refs\n  const selectRef = ref<HTMLElement>()\n  const selectionRef = ref<HTMLElement>()\n  const tooltipRef = ref<TooltipInstance>()\n  const tagTooltipRef = ref<TooltipInstance>()\n  const inputRef = ref<HTMLElement>()\n  const prefixRef = ref<HTMLElement>()\n  const suffixRef = ref<HTMLElement>()\n  const menuRef = ref<SelectDropdownInstance>()\n  const tagMenuRef = ref<HTMLElement>()\n  const collapseItemRef = ref<HTMLElement>()\n\n  const {\n    isComposing,\n    handleCompositionStart,\n    handleCompositionEnd,\n    handleCompositionUpdate,\n  } = useComposition({\n    afterComposition: (e) => onInput(e),\n  })\n\n  const selectDisabled = useFormDisabled()\n\n  const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, {\n    disabled: selectDisabled,\n    afterFocus() {\n      if (props.automaticDropdown && !expanded.value) {\n        expanded.value = true\n        states.menuVisibleOnFocus = true\n      }\n    },\n    beforeBlur(event) {\n      return (\n        tooltipRef.value?.isFocusInsideContent(event) ||\n        tagTooltipRef.value?.isFocusInsideContent(event)\n      )\n    },\n    afterBlur() {\n      expanded.value = false\n      states.menuVisibleOnFocus = false\n      if (props.validateEvent) {\n        elFormItem?.validate?.('blur').catch((err) => debugWarn(err))\n      }\n    },\n  })\n\n  const allOptions = computed(() => filterOptions(''))\n\n  const hasOptions = computed(() => {\n    if (props.loading) return false\n    return props.options.length > 0 || states.createdOptions.length > 0\n  })\n\n  const filteredOptions = ref<OptionType[]>([])\n  // the controller of the expanded popup\n  const expanded = ref(false)\n\n  const needStatusIcon = computed(() => elForm?.statusIcon ?? false)\n\n  const popupHeight = computed(() => {\n    const totalHeight = filteredOptions.value.length * props.itemHeight\n    return totalHeight > props.height ? props.height : totalHeight\n  })\n\n  const hasModelValue = computed(() => {\n    return props.multiple\n      ? isArray(props.modelValue) && props.modelValue.length > 0\n      : !isEmptyValue(props.modelValue)\n  })\n\n  const showClearBtn = computed(() => {\n    return (\n      props.clearable &&\n      !selectDisabled.value &&\n      hasModelValue.value &&\n      (isFocused.value || states.inputHovering)\n    )\n  })\n\n  const iconComponent = computed(() =>\n    props.remote && props.filterable && !props.remoteShowSuffix\n      ? ''\n      : props.suffixIcon\n  )\n\n  const iconReverse = computed(\n    () => iconComponent.value && nsSelect.is('reverse', expanded.value)\n  )\n\n  const validateState = computed(() => elFormItem?.validateState || '')\n  const validateIcon = computed(() => {\n    // When we use indexed access to get the type of an undeclared property,\n    // the unsafe type `any` will be inferred, which TypeScript throws an error to emphasize it.\n    // To avoid TypeScript complaining about it, we use truthiness narrowing to narrow the type of validateState.\n    if (!validateState.value) return\n    return ValidateComponentsMap[validateState.value]\n  })\n\n  const debounce = computed(() => (props.remote ? props.debounce : 0))\n\n  const isRemoteSearchEmpty = computed(\n    () => props.remote && !states.inputValue && !hasOptions.value\n  )\n\n  // filteredOptions includes flatten the data into one dimensional array.\n  const emptyText = computed(() => {\n    if (props.loading) {\n      return props.loadingText || t('el.select.loading')\n    } else {\n      if (\n        props.filterable &&\n        states.inputValue &&\n        hasOptions.value &&\n        filteredOptions.value.length === 0\n      ) {\n        return props.noMatchText || t('el.select.noMatch')\n      }\n      if (!hasOptions.value) {\n        return props.noDataText || t('el.select.noData')\n      }\n    }\n    return null\n  })\n\n  const isFilterMethodValid = computed(\n    () => props.filterable && isFunction(props.filterMethod)\n  )\n  const isRemoteMethodValid = computed(\n    () => props.filterable && props.remote && isFunction(props.remoteMethod)\n  )\n\n  const filterOptions = (query: string) => {\n    const regexp = new RegExp(escapeStringRegexp(query), 'i')\n\n    const isValidOption = (o: Option): boolean => {\n      if (isFilterMethodValid.value || isRemoteMethodValid.value) return true\n      // when query was given, we should test on the label see whether the label contains the given query\n      return query ? regexp.test(getLabel(o) || '') : true\n    }\n    if (props.loading) {\n      return []\n    }\n\n    return [...states.createdOptions, ...props.options].reduce((all, item) => {\n      const options = getOptions(item)\n\n      if (isArray(options)) {\n        const filtered = options.filter(isValidOption)\n\n        if (filtered.length > 0) {\n          all.push(\n            {\n              label: getLabel(item),\n              type: 'Group',\n            },\n            ...filtered\n          )\n        }\n      } else if (props.remote || isValidOption(item)) {\n        all.push(item)\n      }\n\n      return all\n    }, []) as OptionType[]\n  }\n\n  const updateOptions = () => {\n    filteredOptions.value = filterOptions(states.inputValue)\n  }\n\n  const allOptionsValueMap = computed(() => {\n    const valueMap = new Map()\n\n    allOptions.value.forEach((option, index) => {\n      valueMap.set(getValueKey(getValue(option)), { option, index })\n    })\n    return valueMap\n  })\n\n  const filteredOptionsValueMap = computed(() => {\n    const valueMap = new Map()\n\n    filteredOptions.value.forEach((option, index) => {\n      valueMap.set(getValueKey(getValue(option)), { option, index })\n    })\n    return valueMap\n  })\n\n  const optionsAllDisabled = computed(() =>\n    filteredOptions.value.every((option) => getDisabled(option))\n  )\n\n  const selectSize = useFormSize()\n\n  const collapseTagSize = computed(() =>\n    'small' === selectSize.value ? 'small' : 'default'\n  )\n\n  const calculatePopperSize = () => {\n    if (isNumber(props.fitInputWidth)) {\n      popperSize.value = props.fitInputWidth\n      return\n    }\n    const width = selectRef.value?.offsetWidth || 200\n    if (!props.fitInputWidth && hasOptions.value) {\n      nextTick(() => {\n        popperSize.value = Math.max(width, calculateLabelMaxWidth())\n      })\n    } else {\n      popperSize.value = width\n    }\n  }\n\n  // TODO Caching implementation\n  // 1. There is no need to calculate options that have already been calculated\n  // 2. Repeatedly expand and close when persistent is set to false, no need for repeated calculations\n  const calculateLabelMaxWidth = () => {\n    const canvas = document.createElement('canvas')\n    const ctx = canvas.getContext('2d')\n    const selector = nsSelect.be('dropdown', 'item')\n    const dom = menuRef.value?.listRef?.innerRef || document\n    const dropdownItemEl = dom.querySelector(`.${selector}`)\n    if (dropdownItemEl === null || ctx === null) return 0\n    const style = getComputedStyle(dropdownItemEl)\n    const padding =\n      Number.parseFloat(style.paddingLeft) +\n      Number.parseFloat(style.paddingRight)\n    ctx.font = `bold ${style.font.replace(\n      new RegExp(`\\\\b${style.fontWeight}\\\\b`),\n      ''\n    )}`\n    const maxWidth = filteredOptions.value.reduce((max, option) => {\n      const metrics = ctx.measureText(getLabel(option))\n      return Math.max(metrics.width, max)\n    }, 0)\n    return maxWidth + padding\n  }\n\n  const getGapWidth = () => {\n    if (!selectionRef.value) return 0\n    const style = window.getComputedStyle(selectionRef.value)\n    return Number.parseFloat(style.gap || '6px')\n  }\n\n  // computed style\n  const tagStyle = computed(() => {\n    const gapWidth = getGapWidth()\n    const inputSlotWidth = props.filterable ? gapWidth + MINIMUM_INPUT_WIDTH : 0\n    const maxWidth =\n      collapseItemRef.value && props.maxCollapseTags === 1\n        ? states.selectionWidth -\n          states.collapseItemWidth -\n          gapWidth -\n          inputSlotWidth\n        : states.selectionWidth - inputSlotWidth\n    return { maxWidth: `${maxWidth}px` }\n  })\n\n  const collapseTagStyle = computed(() => {\n    return { maxWidth: `${states.selectionWidth}px` }\n  })\n\n  const shouldShowPlaceholder = computed(() => {\n    if (isArray(props.modelValue)) {\n      return props.modelValue.length === 0 && !states.inputValue\n    }\n\n    // when it's not multiple mode, we only determine this flag based on filterable and expanded\n    // when filterable flag is true, which means we have input box on the screen\n    return props.filterable ? !states.inputValue : true\n  })\n\n  const currentPlaceholder = computed(() => {\n    const _placeholder = props.placeholder ?? t('el.select.placeholder')\n    return props.multiple || !hasModelValue.value\n      ? _placeholder\n      : states.selectedLabel\n  })\n\n  // this obtains the actual popper DOM element.\n  const popperRef = computed(() => tooltipRef.value?.popperRef?.contentRef)\n\n  // the index with current value in options\n  const indexRef = computed<number>(() => {\n    if (props.multiple) {\n      const len = (props.modelValue as []).length\n      if (\n        len > 0 &&\n        filteredOptionsValueMap.value.has(props.modelValue[len - 1])\n      ) {\n        const { index } = filteredOptionsValueMap.value.get(\n          props.modelValue[len - 1]\n        )\n        return index\n      }\n    } else {\n      if (\n        !isEmptyValue(props.modelValue) &&\n        filteredOptionsValueMap.value.has(props.modelValue)\n      ) {\n        const { index } = filteredOptionsValueMap.value.get(props.modelValue)\n        return index\n      }\n    }\n    return -1\n  })\n\n  const dropdownMenuVisible = computed({\n    get() {\n      return (\n        expanded.value &&\n        (props.loading ||\n          !isRemoteSearchEmpty.value ||\n          (props.remote && !!slots.empty)) &&\n        (!debouncing.value || !isEmpty(states.previousQuery))\n      )\n    },\n    set(val: boolean) {\n      expanded.value = val\n    },\n  })\n\n  const showTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.cachedOptions.slice(0, props.maxCollapseTags)\n      : states.cachedOptions\n  })\n\n  const collapseTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.cachedOptions.slice(props.maxCollapseTags)\n      : []\n  })\n\n  // hooks\n  const {\n    createNewOption,\n    removeNewOption,\n    selectNewOption,\n    clearAllNewOption,\n  } = useAllowCreate(props, states)\n\n  // methods\n  const toggleMenu = (event?: Event) => {\n    if (\n      selectDisabled.value ||\n      (props.filterable &&\n        expanded.value &&\n        event &&\n        !suffixRef.value?.contains(event.target as Node))\n    )\n      return\n\n    if (states.menuVisibleOnFocus) {\n      // controlled by automaticDropdown\n      states.menuVisibleOnFocus = false\n    } else {\n      expanded.value = !expanded.value\n    }\n  }\n\n  const onInputChange = () => {\n    if (states.inputValue.length > 0 && !expanded.value) {\n      expanded.value = true\n    }\n    createNewOption(states.inputValue)\n    nextTick(() => {\n      handleQueryChange(states.inputValue)\n    })\n  }\n\n  const debouncedOnInputChange = useDebounceFn(() => {\n    onInputChange()\n    debouncing.value = false\n  }, debounce)\n\n  const handleQueryChange = (val: string) => {\n    if (states.previousQuery === val || isComposing.value) {\n      return\n    }\n    states.previousQuery = val\n    if (props.filterable && isFunction(props.filterMethod)) {\n      props.filterMethod(val)\n    } else if (\n      props.filterable &&\n      props.remote &&\n      isFunction(props.remoteMethod)\n    ) {\n      props.remoteMethod(val)\n    }\n    if (\n      props.defaultFirstOption &&\n      (props.filterable || props.remote) &&\n      filteredOptions.value.length\n    ) {\n      nextTick(checkDefaultFirstOption)\n    } else {\n      nextTick(updateHoveringIndex)\n    }\n  }\n\n  /**\n   * find and highlight first option as default selected\n   * @remark\n   * - if the first option in dropdown list is user-created,\n   *   it would be at the end of the optionsArray\n   *   so find it and set hover.\n   *   (NOTE: there must be only one user-created option in dropdown list with query)\n   * - if there's no user-created option in list, just find the first one as usual\n   *   (NOTE: exclude options that are disabled or in disabled-group)\n   */\n  const checkDefaultFirstOption = () => {\n    const optionsInDropdown = filteredOptions.value.filter(\n      (n) => !n.disabled && n.type !== 'Group'\n    )\n    const userCreatedOption = optionsInDropdown.find((n) => n.created)\n    const firstOriginOption = optionsInDropdown[0]\n    states.hoveringIndex = getValueIndex(\n      filteredOptions.value,\n      userCreatedOption || firstOriginOption\n    )\n  }\n\n  const emitChange = (val: any | any[]) => {\n    if (!isEqual(props.modelValue, val)) {\n      emit(CHANGE_EVENT, val)\n    }\n  }\n\n  const update = (val: any) => {\n    emit(UPDATE_MODEL_EVENT, val)\n    emitChange(val)\n    states.previousValue = props.multiple ? String(val) : val\n\n    nextTick(() => {\n      if (props.multiple && isArray(props.modelValue)) {\n        const cachedOptions = states.cachedOptions.slice()\n        const selectedOptions = props.modelValue.map((value) =>\n          getOption(value, cachedOptions)\n        )\n\n        if (!isEqual(states.cachedOptions, selectedOptions)) {\n          states.cachedOptions = selectedOptions\n        }\n      } else {\n        initStates(true)\n      }\n    })\n  }\n\n  const getValueIndex = (arr: unknown[] = [], value: unknown) => {\n    if (!isObject(value)) {\n      return arr.indexOf(value)\n    }\n    const valueKey = props.valueKey\n    let index = -1\n    arr.some((item, i) => {\n      if (get(item, valueKey) === get(value, valueKey)) {\n        index = i\n        return true\n      }\n      return false\n    })\n    return index\n  }\n\n  const getValueKey = (item: unknown) => {\n    return isObject(item) ? get(item, props.valueKey) : item\n  }\n\n  const handleResize = () => {\n    calculatePopperSize()\n  }\n\n  const resetSelectionWidth = () => {\n    states.selectionWidth = Number.parseFloat(\n      window.getComputedStyle(selectionRef.value!).width\n    )\n  }\n\n  const resetCollapseItemWidth = () => {\n    states.collapseItemWidth =\n      collapseItemRef.value!.getBoundingClientRect().width\n  }\n\n  const updateTooltip = () => {\n    tooltipRef.value?.updatePopper?.()\n  }\n\n  const updateTagTooltip = () => {\n    tagTooltipRef.value?.updatePopper?.()\n  }\n\n  const onSelect = (option: Option) => {\n    const optionValue = getValue(option)\n\n    if (props.multiple) {\n      let selectedOptions = (props.modelValue as any[]).slice()\n\n      const index = getValueIndex(selectedOptions, optionValue)\n      if (index > -1) {\n        selectedOptions = [\n          ...selectedOptions.slice(0, index),\n          ...selectedOptions.slice(index + 1),\n        ]\n        states.cachedOptions.splice(index, 1)\n        removeNewOption(option)\n      } else if (\n        props.multipleLimit <= 0 ||\n        selectedOptions.length < props.multipleLimit\n      ) {\n        selectedOptions = [...selectedOptions, optionValue]\n        states.cachedOptions.push(option)\n        selectNewOption(option)\n      }\n      update(selectedOptions)\n      if (option.created) {\n        handleQueryChange('')\n      }\n      if (props.filterable && (option.created || !props.reserveKeyword)) {\n        states.inputValue = ''\n      }\n    } else {\n      states.selectedLabel = getLabel(option)\n      !isEqual(props.modelValue, optionValue) && update(optionValue)\n      expanded.value = false\n      selectNewOption(option)\n      if (!option.created) {\n        clearAllNewOption()\n      }\n    }\n    focus()\n  }\n\n  const deleteTag = (event: MouseEvent, option: Option) => {\n    let selectedOptions = (props.modelValue as any[]).slice()\n\n    const index = getValueIndex(selectedOptions, getValue(option))\n\n    if (index > -1 && !selectDisabled.value) {\n      selectedOptions = [\n        ...(props.modelValue as Array<unknown>).slice(0, index),\n        ...(props.modelValue as Array<unknown>).slice(index + 1),\n      ]\n      states.cachedOptions.splice(index, 1)\n      update(selectedOptions)\n      emit('remove-tag', getValue(option))\n      removeNewOption(option)\n    }\n    event.stopPropagation()\n    focus()\n  }\n\n  const focus = () => {\n    inputRef.value?.focus()\n  }\n\n  const blur = () => {\n    if (expanded.value) {\n      expanded.value = false\n      nextTick(() => inputRef.value?.blur())\n      return\n    }\n    inputRef.value?.blur()\n  }\n\n  // keyboard handlers\n  const handleEsc = () => {\n    if (states.inputValue.length > 0) {\n      states.inputValue = ''\n    } else {\n      expanded.value = false\n    }\n  }\n\n  const getLastNotDisabledIndex = (value: unknown[]) =>\n    findLastIndex(\n      value,\n      (it) =>\n        !states.cachedOptions.some(\n          (option) => getValue(option) === it && getDisabled(option)\n        )\n    )\n\n  const handleDel = (e: KeyboardEvent) => {\n    const code = getEventCode(e)\n    if (!props.multiple) return\n    if (code === EVENT_CODE.delete) return\n    if (states.inputValue.length === 0) {\n      e.preventDefault()\n      const selected = (props.modelValue as Array<any>).slice()\n      const lastNotDisabledIndex = getLastNotDisabledIndex(selected)\n      if (lastNotDisabledIndex < 0) return\n      const removeTagValue = selected[lastNotDisabledIndex]\n      selected.splice(lastNotDisabledIndex, 1)\n      const option = states.cachedOptions[lastNotDisabledIndex]\n      states.cachedOptions.splice(lastNotDisabledIndex, 1)\n      removeNewOption(option)\n      update(selected)\n      emit('remove-tag', removeTagValue)\n    }\n  }\n\n  const handleClear = () => {\n    let emptyValue: string | any[]\n    if (isArray(props.modelValue)) {\n      emptyValue = []\n    } else {\n      emptyValue = valueOnClear.value\n    }\n\n    states.selectedLabel = ''\n\n    expanded.value = false\n    update(emptyValue)\n    emit('clear')\n    clearAllNewOption()\n    focus()\n  }\n\n  const onKeyboardNavigate = (\n    direction: 'forward' | 'backward',\n    hoveringIndex: number | undefined = undefined\n  ): void => {\n    const options = filteredOptions.value\n    if (\n      !['forward', 'backward'].includes(direction) ||\n      selectDisabled.value ||\n      options.length <= 0 ||\n      optionsAllDisabled.value ||\n      isComposing.value\n    ) {\n      return\n    }\n    if (!expanded.value) {\n      return toggleMenu()\n    }\n    if (isUndefined(hoveringIndex)) {\n      hoveringIndex = states.hoveringIndex\n    }\n    let newIndex = -1\n    if (direction === 'forward') {\n      newIndex = hoveringIndex + 1\n      if (newIndex >= options.length) {\n        // return to the first option\n        newIndex = 0\n      }\n    } else if (direction === 'backward') {\n      newIndex = hoveringIndex - 1\n      if (newIndex < 0 || newIndex >= options.length) {\n        // navigate to the last one\n        newIndex = options.length - 1\n      }\n    }\n    const option = options[newIndex]\n    if (getDisabled(option) || option.type === 'Group') {\n      // prevent dispatching multiple nextTick callbacks.\n      return onKeyboardNavigate(direction, newIndex)\n    } else {\n      states.hoveringIndex = newIndex\n      scrollToItem(newIndex)\n    }\n  }\n\n  const onKeyboardSelect = () => {\n    if (!expanded.value) {\n      return toggleMenu()\n    } else if (\n      ~states.hoveringIndex &&\n      filteredOptions.value[states.hoveringIndex]\n    ) {\n      onSelect(filteredOptions.value[states.hoveringIndex])\n    }\n  }\n\n  const onHoverOption = (idx?: number) => {\n    states.hoveringIndex = idx ?? -1\n  }\n\n  const updateHoveringIndex = () => {\n    if (!props.multiple) {\n      states.hoveringIndex = filteredOptions.value.findIndex((item) => {\n        return getValueKey(getValue(item)) === getValueKey(props.modelValue)\n      })\n    } else {\n      const length = props.modelValue.length\n      if (length > 0) {\n        const lastValue = props.modelValue[length - 1]\n        states.hoveringIndex = filteredOptions.value.findIndex(\n          (item) => getValueKey(lastValue) === getValueKey(getValue(item))\n        )\n      } else {\n        states.hoveringIndex = -1\n      }\n    }\n  }\n\n  const onInput = (event: Event) => {\n    states.inputValue = (event.target as HTMLInputElement).value\n    if (props.remote) {\n      debouncing.value = true\n      debouncedOnInputChange()\n    } else {\n      return onInputChange()\n    }\n  }\n\n  const handleClickOutside = (event: Event) => {\n    expanded.value = false\n\n    if (isFocused.value) {\n      const _event = new FocusEvent('blur', event)\n      handleBlur(_event)\n    }\n  }\n\n  const handleMenuEnter = () => {\n    states.isBeforeHide = false\n    return nextTick(() => {\n      if (~indexRef.value) {\n        scrollToItem(indexRef.value)\n      }\n    })\n  }\n\n  const scrollToItem = (index: number) => {\n    menuRef.value!.scrollToItem(index)\n  }\n\n  const getOption = (value: unknown, cachedOptions?: Option[]) => {\n    // match the option with the given value, if not found, create a new option\n    const selectValue = getValueKey(value)\n\n    if (allOptionsValueMap.value.has(selectValue)) {\n      const { option } = allOptionsValueMap.value.get(selectValue)\n\n      return option\n    }\n    if (cachedOptions && cachedOptions.length) {\n      const option = cachedOptions.find(\n        (option) => getValueKey(getValue(option)) === selectValue\n      )\n      if (option) {\n        return option\n      }\n    }\n\n    return {\n      [aliasProps.value.value]: value,\n      [aliasProps.value.label]: value,\n    }\n  }\n\n  const getIndex = (option: Option) =>\n    allOptionsValueMap.value.get(getValue(option))?.index ?? -1\n\n  const initStates = (needUpdateSelectedLabel = false) => {\n    if (props.multiple) {\n      if ((props.modelValue as Array<any>).length > 0) {\n        const cachedOptions = states.cachedOptions.slice()\n        states.cachedOptions.length = 0\n        states.previousValue = props.modelValue.toString()\n\n        for (const value of props.modelValue) {\n          const option = getOption(value, cachedOptions)\n          states.cachedOptions.push(option)\n        }\n      } else {\n        states.cachedOptions = []\n        states.previousValue = undefined\n      }\n    } else {\n      if (hasModelValue.value) {\n        states.previousValue = props.modelValue\n        const options = filteredOptions.value\n        const selectedItemIndex = options.findIndex(\n          (option) =>\n            getValueKey(getValue(option)) === getValueKey(props.modelValue)\n        )\n        if (~selectedItemIndex) {\n          states.selectedLabel = getLabel(options[selectedItemIndex])\n        } else {\n          if (!states.selectedLabel || needUpdateSelectedLabel) {\n            states.selectedLabel = getValueKey(props.modelValue)\n          }\n        }\n      } else {\n        states.selectedLabel = ''\n        states.previousValue = undefined\n      }\n    }\n    clearAllNewOption()\n    calculatePopperSize()\n  }\n\n  watch(\n    () => props.fitInputWidth,\n    () => {\n      calculatePopperSize()\n    }\n  )\n\n  // in order to track these individually, we need to turn them into refs instead of watching the entire\n  // reactive object which could cause perf penalty when unnecessary field gets changed the watch method will\n  // be invoked.\n\n  watch(expanded, (val) => {\n    if (val) {\n      if (!props.persistent) {\n        calculatePopperSize()\n      }\n      handleQueryChange('')\n    } else {\n      states.inputValue = ''\n      states.previousQuery = null\n      states.isBeforeHide = true\n      states.menuVisibleOnFocus = false\n      createNewOption('')\n    }\n  })\n\n  watch(\n    () => props.modelValue,\n    (val, oldVal) => {\n      const isValEmpty = !val || (isArray(val) && val.length === 0)\n\n      if (\n        isValEmpty ||\n        (props.multiple && !isEqual(val.toString(), states.previousValue)) ||\n        (!props.multiple &&\n          getValueKey(val) !== getValueKey(states.previousValue))\n      ) {\n        initStates(true)\n      }\n      if (!isEqual(val, oldVal) && props.validateEvent) {\n        elFormItem?.validate?.('change').catch((err) => debugWarn(err))\n      }\n    },\n    {\n      deep: true,\n    }\n  )\n\n  watch(\n    () => props.options,\n    () => {\n      const input = inputRef.value\n      // filter or remote-search scenarios are not initialized\n      if (!input || (input && document.activeElement !== input)) {\n        initStates()\n      }\n    },\n    {\n      deep: true,\n      flush: 'post',\n    }\n  )\n\n  // fix the problem that scrollTop is not reset in filterable mode\n  watch(\n    () => filteredOptions.value,\n    () => {\n      calculatePopperSize()\n      return menuRef.value && nextTick(menuRef.value.resetScrollTop)\n    }\n  )\n\n  watchEffect(() => {\n    // Anything could cause options changed, then update options\n    // If you want to control it by condition, write here\n    if (states.isBeforeHide) return\n    updateOptions()\n  })\n\n  watchEffect(() => {\n    const { valueKey, options } = props\n    const duplicateValue = new Map()\n    for (const item of options) {\n      const optionValue = getValue(item)\n      let v = optionValue\n      if (isObject(v)) {\n        v = get(optionValue, valueKey)\n      }\n      if (duplicateValue.get(v)) {\n        debugWarn(\n          'ElSelectV2',\n          `The option values you provided seem to be duplicated, which may cause some problems, please check.`\n        )\n        break\n      } else {\n        duplicateValue.set(v, true)\n      }\n    }\n  })\n\n  onMounted(() => {\n    initStates()\n  })\n  useResizeObserver(selectRef, handleResize)\n  useResizeObserver(selectionRef, resetSelectionWidth)\n  useResizeObserver(wrapperRef, updateTooltip)\n  useResizeObserver(tagMenuRef, updateTagTooltip)\n  useResizeObserver(collapseItemRef, resetCollapseItemWidth)\n\n  // #21498\n  let stop: (() => void) | undefined\n  watch(\n    () => dropdownMenuVisible.value,\n    (newVal) => {\n      if (newVal) {\n        stop = useResizeObserver(menuRef, updateTooltip).stop\n      } else {\n        stop?.()\n        stop = undefined\n      }\n      emit('visible-change', newVal)\n    }\n  )\n\n  return {\n    // data exports\n    inputId,\n    collapseTagSize,\n    currentPlaceholder,\n    expanded,\n    emptyText,\n    popupHeight,\n    debounce,\n    allOptions,\n    allOptionsValueMap,\n    filteredOptions,\n    iconComponent,\n    iconReverse,\n    tagStyle,\n    collapseTagStyle,\n    popperSize,\n    dropdownMenuVisible,\n    hasModelValue,\n    shouldShowPlaceholder,\n    selectDisabled,\n    selectSize,\n    needStatusIcon,\n    showClearBtn,\n    states,\n    isFocused,\n    nsSelect,\n    nsInput,\n\n    // refs items exports\n    inputRef,\n    menuRef,\n    tagMenuRef,\n    tooltipRef,\n    tagTooltipRef,\n    selectRef,\n    wrapperRef,\n    selectionRef,\n    prefixRef,\n    suffixRef,\n    collapseItemRef,\n\n    popperRef,\n\n    validateState,\n    validateIcon,\n    showTagList,\n    collapseTagList,\n\n    // methods exports\n    debouncedOnInputChange,\n    deleteTag,\n    getLabel,\n    getValue,\n    getDisabled,\n    getValueKey,\n    getIndex,\n    handleClear,\n    handleClickOutside,\n    handleDel,\n    handleEsc,\n    focus,\n    blur,\n    handleMenuEnter,\n    handleResize,\n    resetSelectionWidth,\n    updateTooltip,\n    updateTagTooltip,\n    updateOptions,\n    toggleMenu,\n    scrollTo: scrollToItem,\n    onInput,\n    onKeyboardNavigate,\n    onKeyboardSelect,\n    onSelect,\n    onHover: onHoverOption,\n    handleCompositionStart,\n    handleCompositionEnd,\n    handleCompositionUpdate,\n  }\n}\n\nexport default useSelect\n"],"mappings":"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"}