Skip to content

Commit 81235e9

Browse files
committed
Refactor TreeView drag-and-drop and improve tests
Refactored TreeView and TreeViewRow to require OnItemDrop and remove null checks, simplifying drag-and-drop logic. Updated tests to cover cases where OnItemDrop is not set and to verify drag-and-drop visual feedback.
1 parent 906f2aa commit 81235e9

File tree

3 files changed

+40
-18
lines changed

3 files changed

+40
-18
lines changed

src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
380380
/// <inheritdoc/>
381381
/// </summary>
382382
/// <returns></returns>
383-
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, new { Invoke = Interop, Method = nameof(TriggerKeyDown) });
383+
protected override Task InvokeInitAsync() =>
384+
InvokeVoidAsync("init", Id, new { Invoke = Interop, Method = nameof(TriggerKeyDown) });
384385

385386
private bool _keyboardArrowUpDownTrigger;
386387

@@ -730,7 +731,6 @@ public void ClearCheckedItems()
730731

731732
#region Draggable
732733

733-
734734
/// <summary>
735735
/// Gets or sets whether to enable item dragging. Default is false.
736736
/// </summary>
@@ -831,11 +831,8 @@ private async Task OnItemDrop(TreeDropEventArgs<TItem> e)
831831
}
832832

833833
break;
834-
default:
835-
throw new ArgumentOutOfRangeException();
836834
}
837835

838-
839836
_draggingItem = null;
840837
_previewDrop = false;
841838
_rows = GetTreeItems().ToFlat();
@@ -911,5 +908,4 @@ public class TreeDropEventArgs<TItem>
911908
/// Gets or sets whether to expand the source item's children when dropping.
912909
/// </summary>
913910
public bool ExpandAfterDrop { get; set; }
914-
915911
}

src/BootstrapBlazor/Components/TreeView/TreeViewRow.razor.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,8 @@ private async Task ClickRow()
326326
/// <summary>
327327
/// Triggered when an item is dropped
328328
/// </summary>
329-
[Parameter]
330-
public Func<TreeDropEventArgs<TItem>, Task>? OnItemDrop { get; set; }
329+
[Parameter][Required]
330+
public Func<TreeDropEventArgs<TItem>, Task> OnItemDrop { get; set; } = null!;
331331

332332
private async Task DragStart(DragEventArgs e)
333333
{
@@ -336,7 +336,6 @@ private async Task DragStart(DragEventArgs e)
336336
{
337337
_expandAfterDrop = true;
338338
await ToggleNodeAsync();
339-
StateHasChanged();
340339
}else
341340
{
342341
_expandAfterDrop = false;
@@ -389,10 +388,6 @@ private void DragLeaveChildBelow(DragEventArgs e)
389388

390389
private async Task DropChildInside(DragEventArgs e)
391390
{
392-
if (OnItemDrop is null)
393-
{
394-
return;
395-
}
396391
_previewChildFirst = false;
397392
_previewChildLast = false;
398393
_previewBelow = false;
@@ -409,10 +404,6 @@ private async Task DropChildInside(DragEventArgs e)
409404

410405
private async Task DropChildBelow(DragEventArgs e)
411406
{
412-
if (OnItemDrop is null)
413-
{
414-
return;
415-
}
416407
_previewChildFirst = false;
417408
_previewChildLast = false;
418409
_previewBelow = false;

test/UnitTest/Components/TreeViewTest.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,30 @@ public async Task Draggable_Basic_MoveAsSiblingBelow()
13901390
Assert.Equal("Root1", nodes[2].Text); // Root1 成为最后一个根节点
13911391
}
13921392

1393+
[Fact]
1394+
public async Task Draggable_NothingDrop()
1395+
{
1396+
var items = new List<TreeFoo>
1397+
{
1398+
new() { Text = "Root1", Id = "1" },
1399+
new() { Text = "Child1", Id = "2", ParentId = "1" }
1400+
};
1401+
1402+
var nodes = TreeFoo.CascadingTree(items);
1403+
nodes[0].IsExpand = true;
1404+
var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb =>
1405+
{
1406+
pb.Add(a => a.Items, nodes);
1407+
pb.Add(a => a.ItemDraggable, true);
1408+
});
1409+
1410+
var rows = cut.FindComponents<TreeViewRow<TreeFoo>>();
1411+
var dropTarget = rows[1]; // Child1
1412+
var targetDropZone = dropTarget.Find(".tree-drop-child-below");
1413+
1414+
await Assert.ThrowsAsync<InvalidOperationException>(() => targetDropZone.TriggerEventAsync("ondrop", new DragEventArgs()));
1415+
}
1416+
13931417
[Fact]
13941418
public async Task Draggable_OnDrop_Cancel()
13951419
{
@@ -1447,7 +1471,6 @@ public async Task Draggable_DragClassState()
14471471
});
14481472

14491473
var row = cut.FindComponent<TreeViewRow<TreeFoo>>();
1450-
var dragEvent = new DragEventArgs();
14511474

14521475
// 获取可拖拽的 DOM 元素
14531476
var dragSourceElement = row.Find(".tree-node");
@@ -1459,6 +1482,18 @@ public async Task Draggable_DragClassState()
14591482
// 触发拖拽结束
14601483
await dragSourceElement.TriggerEventAsync("ondragend", new DragEventArgs());
14611484
Assert.DoesNotContain("tree-drop-pass", row.Markup);
1485+
1486+
var dropBelow = cut.Find(".tree-drop-child-below");
1487+
await dropBelow.TriggerEventAsync("ondragenter", new DragEventArgs());
1488+
Assert.Contains("tree-preview-below", cut.Markup); // 检查是否有拖拽进入的样式
1489+
await dropBelow.TriggerEventAsync("ondragleave", new DragEventArgs());
1490+
Assert.DoesNotContain("tree-preview-below", cut.Markup); // 检查是否移除拖拽进入的样式
1491+
1492+
var dropInside = cut.Find(".tree-drop-child-inside");
1493+
await dropInside.TriggerEventAsync("ondragenter", new DragEventArgs());
1494+
Assert.Contains("tree-preview-child-last", cut.Markup); // 检查是否有拖拽进入的样式
1495+
await dropInside.TriggerEventAsync("ondragleave", new DragEventArgs());
1496+
Assert.DoesNotContain("tree-preview-child-last", cut.Markup); // 检查是否移除拖拽进入的样式
14621497
}
14631498

14641499
#endregion

0 commit comments

Comments
 (0)