1+ import { PATH_SEPARATOR } from '@tdesign/common-js/tree-v1/tree-node-model' ;
12import { isEmpty } from 'lodash-es' ;
2- import {
3- TreeNode ,
3+
4+ import type {
45 CascaderContextType ,
5- TdCascaderProps ,
66 CascaderValue ,
7+ TdCascaderProps ,
8+ TreeNode ,
79 TreeNodeValue ,
810 TreeOptionData ,
911} from '../interface' ;
@@ -15,20 +17,34 @@ import {
1517 * @returns
1618 */
1719export function getSingleContent ( cascaderContext : CascaderContextType ) : string {
18- const { value, multiple, treeStore, showAllLevels } = cascaderContext ;
19- const BooleanIsFalseExceptZero = 0 ;
20- if ( multiple || ( ! value && value !== BooleanIsFalseExceptZero ) ) return '' ;
21-
22- if ( Array . isArray ( value ) ) return '' ;
23- const node = treeStore && treeStore . getNodes ( value as TreeNodeValue | TreeNode ) ;
24- if ( ! ( node && node . length ) ) {
25- return value as string ;
20+ const { value, multiple, treeStore, showAllLevels, valueType } = cascaderContext ;
21+
22+ const isEmpty = ( ! value && value !== 0 ) || ( Array . isArray ( value ) && value . length === 0 ) ;
23+ const isInvalidFullPathValue = valueType === 'full' && ! Array . isArray ( value ) ;
24+ if ( multiple || isEmpty || isInvalidFullPathValue ) return '' ;
25+
26+ const formatContent = ( path : TreeNode [ ] ) => {
27+ if ( ! path ?. length ) return '' ;
28+ return showAllLevels ? path . map ( ( node ) => node . label ) . join ( ` ${ PATH_SEPARATOR } ` ) : path [ path . length - 1 ] . label ;
29+ } ;
30+
31+ const getDefaultDisplay = ( val : any ) => ( Array . isArray ( val ) ? val . join ( ` ${ PATH_SEPARATOR } ` ) : String ( val ) ) ;
32+
33+ // valueType = 'full'
34+ if ( valueType === 'full' && Array . isArray ( value ) && value . length > 0 ) {
35+ const node = treeStore ?. getNode ( value as string [ ] ) ;
36+ const path = node ?. getPath ( ) ;
37+ return path ?. length ? formatContent ( path ) : getDefaultDisplay ( value ) ;
2638 }
27- const path = node && node [ 0 ] . getPath ( ) ;
28- if ( path && path . length ) {
29- return showAllLevels ? path . map ( ( node : TreeNode ) => node . label ) . join ( ' / ' ) : path [ path . length - 1 ] . label ;
39+
40+ // valueType = 'single'
41+ const nodes = treeStore ?. getNodes ( value as TreeNodeValue | TreeNode ) ;
42+ if ( ! nodes ?. length ) {
43+ return getDefaultDisplay ( value ) ;
3044 }
31- return value as string ;
45+
46+ const path = nodes [ 0 ] . getPath ( ) ;
47+ return path ?. length ? formatContent ( path ) : getDefaultDisplay ( value ) ;
3248}
3349
3450/**
@@ -38,18 +54,23 @@ export function getSingleContent(cascaderContext: CascaderContextType): string {
3854 * @returns
3955 */
4056export function getMultipleContent ( cascaderContext : CascaderContextType ) {
41- const { value, multiple, treeStore, showAllLevels } = cascaderContext ;
57+ const { value, multiple, treeStore, showAllLevels, valueType } = cascaderContext ;
4258
4359 if ( ! multiple ) return [ ] ;
4460 if ( multiple && ! Array . isArray ( value ) ) return [ ] ;
4561
46- const node = treeStore && treeStore . getNodes ( value as TreeNodeValue | TreeNode ) ;
47- if ( ! node ) return [ ] ;
48-
4962 return ( value as TreeNodeValue [ ] )
5063 . map ( ( item : TreeNodeValue ) => {
51- const node = treeStore . getNodes ( item ) ;
52- return showAllLevels ? getFullPathLabel ( node ?. [ 0 ] ) : node ?. [ 0 ] ?. label ;
64+ let node : TreeNode | undefined ;
65+ // valueType='full' 时,item 是路径数组,使用 getNode 获取节点
66+ if ( valueType === 'full' && Array . isArray ( item ) ) {
67+ node = treeStore ?. getNode ( item as string [ ] ) ;
68+ } else {
69+ const nodes = treeStore ?. getNodes ( item ) ;
70+ node = nodes ?. [ 0 ] ;
71+ }
72+ if ( ! node ) return undefined ;
73+ return showAllLevels ? getFullPathLabel ( node ) : node ?. label ;
5374 } )
5475 . filter ( ( item ) => ! ! item ) ;
5576}
@@ -107,20 +128,16 @@ export const getTreeValue = (value: CascaderContextType['value']) => {
107128} ;
108129
109130/**
110- * 按数据类型计算通用数值
111- * @param value
112- * @param showAllLevels
113- * @param multiple
114- * @returns
131+ * 获取用于展开的节点值
115132 */
116- export const getCascaderValue = ( value : CascaderValue , valueType : TdCascaderProps [ 'valueType' ] , multiple : boolean ) => {
117- if ( valueType === 'single' ) {
118- return value ;
119- }
120- if ( multiple ) {
121- return ( value as Array < CascaderValue > ) . map ( ( item : TreeNodeValue [ ] ) => item [ item . length - 1 ] ) ;
133+ export const getExpandValue = ( value : CascaderContextType [ 'value' ] , valueType ?: TdCascaderProps [ 'valueType' ] ) => {
134+ if ( valueType === 'full' && Array . isArray ( value ) && value . length > 0 ) {
135+ // valueType='full' 时,value 是完整路径数组
136+ // 返回最后一个值用于展开
137+ return value [ value . length - 1 ] as TreeNodeValue ;
122138 }
123- return value [ ( value as Array < CascaderValue > ) . length - 1 ] ;
139+ const treeValue = getTreeValue ( value ) ;
140+ return treeValue [ 0 ] ;
124141} ;
125142
126143/**
@@ -141,6 +158,25 @@ export function isEmptyValues(value: unknown): boolean {
141158 * @returns boolean
142159 */
143160export function isValueInvalid ( value : CascaderValue , cascaderContext : CascaderContextType ) {
144- const { multiple, showAllLevels } = cascaderContext ;
145- return ( multiple && ! Array . isArray ( value ) ) || ( ! multiple && Array . isArray ( value ) && ! showAllLevels ) ;
161+ const { multiple, showAllLevels, valueType } = cascaderContext ;
162+
163+ // 多选模式:
164+ // value 必须是数组
165+ if ( multiple ) {
166+ return ! Array . isArray ( value ) ;
167+ }
168+
169+ // 单选模式:
170+ // valueType === 'full' 时,使用完整路径数组
171+ if ( valueType === 'full' ) {
172+ return ! Array . isArray ( value ) ;
173+ }
174+
175+ // 其它情况默认 value 为非数组
176+ // 若是数组,仅在 showAllLevels=true 时合法
177+ if ( Array . isArray ( value ) ) {
178+ return ! showAllLevels ;
179+ }
180+
181+ return false ;
146182}
0 commit comments