UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 60.8 kB
{"version":3,"file":"useSelect.mjs","sources":["../../../../../../packages/components/select-v2/src/useSelect.ts"],"sourcesContent":["import {\n computed,\n nextTick,\n onMounted,\n reactive,\n ref,\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 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 || !isRemoteSearchEmpty.value) &&\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 && !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 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"],"names":["_a","option"],"mappings":"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