Allow editing of columns displayed in games list
This commit is contained in:
parent
a291462bde
commit
bc384b68c1
1 changed files with 224 additions and 27 deletions
|
@ -1,4 +1,6 @@
|
||||||
@page "/Games"
|
@page "/Games"
|
||||||
|
@using LANCommander.Extensions;
|
||||||
|
@using System.ComponentModel.DataAnnotations;
|
||||||
@attribute [Authorize]
|
@attribute [Authorize]
|
||||||
@inject GameService GameService
|
@inject GameService GameService
|
||||||
@inject NavigationManager NavigationManager
|
@inject NavigationManager NavigationManager
|
||||||
|
@ -9,35 +11,176 @@
|
||||||
</PageHeaderExtra>
|
</PageHeaderExtra>
|
||||||
</PageHeader>
|
</PageHeader>
|
||||||
|
|
||||||
|
<Drawer Closable="true" Visible="@FieldPickerVisible" Placement="right" Title="@("Fields")" OnClose="() => FieldPickerVisible = false">
|
||||||
|
<Space Direction="@DirectionVHType.Vertical">
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Icon)" OnChange="(state) => ChangeFieldVisibility(Field.Icon, state)" /> @Field.Icon.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Title)" OnChange="(state) => ChangeFieldVisibility(Field.Title, state)" /> @Field.Title.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.SortTitle)" OnChange="(state) => ChangeFieldVisibility(Field.SortTitle, state)" /> @Field.SortTitle.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.ReleasedOn)" OnChange="(state) => ChangeFieldVisibility(Field.ReleasedOn, state)" /> @Field.ReleasedOn.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.CreatedOn)" OnChange="(state) => ChangeFieldVisibility(Field.CreatedOn, state)" /> @Field.CreatedOn.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.CreatedBy)" OnChange="(state) => ChangeFieldVisibility(Field.CreatedBy, state)" /> @Field.CreatedBy.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.UpdatedOn)" OnChange="(state) => ChangeFieldVisibility(Field.UpdatedOn, state)" /> @Field.UpdatedOn.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.UpdatedBy)" OnChange="(state) => ChangeFieldVisibility(Field.UpdatedBy, state)" /> @Field.UpdatedBy.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Singleplayer)" OnChange="(state) => ChangeFieldVisibility(Field.Singleplayer, state)" /> @Field.Singleplayer.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Multiplayer)" OnChange="(state) => ChangeFieldVisibility(Field.Multiplayer, state)" /> @Field.Multiplayer.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.TotalKeys)" OnChange="(state) => ChangeFieldVisibility(Field.TotalKeys, state)" /> @Field.TotalKeys.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.KeysAllocated)" OnChange="(state) => ChangeFieldVisibility(Field.KeysAllocated, state)" /> @Field.KeysAllocated.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Developers)" OnChange="(state) => ChangeFieldVisibility(Field.Developers, state)" /> @Field.Developers.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Publishers)" OnChange="(state) => ChangeFieldVisibility(Field.Publishers, state)" /> @Field.Publishers.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.Genres)" OnChange="(state) => ChangeFieldVisibility(Field.Genres, state)" /> @Field.Genres.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.MultiplayerModes)" OnChange="(state) => ChangeFieldVisibility(Field.MultiplayerModes, state)" /> @Field.MultiplayerModes.GetDisplayName()</SpaceItem>
|
||||||
|
<SpaceItem><Switch Checked="FieldVisible(Field.ArchiveSize)" OnChange="(state) => ChangeFieldVisibility(Field.ArchiveSize, state)" /> @Field.ArchiveSize.GetDisplayName()</SpaceItem>
|
||||||
|
</Space>
|
||||||
|
</Drawer>
|
||||||
|
|
||||||
<Table TItem="Game" DataSource="@Games" Loading="@Loading">
|
<Table TItem="Game" DataSource="@Games" Loading="@Loading">
|
||||||
<Column TData="string">
|
@if (FieldVisible(Field.Icon))
|
||||||
<Image Src="@GetIcon(context)" Height="32" Width="32" Preview="false"></Image>
|
{
|
||||||
</Column>
|
<Column TData="string">
|
||||||
<PropertyColumn Property="g => g.Title" Sortable Filterable />
|
<Image Src="@GetIcon(context)" Height="32" Width="32" Preview="false"></Image>
|
||||||
<PropertyColumn Property="g => g.SortTitle" Sortable Filterable />
|
</Column>
|
||||||
<PropertyColumn Property="g => g.ReleasedOn" Format="MM/dd/yyyy" Sortable Filterable />
|
}
|
||||||
<PropertyColumn Property="g => g.CreatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable />
|
|
||||||
<PropertyColumn Property="g => g.CreatedBy" Sortable>
|
@if (FieldVisible(Field.Title))
|
||||||
@context.CreatedBy?.UserName
|
{
|
||||||
</PropertyColumn>
|
<PropertyColumn Property="g => g.Title" Sortable Filterable />
|
||||||
<PropertyColumn Property="g => g.UpdatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable />
|
}
|
||||||
<PropertyColumn Property="g => g.UpdatedBy" Sortable>
|
|
||||||
@context.UpdatedBy?.UserName
|
@if (FieldVisible(Field.SortTitle))
|
||||||
</PropertyColumn>
|
{
|
||||||
|
<PropertyColumn Property="g => g.SortTitle" Title="@Field.SortTitle.GetDisplayName()" Sortable Filterable />
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.ReleasedOn))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.ReleasedOn" Format="MM/dd/yyyy" Sortable Filterable />
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.CreatedOn))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.CreatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable />
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.CreatedBy))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.CreatedBy" Sortable>
|
||||||
|
@context.CreatedBy?.UserName
|
||||||
|
</PropertyColumn>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.UpdatedOn))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.UpdatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable />
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.UpdatedBy))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.UpdatedBy" Sortable>
|
||||||
|
@context.UpdatedBy?.UserName
|
||||||
|
</PropertyColumn>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.Singleplayer))
|
||||||
|
{
|
||||||
|
<PropertyColumn Property="g => g.Singleplayer" Sortable Filterable>
|
||||||
|
<Checkbox Disabled="true" Checked="context.Singleplayer" />
|
||||||
|
</PropertyColumn>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.Multiplayer))
|
||||||
|
{
|
||||||
|
<Column TData="bool" Title="@Field.Multiplayer.GetDisplayName()">
|
||||||
|
<Checkbox Disabled="true" Checked="context.MultiplayerModes?.Count > 0" />
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.TotalKeys))
|
||||||
|
{
|
||||||
|
<Column TData="int" Title="@Field.TotalKeys.GetDisplayName()">
|
||||||
|
@context.Keys?.Count
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.KeysAllocated))
|
||||||
|
{
|
||||||
|
<Column TData="int" Title="@Field.KeysAllocated.GetDisplayName()">
|
||||||
|
@context.Keys?.Count(k => k.ClaimedOn.HasValue)
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.Developers))
|
||||||
|
{
|
||||||
|
<Column TData="string[]" Title="@Field.Developers.GetDisplayName()">
|
||||||
|
@foreach (var dev in context.Developers)
|
||||||
|
{
|
||||||
|
<Tag>@dev.Name</Tag>
|
||||||
|
}
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.Publishers))
|
||||||
|
{
|
||||||
|
<Column TData="string[]" Title="@Field.Publishers.GetDisplayName()">
|
||||||
|
@foreach (var pub in context.Publishers)
|
||||||
|
{
|
||||||
|
<Tag>@pub.Name</Tag>
|
||||||
|
}
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.Genres))
|
||||||
|
{
|
||||||
|
<Column TData="string[]" Title="@Field.Genres.GetDisplayName()">
|
||||||
|
@foreach (var genre in context.Genres)
|
||||||
|
{
|
||||||
|
<Tag>@genre.Name</Tag>
|
||||||
|
}
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.MultiplayerModes))
|
||||||
|
{
|
||||||
|
<Column TData="Data.Enums.MultiplayerType[]" Title="@Field.MultiplayerModes.GetDisplayName()">
|
||||||
|
@foreach (var mode in context.MultiplayerModes.Select(mm => mm.Type).Distinct())
|
||||||
|
{
|
||||||
|
<Tag>@mode.GetDisplayName()</Tag>
|
||||||
|
}
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (FieldVisible(Field.ArchiveSize))
|
||||||
|
{
|
||||||
|
long? compressedSize = context.Archives?.OrderByDescending(a => a.CreatedOn).FirstOrDefault()?.CompressedSize;
|
||||||
|
|
||||||
|
<Column TData="long" Title="@Field.ArchiveSize.GetDisplayName()">
|
||||||
|
@if (compressedSize.HasValue)
|
||||||
|
{
|
||||||
|
@ByteSizeLib.ByteSize.FromBytes((double)compressedSize)
|
||||||
|
}
|
||||||
|
</Column>
|
||||||
|
}
|
||||||
|
|
||||||
<ActionColumn Title="" Style="text-align: right">
|
<ActionColumn Title="" Style="text-align: right">
|
||||||
<Space Direction="DirectionVHType.Horizontal">
|
<TitleTemplate>
|
||||||
<SpaceItem>
|
<div style="text-align: right">
|
||||||
<Button OnClick="() => ViewSaves(context)">Saves</Button>
|
<Button Icon="@IconType.Outline.Edit" Type="@ButtonType.Text" OnClick="() => FieldPickerVisible = true" />
|
||||||
</SpaceItem>
|
</div>
|
||||||
<SpaceItem>
|
</TitleTemplate>
|
||||||
<a href="/Games/@(context.Id)/Edit" class="ant-btn ant-btn-primary">Edit</a>
|
<ChildContent>
|
||||||
</SpaceItem>
|
<Space Direction="DirectionVHType.Horizontal">
|
||||||
<SpaceItem>
|
<SpaceItem>
|
||||||
<Popconfirm OnConfirm="() => Delete(context)" Title="Are you sure you want to delete this game?">
|
<Button OnClick="() => ViewSaves(context)">Saves</Button>
|
||||||
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
|
</SpaceItem>
|
||||||
</Popconfirm>
|
<SpaceItem>
|
||||||
</SpaceItem>
|
<a href="/Games/@(context.Id)/Edit" class="ant-btn ant-btn-primary">Edit</a>
|
||||||
</Space>
|
</SpaceItem>
|
||||||
|
<SpaceItem>
|
||||||
|
<Popconfirm OnConfirm="() => Delete(context)" Title="Are you sure you want to delete this game?">
|
||||||
|
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
|
||||||
|
</Popconfirm>
|
||||||
|
</SpaceItem>
|
||||||
|
</Space>
|
||||||
|
</ChildContent>
|
||||||
</ActionColumn>
|
</ActionColumn>
|
||||||
</Table>
|
</Table>
|
||||||
|
|
||||||
|
@ -45,6 +188,50 @@
|
||||||
IEnumerable<Game> Games { get; set; } = new List<Game>();
|
IEnumerable<Game> Games { get; set; } = new List<Game>();
|
||||||
|
|
||||||
bool Loading = true;
|
bool Loading = true;
|
||||||
|
bool FieldPickerVisible = false;
|
||||||
|
|
||||||
|
Dictionary<Field, bool> FieldVisibility = new Dictionary<Field, bool>()
|
||||||
|
{
|
||||||
|
{ Field.Icon, true },
|
||||||
|
{ Field.Title, true },
|
||||||
|
{ Field.SortTitle, true },
|
||||||
|
{ Field.ReleasedOn, true },
|
||||||
|
{ Field.CreatedOn, true },
|
||||||
|
{ Field.CreatedBy, true },
|
||||||
|
{ Field.UpdatedOn, true },
|
||||||
|
{ Field.UpdatedBy, true }
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Field
|
||||||
|
{
|
||||||
|
Icon,
|
||||||
|
Title,
|
||||||
|
[Display(Name = "Sort Title")]
|
||||||
|
SortTitle,
|
||||||
|
[Display(Name = "Released On")]
|
||||||
|
ReleasedOn,
|
||||||
|
[Display(Name = "Created On")]
|
||||||
|
CreatedOn,
|
||||||
|
[Display(Name = "Created By")]
|
||||||
|
CreatedBy,
|
||||||
|
[Display(Name = "Updated On")]
|
||||||
|
UpdatedOn,
|
||||||
|
[Display(Name = "Updated By")]
|
||||||
|
UpdatedBy,
|
||||||
|
Singleplayer,
|
||||||
|
Multiplayer,
|
||||||
|
[Display(Name = "Total Keys")]
|
||||||
|
TotalKeys,
|
||||||
|
[Display(Name = "Keys Allocated")]
|
||||||
|
KeysAllocated,
|
||||||
|
Developers,
|
||||||
|
Publishers,
|
||||||
|
Genres,
|
||||||
|
[Display(Name = "Multiplayer Modes")]
|
||||||
|
MultiplayerModes,
|
||||||
|
[Display(Name = "Archive Size")]
|
||||||
|
ArchiveSize,
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnAfterRender(bool firstRender)
|
protected override void OnAfterRender(bool firstRender)
|
||||||
{
|
{
|
||||||
|
@ -58,6 +245,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool FieldVisible(Field field)
|
||||||
|
{
|
||||||
|
return FieldVisibility.ContainsKey(field) && FieldVisibility[field] == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChangeFieldVisibility(Field field, bool state)
|
||||||
|
{
|
||||||
|
FieldVisibility[field] = state;
|
||||||
|
}
|
||||||
|
|
||||||
private string GetIcon(Game game)
|
private string GetIcon(Game game)
|
||||||
{
|
{
|
||||||
return $"/api/Games/{game.Id}/Icon.png";
|
return $"/api/Games/{game.Id}/Icon.png";
|
||||||
|
|
Loading…
Add table
Reference in a new issue