diff --git a/packages/antd/src/preview-text/index.tsx b/packages/antd/src/preview-text/index.tsx index 66695a87c76..5dcc9ce2cc9 100644 --- a/packages/antd/src/preview-text/index.tsx +++ b/packages/antd/src/preview-text/index.tsx @@ -6,7 +6,7 @@ import { InputProps } from 'antd/lib/input' import { InputNumberProps } from 'antd/lib/input-number' import { SelectProps } from 'antd/lib/select' import { TreeSelectProps } from 'antd/lib/tree-select' -import { CascaderProps } from 'antd/lib/cascader' +import { CascaderProps, DefaultOptionType } from 'antd/lib/cascader' import { DatePickerProps, RangePickerProps as DateRangePickerProps, @@ -239,18 +239,43 @@ const Cascader: React.FC>> = : props?.options?.length ? props.options : [] + const findSelectedItem = ( + items: DefaultOptionType[], + val: string | number + ) => { + return items.find((item) => item.value == val) + } + const findSelectedItems = ( + sources: DefaultOptionType[], + selectedValues: Array + ): Array => { + return selectedValues.map((value) => { + const result: Array = [] + let items = sources + value.forEach((val) => { + const selectedItem = findSelectedItem(items, val) + result.push({ + label: selectedItem?.label ?? '', + value: selectedItem?.value, + }) + items = selectedItem?.children ?? [] + }) + return result + }) + } const getSelected = () => { const val = toArr(props.value) - return props.multiple - ? val.map((item) => item[item.length - 1]) - : val.slice(val.length - 1) + // unified conversion to multi selection mode + return props.multiple ? val : [val] } const getLabels = () => { const selected = getSelected() - const labels = getValueByValue(dataSource, selected) - ?.filter((item) => isValid(item)) - ?.map((item) => item?.whole?.join('/')) - .join(', ') + const values = findSelectedItems(dataSource, selected) + const labels = values + .map((val: Array) => { + return val.map((item) => item.label).join('/') + }) + .join(' ') return labels || placeholder } return ( diff --git a/packages/next/src/preview-text/index.tsx b/packages/next/src/preview-text/index.tsx index 0e044965cef..6b76e017393 100644 --- a/packages/next/src/preview-text/index.tsx +++ b/packages/next/src/preview-text/index.tsx @@ -208,6 +208,12 @@ const TreeSelect: React.FC> = observer( } ) +type SelectOptionType = { + value: string + label: string + children?: SelectOptionType[] +} + const Cascader: React.FC> = observer( (props) => { const field = useField() @@ -218,15 +224,43 @@ const Cascader: React.FC> = observer( : props?.dataSource?.length ? props.dataSource : [] + const findSelectedItem = ( + items: SelectOptionType[], + val: string | number + ) => { + return items.find((item) => item.value == val) + } + const findSelectedItems = ( + sources: SelectOptionType[], + selectedValues: Array + ): Array => { + return selectedValues.map((value) => { + const result: Array = [] + let items = sources + value.forEach((val) => { + const selectedItem = findSelectedItem(items, val) + result.push({ + label: selectedItem?.label ?? '', + value: selectedItem?.value, + }) + items = selectedItem?.children ?? [] + }) + return result + }) + } const getSelected = () => { - return props.multiple ? toArr(props.value) : [props.value] + const val = toArr(props.value) + // unified conversion to multi selection mode + return props.multiple ? val : [val] } const getLabels = () => { const selected = getSelected() - const labels = getValueByValue(dataSource, selected) - ?.filter((item) => isValid(item)) - ?.map((item) => item?.whole?.join('/')) - .join(', ') + const values = findSelectedItems(dataSource, selected) + const labels = values + .map((val: Array<{ value: string; label: string }>) => { + return val.map((item) => item.label).join('/') + }) + .join(' ') return labels || placeholder } return
{getLabels()}