162 lines
4.7 KiB
Plaintext
162 lines
4.7 KiB
Plaintext
@page "/admin/servers/all"
|
|
|
|
@using MoonCore.Blazor.FlyonUi.Alerts
|
|
@using MoonCore.Blazor.FlyonUi.Common
|
|
@using MoonCore.Blazor.FlyonUi.Toasts
|
|
@using MoonCore.Helpers
|
|
@using MoonlightServers.Shared.Http.Responses.Admin.Nodes
|
|
@using MoonlightServers.Shared.Http.Responses.Admin.Servers
|
|
@using MoonlightServers.Shared.Http.Responses.Admin.Stars
|
|
@using MoonCore.Blazor.FlyonUi.Components
|
|
@using MoonCore.Blazor.FlyonUi.Grid
|
|
@using MoonCore.Blazor.FlyonUi.Grid.Columns
|
|
@using MoonCore.Common
|
|
@using Moonlight.Shared.Http.Responses.Admin.Users
|
|
|
|
@inject HttpApiClient ApiClient
|
|
@inject AlertService AlertService
|
|
@inject ToastService ToastService
|
|
|
|
@attribute [Authorize(Policy = "permissions:admin.servers.get")]
|
|
|
|
<div class="mb-3">
|
|
<NavTabs Index="1" Names="@UiConstants.AdminNavNames" Links="@UiConstants.AdminNavLinks"/>
|
|
</div>
|
|
|
|
<div class="mb-5">
|
|
<PageHeader Title="Servers">
|
|
<a href="/admin/servers/all/create" class="btn btn-primary">
|
|
Create
|
|
</a>
|
|
</PageHeader>
|
|
</div>
|
|
|
|
<DataGrid @ref="Grid"
|
|
TGridItem="ServerResponse"
|
|
ItemSource="ItemSource">
|
|
<PropertyColumn Field="x => x.Id"/>
|
|
<TemplateColumn Title="Name">
|
|
<td>
|
|
<a class="text-primary" href="/admin/servers/all/update/@context.Id">
|
|
@context.Name
|
|
</a>
|
|
</td>
|
|
</TemplateColumn>
|
|
<TemplateColumn Title="Owner">
|
|
<td>
|
|
@{
|
|
var owner = Users.GetValueOrDefault(context.OwnerId);
|
|
}
|
|
|
|
<span>
|
|
@(owner?.Username ?? "N/A")
|
|
</span>
|
|
</td>
|
|
</TemplateColumn>
|
|
<TemplateColumn Title="Node">
|
|
<td>
|
|
@{
|
|
var node = Nodes.GetValueOrDefault(context.NodeId);
|
|
}
|
|
|
|
<span>
|
|
@(node?.Name ?? "N/A")
|
|
</span>
|
|
</td>
|
|
</TemplateColumn>
|
|
<TemplateColumn Title="Star">
|
|
<td>
|
|
@{
|
|
var star = Stars.GetValueOrDefault(context.StarId);
|
|
}
|
|
|
|
<span>
|
|
@(star?.Name ?? "N/A")
|
|
</span>
|
|
</td>
|
|
</TemplateColumn>
|
|
<TemplateColumn Title="Actions">
|
|
<td>
|
|
<div class="flex justify-end">
|
|
<a href="/admin/servers/all/update/@(context.Id)" class="text-primary mr-2 sm:mr-3">
|
|
<i class="icon-pencil text-base"></i>
|
|
</a>
|
|
|
|
<a href="#" @onclick="() => DeleteAsync(context)" @onclick:preventDefault
|
|
class="text-error">
|
|
<i class="icon-trash text-base"></i>
|
|
</a>
|
|
</div>
|
|
</td>
|
|
</TemplateColumn>
|
|
</DataGrid>
|
|
|
|
@code
|
|
{
|
|
private DataGrid<ServerResponse> Grid;
|
|
|
|
private Dictionary<int, StarResponse> Stars = new();
|
|
private Dictionary<int, NodeResponse> Nodes = new();
|
|
private Dictionary<int, UserResponse> Users = new();
|
|
|
|
private ItemSource<ServerResponse> ItemSource => ItemSourceFactory.From(LoadAsync);
|
|
|
|
private async Task<IEnumerable<ServerResponse>> LoadAsync(int startIndex, int count)
|
|
{
|
|
var query = $"?startIndex={startIndex}&count={count}";
|
|
|
|
var countedData = await ApiClient.GetJson<CountedData<ServerResponse>>($"api/admin/servers{query}");
|
|
|
|
// Fetch relations
|
|
|
|
var nodesToFetch = countedData.Items
|
|
.Where(x => !Nodes.ContainsKey(x.Id))
|
|
.Select(x => x.Id)
|
|
.Distinct();
|
|
|
|
foreach (var id in nodesToFetch)
|
|
{
|
|
var node = await ApiClient.GetJson<NodeResponse>($"api/admin/servers/nodes/{id}");
|
|
Nodes[node.Id] = node;
|
|
}
|
|
|
|
var starsToFetch = countedData.Items
|
|
.Where(x => !Stars.ContainsKey(x.Id))
|
|
.Select(x => x.Id)
|
|
.Distinct();
|
|
|
|
foreach (var id in starsToFetch)
|
|
{
|
|
var star = await ApiClient.GetJson<StarResponse>($"api/admin/servers/stars/{id}");
|
|
Stars[star.Id] = star;
|
|
}
|
|
|
|
var usersToFetch = countedData.Items
|
|
.Where(x => !Users.ContainsKey(x.Id))
|
|
.Select(x => x.Id)
|
|
.Distinct();
|
|
|
|
foreach (var id in usersToFetch)
|
|
{
|
|
var user = await ApiClient.GetJson<UserResponse>($"api/admin/users/{id}");
|
|
Users[user.Id] = user;
|
|
}
|
|
|
|
return countedData;
|
|
}
|
|
|
|
private async Task DeleteAsync(ServerResponse response)
|
|
{
|
|
await AlertService.ConfirmDangerAsync(
|
|
"Server deletion",
|
|
$"Do you really want to delete the server '{response.Name}'",
|
|
async () =>
|
|
{
|
|
await ApiClient.Delete($"api/admin/servers/{response.Id}");
|
|
await ToastService.SuccessAsync("Successfully deleted server");
|
|
|
|
await Grid.RefreshAsync();
|
|
}
|
|
);
|
|
}
|
|
} |