LANCommander/LANCommander.Server/UI/Pages/Issues/Index.razor

119 lines
4 KiB
Text

@page "/Issues"
@using Microsoft.EntityFrameworkCore;
@attribute [Authorize(Roles = RoleService.AdministratorRoleName)]
@inject DatabaseServiceFactory DatabaseServiceFactory
@inject NavigationManager NavigationManager
@inject IMessageService MessageService
<PageHeader Title="Issues">
<PageHeaderExtra>
<Space Direction="DirectionVHType.Horizontal">
<SpaceItem>
<Search Placeholder="Search" @bind-Value="Search" BindOnInput DebounceMilliseconds="150" OnChange="() => LoadData()" />
</SpaceItem>
<SpaceItem>
<Button OnClick="() => Add()" Type="@ButtonType.Primary">Add Issue</Button>
</SpaceItem>
</Space>
</PageHeaderExtra>
</PageHeader>
<TableColumnPicker @ref="Picker" Key="Issues" @bind-Visible="ColumnPickerVisible" />
<Table TItem="Issue" DataSource="@Issues" Loading="@Loading" PageSize="25" Responsive>
<PropertyColumn Property="r => r.Game.Title" Sortable Hidden="@(Picker.IsColumnHidden("Game"))" />
<PropertyColumn Property="r => r.CreatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable Hidden="@(Picker.IsColumnHidden("Created On"))" />
<PropertyColumn Property="r => r.CreatedBy != null ? r.CreatedBy.UserName : String.Empty" Title="Created By" Sortable Hidden="@(Picker.IsColumnHidden("Created By"))" />
<PropertyColumn Property="r => r.UpdatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable Hidden="@(Picker.IsColumnHidden("Updated On", false))" />
<PropertyColumn Property="r => r.UpdatedBy != null ? r.UpdatedBy.UserName : String.Empty" Title="Updated By" Sortable Hidden="@(Picker.IsColumnHidden("Updated By"))" />
<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>
<a href="/Issues/@(context.Id)" class="ant-btn ant-btn-primary">Edit</a>
</SpaceItem>
<SpaceItem>
<Popconfirm OnConfirm="() => Delete(context)" Title="Are you sure you want to delete this issue?">
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
</Popconfirm>
</SpaceItem>
</Space>
</ChildContent>
</ActionColumn>
</Table>
@code {
IssueService IssueService;
IEnumerable<Issue> Issues { get; set; } = new List<Issue>();
bool Loading = true;
string Search = "";
TableColumnPicker Picker;
bool ColumnPickerVisible = false;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await LoadData();
Loading = false;
StateHasChanged();
}
}
async Task LoadData()
{
var fuzzySearch = Search.ToLower().Trim();
using (var issueService = DatabaseServiceFactory.Create<IssueService>())
{
Issues = await issueService
.Include(i => i.CreatedBy)
.Include(i => i.UpdatedBy)
.Include(i => i.Game)
.SortBy(i => i.CreatedOn, Data.Enums.SortDirection.Descending)
.GetAsync(i => i.Game.Title.ToLower().Contains(fuzzySearch));
}
}
void Add()
{
NavigationManager.NavigateTo("/Issues/Add");
}
async Task Delete(Issue issue)
{
Issues = new List<Issue>();
Loading = true;
using (var issueService = DatabaseServiceFactory.Create<IssueService>())
{
await IssueService.DeleteAsync(issue);
}
await LoadData();
Loading = false;
}
async Task OpenColumnPicker()
{
ColumnPickerVisible = true;
}
async Task CloseColumnPicker()
{
ColumnPickerVisible = false;
}
}