|
3 | 3 | // See the LICENSE file in the project root for more information. |
4 | 4 | // Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone |
5 | 5 |
|
| 6 | +using Microsoft.AspNetCore.Components.Web; |
| 7 | + |
6 | 8 | namespace UnitTest.Components; |
7 | 9 |
|
8 | 10 | public class TreeViewTest : BootstrapBlazorTestBase |
@@ -1221,6 +1223,158 @@ public async Task ShowToolbar_Ok() |
1221 | 1223 | Assert.Contains("test-toolbar-template", cut.Markup); |
1222 | 1224 | } |
1223 | 1225 |
|
| 1226 | + [Fact] |
| 1227 | + public async Task Draggable_Basic_MoveAsLastChild() |
| 1228 | + { |
| 1229 | + // Arrange |
| 1230 | + var items = new List<TreeFoo> |
| 1231 | + { |
| 1232 | + new() { Text = "Root", Id = "1" }, |
| 1233 | + new() { Text = "Child1", Id = "2", ParentId = "1" }, |
| 1234 | + new() { Text = "Child2", Id = "3", ParentId = "1" }, |
| 1235 | + new() { Text = "Root2", Id = "4" }, |
| 1236 | + new() { Text = "Child3", Id = "5", ParentId = "4" } |
| 1237 | + }; |
| 1238 | + var nodes = TreeFoo.CascadingTree(items); |
| 1239 | + nodes[0].IsExpand = true; |
| 1240 | + var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb => |
| 1241 | + { |
| 1242 | + pb.Add(a => a.Items, nodes); |
| 1243 | + pb.Add(a => a.ItemDraggable, true); |
| 1244 | + }); |
| 1245 | + |
| 1246 | + var rows = cut.FindComponents<TreeViewRow<TreeFoo>>(); |
| 1247 | + var dragSource = rows[1]; // Child1 |
| 1248 | + var dragTarget = rows[3]; // Root2 |
| 1249 | + |
| 1250 | + var dragSourceElement = dragSource.Find(".tree-node"); |
| 1251 | + var dragTargetDropZone = dragTarget.Find(".tree-drop-child-inside"); |
| 1252 | + // 1. 触发 dragstart |
| 1253 | + await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs()); |
| 1254 | + // 2. 触发 dragenter 到目标 drop zone |
| 1255 | + await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs()); |
| 1256 | + // 3. 触发 drop 到目标 drop zone |
| 1257 | + await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs()); |
| 1258 | + // 成功移动,原对象销毁,不触发dragend |
| 1259 | + |
| 1260 | + // Assert |
| 1261 | + Assert.Equal("Root2", nodes[1].Text); |
| 1262 | + Assert.Equal(2, nodes[1].Items.Count); |
| 1263 | + Assert.Equal("Child1", nodes[1].Items[1].Text); |
| 1264 | + Assert.Equal(nodes[1], nodes[1].Items[1].Parent); |
| 1265 | + } |
| 1266 | + |
| 1267 | + [Fact] |
| 1268 | + public async Task Draggable_Basic_MoveAsSiblingBelow() |
| 1269 | + { |
| 1270 | + // Arrange |
| 1271 | + var items = new List<TreeFoo> |
| 1272 | + { |
| 1273 | + new() { Text = "Root", Id = "1" }, |
| 1274 | + new() { Text = "Child1", Id = "2", ParentId = "1" }, |
| 1275 | + new() { Text = "Child2", Id = "3", ParentId = "1" } |
| 1276 | + }; |
| 1277 | + var nodes = TreeFoo.CascadingTree(items); |
| 1278 | + nodes[0].IsExpand = true; |
| 1279 | + var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb => |
| 1280 | + { |
| 1281 | + pb.Add(a => a.Items, nodes); |
| 1282 | + pb.Add(a => a.ItemDraggable, true); |
| 1283 | + }); |
| 1284 | + |
| 1285 | + var rows = cut.FindComponents<TreeViewRow<TreeFoo>>(); |
| 1286 | + var dragSource = rows[1]; // Child1 |
| 1287 | + var dragTarget = rows[2]; // Child2 |
| 1288 | + |
| 1289 | + // 获取可拖拽的 DOM 元素(DynamicElement) |
| 1290 | + var dragSourceElement = dragSource.Find(".tree-node"); |
| 1291 | + var dragTargetDropZone = dragTarget.Find(".tree-drop-child-below"); |
| 1292 | + // 1. 触发 dragstart |
| 1293 | + await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs()); |
| 1294 | + // 2. 触发 dragenter 到目标 drop zone |
| 1295 | + await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs()); |
| 1296 | + // 3. 触发 drop 到目标 drop zone |
| 1297 | + await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs()); |
| 1298 | + // 成功移动,原对象销毁,不触发dragend |
| 1299 | + |
| 1300 | + // Assert |
| 1301 | + var parent = nodes[0]; |
| 1302 | + Assert.Equal(2, parent.Items.Count); |
| 1303 | + Assert.Equal("Child2", parent.Items[0].Text); |
| 1304 | + Assert.Equal("Child1", parent.Items[1].Text); |
| 1305 | + } |
| 1306 | + |
| 1307 | + [Fact] |
| 1308 | + public async Task Draggable_OnDrop_Cancel() |
| 1309 | + { |
| 1310 | + // Arrange |
| 1311 | + var items = new List<TreeFoo> |
| 1312 | + { |
| 1313 | + new() { Text = "Root", Id = "1" }, |
| 1314 | + new() { Text = "Child1", Id = "2", ParentId = "1" }, |
| 1315 | + new() { Text = "Child2", Id = "3", ParentId = "1" } |
| 1316 | + }; |
| 1317 | + var nodes = TreeFoo.CascadingTree(items); |
| 1318 | + nodes[0].IsExpand = true; |
| 1319 | + var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb => |
| 1320 | + { |
| 1321 | + pb.Add(a => a.Items, nodes); |
| 1322 | + pb.Add(a => a.ItemDraggable, true); |
| 1323 | + pb.Add(a => a.OnDrop, args => Task.FromResult(false)); // 拒绝拖拽 |
| 1324 | + }); |
| 1325 | + |
| 1326 | + var rows = cut.FindComponents<TreeViewRow<TreeFoo>>(); |
| 1327 | + var dragSource = rows[1]; // Child1 |
| 1328 | + var dragTarget = rows[2]; // Child2 |
| 1329 | + |
| 1330 | + // 获取可拖拽的 DOM 元素(DynamicElement) |
| 1331 | + var dragSourceElement = dragSource.Find(".tree-node"); |
| 1332 | + var dragTargetDropZone = dragTarget.Find(".tree-drop-child-below"); |
| 1333 | + // 1. 触发 dragstart |
| 1334 | + await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs()); |
| 1335 | + // 2. 触发 dragenter 到目标 drop zone |
| 1336 | + await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs()); |
| 1337 | + // 3. 触发 drop 到目标 drop zone |
| 1338 | + await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs()); |
| 1339 | + // 4. 触发 dragend |
| 1340 | + await dragSourceElement.TriggerEventAsync("ondragend", new DragEventArgs()); |
| 1341 | + |
| 1342 | + // Assert: 顺序未变 |
| 1343 | + var parent = nodes[0]; |
| 1344 | + Assert.Equal("Child1", parent.Items[0].Text); |
| 1345 | + Assert.Equal("Child2", parent.Items[1].Text); |
| 1346 | + } |
| 1347 | + |
| 1348 | + [Fact] |
| 1349 | + public async Task Draggable_DragClassState() |
| 1350 | + { |
| 1351 | + // Arrange |
| 1352 | + var items = new List<TreeFoo> |
| 1353 | + { |
| 1354 | + new() { Text = "Root", Id = "1" } |
| 1355 | + }; |
| 1356 | + var nodes = TreeFoo.CascadingTree(items); |
| 1357 | + var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb => |
| 1358 | + { |
| 1359 | + pb.Add(a => a.Items, nodes); |
| 1360 | + pb.Add(a => a.ItemDraggable, true); |
| 1361 | + }); |
| 1362 | + |
| 1363 | + var row = cut.FindComponent<TreeViewRow<TreeFoo>>(); |
| 1364 | + var dragEvent = new DragEventArgs(); |
| 1365 | + |
| 1366 | + // 获取可拖拽的 DOM 元素 |
| 1367 | + var dragSourceElement = row.Find(".tree-node"); |
| 1368 | + |
| 1369 | + // 触发拖拽开始 |
| 1370 | + await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs()); |
| 1371 | + Assert.Contains("tree-drop-pass", row.Markup); |
| 1372 | + |
| 1373 | + // 触发拖拽结束 |
| 1374 | + await dragSourceElement.TriggerEventAsync("ondragend", new DragEventArgs()); |
| 1375 | + Assert.DoesNotContain("tree-drop-pass", row.Markup); |
| 1376 | + } |
| 1377 | + |
1224 | 1378 | class MockTree<TItem> : TreeView<TItem> where TItem : class |
1225 | 1379 | { |
1226 | 1380 | public bool TestComparerItem(TItem? a, TItem? b) => base.Equals(a, b); |
|
0 commit comments