@page "/students/event-ranking-edit/{StudentId:int}" @attribute [Authorize] @using Microsoft.EntityFrameworkCore @using BlazorSortableList @using WebApp.Models @inject AppDbContext Context @inject NavigationManager NavigationManager Student Event Ranks - TSA Chapter Organizer Student Event Ranks
@if (_student == null) {

Loading...

} else { @_student.Name Warning: drag and drop is currently a bit squirrely - double check! Back Save /* https://github.com/AlexNek/BlazorSortableList */ @item.Name @item.Name }
@code { private const string ListId1 = "SharedListId1"; private const string ListId2 = "SharedListId2"; private const string GroupId = "CommonGroup"; [Parameter] public int? StudentId { get; set; } private Student? _student; private List? _events; public List _rankedEvents = []; public List _availableEvents = []; SharedSortableListGroup _group; private void RankedEventsRemove((int oldIndex, int newIndex) indices) { // get the item at the old index in list 1 var item = _rankedEvents[indices.oldIndex]; // add it to the new index in list 2 _availableEvents.Insert(indices.newIndex, item); // remove the item from the old index in list 1 _rankedEvents.Remove(_rankedEvents[indices.oldIndex]); } private void AvailableEventsRemove((int oldIndex, int newIndex) indices) { // get the item at the old index in list 2 var item = _availableEvents[indices.oldIndex]; // add it to the new index in list 1 _rankedEvents.Insert(indices.newIndex, item); // remove the item from the old index in list 2 _availableEvents.Remove(_availableEvents[indices.oldIndex]); } protected override async Task OnInitializedAsync() { _student = await Context.Students .Include(e => e.EventRankings) .Where(e => e.Id == StudentId).FirstAsync(); _events = await Context.Events .OrderBy(e => e.Name) .ToListAsync(); _rankedEvents = _student.EventRankings.OrderBy(e => e.Rank).Select(e => e.EventDefinition).ToList(); _availableEvents = _events.Where(e => !_rankedEvents.Contains(e)).ToList(); _group = new SharedSortableListGroup(StateHasChanged); _group.AddModel(ListId1, new SortableListModel(_rankedEvents) { Group = GroupId }); _group.AddModel(ListId2, new SortableListModel(_availableEvents) { Group = GroupId }); } private void Update((int oldIndex, int newIndex) indices) { var (oldIndex, newIndex) = indices; var items = _rankedEvents; var itemToMove = items[oldIndex]; items.RemoveAt(oldIndex); if (newIndex < items.Count) { items.Insert(newIndex, itemToMove); } else { items.Add(itemToMove); } StateHasChanged(); } async Task Save() { if (_student == null) return; try { _student.EventRankings.Clear(); for (var index = 0; index < _rankedEvents.Count; index++) { var evt = _rankedEvents[index]; _student.EventRankings.Add(new StudentEventRanking { EventDefinition = evt, Student = _student, Rank = index + 1 }); } Context.Students.Update(_student); await Context.SaveChangesAsync(); NavigationManager.NavigateTo("/students/event-ranking"); } catch (Exception e) { Console.WriteLine(e); throw; } } }