Skip to content
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
42 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
c6157e7
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/sortable-list
vnbaaij Feb 6, 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
@@ -0,0 +1,109 @@
<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>
</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>
</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();

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;

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

void ListTwoRemove(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);
}

void SortListOne(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);
}
}

void SortListTwo(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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Items="items" OnUpdate="@SortList">
<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> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();


void SortList(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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
@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>

@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();

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]);

Console.WriteLine($"Moved item '{item.Name}' from list '{args.FromListId}' to list '{args.ToListId}'");
}

void SortList(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 < items2.Count)
{
items.Insert(newIndex, itemToMove);
}
else
{
items.Add(itemToMove);
}

StateHasChanged();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Id="dragHandles" Handle="true" Items="items" OnUpdate="@SortList" Context="item">
<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>
</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> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();

void SortList(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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<FluentGrid Justify="JustifyContent.FlexStart" Spacing="3">
<FluentGridItem xs="12" sm="6">
<FluentSortableList Fallback="true" Items="items" OnUpdate="@SortList">
<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> items = Enumerable.Range(1, 10).Select(i => new Item { Id = i, Name = $"Item {i}" }).ToList();


void SortList(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();
}
}
Loading
Loading