LANCommander/LANCommander.Server/UI/Pages/Metadata/Engines/Index.razor
2024-08-04 18:44:33 -05:00

166 lines
5.4 KiB
Text

@page "/Metadata/Engines"
@using Microsoft.EntityFrameworkCore;
@attribute [Authorize(Roles = "Administrator")]
@inject EngineService EngineService
@inject NavigationManager NavigationManager
@inject IMessageService MessageService
@inject ILogger<Index> Logger
<PageHeader Title="Engines">
<PageHeaderExtra>
<Space Direction="DirectionVHType.Horizontal">
<SpaceItem>
<Search Placeholder="Search" @bind-Value="Search" BindOnInput DebounceMilliseconds="150" OnChange="() => LoadData()" />
</SpaceItem>
<SpaceItem>
<Button OnClick="() => OpenEdit(null)" Type="@ButtonType.Primary">Add Engine</Button>
</SpaceItem>
</Space>
</PageHeaderExtra>
</PageHeader>
<TableColumnPicker @ref="Picker" Key="Engines" @bind-Visible="ColumnPickerVisible" />
<Table TItem="Engine" DataSource="@Engines" Loading="@Loading" PageSize="25" Responsive>
<PropertyColumn Property="c => c.Name" Sortable Hidden="@(Picker.IsColumnHidden("Name"))" />
<PropertyColumn Property="c => c.CreatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable Hidden="@(Picker.IsColumnHidden("Created On"))" />
<PropertyColumn Property="c => c.CreatedBy != null ? c.CreatedBy.UserName : String.Empty" Title="Created By" Sortable Hidden="@(Picker.IsColumnHidden("Created By"))" />
<PropertyColumn Property="c => c.UpdatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable Hidden="@(Picker.IsColumnHidden("Updated On", false))" />
<PropertyColumn Property="c => c.UpdatedBy != null ? c.UpdatedBy.UserName : String.Empty" Title="Updated By" Sortable Hidden="@(Picker.IsColumnHidden("Updated By"))" />
<PropertyColumn Property="c => c.Games != null ? c.Games.Count : 0" Title="Games" Sortable Hidden="@(Picker.IsColumnHidden("Games"))" />
<ActionColumn Title="" Style="text-align: right; white-space: nowrap">
<TitleTemplate>
<div style="text-align: right">
<Button Icon="@IconType.Outline.Edit" Type="@ButtonType.Text" OnClick="() => OpenColumnPicker()" />
</div>
</TitleTemplate>
<ChildContent>
<Space Direction="DirectionVHType.Horizontal">
<SpaceItem>
<Button Icon="@IconType.Outline.Edit" Type="@ButtonType.Text" OnClick="() => OpenEdit(context)" />
</SpaceItem>
<SpaceItem>
<Popconfirm OnConfirm="() => Delete(context)" Title="Are you sure you want to delete this Engine?">
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
</Popconfirm>
</SpaceItem>
</Space>
</ChildContent>
</ActionColumn>
</Table>
<Modal Title="@(EngineContext.Id == Guid.Empty ? "New Engine" : "Edit Engine")"
@bind-Visible="@EditEngineVisible"
OnOk="UpdateOrAdd"
OnCancel="CloseEdit">
<Form Model="@EngineContext">
<FormItem Label="Name">
<Input @bind-Value="@context.Name" />
</FormItem>
</Form>
</Modal>
@code {
IEnumerable<Engine> Engines { get; set; } = new List<Engine>();
bool Loading = true;
string Search = "";
TableColumnPicker Picker;
bool ColumnPickerVisible = false;
bool EditEngineVisible = false;
Engine EngineContext = new Engine();
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
LoadData();
Loading = false;
StateHasChanged();
}
}
private async Task LoadData()
{
var fuzzySearch = Search.ToLower().Trim();
Engines = await EngineService.Get(r => r.Name.ToLower().Contains(fuzzySearch)).OrderBy(r => r.Name).ToListAsync();
}
private async Task UpdateOrAdd()
{
try
{
if (EngineContext.Id == Guid.Empty)
{
await EngineService.AddMissing(x => x.Name == EngineContext.Name, EngineContext);
MessageService.Success($"{EngineContext.Name} was added!");
}
else
{
await EngineService.Update(EngineContext);
MessageService.Success($"{EngineContext.Name} was updated!");
}
await LoadData();
}
catch (Exception ex)
{
if (EngineContext.Id == Guid.Empty)
MessageService.Error($"Could not add {EngineContext.Name}!");
else
MessageService.Error($"Could not update {EngineContext.Name}!");
Logger.LogError(ex, "Could not add/update {EngineContext.Name}!");
}
await CloseEdit();
}
private async Task OpenEdit(Engine engine)
{
if (engine != null)
EngineContext = engine;
EditEngineVisible = true;
await InvokeAsync(StateHasChanged);
}
private async Task CloseEdit()
{
EditEngineVisible = false;
await InvokeAsync(StateHasChanged);
}
private async Task Delete(Engine Engine)
{
Engines = new List<Engine>();
Loading = true;
await EngineService.Delete(Engine);
Engines = await EngineService.Get(x => true).OrderBy(r => r.Name).ToListAsync();
Loading = false;
}
private async Task OpenColumnPicker()
{
ColumnPickerVisible = true;
}
private async Task CloseColumnPicker()
{
ColumnPickerVisible = false;
}
}