UNPKG

@vuesax-alpha/nightly

Version:
1 lines • 16 kB
{"version":3,"file":"select2.mjs","sources":["../../../../../../packages/components/select/src/select.vue"],"sourcesContent":["<template>\n <vs-popper\n ref=\"popperRef\"\n v-model:visible=\"dropMenuVisible\"\n trigger=\"click\"\n placement=\"bottom\"\n persistent\n :animation=\"optionsAnimation\"\n :flip=\"flip\"\n :fit=\"fit\"\n :hide-after=\"hideAfter\"\n :show-after=\"showAfter\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :on-blur=\"onBlur\"\n :on-focus=\"onFocus\"\n :on-click=\"onClick\"\n :on-contextmenu=\"onContextmenu\"\n :on-mouseenter=\"onMouseenter\"\n :on-mouseleave=\"onMouseleave\"\n :on-keydown=\"onKeydown\"\n :teleported=\"teleported\"\n :strategy=\"strategy\"\n :popper-class=\"[ns.e('content'), useVuesaxBaseComponent(color)]\"\n :popper-style=\"colorCssVar\"\n :show-arrow=\"false\"\n :offset=\"0\"\n :process-before-open=\"processBeforeOpen\"\n :process-before-close=\"processBeforeClose\"\n @show=\"handleMenuEnter\"\n >\n <div\n ref=\"selectWrapper\"\n v-click-outside:[popperPaneRef]=\"handleClose\"\n :class=\"selectKls\"\n :style=\"selectStyle\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @click=\"toggleMenu\"\n >\n <div v-if=\"multiple\" ref=\"chips\" :class=\"[ns.e('chips')]\">\n <vs-chip\n v-for=\"(item, cIndex) in showTagList\"\n :key=\"cIndex + 'chip'\"\n :shape=\"shape\"\n :disabled=\"selectDisabled || item.isDisabled\"\n :hit=\"item.hit\"\n @close=\"deleteTag(item.value)\"\n >\n {{ item.currentLabel }}\n </vs-chip>\n\n <vs-chip\n v-if=\"collapseChips && selectedArray.length > maxCollapseChips\"\n :show-close=\"false\"\n :shape=\"shape\"\n :hit=\"collapseTagList.some((item) => item.hit)\"\n >\n + {{ selectedArray.length - maxCollapseChips }}\n </vs-chip>\n\n <input\n v-if=\"filter && !selectDisabled\"\n ref=\"input\"\n v-model=\"query\"\n type=\"text\"\n :class=\"[\n ns.e('input-filter'),\n ns.is('disabled', selectDisabled),\n ns.be('chips', 'input'),\n ]\"\n :placeholder=\"states.selectedLabel ? '' : states.query ?? ''\"\n :disabled=\"selectDisabled\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @mouseenter=\"handleTarget('input-filter')\"\n @mouseleave=\"handleTarget(null)\"\n @keyup=\"managePlaceholder\"\n @keydown.down.prevent=\"navigateOptions('next')\"\n @keydown.up.prevent=\"navigateOptions('prev')\"\n @keydown.esc=\"handleKeydownEscape\"\n @keydown.enter.stop.prevent=\"selectOption\"\n @keydown.delete=\"deletePrevTag\"\n @keydown.tab=\"visible = false\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n @input=\"debouncedQueryChange\"\n />\n </div>\n <input\n :id=\"inputId\"\n ref=\"reference\"\n v-model=\"states.selectedLabel\"\n :class=\"[ns.e('input'), ns.is('multiple', multiple)]\"\n :readonly=\"readonly\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @mouseenter=\"handleTarget('input-filter', !readonly)\"\n @mouseleave=\"handleTarget(null)\"\n @input=\"debouncedOnInputChange\"\n @paste=\"debouncedOnInputChange\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n @keydown.down.prevent=\"navigateOptions('next')\"\n @keydown.up.prevent=\"navigateOptions('prev')\"\n @keydown.enter.prevent=\"selectOption\"\n @keydown.esc=\"handleKeydownEscape\"\n @keydown.tab=\"states.visible = false\"\n />\n\n <label\n v-if=\"label\"\n :for=\"inputId\"\n :class=\"[\n ns.e('label'),\n ns.is(\n 'placeholder',\n labelFloat &&\n !dropMenuVisible &&\n (isEqual(modelValue, notValue) ||\n (!modelValue && modelValue != 0))\n ),\n ]\"\n >\n {{ label }}\n </label>\n\n <span\n v-if=\"!multiple && !labelFloat && states.currentPlaceholder\"\n :class=\"[ns.e('placeholder'), ns.is('hidden', !!modelValue)]\"\n >\n {{ states.currentPlaceholder }}\n </span>\n\n <icon-loading v-if=\"loading\" class=\"vs-select__loading\" />\n\n <vs-icon :class=\"ns.e('arrow')\" size=\"14\"><chevron-down /></vs-icon>\n\n <transition name=\"v-clearable\">\n <span\n v-if=\"showClose\"\n :class=\"ns.e('clearable')\"\n @click=\"handleClearClick\"\n >\n <icon-close hover=\"less\" scale=\"0.675\" />\n </span>\n </transition>\n\n <vs-collapse-transition\n v-for=\"(messageType, index) in messageTypes\"\n :key=\"index\"\n >\n <div\n v-if=\"$slots[`message-${messageType}`]\"\n :class=\"[ns.e('message'), ns.em('message', messageType)]\"\n >\n <slot :name=\"`message-${messageType}`\" />\n </div>\n </vs-collapse-transition>\n </div>\n\n <template #content>\n <vs-scrollbar\n v-show=\"states.options.size > 0 && !loading\"\n max-height=\"200\"\n thickness=\"3\"\n :wrap-class=\"[\n ns.e('options'),\n ns.is(\n 'empty',\n !allowCreate && Boolean(query) && states.filteredOptionsCount === 0\n ),\n ]\"\n :native=\"nativeScrollbar\"\n @mouseleave=\"hoverIndex = -1\"\n >\n <vs-option v-if=\"showNewOption\" :value=\"query\" :created=\"true\" />\n <slot />\n </vs-scrollbar>\n\n <template\n v-if=\"\n emptyText &&\n (!allowCreate ||\n loading ||\n (allowCreate && states.options.size === 0))\n \"\n >\n <slot v-if=\"$slots.empty\" name=\"empty\" />\n <p v-else :class=\"ns.em('options', 'empty')\">\n {{ emptyText }}\n </p>\n </template>\n </template>\n </vs-popper>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, nextTick, onMounted, provide, reactive, toRef } from 'vue'\nimport { toRefs, unrefElement, useResizeObserver } from '@vueuse/core'\nimport { isEqual } from 'lodash-unified'\nimport { ClickOutside as vClickOutside } from '@vuesax-alpha/directives'\nimport { UPDATE_MODEL_EVENT } from '@vuesax-alpha/constants'\nimport VsIcon, { IconClose, IconLoading } from '@vuesax-alpha/components/icon'\nimport VsCollapseTransition from '@vuesax-alpha/components/collapse-transition'\nimport VsScrollbar from '@vuesax-alpha/components/scrollbar'\nimport VsPopper from '@vuesax-alpha/components/popper'\nimport { ChevronDown } from '@vuesax-alpha/icons-vue'\nimport {\n useColor,\n useNamespace,\n useVuesaxBaseComponent,\n} from '@vuesax-alpha/hooks'\nimport { getVsColor } from '@vuesax-alpha/utils'\nimport VsOption from './option.vue'\nimport VsChip from './chip.vue'\nimport { selectContextKey, selectRegisterKey } from './tokens'\nimport { selectEmits, selectProps } from './select'\nimport { useSelect, useSelectStates } from './useSelect'\nimport type { SelectOptionContext } from './tokens'\n\ndefineOptions({\n name: 'VsSelect',\n inheritAttrs: false,\n})\n\nconst messageTypes = ['success', 'warn', 'danger', 'primary', 'dark']\n\nconst props = defineProps(selectProps)\nconst emit = defineEmits(selectEmits)\nconst ns = useNamespace('select')\n\nconst states = useSelectStates(props)\n\nconst color = useColor('primary')\n\nconst colorCssVar = computed(() =>\n ns.cssVar({\n color: getVsColor(color.value),\n })\n)\n\nconst optionsAnimation = computed(() => ns.b())\n\nconst {\n showNewOption,\n debouncedQueryChange,\n managePlaceholder,\n deletePrevTag,\n deleteTag,\n handleClearClick,\n showClose,\n inputId,\n emptyText,\n readonly,\n input,\n reference,\n\n showTagList,\n collapseTagList,\n chips,\n popperRef,\n selectDisabled,\n selectWrapper,\n handleMouseEnter,\n handleMouseLeave,\n handleTarget,\n selectOption,\n handleComposition,\n navigateOptions,\n handleKeydownEscape,\n dropMenuVisible,\n debouncedOnInputChange,\n handleFocus,\n handleBlur,\n toggleMenu,\n handleMenuEnter,\n handleResize,\n setSelected,\n handleClose,\n onOptionCreate,\n onOptionDestroy,\n handleOptionSelect,\n focus,\n blur,\n\n processBeforeOpen,\n processBeforeClose,\n\n queryChange,\n\n optionsArray,\n cachedOptionsArray,\n selectedArray,\n} = useSelect(props, states, emit)\n\nconst { visible, hoverIndex, query } = toRefs(states)\n\n// @ts-ignore - directive: v-click-outside element\nconst popperPaneRef = computed(() => {\n return unrefElement(popperRef.value?.contentRef)\n})\n\nif (props.multiple && !Array.isArray(props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, [])\n}\n\nif (!props.multiple && Array.isArray(props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, '')\n}\n\nconst selectKls = computed(() => [\n ns.is('block', props.block),\n\n ns.b(),\n ns.em('state', props.state),\n ns.is('open', dropMenuVisible.value),\n ns.is('hovering', states.mouseEnter),\n ns.is('focus', states.softFocus),\n ns.is('disabled', selectDisabled.value),\n ns.is('multiple', props.multiple),\n ns.is('loading', props.loading),\n ns.is(popperRef.value?.popperPlacement ?? 'bottom'),\n { [ns.m('has-label')]: props.label || props.labelFloat },\n])\n\nconst selectStyle = computed(() => [colorCssVar.value])\n\nonMounted(() => {\n states.cachedPlaceHolder = states.currentPlaceholder = props.placeholder\n if (\n props.multiple &&\n Array.isArray(props.modelValue) &&\n props.modelValue.length > 0\n ) {\n states.currentPlaceholder = ''\n }\n useResizeObserver(selectWrapper, handleResize)\n\n setSelected()\n})\n\nprovide(\n selectContextKey,\n reactive({\n multiple: toRef(props, 'multiple'),\n multipleLimit: toRef(props, 'multipleLimit'),\n states,\n queryChange,\n hoverIndex,\n selectWrapper,\n selectedArray,\n optionsArray,\n cachedOptionsArray,\n handleTarget,\n setSelected,\n handleOptionSelect,\n })\n)\n\nprovide(selectRegisterKey, (option: SelectOptionContext) => {\n option.index = states.optionsCount\n\n onOptionCreate(option.value, option)\n\n return {\n updateOption: (newOption: SelectOptionContext) => {\n onOptionDestroy(option.value, option)\n onOptionCreate(newOption.value, newOption)\n },\n unregister: () => {\n const doesSelected = selectedArray.value.some(\n (e) => e.value == option.value\n )\n // if option is not selected, remove it from cache\n nextTick(() => {\n if (\n states.cachedOptions.get(option.value) === option &&\n !doesSelected\n ) {\n states.cachedOptions.delete(option.value)\n }\n })\n onOptionDestroy(option.value, option)\n },\n }\n})\n\ndefineExpose({\n /** focus to select */\n focus,\n\n /** blur select */\n blur,\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA+Nc,CAAA;AAAA,EACZ,IAAM,EAAA,UAAA;AAAA,EACN,YAAc,EAAA,KAAA;AAChB,CAAA,CAAA,CAAA;;;;;;;AAEA,IAAA,MAAM,eAAe,CAAC,SAAA,EAAW,MAAQ,EAAA,QAAA,EAAU,WAAW,MAAM,CAAA,CAAA;AAI9D,IAAA,MAAA,EAAA,GAAK,aAAa,QAAQ,CAAA,CAAA;AAE1B,IAAA,MAAA,MAAA,GAAS,gBAAgB,KAAK,CAAA,CAAA;AAE9B,IAAA,MAAA,KAAA,GAAQ,SAAS,SAAS,CAAA,CAAA;AAEhC,IAAA,MAAM,WAAc,GAAA,QAAA;AAAA,MAAS,MAC3B,GAAG,MAAO,CAAA;AAAA,QACR,KAAA,EAAO,UAAW,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA,OAC9B,CAAA;AAAA,KACH,CAAA;AAEA,IAAA,MAAM,gBAAmB,GAAA,QAAA,CAAS,MAAM,EAAA,CAAG,GAAG,CAAA,CAAA;AAExC,IAAA,MAAA;AAAA,MACJ,aAAA;AAAA,MACA,oBAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MAEA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MAEA,iBAAA;AAAA,MACA,kBAAA;AAAA,MAEA,WAAA;AAAA,MAEA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,aAAA;AAAA,KACE,GAAA,SAAA,CAAU,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAEjC,IAAA,MAAM,EAAE,OAAS,EAAA,UAAA,EAAY,KAAM,EAAA,GAAI,OAAO,MAAM,CAAA,CAAA;AAG9C,IAAA,MAAA,aAAA,GAAgB,SAAS,MAAM;;AAC5B,MAAA,OAAA,YAAa,CAAA,CAAA,EAAA,GAAA,SAAA,CAAU,KAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAiB,UAAU,CAAA,CAAA;AAAA,KAChD,CAAA,CAAA;AAED,IAAA,IAAI,MAAM,QAAY,IAAA,CAAC,MAAM,OAAQ,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA;AACjD,MAAA,IAAA,CAAA,kBAAA,EAAoB,EAAE,CAAA,CAAA;AAAA,KAC7B;AAEA,IAAA,IAAI,CAAC,KAAM,CAAA,QAAA,IAAY,MAAM,OAAQ,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,oBAAoB,EAAE,CAAA,CAAA;AAAA,KAC7B;AAEM,IAAA,MAAA,SAAA,GAAY,SAAS,MAAM;;AAAA,MAAA,OAAA;AAAA,QAC/B,EAAG,CAAA,EAAA,CAAG,OAAS,EAAA,KAAA,CAAM,KAAK,CAAA;AAAA,QAE1B,GAAG,CAAE,EAAA;AAAA,QACL,EAAG,CAAA,EAAA,CAAG,OAAS,EAAA,KAAA,CAAM,KAAK,CAAA;AAAA,QAC1B,EAAG,CAAA,EAAA,CAAG,MAAQ,EAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACnC,EAAG,CAAA,EAAA,CAAG,UAAY,EAAA,MAAA,CAAO,UAAU,CAAA;AAAA,QACnC,EAAG,CAAA,EAAA,CAAG,OAAS,EAAA,MAAA,CAAO,SAAS,CAAA;AAAA,QAC/B,EAAG,CAAA,EAAA,CAAG,UAAY,EAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtC,EAAG,CAAA,EAAA,CAAG,UAAY,EAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,QAChC,EAAG,CAAA,EAAA,CAAG,SAAW,EAAA,KAAA,CAAM,OAAO,CAAA;AAAA,QAC9B,GAAG,EAAG,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAA,CAAU,UAAV,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,eAAA,KAAjB,YAAoC,QAAQ,CAAA;AAAA,QAClD,EAAE,CAAC,EAAG,CAAA,CAAA,CAAE,WAAW,CAAI,GAAA,KAAA,CAAM,KAAS,IAAA,KAAA,CAAM,UAAW,EAAA;AAAA,OACzD,CAAA;AAAA,KAAC,CAAA,CAAA;AAED,IAAA,MAAM,cAAc,QAAS,CAAA,MAAM,CAAC,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAEtD,IAAA,SAAA,CAAU,MAAM;AACP,MAAA,MAAA,CAAA,iBAAA,GAAoB,MAAO,CAAA,kBAAA,GAAqB,KAAM,CAAA,WAAA,CAAA;AAE3D,MAAA,IAAA,KAAA,CAAM,QACN,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAA,CAAM,UAAU,CAC9B,IAAA,KAAA,CAAM,UAAW,CAAA,MAAA,GAAS,CAC1B,EAAA;AACA,QAAA,MAAA,CAAO,kBAAqB,GAAA,EAAA,CAAA;AAAA,OAC9B;AACA,MAAA,iBAAA,CAAkB,eAAe,YAAY,CAAA,CAAA;AAEjC,MAAA,WAAA,EAAA,CAAA;AAAA,KACb,CAAA,CAAA;AAED,IAAA,OAAA;AAAA,MACE,gBAAA;AAAA,MACA,QAAS,CAAA;AAAA,QACP,QAAA,EAAU,KAAM,CAAA,KAAA,EAAO,UAAU,CAAA;AAAA,QACjC,aAAA,EAAe,KAAM,CAAA,KAAA,EAAO,eAAe,CAAA;AAAA,QAC3C,MAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,kBAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,kBAAA;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAEQ,IAAA,OAAA,CAAA,iBAAA,EAAmB,CAAC,MAAgC,KAAA;AAC1D,MAAA,MAAA,CAAO,QAAQ,MAAO,CAAA,YAAA,CAAA;AAEP,MAAA,cAAA,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAE5B,MAAA,OAAA;AAAA,QACL,YAAA,EAAc,CAAC,SAAmC,KAAA;AAChC,UAAA,eAAA,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AACrB,UAAA,cAAA,CAAA,SAAA,CAAU,OAAO,SAAS,CAAA,CAAA;AAAA,SAC3C;AAAA,QACA,YAAY,MAAM;AACV,UAAA,MAAA,YAAA,GAAe,cAAc,KAAM,CAAA,IAAA;AAAA,YACvC,CAAC,CAAA,KAAM,CAAE,CAAA,KAAA,IAAS,MAAO,CAAA,KAAA;AAAA,WAC3B,CAAA;AAEA,UAAA,QAAA,CAAS,MAAM;AAEX,YAAA,IAAA,MAAA,CAAO,cAAc,GAAI,CAAA,MAAA,CAAO,KAAK,CAAM,KAAA,MAAA,IAC3C,CAAC,YACD,EAAA;AACO,cAAA,MAAA,CAAA,aAAA,CAAc,MAAO,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,aAC1C;AAAA,WACD,CAAA,CAAA;AACe,UAAA,eAAA,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,SACtC;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAEY,IAAA,QAAA,CAAA;AAAA,MAEX,KAAA;AAAA,MAGA,IAAA;AAAA,KACD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}