UNPKG

vexip-ui

Version:

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

1 lines 60.5 kB
{"version":3,"file":"cascader.vue2.cjs","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","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","_b","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","_createElementBlock","_unref","toAttrValue","_createElementVNode","_normalizeStyle","_renderSlot","_ctx","_createVNode","Renderer","Icon","_normalizeClass","_createBlock","Overflow","_cache","$event","_withCtx","index","Tag","_createTextVNode","_toDisplayString","count","_hoisted_2","Tooltip","NativeScroll","_openBlock","_Fragment","_renderList","_mergeProps","_Transition","_normalizeProps","_guardReactiveProps","Popper","items","CascaderPanel","payload"],"mappings":"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