UNPKG

@extclp/vexip-ui

Version:

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

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