Skip to content

Commit 2dc7c2a

Browse files
committed
simplifies invalidTargetIDs
1 parent d870daa commit 2dc7c2a

File tree

3 files changed

+12
-34
lines changed

3 files changed

+12
-34
lines changed

packages/ui/src/elements/TreeView/NestedSectionsTable/RowDropArea/index.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const THROTTLE_MS = 16
1313
type Placement = 'middle' | 'split'
1414

1515
export type RowDropAreaProps = {
16+
disabled?: boolean
1617
dropContextName: string
17-
invalidTargetIDs?: Set<number | string>
1818
isDragging?: boolean
1919
onHover?: (data: { placement: Placement; targetItem: any }) => void
2020
placement?: Placement
@@ -26,8 +26,8 @@ export type RowDropAreaProps = {
2626
}
2727

2828
export const RowDropArea = ({
29+
disabled = false,
2930
dropContextName,
30-
invalidTargetIDs,
3131
isDragging = false,
3232
onHover,
3333
placement = 'split',
@@ -51,20 +51,10 @@ export const RowDropArea = ({
5151

5252
const targetItem = targetItems[hoverIndex]
5353

54-
// Check if this target is invalid (trying to drop a parent into its own descendant)
55-
const isInvalidTarget = React.useMemo(() => {
56-
if (!invalidTargetIDs || !targetItem) {
57-
return false
58-
}
59-
// targetItem can be null (for root level drops) or have a rowID
60-
const targetID = targetItem?.rowID
61-
return targetID !== null && targetID !== undefined && invalidTargetIDs.has(targetID)
62-
}, [invalidTargetIDs, targetItem])
63-
6454
const { isOver, setNodeRef } = useDroppable({
6555
id,
6656
data: { type: dropContextName, targetItem },
67-
disabled: !isDragging || isInvalidTarget,
57+
disabled: disabled || !isDragging,
6858
})
6959

7060
React.useEffect(() => {
@@ -80,7 +70,7 @@ export const RowDropArea = ({
8070
`${baseClass}--on-${placement}`,
8171
isDragging && 'is-dragging',
8272
isOver && 'is-over',
83-
isInvalidTarget && `${baseClass}--invalid`,
73+
disabled && `${baseClass}--invalid`,
8474
]
8575
.filter(Boolean)
8676
.join(' ')}

packages/ui/src/elements/TreeView/NestedSectionsTable/index.tsx

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ interface NestedSectionsTableProps {
2727
dropContextName: string
2828
hoveredRowID?: null | number | string
2929
initialOffset?: number
30-
invalidTargetIDs?: Set<number | string>
3130
isDragging?: boolean
3231
loadingRowIDs?: Set<number | string>
3332
onDroppableHover: (params: {
@@ -60,8 +59,8 @@ interface DivTableSectionProps {
6059
firstCellRef?: React.RefObject<HTMLDivElement>
6160
firstCellWidth: number
6261
firstCellXOffset: number
62+
hasSelectedAncestor?: boolean
6363
hoveredRowID: null | number | string
64-
invalidTargetIDs?: Set<number | string>
6564
isDragging: boolean
6665
isLastRowOfRoot?: boolean
6766
level?: number
@@ -101,7 +100,6 @@ export const NestedSectionsTable: React.FC<NestedSectionsTableProps> = ({
101100
disabledRowIDs,
102101
dropContextName,
103102
hoveredRowID,
104-
invalidTargetIDs,
105103
isDragging = false,
106104
loadingRowIDs,
107105
onDroppableHover,
@@ -161,7 +159,6 @@ export const NestedSectionsTable: React.FC<NestedSectionsTableProps> = ({
161159
firstCellWidth={firstCellWidth}
162160
firstCellXOffset={firstCellXOffset}
163161
hoveredRowID={hoveredRowID}
164-
invalidTargetIDs={invalidTargetIDs}
165162
isDragging={isDragging}
166163
loadingRowIDs={loadingRowIDs}
167164
onDroppableHover={onDroppableHover}
@@ -188,8 +185,8 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
188185
firstCellRef,
189186
firstCellWidth,
190187
firstCellXOffset,
188+
hasSelectedAncestor = false,
191189
hoveredRowID,
192-
invalidTargetIDs,
193190
isDragging,
194191
isLastRowOfRoot = false,
195192
level = 0,
@@ -264,8 +261,8 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
264261
: firstCellWidth + segmentWidth * (hasNestedRows ? level + 1 : level) + 28
265262

266263
const isOdd = absoluteRowIndex % 2 === 1
267-
268-
const isInvalidTarget = invalidTargetIDs?.has(rowItem.rowID)
264+
const isRowSelected = selectedRowIDs.includes(rowItem.rowID)
265+
const isInvalidTarget = hasSelectedAncestor || isRowSelected
269266

270267
const renderResult = (
271268
<React.Fragment key={rowItem.rowID}>
@@ -276,7 +273,7 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
276273
isDragging && isInvalidTarget && `${baseClass}__section--invalid-target`,
277274
isOdd && `${baseClass}__section--odd`,
278275
targetParentID === rowItem.rowID && `${baseClass}__section--target`,
279-
selectedRowIDs.includes(rowItem.rowID) && `${baseClass}__section--selected`,
276+
isRowSelected && `${baseClass}__section--selected`,
280277
]
281278
.filter(Boolean)
282279
.join(' ')}
@@ -387,8 +384,8 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
387384
)}
388385
<div>
389386
<RowDropArea
387+
disabled={isInvalidTarget}
390388
dropContextName={dropContextName}
391-
invalidTargetIDs={invalidTargetIDs}
392389
isDragging={isDragging}
393390
onHover={(data) => {
394391
onDroppableHover({ ...data, hoveredRowID: rowItem.rowID })
@@ -400,8 +397,8 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
400397
/>
401398

402399
<RowDropArea
400+
disabled={isInvalidTarget}
403401
dropContextName={dropContextName}
404-
invalidTargetIDs={invalidTargetIDs}
405402
isDragging={isDragging}
406403
onHover={(data) => {
407404
onDroppableHover({ ...data, hoveredRowID: rowItem.rowID })
@@ -439,8 +436,8 @@ export const DivTableSection: React.FC<DivTableSectionProps> = ({
439436
dropContextName={dropContextName}
440437
firstCellWidth={firstCellWidth}
441438
firstCellXOffset={firstCellXOffset}
439+
hasSelectedAncestor={hasSelectedAncestor || isRowSelected}
442440
hoveredRowID={hoveredRowID}
443-
invalidTargetIDs={invalidTargetIDs}
444441
isDragging={isDragging}
445442
isLastRowOfRoot={isRowAtRootLevel}
446443
level={level + 1}

packages/ui/src/elements/TreeView/TreeViewTable/index.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -343,14 +343,6 @@ export function TreeViewTable() {
343343
})
344344
}, [selectedItemKeys, items])
345345

346-
// Compute invalid drop targets (dragged items + all their descendants)
347-
const invalidTargetIDs = React.useMemo(() => {
348-
if (!isDragging || selectedRowIDs.length === 0) {
349-
return undefined
350-
}
351-
return getAllDescendantIDs(selectedRowIDs, items)
352-
}, [isDragging, selectedRowIDs, items])
353-
354346
return (
355347
<>
356348
{/* TODO: remove this button */}
@@ -359,7 +351,6 @@ export function TreeViewTable() {
359351
className={baseClass}
360352
dropContextName={dropContextName}
361353
hoveredRowID={hoveredRowID}
362-
invalidTargetIDs={invalidTargetIDs}
363354
isDragging={isDragging}
364355
loadingRowIDs={loadingRowIDs}
365356
onDroppableHover={onDroppableHover}

0 commit comments

Comments
 (0)