@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 54.8 kB
Source Map (JSON)
{"version":3,"file":"cascader.vue2.mjs","sources":["../../../components/cascader/cascader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon'\nimport { NativeScroll } from '@/components/native-scroll'\nimport { Overflow } from '@/components/overflow'\nimport { Popper } from '@/components/popper'\nimport { Renderer } from '@/components/renderer'\nimport { Tag } from '@/components/tag'\nimport { Tooltip } from '@/components/tooltip'\nimport { useFieldStore } from '@/components/form'\n\nimport { computed, nextTick, onBeforeUpdate, reactive, ref, toRef, watch, watchEffect } from 'vue'\n\nimport CascaderPanel from './cascader-panel.vue'\nimport {\n createIconProp,\n createSizeProp,\n createStateProp,\n emitEvent,\n useIcons,\n useLocale,\n useNameHelper,\n useProps\n} from '@vexip-ui/config'\nimport { placementWhileList, useClickOutside, useHover, usePopper } from '@vexip-ui/hooks'\nimport { flatTree, getLast, isNull, isPromise, toAttrValue, transformTree } from '@vexip-ui/utils'\nimport { cascaderProps } from './props'\n\nimport type { PopperExposed } from '@/components/popper'\nimport type {\n CascaderKeyConfig,\n CascaderOptionState,\n CascaderSlots,\n CascaderValue,\n Data\n} from './symbol'\n\ntype ChangeListener = (value: CascaderValue, data: Data[] | Data[][]) => void\n\nconst ID_KEY = Symbol('ID_KEY')\nconst PARENT_KEY = Symbol('PARENT_KEY')\n\nconst defaultKeyConfig: Required<CascaderKeyConfig> = {\n value: 'value',\n label: 'label',\n children: 'children',\n disabled: 'disabled',\n hasChild: 'hasChild'\n}\n\ndefineOptions({ name: 'Cascader' })\n\nconst {\n idFor,\n labelId,\n state,\n disabled,\n loading,\n size,\n validateField,\n clearField,\n getFieldValue,\n setFieldValue\n} = useFieldStore<CascaderValue>(() => reference.value?.focus())\n\nconst _props = defineProps(cascaderProps)\nconst nh = useNameHelper('cascader')\nconst props = useProps('cascader', _props, {\n size: createSizeProp(size),\n state: createStateProp(state),\n locale: null,\n value: {\n default: () => getFieldValue(),\n static: true\n },\n visible: {\n default: false,\n static: true\n },\n options: {\n default: () => [],\n static: true\n },\n placeholder: null,\n prefix: createIconProp(),\n prefixColor: '',\n suffix: createIconProp(),\n suffixColor: '',\n noCascaded: false,\n multiple: false,\n disabled: () => disabled.value,\n clearable: false,\n placement: {\n default: 'bottom-start',\n validator: value => placementWhileList.includes(value)\n },\n transfer: false,\n staticSuffix: false,\n noSuffix: false,\n transitionName: () => nh.ns('drop'),\n outsideClose: true,\n keyConfig: () => ({}),\n separator: {\n default: '/',\n validator: value => value.length === 1\n },\n hoverTrigger: false,\n maxTagCount: 0,\n briefLabel: false,\n noRestTip: false,\n onAsyncLoad: {\n default: null,\n isFunc: true\n },\n mergeTags: false,\n tagType: null,\n emptyText: null,\n loading: () => loading.value,\n loadingIcon: createIconProp(),\n loadingLock: false,\n loadingEffect: null,\n transparent: false,\n popperAlive: null,\n slots: () => ({})\n})\n\nconst emit = defineEmits(['update:visible', 'update:value'])\n\nconst slots = defineSlots<CascaderSlots>()\n\nconst icons = useIcons()\nconst locale = useLocale('select', toRef(props, 'locale'))\n\nconst currentVisible = ref(props.visible)\nconst currentValues = ref<string[]>([])\nconst currentLabels = ref<string[]>([])\nconst mergedValues = ref<string[]>([])\nconst mergedLabels = ref<string[]>([])\nconst isPopperShow = ref(false)\nconst placement = toRef(props, 'placement')\nconst transfer = toRef(props, 'transfer')\n\nconst emittedValue = ref<CascaderValue | null>(null)\nconst optionTree = ref<CascaderOptionState[]>(null!)\nconst isAsyncLoad = computed(() => typeof props.onAsyncLoad === 'function')\nconst usingMerged = computed(() => props.mergeTags && !props.noCascaded)\nconst templateValues = computed(() =>\n usingMerged.value ? mergedValues.value : currentValues.value\n)\nconst templateLabels = computed(() =>\n usingMerged.value ? mergedLabels.value : currentLabels.value\n)\n\nlet optionList: CascaderOptionState[] = null!\nlet optionIdMap: Map<number, CascaderOptionState> = null!\nlet optionValueMap: Map<string, CascaderOptionState> = null!\nlet outsideClosed = false\nlet prevClosedId = -1\nlet flattedOptions: Record<any, any>[]\n\nconst updateTrigger = ref(0)\n\nwatchEffect(() => {\n /* eslint-disable @typescript-eslint/no-unused-expressions */\n props.keyConfig.value\n props.keyConfig.label\n props.keyConfig.disabled\n props.keyConfig.hasChild\n props.separator\n isAsyncLoad.value\n /* eslint-enable */\n\n flattedOptions = flatTree(props.options as Record<any, any>[], {\n keyField: ID_KEY,\n parentField: PARENT_KEY,\n childField: props.keyConfig.children ?? defaultKeyConfig.children,\n forceInject: true\n })\n\n updateTrigger.value++\n})\n\nwatch(updateTrigger, initOptionStates, { immediate: true })\n\nfunction initOptionStates() {\n const separator = props.separator\n const isAsync = isAsyncLoad.value\n\n optionList = createOptionStates(flattedOptions)\n optionIdMap = new Map()\n optionValueMap = new Map()\n\n for (let i = 0, len = optionList.length; i < len; ++i) {\n const option = optionList[i]\n\n initOptionFull(option, separator)\n optionIdMap.set(option.id, option)\n optionValueMap.set(option.fullValue, option)\n\n if (isAsync) {\n option.childrenLoaded = queryChildrenLoaded(option)\n }\n }\n\n optionTree.value = transformTree(optionList)\n initValueAndLabel(emittedValue.value)\n}\n\nconst openedIds = ref<number[]>([])\nconst optionsList = computed(() => {\n return [\n optionTree.value,\n ...openedIds.value.map(id => optionIdMap.get(id)?.children).filter(Boolean)\n ]\n})\n\nconst wrapper = useClickOutside(handleClickOutside)\nconst popper = ref<PopperExposed>()\nconst { reference, transferTo, updatePopper } = usePopper({\n placement,\n transfer,\n wrapper,\n popper: computed(() => popper.value?.wrapper),\n isDrop: true\n})\nconst { isHover } = useHover(reference)\n\nconst panelElList = ref<InstanceType<typeof CascaderPanel>[]>([])\nconst restTagCount = ref(0)\nconst restTipShow = ref(false)\nconst selectorWidth = ref(0)\n\nconst className = computed(() => {\n return {\n [nh.b()]: true,\n [nh.ns('input-vars')]: true,\n [nh.bs('vars')]: true,\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('multiple')]: props.multiple,\n [nh.bm('responsive')]: props.multiple && props.maxTagCount <= 0\n }\n})\nconst readonly = computed(() => props.loading && props.loadingLock)\nconst selectorClass = computed(() => {\n const baseCls = nh.be('selector')\n\n return {\n [baseCls]: true,\n [`${baseCls}--focused`]: !props.disabled && currentVisible.value,\n [`${baseCls}--disabled`]: props.disabled,\n [`${baseCls}--readonly`]: readonly.value,\n [`${baseCls}--loading`]: props.loading,\n [`${baseCls}--${props.size}`]: props.size !== 'default',\n [`${baseCls}--${props.state}`]: props.state !== 'default',\n [`${baseCls}--has-prefix`]: hasPrefix.value,\n [`${baseCls}--has-suffix`]: !props.noSuffix,\n [`${baseCls}--transparent`]: props.transparent\n }\n})\nconst hasPrefix = computed(() => {\n return !!(slots.prefix || props.slots.prefix || props.prefix)\n})\nconst hasValue = computed(() => !!templateValues.value[0])\nconst usingHover = computed(() => props.hoverTrigger && !isAsyncLoad.value)\nconst showClear = computed(() => {\n return !props.disabled && !readonly.value && props.clearable && isHover.value && hasValue.value\n})\n\nwatch(\n () => props.visible,\n value => {\n currentVisible.value = value\n }\n)\nwatch(currentVisible, async value => {\n if (value) {\n restTipShow.value = false\n selectorWidth.value = wrapper.value?.offsetWidth || 0\n\n await updatePopper()\n nextTick(() => {\n getLast(panelElList.value)?.$el?.focus()\n })\n } else {\n isPopperShow.value = false\n\n if (reference.value && !outsideClosed) {\n reference.value.focus()\n }\n }\n\n outsideClosed = false\n})\n\nlet outsideChanged = false\n\nwatch(emittedValue, () => {\n outsideChanged = true\n})\nwatch(\n () => props.value,\n value => {\n if (value !== emittedValue.value || outsideChanged) {\n emittedValue.value = value\n initValueAndLabel(value)\n nextTick(() => {\n outsideChanged = false\n })\n }\n },\n { immediate: true }\n)\nwatch(\n () => props.briefLabel,\n brief => {\n currentLabels.value = currentValues.value\n .map(value => optionValueMap.get(value)?.[brief ? 'label' : 'fullLabel'] as string)\n .filter(Boolean)\n\n // nextTick(computeTagsOverflow)\n }\n)\nwatch(isAsyncLoad, value => {\n if (value) {\n for (const option of optionIdMap.values()) {\n option.childrenLoaded = queryChildrenLoaded(option)\n }\n }\n})\nwatch(usingMerged, value => {\n if (value) {\n mergedValues.value.length = 0\n mergedLabels.value.length = 0\n\n updateMergedProps()\n }\n\n if (isAsyncLoad.value) {\n const originalOptions: CascaderOptionState[] = []\n\n for (const option of optionIdMap.values()) {\n if (option.checked) {\n originalOptions.push(option)\n }\n\n if (option.hasChild && !option.children.length && !option.loaded) {\n option.checked = false\n }\n }\n\n for (let i = 0, len = originalOptions.length; i < len; ++i) {\n const option = originalOptions[i]\n\n updateCheckedUpward(option)\n updateCheckedDown(option)\n }\n }\n\n emitMultipleChange()\n})\nwatch(\n () => optionsList.value.length,\n () => {\n updatePopper()\n nextTick(() => {\n getLast(panelElList.value)?.$el?.focus()\n prevClosedId = -1\n })\n }\n)\nwatch(\n () => props.disabled,\n value => {\n if (value) {\n setVisible(false)\n }\n }\n)\nwatch(readonly, value => {\n if (value) {\n setVisible(false)\n }\n})\n\nonBeforeUpdate(() => {\n panelElList.value.length = 0\n})\n\ndefineExpose({\n idFor,\n labelId,\n currentVisible,\n currentValues,\n currentLabels,\n isHover,\n openedIds,\n restTagCount,\n restTipShow,\n optionsList,\n hasValue,\n templateValues,\n templateLabels,\n showClear,\n wrapper,\n reference,\n popper,\n panelElList,\n handlePanelOpen,\n handleOptionSelect,\n handleOptionCheck,\n toggleVisible,\n handleClear,\n handlePanelBack,\n focus: (options?: FocusOptions) => reference.value?.focus(options),\n blur: () => reference.value?.blur()\n})\n\nfunction createOptionStates(rawOptions: Record<string | symbol, any>[]) {\n const {\n value: valueKey,\n label: labelKey,\n disabled: disabledKey,\n hasChild: hasChildKey\n } = { ...defaultKeyConfig, ...props.keyConfig }\n\n return rawOptions.map(rawOption => {\n const {\n [ID_KEY]: id,\n [PARENT_KEY]: parent,\n [valueKey]: value,\n [labelKey]: label,\n [disabledKey]: disabled,\n [hasChildKey]: hasChild\n } = rawOption\n\n return reactive<CascaderOptionState>({\n id,\n parent,\n value,\n disabled,\n hasChild,\n label: label || String(value),\n fullValue: '',\n fullLabel: '',\n children: [],\n checked: false,\n partial: false,\n loading: false,\n loaded: false,\n error: false,\n childrenLoaded: false,\n data: rawOption\n })\n })\n}\n\nfunction initOptionFull(option: CascaderOptionState, separator: string) {\n let value = option.value as string\n let label = option.label\n let parent = optionIdMap.get(option.parent)\n\n while (parent) {\n value = `${parent.value}${separator}${value}`\n label = `${parent.label}${separator}${label}`\n parent = optionIdMap.get(parent.parent)\n }\n\n option.fullValue = value\n option.fullLabel = label\n}\n\nfunction queryChildrenLoaded(option: CascaderOptionState) {\n if (option.hasChild && !option.children?.length) {\n return option.loaded\n }\n\n const loop: CascaderOptionState[] = [...option.children]\n\n while (loop.length) {\n const child = loop.shift()!\n\n if (child.childrenLoaded) continue\n\n if (child.hasChild && !child.children?.length) {\n child.childrenLoaded = child.loaded\n\n if (!child.loaded) return false\n }\n\n loop.push(...child.children)\n }\n\n return true\n}\n\nfunction updateMergedProps() {\n const baseValues = isAsyncLoad.value\n ? currentValues.value.concat(mergedValues.value)\n : currentValues.value\n const values = new Set(baseValues)\n const loop = [...baseValues]\n\n while (loop.length) {\n const value = loop.shift()!\n\n const option = optionValueMap.get(value)\n\n if (option) {\n const parent = optionIdMap.get(option.parent)\n\n if (parent?.checked) {\n values.delete(value)\n values.add(parent.fullValue)\n loop.push(parent.fullValue)\n }\n }\n }\n\n const briefLabel = props.briefLabel\n\n mergedValues.value = Array.from(values).filter(value => optionValueMap.has(value))\n mergedLabels.value = mergedValues.value\n .map(value => {\n const option = optionValueMap.get(value)!\n\n return briefLabel ? option.label : option.fullLabel\n })\n .filter(Boolean)\n}\n\nfunction isFlatArray<T extends string | number>(value: T[] | T[][]): value is T[] {\n return !!value.length && !Array.isArray(value[0])\n}\n\nfunction isComplexArray<T extends string | number>(value: T[] | T[][]): value is T[][] {\n return !!value.length && Array.isArray(value[0])\n}\n\nfunction initValueAndLabel(value: CascaderValue | null) {\n const processMerged = () => {\n if (usingMerged.value) {\n if (isAsyncLoad.value) {\n mergedValues.value = Array.from(optionIdMap.values())\n .filter(option => option.checked)\n .map(option => option.fullValue)\n }\n\n updateMergedProps()\n }\n }\n\n for (const option of optionList) {\n option.checked = false\n option.partial = false\n }\n\n if (!value?.length) {\n currentValues.value = []\n currentLabels.value = []\n processMerged()\n return\n }\n\n const briefLabel = props.briefLabel\n\n if (props.multiple) {\n const normalizedValue = isFlatArray(value) ? [value] : value\n const valueSet = new Set<string>(normalizedValue.map(v => v.join(props.separator)))\n const selectedValues: string[] = []\n const selectedLabels: string[] = []\n const selectedOptions: CascaderOptionState[] = []\n\n valueSet.forEach(value => {\n const option = optionValueMap.get(value)\n\n if (option) {\n option.checked = true\n option.partial = false\n\n selectedValues.push(value)\n selectedLabels.push(briefLabel ? option.label : option.fullLabel)\n selectedOptions.push(option)\n }\n })\n\n if (!props.noCascaded) {\n const originalOptions = selectedOptions.concat(\n Array.from(optionIdMap.values()).filter(option => option.disabled && option.checked)\n )\n\n for (let i = 0, len = originalOptions.length; i < len; ++i) {\n const option = originalOptions[i]\n\n updateCheckedUpward(option)\n updateCheckedDown(option)\n }\n }\n\n currentValues.value = selectedValues\n currentLabels.value = selectedLabels\n } else {\n const normalizedValue = isComplexArray(value) ? value[0] : value\n const stringValue = normalizedValue.join(props.separator)\n const option = optionValueMap.get(stringValue)\n\n if (option) {\n currentValues.value = [stringValue]\n currentLabels.value = [briefLabel ? option.label : option.fullLabel]\n\n if (props.noCascaded) {\n option.checked = true\n option.partial = false\n }\n } else {\n currentValues.value = []\n currentLabels.value = []\n }\n }\n\n processMerged()\n\n if (openedIds.value.length) return\n\n const firstValue = currentValues.value[0]\n\n if (firstValue) {\n const option = optionValueMap.get(firstValue)!\n const ids = [option.id]\n\n let parent = optionIdMap.get(option.parent)\n\n while (parent) {\n ids.push(parent.id)\n parent = optionIdMap.get(parent.parent)\n }\n\n openedIds.value = ids.reverse().slice(0, -1)\n }\n}\n\nfunction setVisible(visible: boolean) {\n if (currentVisible.value === visible) return\n\n currentVisible.value = visible\n\n emit('update:visible', visible)\n emitEvent(props.onToggle, visible)\n}\n\nasync function handlePanelOpen(option: CascaderOptionState, depth: number) {\n if (!option.hasChild && !option.children?.length) return\n\n if (isAsyncLoad.value && !option.children?.length && !option.loaded) {\n option.loading = true\n\n let result: ReturnType<typeof props.onAsyncLoad>\n\n try {\n result = props.onAsyncLoad(option.data)\n result = isPromise(result) ? await result : result\n } catch (e) {\n option.error = true\n option.loading = false\n return\n }\n\n const rawOptions = result as any[]\n\n if (!Array.isArray(rawOptions) || !rawOptions.length) {\n option.hasChild = false\n } else {\n const options = createOptionStates(rawOptions)\n const parentId = option.id\n const separator = props.separator\n\n option.children.push(...options)\n\n let idCount = Math.max(...Array.from(optionIdMap.keys()).map(Number)) + 1\n\n options.forEach(option => {\n option.id = idCount++\n option.parent = parentId\n\n initOptionFull(option, separator)\n\n optionIdMap.set(option.id, option)\n optionValueMap.set(option.fullValue, option)\n })\n\n optionList.push(...options)\n }\n\n option.loaded = true\n option.loading = false\n\n const upstream = queryUpstreamOptions(option)\n upstream.forEach(option => {\n option.childrenLoaded = queryChildrenLoaded(option)\n })\n }\n\n if (depth < openedIds.value.length) {\n openedIds.value = openedIds.value.slice(0, depth)\n }\n\n openedIds.value.push(option.id)\n requestAnimationFrame(() => {\n getLast(panelElList.value)?.$el?.focus()\n })\n}\n\nfunction handleOptionSelect(option: CascaderOptionState, depth: number) {\n if (!option) return\n\n if (option.hasChild || option.children?.length) {\n handlePanelOpen(option, depth)\n } else {\n handleSingleSelect(option.fullValue)\n }\n}\n\nfunction queryUpstreamOptions(option: CascaderOptionState) {\n const options = [option]\n let parent = optionIdMap.get(option.parent)\n\n while (parent) {\n options.push(parent)\n parent = optionIdMap.get(parent.parent)\n }\n\n return options\n}\n\nfunction updateCheckedUpward(originalOption: CascaderOptionState) {\n let option = originalOption\n\n while (!isNull(option.parent)) {\n const parent = optionIdMap.get(option.parent)\n\n if (!parent) break\n\n if (option.checked === parent.checked && option.partial === parent.partial) {\n break\n }\n\n if (option.checked) {\n parent.checked = parent.children.every(item => item.disabled || item.checked)\n parent.partial = !parent.checked\n } else {\n parent.checked = false\n parent.partial = parent.children.some(item => item.checked || item.partial)\n }\n\n option = parent\n }\n}\n\nfunction updateCheckedDown(originalOption: CascaderOptionState) {\n const checked = originalOption.checked\n const partial = originalOption.partial\n\n const loop = [...originalOption.children]\n\n let option\n\n while (loop.length) {\n option = loop.shift()!\n\n if (option.disabled) continue\n\n option.checked = checked\n option.partial = partial\n\n if (option.children?.length) {\n loop.push(...option.children)\n }\n }\n}\n\nfunction handleOptionCheck(option: CascaderOptionState) {\n if (!option) return\n\n const options = Array.from(optionIdMap.values())\n const checked = !option.checked\n\n if (!props.multiple) {\n for (let i = 0, len = options.length; i < len; ++i) {\n options[i].checked = false\n }\n\n option.checked = checked\n option.partial = false\n\n return handleSingleSelect(option.fullValue)\n }\n\n option.checked = checked\n option.partial = false\n\n if (!props.noCascaded) {\n const originalOptions = [option].concat(\n options.filter(option => option.disabled && option.checked)\n )\n\n for (let i = 0, len = originalOptions.length; i < len; ++i) {\n const option = originalOptions[i]\n\n updateCheckedUpward(option)\n updateCheckedDown(option)\n }\n }\n\n emitEvent(props[checked ? 'onSelect' : 'onCancel'], option.fullValue, option.data)\n emitMultipleChange()\n}\n\nfunction emitMultipleChange() {\n const options = Array.from(optionIdMap.values())\n const selectedOptions = props.noCascaded\n ? options.filter(option => option.checked)\n : options.filter(option => option.checked && !(option.hasChild || option.children?.length))\n\n const selectedValues: string[] = []\n const selectedLabels: string[] = []\n\n const values: (string | number)[][] = []\n const dataList: Data[][] = []\n const briefLabel = props.briefLabel\n\n selectedOptions.forEach(option => {\n selectedValues.push(option.fullValue)\n selectedLabels.push(briefLabel ? option.label : option.fullLabel)\n\n const { value, data } = queryArrayMeta(option.fullValue)\n\n values.push(value)\n dataList.push(data)\n })\n\n currentValues.value = selectedValues\n currentLabels.value = selectedLabels\n\n if (usingMerged.value) {\n if (isAsyncLoad.value) {\n mergedValues.value = options.filter(option => option.checked).map(option => option.fullValue)\n }\n\n updateMergedProps()\n }\n\n if (usingMerged.value && isAsyncLoad.value) {\n values.length = 0\n dataList.length = 0\n\n mergedValues.value.forEach(fullValue => {\n const option = optionValueMap.get(fullValue)\n\n if (option) {\n const { value, data } = queryArrayMeta(option.fullValue)\n\n values.push(value)\n dataList.push(data)\n }\n })\n }\n\n emitChangeEvent(values, dataList)\n nextTick(updatePopper)\n}\n\nfunction handleSingleSelect(fullValue: string) {\n const option = optionValueMap.get(fullValue)\n\n if (!option) return\n\n emitEvent(props.onSelect, fullValue, option.data)\n\n if (fullValue) {\n currentValues.value[0] = fullValue\n currentLabels.value[0] = props.briefLabel ? option.label : option.fullLabel\n } else {\n currentValues.value.length = 0\n currentLabels.value.length = 0\n }\n\n const { value, data } = queryArrayMeta(fullValue)\n\n emitChangeEvent(value, data)\n setVisible(false)\n}\n\nfunction emitChangeEvent(value: CascaderValue, data: Data[] | Data[][]) {\n emittedValue.value = value\n\n nextTick(() => {\n outsideChanged = false\n\n emit('update:value', value)\n setFieldValue(value)\n emitEvent(props.onChange as ChangeListener, value, data)\n validateField()\n })\n}\n\nfunction queryArrayMeta(fullValue: string) {\n let option = optionValueMap.get(fullValue)!\n\n if (!option) return { value: [], data: [] }\n\n const value = [option.value]\n const data = [option.data]\n\n while (option.parent) {\n const parent = optionIdMap.get(option.parent)\n\n if (!parent) break\n\n value.push(parent.value)\n data.push(parent.data)\n option = parent\n }\n\n return {\n value: value.reverse(),\n data: data.reverse()\n }\n}\n\nfunction toggleVisible(visible = !currentVisible.value) {\n if (props.disabled || readonly.value) return\n\n setVisible(visible)\n}\n\nfunction handleClickOutside() {\n restTipShow.value = false\n emitEvent(props.onClickOutside)\n\n if (props.outsideClose && currentVisible.value) {\n setVisible(false)\n outsideClosed = true\n emitEvent(props.onOutsideClose)\n }\n}\n\nfunction handleClear() {\n if (props.disabled || readonly.value) return\n\n if (props.clearable) {\n const prev = emittedValue.value\n\n currentValues.value.length = 0\n currentLabels.value.length = 0\n mergedValues.value.length = 0\n mergedLabels.value.length = 0\n openedIds.value.length = 0\n emittedValue.value = prev?.length === 0 ? prev : []\n restTipShow.value = false\n\n for (const option of optionIdMap.values()) {\n option.checked = false\n option.partial = false\n }\n\n if (prev?.length !== 0) {\n emit('update:value', emittedValue.value)\n emitEvent(props.onChange as ChangeListener, emittedValue.value, [])\n }\n\n emitEvent(props.onClear)\n clearField(emittedValue.value)\n }\n}\n\nfunction toggleShowRestTip() {\n if (!currentVisible.value) {\n restTipShow.value = !restTipShow.value\n } else {\n restTipShow.value = false\n }\n}\n\nfunction handleTipClose(fullValue: string) {\n if (props.disabled || readonly.value) return\n\n if (props.multiple) {\n handleOptionCheck(optionValueMap.get(fullValue)!)\n } else {\n handleSingleSelect(fullValue)\n }\n}\n\nfunction handlePanelKeyOpen(option: CascaderOptionState, depth: number) {\n handlePanelOpen(option, depth)\n\n requestAnimationFrame(() => {\n const panel = getLast(panelElList.value)\n\n if (panel && panel.currentHitting < 0) {\n panel.currentHitting = panel.options.findIndex(option => option.id === prevClosedId)\n\n if (panel.currentHitting < 0) {\n panel.currentHitting = 0\n }\n }\n })\n}\n\nfunction handlePanelBack() {\n prevClosedId = openedIds.value.pop()!\n}\n\nfunction handlePanelsEnter() {\n requestAnimationFrame(() => {\n isPopperShow.value = true\n })\n}\n</script>\n\n<template>\n <div\n :id=\"idFor\"\n ref=\"wrapper\"\n :class=\"className\"\n role=\"group\"\n :aria-disabled=\"toAttrValue(props.disabled)\"\n :aria-expanded=\"toAttrValue(currentVisible)\"\n aria-haspopup=\"dialog\"\n :aria-labelledby=\"labelId\"\n @click=\"toggleVisible()\"\n >\n <div\n ref=\"reference\"\n :class=\"selectorClass\"\n tabindex=\"0\"\n @keydown.space.prevent=\"toggleVisible()\"\n @keydown.tab=\"toggleVisible(false)\"\n >\n <div\n v-if=\"hasPrefix\"\n :class=\"[nh.be('icon'), nh.be('prefix')]\"\n :style=\"{ color: props.prefixColor }\"\n >\n <slot name=\"prefix\">\n <Renderer :renderer=\"props.slots.prefix\">\n <Icon :icon=\"props.prefix\"></Icon>\n </Renderer>\n </slot>\n </div>\n <div :class=\"nh.be('control')\">\n <slot name=\"control\">\n <Renderer :renderer=\"props.slots.control\">\n <Overflow\n v-if=\"props.multiple\"\n inherit\n :class=\"[nh.be('tags')]\"\n :items=\"templateValues\"\n :max-count=\"props.maxTagCount\"\n @rest-change=\"restTagCount = $event\"\n >\n <template #default=\"{ item, index }\">\n <Tag\n inherit\n :class=\"nh.be('tag')\"\n :type=\"props.tagType\"\n closable\n :disabled=\"props.disabled\"\n @click.stop=\"toggleVisible()\"\n @close=\"handleTipClose(item)\"\n >\n {{ templateLabels[index] }}\n </Tag>\n </template>\n <template #counter=\"{ count }\">\n <Tag\n v-if=\"props.noRestTip\"\n inherit\n :class=\"[nh.be('tag'), nh.be('counter')]\"\n :type=\"props.tagType\"\n :disabled=\"props.disabled\"\n >\n {{ `+${count}` }}\n </Tag>\n <span v-else>\n <Tooltip\n inherit\n :transfer=\"false\"\n :visible=\"restTipShow\"\n trigger=\"custom\"\n placement=\"top-end\"\n :tip-class=\"nh.be('rest-tip')\"\n @click.stop=\"toggleShowRestTip\"\n >\n <template #trigger>\n <Tag\n inherit\n :class=\"[nh.be('tag'), nh.be('counter')]\"\n :type=\"props.tagType\"\n :disabled=\"props.disabled\"\n >\n {{ `+${count}` }}\n </Tag>\n </template>\n <NativeScroll inherit use-y-bar>\n <template v-for=\"(item, index) in templateValues\" :key=\"index\">\n <Tag\n v-if=\"index >= templateValues.length - restTagCount\"\n inherit\n :class=\"nh.be('tag')\"\n closable\n :type=\"props.tagType\"\n :disabled=\"props.disabled\"\n @close=\"handleTipClose(item)\"\n >\n {{ templateLabels[index] }}\n </Tag>\n </template>\n </NativeScroll>\n </Tooltip>\n </span>\n </template>\n </Overflow>\n <template v-else>\n {{ currentLabels[0] }}\n </template>\n <span\n v-if=\"(props.placeholder ?? locale.placeholder) && !hasValue\"\n :class=\"nh.be('placeholder')\"\n >\n {{ props.placeholder ?? locale.placeholder }}\n </span>\n </Renderer>\n </slot>\n </div>\n <div\n v-if=\"!props.noSuffix\"\n :class=\"[nh.be('icon'), nh.be('suffix')]\"\n :style=\"{\n color: props.suffixColor,\n opacity: showClear || props.loading ? '0%' : ''\n }\"\n >\n <slot name=\"suffix\">\n <Renderer :renderer=\"props.slots.suffix\">\n <Icon\n v-if=\"props.suffix\"\n :icon=\"props.suffix\"\n :class=\"{\n [nh.be('arrow')]: !props.staticSuffix\n }\"\n ></Icon>\n <Icon v-else v-bind=\"icons.angleDown\" :class=\"nh.be('arrow')\"></Icon>\n </Renderer>\n </slot>\n </div>\n <div\n v-else-if=\"props.clearable || props.loading\"\n :class=\"[nh.be('icon'), nh.bem('icon', 'placeholder'), nh.be('suffix')]\"\n ></div>\n <Transition :name=\"nh.ns('fade')\" appear>\n <button\n v-if=\"showClear\"\n :class=\"[nh.be('icon'), nh.be('clear')]\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"locale.ariaLabel.clear\"\n @click.stop=\"handleClear\"\n >\n <Icon v-bind=\"icons.clear\"></Icon>\n </button>\n <div v-else-if=\"props.loading\" :class=\"[nh.be('icon'), nh.be('loading')]\">\n <Icon\n v-bind=\"icons.loading\"\n :effect=\"props.loadingEffect || icons.loading.effect\"\n :icon=\"props.loadingIcon || icons.loading.icon\"\n ></Icon>\n </div>\n </Transition>\n </div>\n <Popper\n ref=\"popper\"\n :class=\"[nh.be('popper'), nh.ns('input-vars'), nh.bs('vars')]\"\n :visible=\"currentVisible\"\n :to=\"transferTo\"\n :transition=\"props.transitionName\"\n :alive=\"props.popperAlive ?? !transferTo\"\n @click.stop\n @enter=\"handlePanelsEnter\"\n >\n <div\n :class=\"{\n [nh.be('panels')]: true,\n [nh.bem('panels', 'empty')]: !optionsList[0] || !optionsList[0].length\n }\"\n >\n <template v-if=\"optionsList[0] && optionsList[0].length\">\n <CascaderPanel\n v-for=\"(items, index) in optionsList\"\n :key=\"index\"\n :ref=\"(panel: any) => panel && panelElList.push(panel)\"\n :options=\"items\"\n :opened-id=\"openedIds[index]\"\n :values=\"currentValues\"\n :ready=\"isPopperShow\"\n :multiple=\"props.multiple\"\n :is-async=\"isAsyncLoad\"\n :merged=\"usingMerged\"\n :no-cascaded=\"props.noCascaded\"\n :labeled-by=\"labelId\"\n @select=\"handleOptionSelect($event, index)\"\n @hover=\"usingHover && handlePanelOpen($event, index)\"\n @check=\"handleOptionCheck($event)\"\n @open=\"handlePanelKeyOpen($event, index)\"\n @back=\"handlePanelBack\"\n @close=\"currentVisible = false\"\n >\n <template v-if=\"slots.default || props.slots.default\" #default=\"payload\">\n <slot v-bind=\"payload\">\n <Renderer :renderer=\"props.slots.default\" :data=\"payload\"></Renderer>\n </slot>\n </template>\n <template v-if=\"slots.label || props.slots.label\" #label=\"payload\">\n <slot name=\"label\" v-bind=\"payload\">\n <Renderer :renderer=\"props.slots.label\" :data=\"payload\"></Renderer>\n </slot>\n </template>\n </CascaderPanel>\n </template>\n <div v-else :class=\"nh.be('empty')\" :style=\"{ width: `${selectorWidth}px` }\">\n <slot name=\"empty\">\n <Renderer :renderer=\"props.slots.empty\">\n {{ props.emptyText ?? locale.empty }}\n </Renderer>\n </slot>\n </div>\n </div>\n </Popper>\n </div>\n</template>\n"],"names":["ID_KEY","PARENT_KEY","defaultKeyConfig","idFor","labelId","state","disabled","loading","size","validateField","clearField","getFieldValue","setFieldValue","useFieldStore","_a","reference","_props","__props","nh","useNameHelper","props","useProps","createSizeProp","createStateProp","createIconProp","value","placementWhileList","emit","__emit","slots","_useSlots","icons","useIcons","locale","useLocale","toRef","currentVisible","ref","currentValues","currentLabels","mergedValues","mergedLabels","isPopperShow","placement","transfer","emittedValue","optionTree","isAsyncLoad","computed","usingMerged","templateValues","templateLabels","optionList","optionIdMap","optionValueMap","outsideClosed","prevClosedId","flattedOptions","updateTrigger","watchEffect","flatTree","watch","initOptionStates","separator","isAsync","createOptionStates","i","len","option","initOptionFull","queryChildrenLoaded","transformTree","initValueAndLabel","openedIds","optionsList","id","wrapper","useClickOutside","handleClickOutside","popper","transferTo","updatePopper","usePopper","isHover","useHover","panelElList","restTagCount","restTipShow","selectorWidth","className","readonly","selectorClass","baseCls","hasPrefix","hasValue","usingHover","showClear","nextTick","_b","getLast","outsideChanged","brief","updateMergedProps","originalOptions","updateCheckedUpward","updateCheckedDown","emitMultipleChange","setVisible","onBeforeUpdate","__expose","handlePanelOpen","handleOptionSelect","handleOptionCheck","toggleVisible","handleClear","handlePanelBack","options","rawOptions","valueKey","labelKey","disabledKey","hasChildKey","rawOption","parent","label","hasChild","reactive","loop","child","baseValues","values","briefLabel","isFlatArray","isComplexArray","processMerged","normalizedValue","valueSet","v","selectedValues","selectedLabels","selectedOptions","stringValue","firstValue","ids","visible","emitEvent","depth","result","isPromise","parentId","idCount","queryUpstreamOptions","handleSingleSelect","originalOption","isNull","item","checked","partial","dataList","data","queryArrayMeta","fullValue","emitChangeEvent","prev","toggleShowRestTip","handleTipClose","handlePanelKeyOpen","panel","handlePanelsEnter"],"mappings":"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