Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(comp:tree-select): removing item from selector doesn't uncheck tree node #1877

Merged
merged 1 commit into from
Apr 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/cdk/utils/src/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ export function traverseTree<V extends TreeTypeData<V, C>, C extends keyof V>(
export function mapTree<V extends TreeTypeData<V, C>, R extends object, C extends keyof V>(
data: V[],
childrenKey: C,
mapFn: (item: V, parents: V[]) => R | undefined,
mapFn: (item: V, parents: V[], index: number) => R | undefined,
): (R & TreeTypeData<R, C>)[] {
const map = (_data: V[], parents: V[]) => {
const res: (TreeTypeData<R, C> & R)[] = []
for (let idx = 0; idx < _data.length; idx++) {
const item = _data[idx]
const mappedItem = mapFn(item, parents) as R & TreeTypeData<R, C>
const mappedItem = mapFn(item, parents, idx) as R & TreeTypeData<R, C>
if (!mappedItem) {
continue
}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/tree-select/src/TreeSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export default defineComponent({
const mergedLabelKey = computed(() => props.labelKey ?? config.labelKey)

const triggerRef = ref<SelectorInstance>()
const treeRef = ref<TreeInstance>()
const [inputValue, setInputValue] = useState('')
const focus = () => triggerRef.value?.focus()
const blur = () => triggerRef.value?.blur()
Expand All @@ -63,11 +64,11 @@ export default defineComponent({
const { selectedValue, selectedNodes, changeSelected, handleRemove, handleClear } = useSelectedState(
props,
accessor,
treeRef,
mergedNodeMap,
)
const [overlayOpened, setOverlayOpened] = useControlledProp(props, 'open', false)

const treeRef = ref<TreeInstance>()
const scrollTo: VirtualScrollToFn = options => {
treeRef.value?.scrollTo(options)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

/* eslint-disable @typescript-eslint/no-explicit-any */

import { type ComputedRef, computed, toRaw } from 'vue'
import type { TreeInstance } from '@idux/components/tree'

import { type ComputedRef, type Ref, computed, toRaw } from 'vue'

import { type FormAccessor } from '@idux/cdk/forms'
import { type VKey, callEmit, convertArray } from '@idux/cdk/utils'

import { type MergedNode } from './useDataSource'
import { type TreeSelectNode, type TreeSelectProps } from '../types'

//import { generateOption } from '../utils/generateOption'

export interface SelectedStateContext {
selectedValue: ComputedRef<VKey[]>
selectedNodes: ComputedRef<MergedNode[]>
Expand All @@ -28,6 +28,7 @@ export interface SelectedStateContext {
export function useSelectedState(
props: TreeSelectProps,
accessor: FormAccessor,
treeRef: Ref<TreeInstance | undefined>,
mergedNodeMap: ComputedRef<Map<VKey, MergedNode>>,
): SelectedStateContext {
const selectedValue = computed(() => convertArray(accessor.value))
Expand All @@ -54,7 +55,7 @@ export function useSelectedState(
}

const handleRemove = (key: VKey) => {
setValue(selectedValue.value.filter(item => key !== item))
treeRef.value?._handleCheck(key)
}

const handleClear = (evt: MouseEvent) => {
Expand Down
10 changes: 5 additions & 5 deletions packages/components/tree/__tests__/tree.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,16 +193,16 @@ describe('Tree', () => {

const allNodes = wrapper.findAll('.ix-tree-node')

expect(allNodes[0].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[0].find('.ix-checkbox-checked').exists()).toBe(true)
expect(allNodes[1].find('.ix-checkbox-checked').exists()).toBe(true)
// 0-1 exclude disabled
expect(allNodes[2].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[2].find('.ix-checkbox-checked').exists()).toBe(true)
expect(allNodes[3].find('.ix-checkbox-checked').exists()).toBe(true)

// 0-0, unchecked
await allNodes[1].find('input').setValue(false)

expect(onUpdateCheckedKeys).toBeCalledWith(['0-2'])
expect(onUpdateCheckedKeys).toBeCalledWith(['0-1', '0-2'])

await wrapper.setProps({ checkedKeys: [] })

Expand Down Expand Up @@ -262,8 +262,8 @@ describe('Tree', () => {
await wrapper.setProps({ checkedKeys: [] })

expect(allNodes[0].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[0].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[0].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[1].find('.ix-checkbox-checked').exists()).toBe(false)
expect(allNodes[2].find('.ix-checkbox-checked').exists()).toBe(false)

//0, checked
await allNodes[0].find('input').setValue(true)
Expand Down
23 changes: 19 additions & 4 deletions packages/components/tree/src/Tree.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,21 +62,26 @@
const mergedShowLine = computed(() => props.showLine ?? config.showLine)
const mergedBlocked = computed(() => props.blocked ?? config.blocked)
const mergedCheckOnClick = computed(() => props.checkable && props.checkOnClick)
const { mergedNodes, mergedNodeMap } = useMergeNodes(props, mergedChildrenKey, mergedGetKey, mergedLabelKey)
const { mergedNodes, mergedNodeMap, parentKeyMap, depthMap, setLoadedNodes } = useMergeNodes(
props,
mergedChildrenKey,
mergedGetKey,
mergedLabelKey,
)
const { searchedKeys } = useSearchable(props, mergedNodeMap, mergedLabelKey)
const expandableContext = useExpandable(
props,
config,
mergedChildrenKey,
mergedGetKey,
mergedLabelKey,
mergedNodeMap,
searchedKeys,
setLoadedNodes,
)
const flattedNodes = useFlattedNodes(mergedNodes, expandableContext, props, searchedKeys)
const checkableContext = useCheckable(props, mergedNodeMap)
const checkableContext = useCheckable(props, mergedNodes, mergedNodeMap, parentKeyMap, depthMap)
const dragDropContext = useDragDrop(props, config, expandableContext)
const selectableContext = useSelectable(props, mergedNodeMap)
const { handleCheck } = checkableContext

provide(treeToken, {
props,
Expand Down Expand Up @@ -155,6 +160,15 @@
const _getFlattedNodes = () => {
return flattedNodes.value
}
const _handleCheck = (key: VKey) => {
const node = mergedNodeMap.value.get(key)

if (!node) {
return
}

handleCheck(node)
}

Check warning on line 171 in packages/components/tree/src/Tree.tsx

View check run for this annotation

Codecov / codecov/patch

packages/components/tree/src/Tree.tsx#L164-L171

Added lines #L164 - L171 were not covered by tests

expose({
focus,
Expand All @@ -166,6 +180,7 @@

// private
_getFlattedNodes,
_handleCheck,
})

const handleScrolledChange = (startIndex: number, endIndex: number, visibleNodes: MergedNode[]) => {
Expand Down
Loading