UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 59.2 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 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 && !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"],"names":["_a","option"],"mappings":"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