Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
97e7ddd
Add SortableList
vnbaaij Jan 27, 2026
5c0106b
Store
vnbaaij Jan 27, 2026
ca77226
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortable-list
vnbaaij Feb 2, 2026
46112a9
- Update script (a11y)
vnbaaij Feb 2, 2026
f625c20
Initial work on making cross-list move work with keyboard
vnbaaij Feb 3, 2026
a765f7d
Add IMask library integration for TextInput component and update docu…
dvoituron Feb 3, 2026
681148f
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortable-list
vnbaaij Feb 3, 2026
9e6b7c6
Merge branch 'dev-v5' into users/dvoituron/dev-v5/external-js-lib
vnbaaij Feb 3, 2026
0541827
Merge
vnbaaij Feb 3, 2026
d431123
Make it work with external lib work
vnbaaij Feb 4, 2026
9235abd
Merge final external work
vnbaaij Feb 4, 2026
cd8c85a
- Update examples
vnbaaij Feb 5, 2026
7a01caf
- Use Debug/Release setting when building script project
vnbaaij Feb 5, 2026
5727e53
Process review comments
vnbaaij Feb 5, 2026
c584334
Use the refined loading process
vnbaaij Feb 5, 2026
c461b9b
Merge
vnbaaij Feb 5, 2026
ec349c9
Update verified files and remove old BuildConstants file
vnbaaij Feb 5, 2026
6d16d16
- Add comment to generated file
vnbaaij Feb 5, 2026
1d18bac
Final touches
vnbaaij Feb 5, 2026
d583608
Process review commetns
vnbaaij Feb 5, 2026
78f8647
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortable-list
vnbaaij Feb 5, 2026
bb7ba86
Update examples/Demo/FluentUI.Demo.Client/Documentation/Components/So…
vnbaaij Feb 5, 2026
04fb7c1
Update src/Core/Components/SortableList/FluentSortableList.razor.cs
vnbaaij Feb 5, 2026
3b2107a
Update tests/Core/Components/SortableList/FluentSortableListTests.razor
vnbaaij Feb 5, 2026
892238d
Update src/Core.Scripts/src/Components/SortableList/FluentSortableLis…
vnbaaij Feb 5, 2026
b0a1bcc
Update src/Core/Components/SortableList/FluentSortableList.razor.css
vnbaaij Feb 5, 2026
32de924
Update examples/Demo/FluentUI.Demo.Client/Documentation/Components/So…
vnbaaij Feb 5, 2026
90c5ce7
Update src/Core/Components/SortableList/FluentSortableList.razor.cs
vnbaaij Feb 5, 2026
3503247
Update src/Core.Scripts/src/Components/SortableList/FluentSortableLis…
vnbaaij Feb 5, 2026
5eb2a13
Update examples/Demo/FluentUI.Demo.Client/Documentation/Components/So…
vnbaaij Feb 5, 2026
b434a67
Update examples/Demo/FluentUI.Demo.Client/Documentation/Components/So…
vnbaaij Feb 5, 2026
3c9b935
Update src/Core/Components/SortableList/FluentSortableList.razor.cs
vnbaaij Feb 5, 2026
6995462
Update src/Core/Components/SortableList/FluentSortableList.razor.css
vnbaaij Feb 5, 2026
9b7c15c
Update src/Core/Components/SortableList/FluentSortableList.razor
vnbaaij Feb 5, 2026
5707cd2
Update src/Core/Components/SortableList/FluentSortableList.razor.cs
vnbaaij Feb 5, 2026
0a7f463
Update src/Core.Scripts/src/Components/SortableList/FluentSortableLis…
vnbaaij Feb 5, 2026
6cc1b19
Update src/Core.Scripts/src/Components/SortableList/FluentSortableLis…
vnbaaij Feb 5, 2026
48f042f
- Remove styling parameters
vnbaaij Feb 6, 2026
4fd03fd
Merge branch 'users/vnbaaij/dev-v5/sortable-list' of https://github.c…
vnbaaij Feb 6, 2026
65f1033
- Add example with more than 2 lists
vnbaaij Feb 6, 2026
90cbeb0
Process more review comments
vnbaaij Feb 6, 2026
16e4e13
First step in making the component bindable
vnbaaij Feb 6, 2026
155a53b
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortablelist-part2
vnbaaij Feb 6, 2026
4634b76
Update docs, examples and script
vnbaaij Feb 11, 2026
fcaa7af
Update tests
vnbaaij Feb 11, 2026
a14dd20
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortablelist-part2
vnbaaij Feb 11, 2026
97e1d81
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortablelist-part2
vnbaaij Feb 12, 2026
9dd6940
Process reviwe comments
vnbaaij Feb 12, 2026
b6bd06e
Remove redundant using
vnbaaij Feb 12, 2026
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
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<h5>List 1</h5>
<FluentSortableList Id="clone1" Group="cloning" Clone="true" OnUpdate="@SortListOne" OnRemove="@ListOneRemove" Items="@items1" Context="item">
<ItemTemplate>@item.Name</ItemTemplate>
<FluentSortableList Id="clone1" Group="cloning" Clone="true" @bind-Items="@items1" OnUpdate="@HandleOnUpdate" OnAdd="@HandleOnAdd" OnRemove="@HandleOnRemove">
<ItemTemplate>@context.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
<FluentGridItem xs="12" sm="6">
<h5>List 2</h5>
<FluentSortableList Id="clone2" Group="cloning" Clone="true" OnUpdate="@SortListTwo" OnRemove="@ListTwoRemove" Items="@items2" Context="item">
<ItemTemplate>@item.Name</ItemTemplate>
<FluentSortableList Id="clone2" Group="cloning" Clone="true" @bind-Items="@items2" OnUpdate="@HandleOnUpdate" OnAdd="@HandleOnAdd" OnRemove="@HandleOnRemove">
<ItemTemplate>@context.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
</FluentGrid>

<p>List 1: @string.Join(", ", items1.Select(i => i.Name))</p>
<p>List 2: @string.Join(", ", items2.Select(i => i.Name))</p>

@code {
class Item
{
Expand All @@ -22,88 +25,22 @@
public bool Disabled { get; set; } = false;
}

List<Item> items1 = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();

List<Item> items2 = Enumerable.Range(11, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();

void ListOneRemove(FluentSortableListEventArgs args)
{
if (args is null)
{
return;
}

// get the item at the old index in list 1
var item = items1[args.OldIndex];

var clone = item;
IEnumerable<Item> items1 = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

// add it to the new index in list 2
items2.Insert(args.NewIndex, clone);
}
IEnumerable<Item> items2 = Enumerable.Range(11, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

void ListTwoRemove(FluentSortableListEventArgs args)
void HandleOnUpdate(FluentSortableListEventArgs args)
{
if (args is null)
{
return;
}

// get the item at the old index in list 2
var item = items2[args.OldIndex];

// make a copy
var clone = item;

// add it to the new index in list 1
items1.Insert(args.NewIndex, clone);
Console.WriteLine($"Item moved in list '{args.FromListId}' from index {args.OldIndex} to index {args.NewIndex}");
}

void SortListOne(FluentSortableListEventArgs args)
void HandleOnAdd(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;

var items = this.items1;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);

if (newIndex < items.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}
Console.WriteLine($"Item added to list '{args.ToListId}' from list '{args.FromListId}' at index {args.NewIndex}");
}

void SortListTwo(FluentSortableListEventArgs args)
void HandleOnRemove(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;

var items = this.items2;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);

if (newIndex < items.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}
Console.WriteLine($"Item removed from list '{args.FromListId}' to list '{args.ToListId}' at index {args.OldIndex}");
}
}
Original file line number Diff line number Diff line change
@@ -1,45 +1,26 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
@using FluentUI.Demo.SampleData
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Items="items" OnUpdate="@SortList">
<ItemTemplate>@context.Name</ItemTemplate>
<FluentSortableList @bind-Items="items" OnUpdate="@HandleOnUpdate">
<ItemTemplate>@context.FirstName @context.LastName</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
<FluentGridItem xs="12" sm="6">
<p>Bound List:</p>
@foreach (var item in items)
{
<div>@item</div>
}
</FluentGridItem>
</FluentGrid>

@code {

class Item
{
public int Id { get; set; }
public string Name { get; set; } = "";

public bool Disabled { get; set; } = false;
}

List<Item> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();
@code {

IEnumerable<People.Person> items = People.GeneratePersons(10);

void SortList(FluentSortableListEventArgs args)
void HandleOnUpdate(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;

var items = this.items;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);

if (newIndex < items.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}
Console.WriteLine($"Item moved in list '{args.FromListId}' from index {args.OldIndex} to index {args.NewIndex}");
}
}
Original file line number Diff line number Diff line change
@@ -1,74 +1,46 @@
@page "/sortablelist-disabled-sorting/debug"
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<h5>List 1</h5>
<FluentSortableList Id="disabledOne" Group="disabledSorting" Drop="false" Sort="false" Items="items1" Context="item" OnRemove="ListOneRemove">
<ItemTemplate>@item.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
<FluentGridItem xs="12" sm="6">
<h5>List 2</h5>
<FluentSortableList Id="disabledTwo" Group="disabledSorting" Items="items2" Context="item" OnUpdate="SortList">
<ItemTemplate>@item.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<h5>List 1</h5>
<FluentSortableList Id="disabledOne" Group="disabledSorting" Drop="false" Sort="false" @bind-Items="items1" OnUpdate="@HandleOnUpdate" OnAdd="@HandleOnAdd" OnRemove="@HandleOnRemove">
<ItemTemplate>@context.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
<FluentGridItem xs="12" sm="6">
<h5>List 2</h5>
<FluentSortableList Id="disabledTwo" Group="disabledSorting" @bind-Items="items2" OnUpdate="@HandleOnUpdate" OnAdd="@HandleOnAdd" OnRemove="@HandleOnRemove">
<ItemTemplate>@context.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
</FluentGrid>

@code {
class Item
{
public int Id { get; set; }
public string Name { get; set; } = "";

public bool Disabled { get; set; } = false;
}

List<Item> items1 = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();

List<Item> items2 = Enumerable.Range(11, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();
<p>List 1: @string.Join(", ", items1.Select(i => i.Name))</p>
<p>List 2: @string.Join(", ", items2.Select(i => i.Name))</p>

void ListOneRemove(FluentSortableListEventArgs args)
{
if (args is null)
{
return;
}

// get the item at the old index in list 1
var item = items1[args.OldIndex];

// add it to the new index in list 2
items2.Insert(args.NewIndex, item);

// remove the item from the old index in list 1
items1.Remove(items1[args.OldIndex]);
@code {
class Item
{
public int Id { get; set; }
public string Name { get; set; } = "";

Console.WriteLine($"Moved item '{item.Name}' from list '{args.FromListId}' to list '{args.ToListId}'");
}
public bool Disabled { get; set; } = false;
}

void SortList(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}
IEnumerable<Item> items1 = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;
IEnumerable<Item> items2 = Enumerable.Range(11, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

var items = this.items2;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);
void HandleOnUpdate(FluentSortableListEventArgs args)
{
Console.WriteLine($"Item moved in list '{args.FromListId}' from index {args.OldIndex} to index {args.NewIndex}");
}

if (newIndex < items2.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}
void HandleOnAdd(FluentSortableListEventArgs args)
{
Console.WriteLine($"Item added to list '{args.ToListId}' from list '{args.FromListId}' at index {args.NewIndex}");
}

StateHasChanged();
}
void HandleOnRemove(FluentSortableListEventArgs args)
{
Console.WriteLine($"Item removed from list '{args.FromListId}' to list '{args.ToListId}' at index {args.OldIndex}");
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Id="dragHandles" Handle="true" Items="items" OnUpdate="@SortList" Context="item">
<FluentSortableList Id="dragHandles" Handle="true" @bind-Items="items" OnUpdate="@HandleOnUpdate">
<ItemTemplate>
<div class="sortable-grab">
<FluentIcon Value="@(new Icons.Regular.Size20.ArrowSort())" />
</div>
<div class="sortable-item-content" style="flex-grow: 1;">@item.Name</div>
<div class="sortable-item-content" style="flex-grow: 1;">@context.Name</div>
</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
</FluentGrid>

<p>Items: @string.Join(", ", items.Select(i => i.Name))</p>

@code {
class Item
{
Expand All @@ -19,29 +21,10 @@

public bool Disabled { get; set; } = false;
}
List<Item> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();
IEnumerable<Item> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

void SortList(FluentSortableListEventArgs args)
void HandleOnUpdate(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;

var items = this.items;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);

if (newIndex < items.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}
Console.WriteLine($"Item moved in list '{args.FromListId}' from index {args.OldIndex} to index {args.NewIndex}");
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Fallback="true" Items="items" OnUpdate="@SortList">
<FluentSortableList Fallback="true" @bind-Items="items" OnUpdate="@HandleOnUpdate">
<ItemTemplate>@context.Name</ItemTemplate>
</FluentSortableList>
</FluentGridItem>
</FluentGrid>

<p>Items: @string.Join(", ", items.Select(i => i.Name))</p>

@code {

class Item
Expand All @@ -16,32 +18,10 @@
public bool Disabled { get; set; } = false;
}

List<Item> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();

IEnumerable<Item> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" });

void SortList(FluentSortableListEventArgs args)
void HandleOnUpdate(FluentSortableListEventArgs args)
{
if (args is null || args.OldIndex == args.NewIndex)
{
return;
}

var oldIndex = args.OldIndex;
var newIndex = args.NewIndex;

var items = this.items;
var itemToMove = items[oldIndex];
items.RemoveAt(oldIndex);

if (newIndex < items.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}

StateHasChanged();
Console.WriteLine($"Item moved in list '{args.FromListId}' from index {args.OldIndex} to index {args.NewIndex}");
}
}
Loading
Loading