LANCommander/LANCommander/Pages/Games/Edit.razor
2023-02-13 01:02:36 -06:00

204 lines
6.5 KiB
Text

@page "/Games/{id:guid}/Edit"
@inject GameService GameService
@inject IDialogService DialogService
@inject ISnackbar Snackbar
<MudGrid>
<MudItem xs="12">
<MudPaper Class="pa-4">
<MudForm @bind-IsValid="@Success" @bind-Errors="@Errors">
<MudTextField @bind-Value="Game.Title" Label="Title" For="@(() => Game.Title)" Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Filled.Search" OnAdornmentClick="LookupGameMetadata" />
<MudTextField @bind-Value="Game.SortTitle" Label="Sort Title" For="@(() => Game.SortTitle)" />
<MudTextField @bind-Value="Game.Icon" Label="Icon" Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Filled.Folder" OnAdornmentClick="BrowseForIcon" />
<MudTextField @bind-Value="Game.Description" Label="Description" For="@(() => Game.Description)" Lines="4" />
<MudDatePicker @bind-Date="Game.ReleasedOn" Label="Released" />
<MudCheckBox @bind-Checked="@Game.Singleplayer" Label="Singleplayer" Color="Color.Primary"></MudCheckBox>
<MudDivider Class="mt-4 mb-4" />
<MudText Typo="Typo.h6">Developers</MudText>
<MudChipSet>
@foreach (var developer in Game.Developers)
{
<MudChip>@developer.Name</MudChip>
}
</MudChipSet>
<MudDivider Class="mt-4 mb-4" />
<MudText Typo="Typo.h6">Publishers</MudText>
<MudChipSet>
@foreach (var publisher in Game.Publishers)
{
<MudChip>@publisher.Name</MudChip>
}
</MudChipSet>
<MudDivider Class="mt-4 mb-4" />
<MudText Typo="Typo.h6">Genres</MudText>
<MudChipSet>
@foreach (var genre in Game.Genres)
{
<MudChip>@genre.Name</MudChip>
}
</MudChipSet>
<MudDivider Class="mt-4 mb-4" />
<MudText Typo="Typo.h6">Tags</MudText>
<MudChipSet>
@foreach (var tags in Game.Tags)
{
<MudChip>@tags.Name</MudChip>
}
</MudChipSet>
</MudForm>
</MudPaper>
</MudItem>
</MudGrid>
<MudCard Class="mt-4">
<MudCardHeader>
<CardHeaderContent>
<MudText Typo="Typo.h6">Actions</MudText>
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<ActionEditor Actions="Game.Actions" ArchiveId="Game.Archives.OrderByDescending(a => a.CreatedOn).First().Id" />
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardHeader>
<CardHeaderContent>
<MudText Typo="Typo.h6">Multiplayer Modes</MudText>
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<MultiplayerModeEditor Game="Game" />
</MudCardContent>
</MudCard>
<MudCard Class="mt-4">
<MudCardHeader>
<CardHeaderContent>
<MudText Typo="Typo.h6">Keys</MudText>
</CardHeaderContent>
<CardHeaderActions>
<MudButton Href="@($"/Games/{Id}/Keys")" Color="Color.Primary" Variant="Variant.Filled">View</MudButton>
</CardHeaderActions>
</MudCardHeader>
<MudCardContent>
<MudGrid>
<MudItem md="4" Class="mud-typography-align-center">
<MudText Typo="Typo.overline">Available</MudText>
<MudText Typo="Typo.body1">@KeysAvailable</MudText>
</MudItem>
<MudItem md="4" Class="mud-typography-align-center">
<MudText Typo="Typo.overline">Claimed</MudText>
<MudText Typo="Typo.body1">@(Game.Keys.Count - KeysAvailable)</MudText>
</MudItem>
<MudItem md="4" Class="mud-typography-align-center">
<MudText Typo="Typo.overline">Total</MudText>
<MudText Typo="Typo.body1">@Game.Keys.Count</MudText>
</MudItem>
</MudGrid>
</MudCardContent>
</MudCard>
<MudFab Color="Color.Primary" Disabled="@(!Success)" OnClick="Save" StartIcon="@Icons.Material.Filled.Save" Style="position: fixed; right: 32px; bottom: 32px;" />
@code {
[Parameter] public Guid Id { get; set; }
bool Success;
string[] Errors = { };
MudForm Form;
private Game Game { get; set; }
private int KeysAvailable { get {
return Game.Keys.Count(k =>
{
return (k.AllocationMethod == KeyAllocationMethod.MacAddress && String.IsNullOrWhiteSpace(k.ClaimedByMacAddress))
||
(k.AllocationMethod == KeyAllocationMethod.UserAccount && k.ClaimedByUser == null);
});
} }
protected override async Task OnInitializedAsync()
{
Game = await GameService.Get(Id);
}
private async Task Save()
{
try
{
Game = await GameService.Update(Game);
Snackbar.Add("Game updated!", Severity.Success);
}
catch (Exception ex)
{
Snackbar.Add("An unknown error occurred!", Severity.Error);
}
}
private async void BrowseForIcon()
{
var parameters = new DialogParameters
{
["ArchiveId"] = Game.Archives.OrderByDescending(a => a.CreatedOn).First().Id
};
var dialog = await DialogService.ShowAsync<ArchiveFileSelectorDialog>("File Selector", parameters);
var result = await dialog.Result;
if (!result.Canceled)
{
Game.Icon = result.Data as string;
StateHasChanged();
}
}
private async void LookupGameMetadata()
{
var parameters = new DialogParameters
{
["GameTitle"] = Game.Title
};
var dialog = await DialogService.ShowAsync<GameMetadataLookup>("Game Lookup", parameters);
var result = await dialog.Result;
if (!result.Canceled)
{
var info = result.Data as Game;
Game.Title = info.Title;
Game.Description = info.Description;
Game.ReleasedOn = info.ReleasedOn;
Game.MultiplayerModes = info.MultiplayerModes;
Game.Developers = info.Developers;
Game.Publishers = info.Publishers;
Game.Genres = info.Genres;
Game.Tags = info.Tags;
Game.Singleplayer = info.Singleplayer;
StateHasChanged();
}
}
}