@page "/students/event-ranking-edit/{StudentId:int}" @attribute [Authorize] @using Microsoft.EntityFrameworkCore @using BlazorSortableList @using WebApp.Models @using WebApp.Components.Shared.Components @inject AppDbContext Context @inject NavigationManager NavigationManager @inject ISnackbar Snackbar @inject ILogger Logger @if (_student == null) {

Loading...

} else { Save Rankings @* https://github.com/AlexNek/BlazorSortableList *@
Ranked Events
Drag events here in order of preference
@item.Name @AppIcons.EventAttributes(item) @AppIcons.EventEffort(item)
Available Events
Drag events to rank them
@item.Name @AppIcons.EventAttributes(item) @AppIcons.EventEffort(item)
} @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 = []; 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(); } 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(); Snackbar.Add($"Event rankings saved for {_student.Name}", Severity.Success); NavigationManager.NavigateTo("/students/event-ranking"); } catch (Exception e) { Snackbar.Add("Error saving rankings. Please try again.", Severity.Error); Logger.LogError(e, "Error saving event rankings for student {StudentId}", StudentId); } } }