{"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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"}