Skip to content

Commit

Permalink
feat(pro:transfer): add tree transfer cascadeStrategy support (#1155)
Browse files Browse the repository at this point in the history
  • Loading branch information
sallerli1 committed Sep 27, 2022
1 parent fba1a5d commit 470bf8d
Show file tree
Hide file tree
Showing 27 changed files with 351 additions and 166 deletions.
21 changes: 12 additions & 9 deletions packages/components/transfer/src/composables/useTransferData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ export interface TransferDataContext<T extends TransferData = TransferData> {
paginatedTargetData: ComputedRef<T[]>
targetKeys: ComputedRef<VKey[]>
targetKeySet: ComputedRef<Set<VKey>>
append: (keys: VKey[]) => void
remove: (keys: VKey[]) => void
changeTargetKeys: (removedKeys: VKey[], appendedKeys: VKey[]) => void
clear: () => void

getKey: ComputedRef<GetKeyFn>
Expand Down Expand Up @@ -122,11 +121,16 @@ export function useTransferData<T extends TransferData = TransferData>(
getPaginatedData(filteredTargetData.value, transferPaginationContext.targetPagination.value),
)

const append = (keys: VKey[]) => {
_append(keys, targetKeySet.value, getKey.value, handleChange)
}
const remove = (keys: VKey[]) => {
_remove(keys, targetKeySet.value, getKey.value, handleChange)
const changeTargetKeys = (removedKeys: VKey[], appendedKeys: VKey[]) => {
let newKeys = targetKeys.value
if (removedKeys.length > 0) {
newKeys = _remove(removedKeys, newKeys, getKey.value)
}
if (appendedKeys.length > 0) {
newKeys = _append(appendedKeys, newKeys, getKey.value)
}

handleChange(newKeys)
}

const clear = () => {
Expand Down Expand Up @@ -161,8 +165,7 @@ export function useTransferData<T extends TransferData = TransferData>(
paginatedTargetData,
targetKeys,
targetKeySet,
append,
remove,
changeTargetKeys,
clear,

getKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,27 +74,23 @@ function createDefaultStrategies<T extends TransferData = TransferData>(

return data.filter(item => searchFn(item, searchValue))
},
append: (keys, selectedKeySet, _, handleChange) => {
append: (keys, selectedKeySet) => {
const newKeys = new Set(selectedKeySet)

keys.forEach(key => {
newKeys.add(key)
})

if (newKeys.size !== selectedKeySet.size) {
handleChange(Array.from(newKeys))
}
return Array.from(newKeys)
},
remove: (keys, selectedKeySet, _, handleChange) => {
remove: (keys, selectedKeySet) => {
const newKeys = new Set(selectedKeySet)

keys.forEach(key => {
newKeys.delete(key)
})

if (newKeys.size !== selectedKeySet.size) {
handleChange(Array.from(newKeys))
}
return Array.from(newKeys)
},
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,16 @@ export function useTransferOperations<T extends TransferData = TransferData>(
transferDataContext: TransferDataContext<T>,
transferSelectStateContext: TransferSelectStateContext,
): TransferOperationsContext {
const { dataKeyMap, sourceData, targetData, disabledSourceKeys, disabledTargetKeys, append, remove, clear, getKey } =
transferDataContext
const {
dataKeyMap,
sourceData,
targetData,
disabledSourceKeys,
disabledTargetKeys,
changeTargetKeys,
clear,
getKey,
} = transferDataContext
const { sourceSelectedKeys, targetSelectedKeys } = transferSelectStateContext

const appendDisabled = computed(() => props.disabled || sourceSelectedKeys.value.length <= 0)
Expand All @@ -47,23 +55,32 @@ export function useTransferOperations<T extends TransferData = TransferData>(
return
}

append((keys ?? Array.from(sourceSelectedKeys.value)).filter(key => !disabledSourceKeys.value.has(key)))
changeTargetKeys(
[],
(keys ?? Array.from(sourceSelectedKeys.value)).filter(key => !disabledSourceKeys.value.has(key)),
)
}

const triggerRemove = (keys?: VKey[]) => {
if ((!keys && removeDisabled.value) || (keys && props.disabled)) {
return
}

remove((keys ?? Array.from(targetSelectedKeys.value)).filter(key => !disabledTargetKeys.value.has(key)))
changeTargetKeys(
(keys ?? Array.from(targetSelectedKeys.value)).filter(key => !disabledTargetKeys.value.has(key)),
[],
)
}

const triggerAppendAll = () => {
if (appendAllDisabled.value) {
return
}

append(Array.from(dataKeyMap.value.keys()).filter(key => !disabledSourceKeys.value.has(key)))
changeTargetKeys(
[],
Array.from(dataKeyMap.value.keys()).filter(key => !disabledSourceKeys.value.has(key)),
)
}

const triggerClear = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,15 @@ export function useTransferSelectState(
const sourceSelectedKeySet = computed(() => new Set(sourceSelectedKeys.value))
const targetSelectedKeySet = computed(() => new Set(targetSelectedKeys.value))

const { dataKeyMap, sourceDataKeys, targetDataKeys, disabledKeys, disabledSourceKeys, disabledTargetKeys } =
transferDataContext
const {
dataKeyMap,
sourceDataKeys,
targetDataKeys,
targetKeySet,
disabledKeys,
disabledSourceKeys,
disabledTargetKeys,
} = transferDataContext

const sourceDataCount = computed(() =>
props.mode === 'immediate' ? dataKeyMap.value.size : sourceDataKeys.value.size,
Expand All @@ -72,7 +79,7 @@ export function useTransferSelectState(
})

watch(
[sourceCheckableDataCount, dataKeyMap, disabledKeys, targetDataKeys],
[sourceCheckableDataCount, dataKeyMap, disabledKeys, targetKeySet],
(_, [, , , prevSelectedKeys]) => {
const tempKeys = new Set(sourceSelectedKeys.value)

Expand All @@ -82,19 +89,19 @@ export function useTransferSelectState(
return
}

if (props.mode === 'default' && targetDataKeys.value.has(key)) {
if (props.mode === 'default' && targetKeySet.value.has(key)) {
tempKeys.delete(key)
}
})

if (props.mode === 'immediate') {
targetDataKeys.value.forEach(key => {
targetKeySet.value.forEach(key => {
if (dataKeyMap.value.has(key)) {
tempKeys.add(key)
}
})
prevSelectedKeys?.forEach(key => {
if (!targetDataKeys.value.has(key)) {
if (!targetKeySet.value.has(key)) {
tempKeys.delete(key)
}
})
Expand Down Expand Up @@ -208,7 +215,7 @@ function transferBySelectionChange(
currentCheckedKeys: Set<VKey>,
transferDataContext: TransferDataContext,
) {
const { append, remove } = transferDataContext
const { changeTargetKeys } = transferDataContext
const appendedKeys: VKey[] = []
const removedKeys: VKey[] = []

Expand All @@ -224,11 +231,5 @@ function transferBySelectionChange(
}
}

if (appendedKeys.length > 0) {
append(appendedKeys)
}

if (removedKeys.length > 0) {
remove(removedKeys)
}
changeTargetKeys(removedKeys, appendedKeys)
}
10 changes: 5 additions & 5 deletions packages/components/transfer/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ export interface TransferDataStrategiesConfig<T extends TransferData = TransferD
getKey: GetKeyFn,
) => SeparatedData<T>
dataFilter?: (data: T[], searchValue: string, searchFn: (item: T, searchValue: string) => boolean) => T[]
append?: (keys: K[], selectedKeySet: Set<K>, getKey: GetKeyFn, handleChange: (keys: K[]) => void) => void
remove?: (keys: K[], selectedKeySet: Set<K>, getKey: GetKeyFn, handleChange: (keys: K[]) => void) => void
append?: (keys: K[], selectedKeys: K[], getKey: GetKeyFn) => K[]
remove?: (keys: K[], selectedKeys: K[], getKey: GetKeyFn) => K[]
}
export type TransferDataStrategies<T extends TransferData = TransferData> = Required<TransferDataStrategiesConfig<T>>

Expand All @@ -59,10 +59,10 @@ export interface TransferBindings<T extends TransferData = TransferData> {

pagination: ComputedRef<PaginationProps | undefined>

triggerAppend: <K = VKey>(keys: K[]) => void
triggerRemove: <K = VKey>(keys: K[]) => void
triggerAppend: (keys: VKey[]) => void
triggerRemove: (keys: VKey[]) => void
getKey: ComputedRef<GetKeyFn>
handleSelectChange: <K = Set<VKey> | VKey[]>(keys: K) => void
handleSelectChange: (keys: Set<VKey> | VKey[]) => void
selectAll: (selected?: boolean) => void

searchValue: ComputedRef<string>
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/BasicTree.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 1
order: 10
title:
zh: 基本树穿梭框
en: Basic tree transfer
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/FlattenTree.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 6
order: 60
title:
zh: 平展已选树
en: Flatten target tree
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TableCustomLabel.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title:
zh: 表格穿梭框自定义表格列渲染
en: Customize Table Transfer Column Render
order: 11
order: 110
---

## zh
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TableOneWay.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 4
order: 40
title:
zh: 单向表格穿梭框
en: One-wayed tree transfer
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TablePagination.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 2
order: 20
title:
zh: 表格穿梭框分页
en: Table transfer pagination
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TableRemote.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 9
order: 90
title:
zh: 表格穿梭框远程数据加载
en: Table transfer remote data
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TableVirtual.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 7
order: 70
title:
zh: 表格穿梭框虚拟滚动
en: Table transfer virtual scroll
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreeCustomLabel.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 12
order: 120
title:
zh: 树穿梭框自定义标签渲染
en: Customize Tree Transfer Label Render
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreeLoadChildren.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 11
order: 110
title:
zh: 树节点异步加载
en: Tree Load Children
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreeOneWay.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 5
order: 50
title:
zh: 单向树穿梭框
en: One-wayed tree transfer
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreePagination.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 3
order: 30
title:
zh: 树穿梭框分页
en: Tree transfer pagination
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreeRemote.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 10
order: 100
title:
zh: 树穿梭框远程数据加载
en: Tree transfer remote data
Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/demo/TreeVirtual.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
order: 8
order: 80
title:
zh: 树穿梭框虚拟滚动
en: Tree transfer virtual scroll
Expand Down
4 changes: 3 additions & 1 deletion packages/pro/transfer/docs/Api.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ export type ProTransferTreeProps = Pick<
| 'loadChildren'
| 'onExpand'
| 'onExpandedChange'
>
> & {
cascaderStrategy: TreeProps['checkStrategy']
}
```
#### ProTransferSlots
Expand Down
7 changes: 5 additions & 2 deletions packages/pro/transfer/src/ProTransfer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import type { TableInstance } from '@idux/components/table'
import type { TreeInstance } from '@idux/components/tree'
import type { GetKeyFn } from '@idux/components/utils'

import { type ComputedRef, computed, defineComponent, provide, ref } from 'vue'

Expand Down Expand Up @@ -56,7 +57,7 @@ export default defineComponent({
const sourceContentRef = ref<TransferListInstance | TableInstance | TreeInstance>()
const targetContentRef = ref<TransferListInstance | TableInstance | TreeInstance>()

const { dataKeyMap, parentKeyMap, expandedKeysContext } = useTreeContext(props, childrenKey, targetKeys)
const { dataKeyMap, parentKeyMap, expandedKeysContext } = useTreeContext(props, childrenKey, getKey, targetKeys)
const { dataSource, loadSourceChildren, loadTargetChildren } = useTransferData(
props,
getKey,
Expand Down Expand Up @@ -172,6 +173,7 @@ export default defineComponent({
function useTreeContext(
props: ProTransferProps,
childrenKey: ComputedRef<string>,
getKey: ComputedRef<GetKeyFn>,
targetKeys: ComputedRef<VKey[] | undefined>,
): {
dataKeyMap?: Map<VKey, TreeTransferData<VKey>>
Expand All @@ -185,8 +187,9 @@ function useTreeContext(
const { dataKeyMap, parentKeyMap, dataStrategies } = useTreeDataStrategies(
childrenKey,
props.defaultTargetData as TreeTransferData<VKey>[] | undefined,
props.treeProps?.cascaderStrategy,
)
const expandedKeysContext = useTreeExpandedKeys(props, targetKeys, parentKeyMap)
const expandedKeysContext = useTreeExpandedKeys(props, childrenKey, getKey, targetKeys, parentKeyMap, dataKeyMap)

provide(TRANSFER_DATA_STRATEGIES, dataStrategies as unknown as TransferDataStrategiesConfig<TransferData>)

Expand Down
2 changes: 1 addition & 1 deletion packages/pro/transfer/src/composables/useTransferData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export function useTransferData<C extends VKey>(
}

return async (node: TreeNode<VKey>, isSource: boolean) => {
const loadedData = await _loadChildren(node as TreeTransferData)
const loadedData = (await _loadChildren(node as TreeTransferData<C>)) as TreeTransferData<C>[]
const key = getKey.value(node)

if (!loadedData || loadedData.length <= 0) {
Expand Down
Loading

0 comments on commit 470bf8d

Please sign in to comment.