UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 36.3 kB
{"version":3,"file":"useSelect.mjs","sources":["../../../../../../packages/components/select/src/useSelect.ts"],"sourcesContent":["import {\n inject,\n nextTick,\n computed,\n watch,\n ref,\n reactive,\n shallowRef,\n triggerRef,\n} from 'vue'\nimport { isObject, toRawType } from '@vue/shared'\nimport lodashDebounce from 'lodash/debounce'\nimport isEqual from 'lodash/isEqual'\nimport { UPDATE_MODEL_EVENT, CHANGE_EVENT } from '@element-plus/utils/constants'\nimport { EVENT_CODE } from '@element-plus/utils/aria'\nimport { useLocaleInject } from '@element-plus/hooks'\nimport isServer from '@element-plus/utils/isServer'\nimport scrollIntoView from '@element-plus/utils/scroll-into-view'\nimport { isKorean } from '@element-plus/utils/isDef'\nimport { getValueByPath, useGlobalConfig } from '@element-plus/utils/util'\nimport { elFormKey, elFormItemKey } from '@element-plus/tokens'\nimport { ArrowUp } from '@element-plus/icons'\n\nimport type { QueryChangeCtx, SelectOptionProxy } from './token'\nimport type { ElFormContext, ElFormItemContext } from '@element-plus/tokens'\n\nexport function useSelectStates(props) {\n const { t } = useLocaleInject()\n return reactive({\n options: new Map(),\n cachedOptions: new Map(),\n createdLabel: null,\n createdSelected: false,\n selected: props.multiple ? [] : ({} as any),\n inputLength: 20,\n inputWidth: 0,\n initialInputHeight: 0,\n optionsCount: 0,\n filteredOptionsCount: 0,\n visible: false,\n softFocus: false,\n selectedLabel: '',\n hoverIndex: -1,\n query: '',\n previousQuery: null,\n inputHovering: false,\n cachedPlaceHolder: '',\n currentPlaceholder: t('el.select.placeholder'),\n menuVisibleOnFocus: false,\n isOnComposition: false,\n isSilentBlur: false,\n prefixWidth: null,\n tagInMultiLine: false,\n })\n}\n\ntype States = ReturnType<typeof useSelectStates>\n\nexport const useSelect = (props, states: States, ctx) => {\n const ELEMENT = useGlobalConfig()\n const { t } = useLocaleInject()\n\n // template refs\n const reference = ref(null)\n const input = ref(null)\n const popper = ref(null)\n const tags = ref(null)\n const selectWrapper = ref<HTMLElement | null>(null)\n const scrollbar = ref(null)\n const hoverOption = ref(-1)\n const queryChange = shallowRef<QueryChangeCtx>({ query: '' })\n const groupQueryChange = shallowRef('')\n\n // inject\n const elForm = inject(elFormKey, {} as ElFormContext)\n const elFormItem = inject(elFormItemKey, {} as ElFormItemContext)\n\n const readonly = computed(\n () => !props.filterable || props.multiple || !states.visible\n )\n\n const selectDisabled = computed(() => props.disabled || elForm.disabled)\n\n const showClose = computed(() => {\n const hasValue = props.multiple\n ? Array.isArray(props.modelValue) && props.modelValue.length > 0\n : props.modelValue !== undefined &&\n props.modelValue !== null &&\n props.modelValue !== ''\n\n const criteria =\n props.clearable &&\n !selectDisabled.value &&\n states.inputHovering &&\n hasValue\n return criteria\n })\n const iconComponent = computed(() =>\n props.remote && props.filterable ? '' : ArrowUp\n )\n const iconReverse = computed(() =>\n iconComponent.value && states.visible ? 'is-reverse' : ''\n )\n\n const debounce = computed(() => (props.remote ? 300 : 0))\n\n const emptyText = computed(() => {\n if (props.loading) {\n return props.loadingText || t('el.select.loading')\n } else {\n if (props.remote && states.query === '' && states.options.size === 0)\n return false\n if (\n props.filterable &&\n states.query &&\n states.options.size > 0 &&\n states.filteredOptionsCount === 0\n ) {\n return props.noMatchText || t('el.select.noMatch')\n }\n if (states.options.size === 0) {\n return props.noDataText || t('el.select.noData')\n }\n }\n return null\n })\n\n const optionsArray = computed(() => Array.from(states.options.values()))\n\n const cachedOptionsArray = computed(() =>\n Array.from(states.cachedOptions.values())\n )\n\n const showNewOption = computed(() => {\n const hasExistingOption = optionsArray.value\n .filter((option) => {\n return !option.created\n })\n .some((option) => {\n return option.currentLabel === states.query\n })\n return (\n props.filterable &&\n props.allowCreate &&\n states.query !== '' &&\n !hasExistingOption\n )\n })\n\n const selectSize = computed(\n () => props.size || elFormItem.size || ELEMENT.size\n )\n\n const collapseTagSize = computed(() =>\n ['small', 'mini'].indexOf(selectSize.value) > -1 ? 'mini' : 'small'\n )\n\n const dropMenuVisible = computed(\n () => states.visible && emptyText.value !== false\n )\n\n // watch\n watch(\n () => selectDisabled.value,\n () => {\n nextTick(() => {\n resetInputHeight()\n })\n }\n )\n\n watch(\n () => props.placeholder,\n (val) => {\n states.cachedPlaceHolder = states.currentPlaceholder = val\n }\n )\n\n watch(\n () => props.modelValue,\n (val, oldVal) => {\n if (props.multiple) {\n resetInputHeight()\n if ((val && val.length > 0) || (input.value && states.query !== '')) {\n states.currentPlaceholder = ''\n } else {\n states.currentPlaceholder = states.cachedPlaceHolder\n }\n if (props.filterable && !props.reserveKeyword) {\n states.query = ''\n handleQueryChange(states.query)\n }\n }\n setSelected()\n if (props.filterable && !props.multiple) {\n states.inputLength = 20\n }\n if (!isEqual(val, oldVal)) {\n elFormItem.validate?.('change')\n }\n },\n {\n flush: 'post',\n deep: true,\n }\n )\n\n watch(\n () => states.visible,\n (val) => {\n if (!val) {\n input.value && input.value.blur()\n states.query = ''\n states.previousQuery = null\n states.selectedLabel = ''\n states.inputLength = 20\n states.menuVisibleOnFocus = false\n resetHoverIndex()\n nextTick(() => {\n if (\n input.value &&\n input.value.value === '' &&\n states.selected.length === 0\n ) {\n states.currentPlaceholder = states.cachedPlaceHolder\n }\n })\n\n if (!props.multiple) {\n if (states.selected) {\n if (\n props.filterable &&\n props.allowCreate &&\n states.createdSelected &&\n states.createdLabel\n ) {\n states.selectedLabel = states.createdLabel\n } else {\n states.selectedLabel = states.selected.currentLabel\n }\n if (props.filterable) states.query = states.selectedLabel\n }\n\n if (props.filterable) {\n states.currentPlaceholder = states.cachedPlaceHolder\n }\n }\n } else {\n popper.value?.update?.()\n\n if (props.filterable) {\n states.filteredOptionsCount = states.optionsCount\n states.query = props.remote ? '' : states.selectedLabel\n if (props.multiple) {\n input.value.focus()\n } else {\n if (states.selectedLabel) {\n states.currentPlaceholder = states.selectedLabel\n states.selectedLabel = ''\n }\n }\n handleQueryChange(states.query)\n if (!props.multiple && !props.remote) {\n queryChange.value.query = ''\n\n triggerRef(queryChange)\n triggerRef(groupQueryChange)\n }\n }\n }\n ctx.emit('visible-change', val)\n }\n )\n\n watch(\n // fix `Array.prototype.push/splice/..` cannot trigger non-deep watcher\n // https://github.com/vuejs/vue-next/issues/2116\n () => states.options.entries(),\n () => {\n if (isServer) return\n popper.value?.update?.()\n if (props.multiple) {\n resetInputHeight()\n }\n const inputs = selectWrapper.value?.querySelectorAll('input') || []\n if ([].indexOf.call(inputs, document.activeElement) === -1) {\n setSelected()\n }\n if (\n props.defaultFirstOption &&\n (props.filterable || props.remote) &&\n states.filteredOptionsCount\n ) {\n checkDefaultFirstOption()\n }\n },\n {\n flush: 'post',\n }\n )\n\n watch(\n () => states.hoverIndex,\n (val) => {\n if (typeof val === 'number' && val > -1) {\n hoverOption.value = optionsArray.value[val] || {}\n }\n optionsArray.value.forEach((option) => {\n option.hover = hoverOption.value === option\n })\n }\n )\n\n // methods\n const resetInputHeight = () => {\n if (props.collapseTags && !props.filterable) return\n nextTick(() => {\n if (!reference.value) return\n const inputChildNodes = reference.value.$el.childNodes\n const input = [].filter.call(\n inputChildNodes,\n (item) => item.tagName === 'INPUT'\n )[0]\n const _tags = tags.value\n const sizeInMap = states.initialInputHeight || 40\n input.style.height =\n states.selected.length === 0\n ? `${sizeInMap}px`\n : `${Math.max(\n _tags\n ? _tags.clientHeight + (_tags.clientHeight > sizeInMap ? 6 : 0)\n : 0,\n sizeInMap\n )}px`\n\n states.tagInMultiLine = parseFloat(input.style.height) > sizeInMap\n\n if (states.visible && emptyText.value !== false) {\n popper.value?.update?.()\n }\n })\n }\n\n const handleQueryChange = (val) => {\n if (states.previousQuery === val || states.isOnComposition) return\n if (\n states.previousQuery === null &&\n (typeof props.filterMethod === 'function' ||\n typeof props.remoteMethod === 'function')\n ) {\n states.previousQuery = val\n return\n }\n states.previousQuery = val\n nextTick(() => {\n if (states.visible) popper.value?.update?.()\n })\n states.hoverIndex = -1\n if (props.multiple && props.filterable) {\n nextTick(() => {\n const length = input.value.length * 15 + 20\n states.inputLength = props.collapseTags ? Math.min(50, length) : length\n managePlaceholder()\n resetInputHeight()\n })\n }\n if (props.remote && typeof props.remoteMethod === 'function') {\n states.hoverIndex = -1\n props.remoteMethod(val)\n } else if (typeof props.filterMethod === 'function') {\n props.filterMethod(val)\n triggerRef(groupQueryChange)\n } else {\n states.filteredOptionsCount = states.optionsCount\n queryChange.value.query = val\n\n triggerRef(queryChange)\n triggerRef(groupQueryChange)\n }\n if (\n props.defaultFirstOption &&\n (props.filterable || props.remote) &&\n states.filteredOptionsCount\n ) {\n checkDefaultFirstOption()\n }\n }\n\n const managePlaceholder = () => {\n if (states.currentPlaceholder !== '') {\n states.currentPlaceholder = input.value.value\n ? ''\n : states.cachedPlaceHolder\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 = optionsArray.value.filter(\n (n) => n.visible && !n.disabled && !n.groupDisabled\n )\n const userCreatedOption = optionsInDropdown.filter((n) => n.created)[0]\n const firstOriginOption = optionsInDropdown[0]\n states.hoverIndex = getValueIndex(\n optionsArray.value,\n userCreatedOption || firstOriginOption\n )\n }\n\n const setSelected = () => {\n if (!props.multiple) {\n const option = getOption(props.modelValue)\n if (option.props?.created) {\n states.createdLabel = option.props.value\n states.createdSelected = true\n } else {\n states.createdSelected = false\n }\n states.selectedLabel = option.currentLabel\n states.selected = option\n if (props.filterable) states.query = states.selectedLabel\n return\n }\n const result = []\n if (Array.isArray(props.modelValue)) {\n props.modelValue.forEach((value) => {\n result.push(getOption(value))\n })\n }\n states.selected = result\n nextTick(() => {\n resetInputHeight()\n })\n }\n\n const getOption = (value) => {\n let option\n const isObjectValue = toRawType(value).toLowerCase() === 'object'\n const isNull = toRawType(value).toLowerCase() === 'null'\n const isUndefined = toRawType(value).toLowerCase() === 'undefined'\n\n for (let i = states.cachedOptions.size - 1; i >= 0; i--) {\n const cachedOption = cachedOptionsArray.value[i]\n const isEqualValue = isObjectValue\n ? getValueByPath(cachedOption.value, props.valueKey) ===\n getValueByPath(value, props.valueKey)\n : cachedOption.value === value\n if (isEqualValue) {\n option = {\n value,\n currentLabel: cachedOption.currentLabel,\n isDisabled: cachedOption.isDisabled,\n }\n break\n }\n }\n if (option) return option\n const label = !isObjectValue && !isNull && !isUndefined ? value : ''\n const newOption = {\n value,\n currentLabel: label,\n }\n if (props.multiple) {\n ;(newOption as any).hitState = false\n }\n return newOption\n }\n\n const resetHoverIndex = () => {\n setTimeout(() => {\n const valueKey = props.valueKey\n if (!props.multiple) {\n states.hoverIndex = optionsArray.value.findIndex((item) => {\n return getValueKey(item) === getValueKey(states.selected)\n })\n } else {\n if (states.selected.length > 0) {\n states.hoverIndex = Math.min.apply(\n null,\n states.selected.map((selected) => {\n return optionsArray.value.findIndex((item) => {\n return (\n getValueByPath(item, valueKey) ===\n getValueByPath(selected, valueKey)\n )\n })\n })\n )\n } else {\n states.hoverIndex = -1\n }\n }\n }, 300)\n }\n\n const handleResize = () => {\n resetInputWidth()\n popper.value?.update?.()\n if (props.multiple) resetInputHeight()\n }\n\n const resetInputWidth = () => {\n states.inputWidth = reference.value?.$el.getBoundingClientRect().width\n }\n\n const onInputChange = () => {\n if (props.filterable && states.query !== states.selectedLabel) {\n states.query = states.selectedLabel\n handleQueryChange(states.query)\n }\n }\n\n const debouncedOnInputChange = lodashDebounce(() => {\n onInputChange()\n }, debounce.value)\n\n const debouncedQueryChange = lodashDebounce((e) => {\n handleQueryChange(e.target.value)\n }, debounce.value)\n\n const emitChange = (val) => {\n if (!isEqual(props.modelValue, val)) {\n ctx.emit(CHANGE_EVENT, val)\n }\n }\n\n const deletePrevTag = (e) => {\n if (e.target.value.length <= 0 && !toggleLastOptionHitState()) {\n const value = props.modelValue.slice()\n value.pop()\n ctx.emit(UPDATE_MODEL_EVENT, value)\n emitChange(value)\n }\n\n if (e.target.value.length === 1 && props.modelValue.length === 0) {\n states.currentPlaceholder = states.cachedPlaceHolder\n }\n }\n\n const deleteTag = (event, tag) => {\n const index = states.selected.indexOf(tag)\n if (index > -1 && !selectDisabled.value) {\n const value = props.modelValue.slice()\n value.splice(index, 1)\n ctx.emit(UPDATE_MODEL_EVENT, value)\n emitChange(value)\n ctx.emit('remove-tag', tag.value)\n }\n event.stopPropagation()\n }\n\n const deleteSelected = (event) => {\n event.stopPropagation()\n const value = props.multiple ? [] : ''\n if (typeof value !== 'string') {\n for (const item of states.selected) {\n if (item.isDisabled) value.push(item.value)\n }\n }\n ctx.emit(UPDATE_MODEL_EVENT, value)\n emitChange(value)\n states.visible = false\n ctx.emit('clear')\n }\n\n const handleOptionSelect = (option, byClick) => {\n if (props.multiple) {\n const value = (props.modelValue || []).slice()\n const optionIndex = getValueIndex(value, option.value)\n if (optionIndex > -1) {\n value.splice(optionIndex, 1)\n } else if (\n props.multipleLimit <= 0 ||\n value.length < props.multipleLimit\n ) {\n value.push(option.value)\n }\n ctx.emit(UPDATE_MODEL_EVENT, value)\n emitChange(value)\n if (option.created) {\n states.query = ''\n handleQueryChange('')\n states.inputLength = 20\n }\n if (props.filterable) input.value.focus()\n } else {\n ctx.emit(UPDATE_MODEL_EVENT, option.value)\n emitChange(option.value)\n states.visible = false\n }\n states.isSilentBlur = byClick\n setSoftFocus()\n if (states.visible) return\n nextTick(() => {\n scrollToOption(option)\n })\n }\n\n const getValueIndex = (arr = [], value) => {\n if (!isObject(value)) return arr.indexOf(value)\n\n const valueKey = props.valueKey\n let index = -1\n arr.some((item, i) => {\n if (getValueByPath(item, valueKey) === getValueByPath(value, valueKey)) {\n index = i\n return true\n }\n return false\n })\n return index\n }\n\n const setSoftFocus = () => {\n states.softFocus = true\n const _input = input.value || reference.value\n if (_input) {\n _input.focus()\n }\n }\n\n const scrollToOption = (option) => {\n const targetOption = Array.isArray(option) ? option[0] : option\n let target = null\n\n if (targetOption?.value) {\n const options = optionsArray.value.filter(\n (item) => item.value === targetOption.value\n )\n if (options.length > 0) {\n target = options[0].$el\n }\n }\n\n if (popper.value && target) {\n const menu = popper.value?.popperRef?.querySelector?.(\n '.el-select-dropdown__wrap'\n )\n if (menu) {\n scrollIntoView(menu, target)\n }\n }\n scrollbar.value?.handleScroll()\n }\n\n const onOptionCreate = (vm: SelectOptionProxy) => {\n states.optionsCount++\n states.filteredOptionsCount++\n states.options.set(vm.value, vm)\n states.cachedOptions.set(vm.value, vm)\n }\n\n const onOptionDestroy = (key) => {\n states.optionsCount--\n states.filteredOptionsCount--\n states.options.delete(key)\n }\n\n const resetInputState = (e: KeyboardEvent) => {\n if (e.code !== EVENT_CODE.backspace) toggleLastOptionHitState(false)\n states.inputLength = input.value.length * 15 + 20\n resetInputHeight()\n }\n\n const toggleLastOptionHitState = (hit?: boolean) => {\n if (!Array.isArray(states.selected)) return\n const option = states.selected[states.selected.length - 1]\n if (!option) return\n\n if (hit === true || hit === false) {\n option.hitState = hit\n return hit\n }\n\n option.hitState = !option.hitState\n return option.hitState\n }\n\n const handleComposition = (event) => {\n const text = event.target.value\n if (event.type === 'compositionend') {\n states.isOnComposition = false\n nextTick(() => handleQueryChange(text))\n } else {\n const lastCharacter = text[text.length - 1] || ''\n states.isOnComposition = !isKorean(lastCharacter)\n }\n }\n\n const handleMenuEnter = () => {\n nextTick(() => scrollToOption(states.selected))\n }\n\n const handleFocus = (event) => {\n if (!states.softFocus) {\n if (props.automaticDropdown || props.filterable) {\n states.visible = true\n if (props.filterable) {\n states.menuVisibleOnFocus = true\n }\n }\n ctx.emit('focus', event)\n } else {\n states.softFocus = false\n }\n }\n\n const blur = () => {\n states.visible = false\n reference.value.blur()\n }\n\n const handleBlur = (event: Event) => {\n // https://github.com/ElemeFE/element/pull/10822\n nextTick(() => {\n if (states.isSilentBlur) {\n states.isSilentBlur = false\n } else {\n ctx.emit('blur', event)\n }\n })\n states.softFocus = false\n }\n\n const handleClearClick = (event: Event) => {\n deleteSelected(event)\n }\n\n const handleClose = () => {\n states.visible = false\n }\n\n const toggleMenu = () => {\n if (props.automaticDropdown) return\n if (!selectDisabled.value) {\n if (states.menuVisibleOnFocus) {\n states.menuVisibleOnFocus = false\n } else {\n states.visible = !states.visible\n }\n if (states.visible) {\n ;(input.value || reference.value).focus()\n }\n }\n }\n\n const selectOption = () => {\n if (!states.visible) {\n toggleMenu()\n } else {\n if (optionsArray.value[states.hoverIndex]) {\n handleOptionSelect(optionsArray.value[states.hoverIndex], undefined)\n }\n }\n }\n\n const getValueKey = (item) => {\n return isObject(item.value)\n ? getValueByPath(item.value, props.valueKey)\n : item.value\n }\n\n const optionsAllDisabled = computed(() =>\n optionsArray.value\n .filter((option) => option.visible)\n .every((option) => option.disabled)\n )\n\n const navigateOptions = (direction) => {\n if (!states.visible) {\n states.visible = true\n return\n }\n if (states.options.size === 0 || states.filteredOptionsCount === 0) return\n if (states.isOnComposition) return\n\n if (!optionsAllDisabled.value) {\n if (direction === 'next') {\n states.hoverIndex++\n if (states.hoverIndex === states.options.size) {\n states.hoverIndex = 0\n }\n } else if (direction === 'prev') {\n states.hoverIndex--\n if (states.hoverIndex < 0) {\n states.hoverIndex = states.options.size - 1\n }\n }\n const option = optionsArray.value[states.hoverIndex]\n if (\n option.disabled === true ||\n option.groupDisabled === true ||\n !option.visible\n ) {\n navigateOptions(direction)\n }\n nextTick(() => scrollToOption(hoverOption.value))\n }\n }\n\n return {\n optionsArray,\n selectSize,\n handleResize,\n debouncedOnInputChange,\n debouncedQueryChange,\n deletePrevTag,\n deleteTag,\n deleteSelected,\n handleOptionSelect,\n scrollToOption,\n readonly,\n resetInputHeight,\n showClose,\n iconComponent,\n iconReverse,\n showNewOption,\n collapseTagSize,\n setSelected,\n managePlaceholder,\n selectDisabled,\n emptyText,\n toggleLastOptionHitState,\n resetInputState,\n handleComposition,\n onOptionCreate,\n onOptionDestroy,\n handleMenuEnter,\n handleFocus,\n blur,\n handleBlur,\n handleClearClick,\n handleClose,\n toggleMenu,\n selectOption,\n getValueKey,\n navigateOptions,\n dropMenuVisible,\n queryChange,\n groupQueryChange,\n\n // DOM ref\n reference,\n input,\n popper,\n tags,\n selectWrapper,\n scrollbar,\n }\n}\n"],"names":["debounce","lodashDebounce"],"mappings":"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"}