Added owner field to server crud. Started update for server crud

This commit is contained in:
2024-12-20 18:45:38 +01:00
parent e9279fa3d1
commit 0baf9668f9
13 changed files with 381 additions and 27 deletions

View File

@@ -30,11 +30,13 @@
// Handle unselected node
if (Request.NodeId <= 0)
return [];
var data = await ApiClient.GetJson<PagedData<NodeAllocationDetailResponse>>(
$"api/admin/servers/nodes/{Request.NodeId}/allocations/free?page=0&pageSize=50"
);
return data.Items;
var items = await PagedData<NodeAllocationDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<NodeAllocationDetailResponse>>(
$"api/admin/servers/nodes/{Request.NodeId}/allocations/free?page={page}&pageSize={pageSize}"
)
);
return items;
}
}

View File

@@ -1,10 +1,10 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonlightServers.Frontend.UI.Components.Forms
@using MoonCore.Helpers
@using MoonCore.Models
@using MoonlightServers.Shared.Http.Responses.Admin.Nodes
@using MoonlightServers.Shared.Http.Responses.Admin.Stars
@using MoonCore.Blazor.Tailwind.Inputs
@using Moonlight.Shared.Http.Responses.Admin.Users
@inject HttpApiClient ApiClient
@@ -16,6 +16,20 @@
</div>
</div>
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Owner</label>
<div class="mt-2">
<InputItemSearchSelect TItem="UserDetailResponse"
TProperty="int"
@bind-Value="Request.OwnerId"
AllowNone="false"
Loader="Loader"
DisplayProperty="@(x => x.Email)"
ValueProperty="@(x => x.Id)"/>
</div>
</div>
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Star</label>
<div class="mt-2">
@@ -75,15 +89,46 @@
{
[Parameter] public CreateServerRequest Request { get; set; }
private UserDetailResponse[]? Users;
private async Task<StarDetailResponse[]> LoadStars()
{
var starData = await ApiClient.GetJson<PagedData<StarDetailResponse>>("api/admin/servers/stars?page=0&pageSize=50");
return starData.Items;
var items = await PagedData<StarDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<StarDetailResponse>>(
$"api/admin/servers/stars?page={page}&pageSize={pageSize}"
)
);
return items;
}
private async Task<NodeDetailResponse[]> LoadNodes()
{
var nodeData = await ApiClient.GetJson<PagedData<NodeDetailResponse>>("api/admin/servers/nodes?page=0&pageSize=50");
return nodeData.Items;
var items = await PagedData<NodeDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<NodeDetailResponse>>(
$"api/admin/servers/nodes?page={page}&pageSize={pageSize}"
)
);
return items;
}
private async Task<UserDetailResponse[]> Loader(string searchTerm)
{
if (Users == null)
{
Users = await PagedData<UserDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<UserDetailResponse>>(
$"api/admin/users?page={page}&pageSize={pageSize}"
)
);
}
if (string.IsNullOrEmpty(searchTerm))
return Users;
return Users
.Where(x => x.Email.Contains(searchTerm))
.ToArray();
}
}

View File

@@ -0,0 +1,70 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonCore.Helpers
@using MoonCore.Blazor.Tailwind.Components
@using MoonCore.Models
@using MoonlightServers.Shared.Http.Responses.Admin.StarVariables
@inject HttpApiClient ApiClient
<LazyLoader Load="Load">
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
@foreach (var variable in StarVariables)
{
// Load value of default
var value = Request.Variables.TryGetValue(variable.Key, out var val)
? val
: variable.DefaultValue;
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">
@variable.Name
</label>
<div class="mt-2">
<input type="text"
class="form-input placeholder-gray-500 w-full"
value="@value"
placeholder="@variable.DefaultValue"
@onchange="@(args => UpdateValue(variable, args))"/>
</div>
<p class="mt-1 text-sm leading-6 text-gray-400">
@variable.Description
</p>
</div>
}
</div>
</LazyLoader>
@code
{
[Parameter] public CreateServerRequest Request { get; set; }
private StarVariableDetailResponse[] StarVariables;
private async Task Load(LazyLoader _)
{
if (Request.StarId <= 0)
{
StarVariables = [];
return;
}
StarVariables = await PagedData<StarVariableDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<StarVariableDetailResponse>>(
$"api/admin/servers/stars/{Request.StarId}/variables?page={page}&pageSize={pageSize}"
)
);
}
private async Task UpdateValue(StarVariableDetailResponse starVariable, ChangeEventArgs args)
{
var value = args.Value?.ToString() ?? "";
// Remove variable from request when set to its default value
if (value == starVariable.DefaultValue && Request.Variables.ContainsKey(starVariable.Key))
Request.Variables.Remove(starVariable.Key);
else
Request.Variables[starVariable.Key] = value;
await InvokeAsync(StateHasChanged);
}
}

View File

@@ -0,0 +1,16 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonCore.Blazor.Tailwind.Inputs
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Bandwidth</label>
<div class="mt-2">
<input @bind="Request.Bandwidth" type="number" autocomplete="off" class="form-input w-full">
</div>
</div>
</div>
@code
{
[Parameter] public UpdateServerRequest Request { get; set; }
}

View File

@@ -0,0 +1,44 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonCore.Blazor.Tailwind.Inputs
@using MoonCore.Helpers
@using MoonCore.Models
@using MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations
@using MoonlightServers.Shared.Http.Responses.Admin.Servers
@inject HttpApiClient ApiClient
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Allocations</label>
<div class="mt-2">
<InputMultiSelect TItem="NodeAllocationDetailResponse"
TProperty="int"
@bind-Value="Request.AllocationIds"
Loader="Loader"
AllowSearch="true"
DisplayProperty="@(x => $"{x.IpAddress}:{x.Port}")"
ValueProperty="@(x => x.Id)"/>
</div>
</div>
</div>
@code
{
[Parameter] public UpdateServerRequest Request { get; set; }
[Parameter] public ServerDetailResponse Server { get; set; }
private async Task<NodeAllocationDetailResponse[]> Loader()
{
// Handle unselected node
if (Server.NodeId <= 0)
return [];
var items = await PagedData<NodeAllocationDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<NodeAllocationDetailResponse>>(
$"api/admin/servers/nodes/{Server.NodeId}/allocations/free?page={page}&pageSize={pageSize}"
)
);
return items;
}
}

View File

@@ -0,0 +1,86 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonCore.Helpers
@using MoonCore.Models
@using MoonCore.Blazor.Tailwind.Inputs
@using Moonlight.Shared.Http.Responses.Admin.Users
@inject HttpApiClient ApiClient
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Name</label>
<div class="mt-2">
<input @bind="Request.Name" type="text" autocomplete="off" class="form-input w-full">
</div>
</div>
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Owner</label>
<div class="mt-2">
<InputItemSearchSelect TItem="UserDetailResponse"
TProperty="int"
@bind-Value="Request.OwnerId"
AllowNone="false"
Loader="Loader"
DisplayProperty="@(x => x.Email)"
ValueProperty="@(x => x.Id)"/>
</div>
</div>
</div>
<div class="border-t border-gray-100/10 pt-6 my-8">
<div class="mb-8"><h2 class="text-base font-semibold leading-7 text-gray-100">
Resources
</h2>
<p class="mt-1 text-sm leading-6 text-gray-400">Define the servers resource limit</p></div>
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Cpu</label>
<div class="mt-2">
<input @bind="Request.Cpu" type="number" autocomplete="off" class="form-input w-full">
</div>
</div>
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Memory</label>
<div class="mt-2">
<input @bind="Request.Memory" type="number" autocomplete="off" class="form-input w-full">
</div>
</div>
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">Disk</label>
<div class="mt-2">
<input @bind="Request.Disk" type="number" autocomplete="off" class="form-input w-full">
</div>
</div>
</div>
</div>
@code
{
[Parameter] public UpdateServerRequest Request { get; set; }
private UserDetailResponse[]? Users;
private async Task<UserDetailResponse[]> Loader(string searchTerm)
{
if (Users == null)
{
Users = await PagedData<UserDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<UserDetailResponse>>(
$"api/admin/users?page={page}&pageSize={pageSize}"
)
);
}
if (string.IsNullOrEmpty(searchTerm))
return Users;
return Users
.Where(x => x.Email.Contains(searchTerm))
.ToArray();
}
}

View File

@@ -0,0 +1,70 @@
@using MoonlightServers.Shared.Http.Requests.Admin.Servers
@using MoonCore.Helpers
@using MoonCore.Blazor.Tailwind.Components
@using MoonCore.Models
@using MoonlightServers.Shared.Http.Responses.Admin.Servers
@using MoonlightServers.Shared.Http.Responses.Admin.StarVariables
@inject HttpApiClient ApiClient
<LazyLoader Load="Load">
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
@foreach (var variable in StarVariables)
{
// Load value of default
/*
var value = Request.Variables.TryGetValue(variable.Key, out var val)
? val
: variable.DefaultValue;*/
var value = "";
<div class="sm:col-span-2">
<label class="block text-sm font-medium leading-6 text-white">
@variable.Name
</label>
<div class="mt-2">
<input type="text"
class="form-input placeholder-gray-500 w-full"
value="@value"
placeholder="@variable.DefaultValue"
@onchange="@(args => UpdateValue(variable, args))"/>
</div>
<p class="mt-1 text-sm leading-6 text-gray-400">
@variable.Description
</p>
</div>
}
</div>
</LazyLoader>
@code
{
[Parameter] public UpdateServerRequest Request { get; set; }
[Parameter] public ServerDetailResponse Server { get; set; }
private StarVariableDetailResponse[] StarVariables;
private async Task Load(LazyLoader _)
{
StarVariables = await PagedData<StarVariableDetailResponse>.All(async (page, pageSize) =>
await ApiClient.GetJson<PagedData<StarVariableDetailResponse>>(
$"api/admin/servers/stars/{Server.StarId}/variables?page={page}&pageSize={pageSize}"
)
);
}
private async Task UpdateValue(StarVariableDetailResponse starVariable, ChangeEventArgs args)
{
/*
var value = args.Value?.ToString() ?? "";
// Remove variable from request when set to its default value
if (value == starVariable.DefaultValue && Request.Variables.ContainsKey(starVariable.Key))
Request.Variables.Remove(starVariable.Key);
else
Request.Variables[starVariable.Key] = value;
await InvokeAsync(StateHasChanged);*/
}
}