diff --git a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj
index c3dfddbe13d..025876af372 100644
--- a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj
+++ b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj
@@ -58,7 +58,7 @@
-
+
@@ -75,7 +75,6 @@
-
diff --git a/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor b/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor
index 31b6de04c9e..4e5b9eeb9cc 100644
--- a/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor
+++ b/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor
@@ -48,7 +48,7 @@
Name="Group">
-
+
@foreach (var item in Items1)
{
@@ -58,7 +58,7 @@
-
+
@foreach (var item in Items2)
{
@@ -76,21 +76,21 @@
-
-
1
-
2
-
3
-
4
+
+ @foreach (var item in ItemsCloneLeft)
+ {
+
+ }
-
-
5
-
6
-
7
-
8
+
+ @foreach (var item in ItemsCloneRight)
+ {
+
+ }
@@ -230,3 +230,40 @@
+
+
+
+
+
+
+ @foreach (var item in AddItems1)
+ {
+
+ }
+
+
+
+
+
+
+ @foreach (var item in AddItems2)
+ {
+
+ }
+
+
+
+
+
+
+ @foreach (var item in AddItems3)
+ {
+
+ }
+
+
+
+
+
diff --git a/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor.cs
index 376a8c5902f..b3684580c10 100644
--- a/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor.cs
+++ b/src/BootstrapBlazor.Server/Components/Samples/SortableLists.razor.cs
@@ -17,9 +17,24 @@ public partial class SortableLists
[NotNull]
private List
? ItemsMultiDrags { get; set; }
+ [NotNull]
+ private List? ItemsCloneLeft { get; set; }
+
+ [NotNull]
+ private List? ItemsCloneRight { get; set; }
+
[NotNull]
private List? ItemsSwaps { get; set; }
+ [NotNull]
+ private List? AddItems1 { get; set; }
+
+ [NotNull]
+ private List? AddItems2 { get; set; }
+
+ [NotNull]
+ private List? AddItems3 { get; set; }
+
private readonly SortableOption _option1 = new()
{
RootSelector = ".sl-list"
@@ -89,6 +104,12 @@ public partial class SortableLists
Swap = true
};
+ private readonly SortableOption _optionAdd = new()
+ {
+ RootSelector = ".sl-list",
+ Group = "group-add"
+ };
+
///
/// OnInitialized
///
@@ -103,6 +124,11 @@ protected override void OnInitialized()
Items2 = Foo.GenerateFoo(FooLocalizer, 8).Skip(4).ToList();
ItemsMultiDrags = Foo.GenerateFoo(FooLocalizer, 8);
ItemsSwaps = Foo.GenerateFoo(FooLocalizer, 8);
+ ItemsCloneLeft = Foo.GenerateFoo(FooLocalizer, 4);
+ ItemsCloneRight = Foo.GenerateFoo(FooLocalizer, 8).Skip(4).ToList();
+ AddItems1 = Foo.GenerateFoo(FooLocalizer, 4);
+ AddItems2 = Foo.GenerateFoo(FooLocalizer, 8).Skip(4).ToList();
+ AddItems3 = Foo.GenerateFoo(FooLocalizer, 12).Skip(8).ToList();
}
private Task OnUpdate(SortableEvent @event)
@@ -112,7 +138,13 @@ private Task OnUpdate(SortableEvent @event)
var item = Items[oldIndex];
Items.RemoveAt(oldIndex);
Items.Insert(newIndex, item);
- StateHasChanged();
+ return Task.CompletedTask;
+ }
+
+ private Task OnAdd1(SortableEvent @event)
+ {
+ var item = Items2[@event.OldIndex];
+ Items1.Insert(@event.NewIndex, item);
return Task.CompletedTask;
}
@@ -123,40 +155,35 @@ private Task OnUpdate1(SortableEvent @event)
var item = Items1[oldIndex];
Items1.RemoveAt(oldIndex);
Items1.Insert(newIndex, item);
- StateHasChanged();
return Task.CompletedTask;
}
- private Task OnUpdate2(SortableEvent @event)
+ private Task OnRemove1(SortableEvent @event)
{
- var oldIndex = @event.OldIndex;
- var newIndex = @event.NewIndex;
- var item = Items2[oldIndex];
- Items2.RemoveAt(oldIndex);
- Items2.Insert(newIndex, item);
- StateHasChanged();
+ Items1.RemoveAt(@event.OldIndex);
return Task.CompletedTask;
}
- private Task OnRemove1(SortableEvent @event)
+ private Task OnAdd2(SortableEvent @event)
{
- var oldIndex = @event.OldIndex;
- var newIndex = @event.NewIndex;
- var item = Items1[oldIndex];
- Items1.RemoveAt(oldIndex);
- Items2.Insert(newIndex, item);
- StateHasChanged();
+ var item = Items1[@event.OldIndex];
+ Items2.Insert(@event.NewIndex, item);
return Task.CompletedTask;
}
- private Task OnRemove2(SortableEvent @event)
+ private Task OnUpdate2(SortableEvent @event)
{
var oldIndex = @event.OldIndex;
var newIndex = @event.NewIndex;
var item = Items2[oldIndex];
Items2.RemoveAt(oldIndex);
- Items1.Insert(newIndex, item);
- StateHasChanged();
+ Items2.Insert(newIndex, item);
+ return Task.CompletedTask;
+ }
+
+ private Task OnRemove2(SortableEvent @event)
+ {
+ Items2.RemoveAt(@event.OldIndex);
return Task.CompletedTask;
}
@@ -186,9 +213,85 @@ private Task OnUpdateSwap(SortableEvent @event)
{
var oldIndex = @event.OldIndex;
var newIndex = @event.NewIndex;
- var item = ItemsSwaps[oldIndex];
- ItemsSwaps.RemoveAt(oldIndex);
- ItemsSwaps.Insert(newIndex, item);
+ var item1 = Utility.Clone(ItemsSwaps[oldIndex]);
+ var item2 = Utility.Clone(ItemsSwaps[newIndex]);
+ ItemsSwaps[oldIndex] = item2;
+ ItemsSwaps[newIndex] = item1;
+ return Task.CompletedTask;
+ }
+
+ private Task OnAddItems1(SortableEvent @event)
+ {
+ var foo = @event.FromId == "sl02"
+ ? AddItems2[@event.OldIndex]
+ : AddItems3[@event.OldIndex];
+ AddItems1.Insert(@event.NewIndex, foo);
+ return Task.CompletedTask;
+ }
+
+ private Task OnUpdateItems1(SortableEvent @event)
+ {
+ var oldIndex = @event.OldIndex;
+ var newIndex = @event.NewIndex;
+ var item = AddItems1[oldIndex];
+ AddItems1.RemoveAt(oldIndex);
+ AddItems1.Insert(newIndex, item);
+ return Task.CompletedTask;
+ }
+
+ private Task OnRemoveItems1(SortableEvent @event)
+ {
+ AddItems1.RemoveAt(@event.OldIndex);
+ return Task.CompletedTask;
+ }
+
+ private Task OnAddItems2(SortableEvent @event)
+ {
+ var foo = @event.FromId == "sl01"
+ ? AddItems1[@event.OldIndex]
+ : AddItems3[@event.OldIndex];
+ AddItems2.Insert(@event.NewIndex, foo);
+ return Task.CompletedTask;
+ }
+
+ private Task OnUpdateItems2(SortableEvent @event)
+ {
+ var oldIndex = @event.OldIndex;
+ var newIndex = @event.NewIndex;
+ var item = AddItems2[oldIndex];
+ AddItems2.RemoveAt(oldIndex);
+ AddItems2.Insert(newIndex, item);
+ return Task.CompletedTask;
+ }
+
+ private Task OnRemoveItems2(SortableEvent @event)
+ {
+ AddItems2.RemoveAt(@event.OldIndex);
+ return Task.CompletedTask;
+ }
+
+ private Task OnAddItems3(SortableEvent @event)
+ {
+ var foo = @event.FromId == "sl01"
+ ? AddItems1[@event.OldIndex]
+ : AddItems2[@event.OldIndex];
+ AddItems3.Insert(@event.NewIndex, foo);
+ return Task.CompletedTask;
+ }
+
+ private Task OnUpdateItems3(SortableEvent @event)
+ {
+ var oldIndex = @event.OldIndex;
+ var newIndex = @event.NewIndex;
+ var item = AddItems3[oldIndex];
+ AddItems3.RemoveAt(oldIndex);
+ AddItems3.Insert(newIndex, item);
+ return Task.CompletedTask;
+ }
+
+ private Task OnRemoveItems3(SortableEvent @event)
+ {
+ AddItems3.RemoveAt(@event.OldIndex);
return Task.CompletedTask;
}
}
diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json
index 4c2669f6c80..0088af5d40c 100644
--- a/src/BootstrapBlazor.Server/Locales/en-US.json
+++ b/src/BootstrapBlazor.Server/Locales/en-US.json
@@ -6747,7 +6747,9 @@
"SortableListClassLi2": "The default style of drag element clones is sortable-ghost
and can be customized through GhostClass
",
"SortableListClassLi3": "Drag elements to swap items. Default style sortable-swap-highlight
can be customized by SwapClass
",
"SortableListSwapTitle": "Swap",
- "SortableListSwapIntro": "By setting the Swap
parameter of SortableListOption
, the drag item and the target item are swapped."
+ "SortableListSwapIntro": "By setting the Swap
parameter of SortableListOption
, the drag item and the target item are swapped.",
+ "SortableListOnAddTitle": "Multiple SortableList",
+ "SortableListOnAddIntro": "Get the SortableList
to which the dragged item belongs by setting the FromId
parameter of the SortableEvent
. In this example, the elements in the three areas can be dragged arbitrarily"
},
"BootstrapBlazor.Server.Components.Samples.WinBoxes": {
"WinBoxTitle": "WinBox",
diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json
index ba11813b0ca..9c7641d80bc 100644
--- a/src/BootstrapBlazor.Server/Locales/zh-CN.json
+++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json
@@ -6747,7 +6747,9 @@
"SortableListClassLi2": "拖动元素克隆项默认样式 sortable-ghost
可通过 GhostClass
自定义",
"SortableListClassLi3": "拖动元素交换想项默认样式 sortable-swap-highlight
可通过 SwapClass
自定义",
"SortableListSwapTitle": "交换",
- "SortableListSwapIntro": "通过设置 SortableListOption
参数 Swap
设置拖拽项与目标项目交换"
+ "SortableListSwapIntro": "通过设置 SortableListOption
参数 Swap
设置拖拽项与目标项目交换",
+ "SortableListOnAddTitle": "多区域拖动",
+ "SortableListOnAddIntro": "通过设置 SortableEvent
参数 FromId
获得拖动项所属 SortableList
。本示例中三个区域内元素可以任意拖动"
},
"BootstrapBlazor.Server.Components.Samples.WinBoxes": {
"WinBoxTitle": "WinBox 窗口组件",