This commit modifies the edit links in the Events and Teams components to append a return URL parameter. This change allows users to be redirected back to the appropriate page after editing an event or team, enhancing the user experience and navigation flow. The affected files include Details.razor, Index.razor, and Registration.razor.
190 lines
6.8 KiB
Plaintext
190 lines
6.8 KiB
Plaintext
@page "/events"
|
|
@attribute [Authorize]
|
|
@implements IAsyncDisposable
|
|
@using Microsoft.EntityFrameworkCore
|
|
@using WebApp.Models
|
|
@using WebApp.Components.Shared.Components
|
|
@inject AppDbContext Context
|
|
@inject IDialogService DialogService
|
|
@inject ISnackbar Snackbar
|
|
|
|
<PageHeader Title="Events">
|
|
<ActionButtons>
|
|
<MudButton StartIcon="@Icons.Material.Filled.Create" Href="events/create" Variant="Variant.Filled" Color="Color.Primary">Create New</MudButton>
|
|
<MudButton StartIcon="@Icons.Material.Filled.Print" Href="events/printout" Variant="Variant.Outlined">Printable Descriptions</MudButton>
|
|
<MudButton StartIcon="@Icons.Material.Filled.AccountTree" Href="events/career-mapping" Variant="Variant.Outlined">Career Mapping</MudButton>
|
|
</ActionButtons>
|
|
</PageHeader>
|
|
|
|
<MudPaper Elevation="2" Class="pa-3 pa-md-6">
|
|
<MudDataGrid T="EventDefinition"
|
|
ServerData="ServerReload"
|
|
@ref="_dataGrid"
|
|
Filterable="true"
|
|
RowsPerPage="50"
|
|
Dense="true"
|
|
Striped="true"
|
|
Hover="true"
|
|
Loading="@_isLoading"
|
|
LoadingProgressColor="Color.Primary">
|
|
<Columns>
|
|
<PropertyColumn Property="@(e => e.Name)" Title="Event Name" Sortable="true">
|
|
<CellTemplate>
|
|
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween" Spacing="1">
|
|
<MudLink Href="@($"/events/details?id={context.Item.Id}&returnUrl=/events")"
|
|
Underline="Underline.Hover"
|
|
Color="Color.Primary">
|
|
@context.Item.Name
|
|
</MudLink>
|
|
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="1">
|
|
<IconButtonWithTooltip Icon="@Icons.Material.Filled.Edit"
|
|
TooltipText="Edit"
|
|
Href="@($"/events/edit?id={context.Item.Id}&returnUrl=/events")" />
|
|
<IconButtonWithTooltip Icon="@Icons.Material.Outlined.Delete"
|
|
TooltipText="Delete"
|
|
HoverColor="Color.Error"
|
|
OnClick="() => DeleteEventDefinition(context.Item!)" />
|
|
</MudStack>
|
|
</MudStack>
|
|
</CellTemplate>
|
|
</PropertyColumn>
|
|
<TemplateColumn Title="Attributes" Sortable="false">
|
|
<CellTemplate>
|
|
<EventAttributes EventDefinition="context.Item"></EventAttributes>
|
|
</CellTemplate>
|
|
</TemplateColumn>
|
|
|
|
<TemplateColumn Title="Team Size" CellStyle="white-space:nowrap">
|
|
<CellTemplate>
|
|
<MudTooltip Text="@context.Item.Eligibility">
|
|
[@context.Item.MinTeamSize - @context.Item.MaxTeamSize]
|
|
</MudTooltip>
|
|
</CellTemplate>
|
|
</TemplateColumn>
|
|
|
|
<PropertyColumn Property="@(e => e.LevelOfEffort)" Title="Level of Effort" />
|
|
<PropertyColumn Property="@(e => e.EventFormat)" Title="Event Format" />
|
|
|
|
</Columns>
|
|
<PagerContent>
|
|
<MudDataGridPager T="EventDefinition"></MudDataGridPager>
|
|
</PagerContent>
|
|
</MudDataGrid>
|
|
</MudPaper>
|
|
|
|
@code {
|
|
MudDataGrid<EventDefinition> _dataGrid = null!;
|
|
private bool _isLoading = true;
|
|
private CancellationTokenSource? _cancellationTokenSource;
|
|
private bool _isDisposed = false;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
_cancellationTokenSource = new CancellationTokenSource();
|
|
}
|
|
|
|
private async Task<GridData<EventDefinition>> ServerReload(GridState<EventDefinition> state)
|
|
{
|
|
if (_isDisposed)
|
|
{
|
|
return new GridData<EventDefinition> { TotalItems = 0, Items = [] };
|
|
}
|
|
|
|
_isLoading = true;
|
|
try
|
|
{
|
|
var cancellationToken = _cancellationTokenSource?.Token ?? CancellationToken.None;
|
|
|
|
var query = Context.Events
|
|
.AsNoTracking()
|
|
.OrderBy(e => e.Name).Where(state.FilterDefinitions).OrderBy(state.SortDefinitions);
|
|
|
|
var totalItems = await query.CountAsync(cancellationToken);
|
|
var pagedData = await query.Skip(state.Page * state.PageSize).Take(state.PageSize).ToArrayAsync(cancellationToken);
|
|
|
|
return new GridData<EventDefinition>
|
|
{
|
|
TotalItems = totalItems,
|
|
Items = pagedData
|
|
};
|
|
}
|
|
catch (TaskCanceledException)
|
|
{
|
|
return new GridData<EventDefinition> { TotalItems = 0, Items = [] };
|
|
}
|
|
catch (JSDisconnectedException)
|
|
{
|
|
return new GridData<EventDefinition> { TotalItems = 0, Items = [] };
|
|
}
|
|
finally
|
|
{
|
|
if (!_isDisposed)
|
|
{
|
|
_isLoading = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task DeleteEventDefinition(EventDefinition evt)
|
|
{
|
|
if (_isDisposed) return;
|
|
|
|
try
|
|
{
|
|
var cancellationToken = _cancellationTokenSource?.Token ?? CancellationToken.None;
|
|
|
|
var result = await DialogService
|
|
.ShowMessageBox("Delete Event",
|
|
(MarkupString)$"Are you sure want to delete <b>{evt.Name}</b>? This cannot be undone.",
|
|
yesText:"Yes",
|
|
noText:"Cancel");
|
|
|
|
if (_isDisposed) return;
|
|
|
|
if (result == true)
|
|
{
|
|
Context.Events.Remove(evt!);
|
|
await Context.SaveChangesAsync(cancellationToken);
|
|
|
|
if (!_isDisposed)
|
|
{
|
|
Snackbar.Add($"Event {evt.Name} deleted", Severity.Info);
|
|
}
|
|
}
|
|
|
|
if (!_isDisposed)
|
|
{
|
|
StateHasChanged();
|
|
await _dataGrid.ReloadServerData();
|
|
}
|
|
}
|
|
catch (TaskCanceledException)
|
|
{
|
|
// Component was disposed, ignore
|
|
}
|
|
catch (JSDisconnectedException)
|
|
{
|
|
// JS connection lost, ignore
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (!_isDisposed)
|
|
{
|
|
Snackbar.Add($"Error deleting event: {ex.Message}", Severity.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
public async ValueTask DisposeAsync()
|
|
{
|
|
if (!_isDisposed)
|
|
{
|
|
_isDisposed = true;
|
|
_cancellationTokenSource?.Cancel();
|
|
_cancellationTokenSource?.Dispose();
|
|
_cancellationTokenSource = null;
|
|
}
|
|
await ValueTask.CompletedTask;
|
|
}
|
|
}
|