UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 23.4 kB
{"version":3,"file":"auto-complete.vue2.mjs","sources":["../../../components/auto-complete/auto-complete.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon'\nimport { Select } from '@/components/select'\nimport { useFieldStore } from '@/components/form'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, nextTick, onMounted, ref, toRef, watch, watchEffect } from 'vue'\n\nimport {\n createIconProp,\n createSizeProp,\n createStateProp,\n emitEvent,\n useLocale,\n useNameHelper,\n useProps\n} from '@vexip-ui/config'\nimport { placementWhileList, useSetTimeout } from '@vexip-ui/hooks'\nimport { debounce, isNull, throttle, toNumber } from '@vexip-ui/utils'\nimport { autoCompleteProps } from './props'\n\nimport type { SelectExposed } from '@/components/select'\nimport type {\n AutoCompleteListSlotParams,\n AutoCompleteRawOption,\n AutoCompleteSlots,\n ChangeEvent,\n EnterEvent\n} from './symbol'\n\ndefineOptions({ name: 'AutoComplete' })\n\nconst select = ref<SelectExposed>()\nconst control = ref<HTMLInputElement>()\n\nconst {\n idFor,\n labelId,\n state,\n disabled,\n loading,\n size,\n validateField,\n clearField,\n getFieldValue,\n setFieldValue\n} = useFieldStore<string | number>(() => control.value?.focus())\n\nconst nh = useNameHelper('auto-complete')\n\nconst _props = defineProps(autoCompleteProps)\nconst props = useProps('autoComplete', _props, {\n size: createSizeProp(size),\n state: createStateProp(state),\n locale: null,\n transfer: false,\n value: {\n default: () => getFieldValue(),\n static: true\n },\n options: {\n default: () => [],\n static: true\n },\n filter: false,\n prefix: createIconProp(),\n prefixColor: '',\n suffix: createIconProp(),\n suffixColor: '',\n placeholder: null,\n disabled: () => disabled.value,\n transitionName: () => nh.ns('drop'),\n dropDisabled: false,\n placement: {\n default: 'bottom',\n validator: value => placementWhileList.includes(value)\n },\n clearable: false,\n ignoreCase: false,\n autofocus: false,\n spellcheck: false,\n keyConfig: () => ({}),\n loading: () => loading.value,\n loadingIcon: createIconProp(),\n loadingLock: false,\n loadingEffect: null,\n transparent: false,\n debounce: false,\n delay: null,\n showEmpty: false,\n name: {\n default: '',\n static: true\n },\n popperAlive: null,\n slots: () => ({})\n})\n\nconst emit = defineEmits(['update:value'])\n\nconst slots = defineSlots<AutoCompleteSlots>()\n\nconst locale = useLocale('input', toRef(props, 'locale'))\n\nconst { timer } = useSetTimeout()\n\nconst currentValue = ref(props.value)\nconst currentIndex = ref(-1)\nconst currentVisible = ref(false)\nconst composing = ref(false)\n\nlet changed = false\nlet lastValue = props.value\nlet lastInput = String(lastValue)\n\nconst isReadonly = computed(() => props.loading && props.loadingLock)\nconst optionStates = computed(() => select.value?.optionStates || [])\nconst filteredOptions = computed(() => select.value?.visibleOptions || [])\nconst hasPrefix = computed(() => !!(slots.prefix || props.prefix || props.slots.prefix))\nconst hasSuffix = computed(() => !!(slots.suffix || props.suffix || props.slots.suffix))\n\nwatch(\n () => props.value,\n value => {\n currentValue.value = value\n lastValue = value\n lastInput = String(value)\n\n if (control.value) {\n control.value.value = String(value)\n }\n }\n)\nwatch(currentIndex, computeHitting)\nwatch(currentVisible, value => {\n if (!value) {\n currentIndex.value = -1\n } else {\n control.value?.focus()\n }\n})\nwatch(currentValue, value => {\n if (props.filter && select.value) {\n select.value.currentFilter = `${value}`\n }\n})\nwatchEffect(() => {\n if (!props.filter || !currentVisible.value || !select.value) return\n\n select.value.currentFilter = String(currentValue.value)\n})\n\ndefineExpose({\n idFor,\n composing,\n select,\n control,\n focus: (options?: FocusOptions) => control.value?.focus(options),\n blur: () => control.value?.blur()\n})\n\nonMounted(() => {\n nextTick(() => {\n if (control.value && !isNull(currentValue.value)) {\n control.value.value = String(currentValue.value)\n }\n })\n})\n\nfunction computeHitting() {\n const hitting = currentIndex.value\n let index = -1\n\n optionStates.value.forEach(state => {\n if (!state.hidden) {\n index += 1\n state.hitting = hitting === index\n\n if (state.hitting) {\n if (control.value) {\n control.value.value = String(state.value)\n }\n }\n } else {\n state.hitting = false\n }\n })\n\n if (control.value && hitting < 0) {\n control.value.value = lastInput\n }\n}\n\nlet focused = false\n\nfunction handleFocus(event: FocusEvent) {\n if (!focused) {\n focused = true\n emitEvent(props.onFocus, event)\n }\n}\n\nfunction handleBlur(event: FocusEvent) {\n if (focused) {\n focused = false\n\n timer.focus = setTimeout(() => {\n if (!focused) {\n emitEvent(props.onBlur, event)\n handleChange()\n }\n }, 120)\n }\n}\n\nfunction handleSelect(value: string | number, data: AutoCompleteRawOption) {\n if (composing.value || isNull(value)) {\n return\n }\n\n const prevValue = currentValue.value\n currentValue.value = value\n\n emitEvent(props.onSelect as ChangeEvent, value, data)\n\n if (value !== prevValue) {\n changed = true\n handleChange()\n } else {\n currentVisible.value = false\n }\n}\n\nfunction handleInputInternal(event: string | Event) {\n const value = typeof event === 'string' ? event : (event.target as HTMLInputElement).value\n\n currentValue.value = value\n changed = true\n lastInput = value\n\n if (currentIndex.value !== -1) {\n currentIndex.value = 0\n }\n\n if (props.showEmpty) {\n currentVisible.value = !props.dropDisabled\n\n if (select.value) {\n select.value.currentVisible = currentVisible.value\n }\n }\n\n emitEvent(props.onInput, value)\n nextTick(testOptionCanDrop)\n select.value?.updatePopper()\n}\n\nconst delay = toNumber(props.delay)\nconst handleInput = props.debounce\n ? debounce(handleInputInternal, delay || 100)\n : throttle(handleInputInternal, delay || 16)\n\nfunction handleChange(valid = true) {\n if (!changed || currentValue.value === lastValue) return\n\n changed = false\n lastValue = currentValue.value\n lastInput = String(lastValue)\n\n const option = optionStates.value.find(option => option.value === lastValue)\n\n if (select.value) {\n select.value.currentValues.length = 0\n ;(currentValue.value || currentValue.value === 0) &&\n select.value.currentValues.push(currentValue.value)\n }\n\n emit('update:value', currentValue.value)\n setFieldValue(currentValue.value)\n emitEvent(props.onChange as ChangeEvent, currentValue.value, option?.data || null!)\n valid && validateField()\n\n currentVisible.value = false\n\n if (control.value) {\n control.value.value = String(lastValue)\n }\n}\n\nlet beforeVisible = false\nlet inClickProcess = false\n\nfunction beforeClick() {\n if (props.disabled || isReadonly.value) return\n\n beforeVisible = currentVisible.value\n inClickProcess = true\n\n if (select.value) {\n select.value.currentFilter = String(currentValue.value)\n }\n}\n\nfunction handleClick() {\n if (props.disabled || isReadonly.value) return\n\n inClickProcess = false\n\n if (!select.value) return\n\n currentVisible.value = true\n\n if (!beforeVisible) {\n testOptionCanDrop()\n beforeVisible = currentVisible.value\n beforeVisible && emitEvent(props.onToggle, beforeVisible)\n } else {\n select.value.currentVisible = true\n }\n}\n\nfunction handleToggle(visible: boolean) {\n if (props.disabled || isReadonly.value || inClickProcess) return\n\n currentVisible.value = visible\n\n visible && testOptionCanDrop()\n beforeVisible = currentVisible.value\n\n if (currentVisible.value !== visible) {\n emitEvent(props.onToggle, currentVisible.value)\n }\n\n if (!currentVisible.value) {\n currentIndex.value = -1\n }\n}\n\nfunction testOptionCanDrop() {\n currentVisible.value = !(\n props.dropDisabled ||\n (!props.showEmpty && !filteredOptions.value.length)\n )\n\n if (select.value) {\n select.value.currentVisible = currentVisible.value\n }\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (composing.value) {\n event.stopPropagation()\n return\n }\n\n const key = event.code || event.key\n\n if (key === 'Enter' || key === 'NumpadEnter') {\n handleEnter(event)\n } else if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const options = filteredOptions.value\n const length = options.length\n\n if (!length) return\n\n const step = key === 'ArrowDown' ? 1 : -1\n\n // 初始状态时 currentIndex 为 -1,往上时会得到 -2 导致行为不按预期,需限制\n let index = (Math.max(currentIndex.value + step, -1) + length) % length\n let option = options[index]\n\n for (let i = 0; (option.disabled || option.group) && i < length; ++i) {\n index += step\n index = (index + length) % length\n option = options[index]\n }\n\n currentIndex.value = index\n } else {\n if (['Space', ' '].includes(key)) {\n event.stopPropagation()\n }\n\n if (!['Enter', 'ArrowLeft', 'ArrowRight'].includes(key)) {\n // 进行了其他按键则重置\n currentIndex.value = -1\n }\n }\n}\n\nfunction handleEnter(event: KeyboardEvent) {\n event.stopPropagation()\n\n if (composing.value) return\n\n if (currentIndex.value >= 0 && filteredOptions.value.length) {\n const option = filteredOptions.value[currentIndex.value === -1 ? 0 : currentIndex.value]\n\n handleSelect(option.value, option.data)\n } else {\n handleChange()\n }\n\n emitEvent(props.onEnter as EnterEvent, currentValue.value)\n currentVisible.value = false\n}\n\nfunction handleClear() {\n if (props.clearable) {\n const prevValue = currentValue.value\n\n currentValue.value = ''\n currentVisible.value = false\n\n if (!isNull(prevValue) && prevValue !== currentValue.value) {\n changed = true\n }\n\n handleChange(false)\n emitEvent(props.onClear)\n nextTick(clearField)\n control.value?.focus()\n }\n}\n\nfunction handleCompositionEnd() {\n if (composing.value) {\n composing.value = false\n\n if (control.value) {\n control.value.dispatchEvent(new Event('input'))\n }\n }\n}\n</script>\n\n<template>\n <Select\n :id=\"idFor\"\n ref=\"select\"\n v-model:visible=\"currentVisible\"\n :class=\"[nh.b(), props.inherit && nh.bm('inherit')]\"\n :inherit=\"props.inherit\"\n :label-id=\"labelId\"\n :list-class=\"nh.be('list')\"\n :value=\"currentValue\"\n :size=\"props.size\"\n :state=\"props.state\"\n :clearable=\"props.clearable\"\n :transition-name=\"props.transitionName\"\n :disabled=\"props.disabled\"\n :transfer=\"props.transfer\"\n :placement=\"props.placement\"\n :prefix-color=\"props.prefixColor\"\n :suffix-color=\"props.suffixColor\"\n :no-suffix=\"!hasSuffix\"\n :placeholder=\"props.placeholder\"\n :options=\"props.options\"\n :key-config=\"props.keyConfig\"\n :loading=\"props.loading\"\n :loading-icon=\"props.loadingIcon\"\n :loading-lock=\"props.loadingLock\"\n :loading-effect=\"props.loadingEffect\"\n :transparent=\"transparent\"\n :filter=\"props.filter\"\n :ignore-case=\"props.ignoreCase\"\n :popper-alive=\"props.popperAlive\"\n @toggle=\"handleToggle\"\n @select=\"handleSelect\"\n @clear=\"handleClear\"\n @focus=\"control?.focus()\"\n @outside-close=\"handleChange\"\n @click=\"handleClick\"\n @click.capture=\"beforeClick\"\n >\n <template v-if=\"hasPrefix\" #prefix>\n <slot name=\"prefix\">\n <Renderer :renderer=\"props.slots.prefix\">\n <Icon :icon=\"props.prefix\"></Icon>\n </Renderer>\n </slot>\n </template>\n <template #control>\n <slot\n name=\"control\"\n :value=\"currentValue\"\n :on-input=\"handleInput\"\n :on-change=\"handleChange\"\n :on-enter=\"handleEnter\"\n :on-clear=\"handleClear\"\n >\n <Renderer\n :renderer=\"props.slots.control\"\n :data=\"{\n value: currentValue,\n onInput: handleInput,\n onChange: handleChange,\n onEnter: handleEnter,\n onClear: handleClear\n }\"\n >\n <input\n ref=\"control\"\n :class=\"nh.be('input')\"\n :autofocus=\"props.autofocus\"\n :spellcheck=\"props.spellcheck\"\n :disabled=\"props.disabled\"\n :placeholder=\"props.placeholder ?? locale.placeholder\"\n :readonly=\"isReadonly\"\n :name=\"props.name\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n @submit.prevent\n @input=\"handleInput\"\n @keydown=\"handleKeyDown\"\n @focus=\"handleFocus($event)\"\n @blur=\"handleBlur($event)\"\n @compositionstart=\"composing = true\"\n @compositionend=\"handleCompositionEnd\"\n @change=\"handleCompositionEnd\"\n />\n </Renderer>\n </slot>\n </template>\n <template v-if=\"hasSuffix\" #suffix>\n <slot name=\"suffix\">\n <Renderer :renderer=\"props.slots.suffix\">\n <Icon :icon=\"props.suffix\"></Icon>\n </Renderer>\n </slot>\n </template>\n <template v-if=\"$slots.default || props.slots.default\" #default=\"{ option, index, selected }\">\n <slot :option=\"option\" :index=\"index\" :selected=\"selected\">\n <Renderer :renderer=\"props.slots.default\" :data=\"{ option, index, selected }\"></Renderer>\n </slot>\n </template>\n <template v-if=\"$slots.group || props.slots.group\" #group=\"{ option, index }\">\n <slot name=\"group\" :option=\"option\" :index=\"index\">\n <Renderer :renderer=\"props.slots.group\" :data=\"{ option, index }\"></Renderer>\n </slot>\n </template>\n <template v-if=\"$slots.prepend || props.slots.prepend\" #prepend>\n <slot name=\"prepend\">\n <Renderer :renderer=\"props.slots.prepend\"></Renderer>\n </slot>\n </template>\n <template v-if=\"$slots.append || props.slots.append\" #append>\n <slot name=\"append\">\n <Renderer :renderer=\"props.slots.append\"></Renderer>\n </slot>\n </template>\n <template\n v-if=\"$slots.list || props.slots.list\"\n #list=\"{ options, isSelected, handleSelect: onSelect }\"\n >\n <slot\n name=\"list\"\n :options=\"options\"\n :is-selected=\"isSelected as AutoCompleteListSlotParams['isSelected']\"\n :handle-select=\"onSelect as AutoCompleteListSlotParams['handleSelect']\"\n >\n <Renderer\n :renderer=\"props.slots.list\"\n :data=\"{\n options,\n isSelected,\n handleSelect: onSelect\n }\"\n ></Renderer>\n </slot>\n </template>\n </Select>\n</template>\n"],"names":["select","ref","control","idFor","labelId","state","disabled","loading","size","validateField","clearField","getFieldValue","setFieldValue","useFieldStore","_a","nh","useNameHelper","props","useProps","__props","createSizeProp","createStateProp","createIconProp","value","placementWhileList","emit","__emit","slots","_useSlots","locale","useLocale","toRef","timer","useSetTimeout","currentValue","currentIndex","currentVisible","composing","changed","lastValue","lastInput","isReadonly","computed","optionStates","filteredOptions","hasPrefix","hasSuffix","watch","computeHitting","watchEffect","__expose","options","onMounted","nextTick","isNull","hitting","index","focused","handleFocus","event","emitEvent","handleBlur","handleChange","handleSelect","data","prevValue","handleInputInternal","testOptionCanDrop","delay","toNumber","handleInput","debounce","throttle","valid","option","beforeVisible","inClickProcess","beforeClick","handleClick","handleToggle","visible","handleKeyDown","key","handleEnter","length","step","i","handleClear","handleCompositionEnd"],"mappings":"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"}