Skip to content

Commit

Permalink
fix(pro:transfer): tree transfer count error under children strategy (
Browse files Browse the repository at this point in the history
  • Loading branch information
sallerli1 committed Feb 13, 2023
1 parent ff3bcf9 commit e0f9597
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 13 deletions.
4 changes: 2 additions & 2 deletions packages/cdk/utils/src/tree.ts
Expand Up @@ -63,7 +63,7 @@ export function mapTree<V extends TreeTypeData<V, C>, R extends object, C extend
export function filterTree<V extends TreeTypeData<V, C>, C extends keyof V>(
data: V[],
childrenKey: C,
filterFn: (item: V, parents: V[]) => boolean,
filterFn: (item: V, parents: V[], filteredChildren: V[] | undefined) => boolean,
filterStrategy: 'and' | 'or' = 'or',
): V[] {
const filter = (_data: V[], parents: V[]): V[] => {
Expand All @@ -76,7 +76,7 @@ export function filterTree<V extends TreeTypeData<V, C>, C extends keyof V>(
children = filter(item[childrenKey]!, [item, ...parents])
}

let itemValid = filterFn(item, parents)
let itemValid = filterFn(item, parents, children)
const childrenValid = (children && children.length > 0) || (!item[childrenKey]?.length && itemValid)

itemValid = filterStrategy === 'and' ? childrenValid && itemValid : childrenValid || itemValid
Expand Down
24 changes: 13 additions & 11 deletions packages/pro/transfer/src/composables/useTreeDataStrategy.ts
Expand Up @@ -94,9 +94,10 @@ function createSeparateDataSourceFn<V extends TreeTransferData<V, C>, C extends
cachedTargetData: Ref<V[]>,
cascaderStrategy: CascaderStrategy,
targetDataCount: Ref<number>,
dataMap: Map<VKey, V>,
flatTargetData: boolean | 'all' = false,
): Exclude<TransferDataStrategyProp<V>['separateDataSource'], undefined> {
const targetDataKeySet = new Set<VKey>()
const sourceDataKeySet = new Set<VKey>()

const getFilterFn = (selectedKeySet: Set<VKey>, getKey: GetKeyFn): ((data: V[], isSource: boolean) => V[]) => {
// under cascaderStrategy `parent`, selected child nodes are not in selectedKeys
Expand All @@ -120,13 +121,13 @@ function createSeparateDataSourceFn<V extends TreeTransferData<V, C>, C extends
return filterTree(
data,
childrenKey.value,
(item, parent) => {
(item, parent, filteredChildren) => {
const filterRes = filterFn(item, parent, isSource)

// set targetDataKeySet to collect targetData count later
// we collect this during filter process to avoid unecessary traveral
if (!isSource && filterRes) {
targetDataKeySet.add(getKey(item))
if (isSource && (filterRes || filteredChildren?.length)) {
sourceDataKeySet.add(getKey(item))
}

return filterRes
Expand All @@ -137,9 +138,7 @@ function createSeparateDataSourceFn<V extends TreeTransferData<V, C>, C extends

const res: V[] = []
traverseTree(data, childrenKey.value, (item, parent) => {
const key = getKey(item)
if (filterFn(item, parent, isSource) && !targetDataKeySet.has(key)) {
targetDataKeySet.add(key)
if (filterFn(item, parent, isSource)) {
res.push({ ...item, [childrenKey.value]: undefined })
}
})
Expand All @@ -150,19 +149,21 @@ function createSeparateDataSourceFn<V extends TreeTransferData<V, C>, C extends
return (data, _, selectedKeySet, getKey) => {
const filterData = getFilterFn(selectedKeySet, getKey)

sourceDataKeySet.clear()

const sourceData = filterData(data, true)
const newTargetData = filterData(data, false)
const previousTargetData = filterData(cachedTargetData.value, false)

targetDataCount.value = targetDataKeySet.size
targetDataKeySet.clear()

// merge new data with previous data
// beacause we intend to cache selected data after dataSource changes
const targetData = mergeTree(previousTargetData, newTargetData, childrenKey.value, getKey)
cachedTargetData.value = targetData

targetDataCount.value = cascaderStrategy === 'off' ? targetData.length : dataMap.size - sourceDataKeySet.size

return {
sourceData: filterData(data, true),
sourceData,
targetData:
cascaderStrategy === 'off' ? targetData : flattenTargetTree(targetData, childrenKey.value, flatTargetData),
}
Expand Down Expand Up @@ -197,6 +198,7 @@ function createStrategy<V extends TreeTransferData<V, C>, C extends string>(
cachedTargetData,
cascaderStrategy,
targetDataCount,
dataMap,
flatTargetData,
),
append: (keys, selectedKey) => checkStateResolver.appendKeys(selectedKey, keys),
Expand Down

0 comments on commit e0f9597

Please sign in to comment.