Base implementation of smart deploy for servers, order screen, subscription service
This commit is contained in:
@@ -153,7 +153,8 @@
|
||||
await JsRuntime.InvokeVoidAsync("document.body.removeAttribute", "data-kt-app-page-loading");
|
||||
await JsRuntime.InvokeVoidAsync("KTMenu.createInstances");
|
||||
await JsRuntime.InvokeVoidAsync("KTDrawer.createInstances");
|
||||
await JsRuntime.InvokeVoidAsync("createSnow");
|
||||
|
||||
//await JsRuntime.InvokeVoidAsync("createSnow");
|
||||
|
||||
await SessionService.Register();
|
||||
|
||||
|
||||
174
Moonlight/Shared/Views/Servers/New.razor
Normal file
174
Moonlight/Shared/Views/Servers/New.razor
Normal file
@@ -0,0 +1,174 @@
|
||||
@page "/servers/new"
|
||||
@using Moonlight.App.Services
|
||||
@using Moonlight.App.Database.Entities
|
||||
@using Moonlight.App.Models.Forms
|
||||
@using Moonlight.App.Models.Misc
|
||||
@using Moonlight.App.Repositories
|
||||
|
||||
@inject SubscriptionService SubscriptionService
|
||||
@inject ImageRepository ImageRepository
|
||||
@inject SmartTranslateService SmartTranslateService
|
||||
@inject SmartDeployService SmartDeployService
|
||||
|
||||
<LazyLoader Load="Load">
|
||||
@if (DeployNode == null)
|
||||
{
|
||||
<div class="d-flex justify-content-center flex-center">
|
||||
<div class="card">
|
||||
<img src="/assets/media/svg/nodata.svg" class="card-img-top w-25 mx-auto pt-5" alt="Not found image"/>
|
||||
<div class="card-body text-center">
|
||||
<h4 class="card-title">
|
||||
<TL>No node found</TL>
|
||||
</h4>
|
||||
<p class="card-text">
|
||||
<TL>No node found to deploy to found</TL>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="d-flex flex-column flex-lg-row">
|
||||
<div class="w-100 flex-lg-row-auto w-lg-300px mb-7 me-7 me-lg-10" data-select2-id="select2-data-131-dr2d">
|
||||
<div class="card card-flush py-4" data-select2-id="select2-data-130-ru5y">
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
<h2>
|
||||
<TL>Server details</TL>
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body pt-0">
|
||||
<div class="d-flex flex-column gap-10">
|
||||
<div class="fv-row">
|
||||
<label class="form-label">Node</label>
|
||||
<div class="fw-bold fs-3">@(DeployNode.Name)</div>
|
||||
</div>
|
||||
@if (Model.Image != null)
|
||||
{
|
||||
var limit = Images[Model.Image];
|
||||
|
||||
<div class="fv-row">
|
||||
<label class="form-label"><TL>Image</TL></label>
|
||||
<div class="fw-bold fs-3">@(Model.Image.Name)</div>
|
||||
</div>
|
||||
|
||||
<div class="fv-row">
|
||||
<label class="form-label"><TL>CPU</TL></label>
|
||||
<div class="fw-bold fs-3">
|
||||
@{
|
||||
var cpu = limit.ReadValue("cpu");
|
||||
|
||||
if (cpu == null)
|
||||
cpu = "N/A";
|
||||
else
|
||||
cpu = (int.Parse(cpu) / 100).ToString();
|
||||
}
|
||||
@(cpu) <TL>Cores</TL>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fv-row">
|
||||
<label class="form-label"><TL>Memory</TL></label>
|
||||
<div class="fw-bold fs-3">@(limit.ReadValue("memory")) MB</div>
|
||||
</div>
|
||||
|
||||
<div class="fv-row">
|
||||
<label class="form-label"><TL>Disk</TL></label>
|
||||
<div class="fw-bold fs-3">@(limit.ReadValue("disk")) MB</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column flex-lg-row-fluid gap-7 gap-lg-10">
|
||||
<div class="card card-flush py-4">
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
<h2>
|
||||
<TL>Configure your server</TL>
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body pt-0">
|
||||
<SmartForm Model="Model" OnValidSubmit="OnValidSubmit">
|
||||
<label class="form-label">
|
||||
<TL>Name</TL>
|
||||
</label>
|
||||
<div class="input-group mb-5">
|
||||
<InputText @bind-Value="Model.Name" class="form-control"></InputText>
|
||||
</div>
|
||||
@if (Images.Any())
|
||||
{
|
||||
<label class="form-label">
|
||||
<TL>Image</TL>
|
||||
</label>
|
||||
<SmartSelect TField="Image"
|
||||
@bind-Value="Model.Image"
|
||||
Items="Images.Keys.ToArray()"
|
||||
DisplayField="@(x => x.Name)">
|
||||
</SmartSelect>
|
||||
|
||||
<button type="submit" class="mt-5 float-end btn btn-primary">
|
||||
<TL>Create</TL>
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="alert alert-warning d-flex align-items-center p-5 mb-10">
|
||||
<span>
|
||||
<TL>You reached the maximum amount of servers for every image of your subscription</TL>: @(Subscription == null ? SmartTranslateService.Translate("Default") : Subscription.Name)
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
</SmartForm>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</LazyLoader>
|
||||
|
||||
@code
|
||||
{
|
||||
private Node? DeployNode;
|
||||
private Subscription? Subscription;
|
||||
|
||||
private Dictionary<Image, SubscriptionLimit> Images = new();
|
||||
|
||||
private ServerOrderDataModel Model = new();
|
||||
|
||||
private async Task Load(LazyLoader lazyLoader)
|
||||
{
|
||||
// Reset state
|
||||
Images.Clear();
|
||||
Model = new();
|
||||
|
||||
await lazyLoader.SetText(SmartTranslateService.Translate("Loading your subscription"));
|
||||
Subscription = await SubscriptionService.GetCurrent();
|
||||
|
||||
await lazyLoader.SetText(SmartTranslateService.Translate("Searching for deploy node"));
|
||||
|
||||
DeployNode = await SmartDeployService.GetNode();
|
||||
|
||||
await lazyLoader.SetText(SmartTranslateService.Translate("Searching for available images"));
|
||||
|
||||
var images = ImageRepository.Get().ToArray();
|
||||
|
||||
foreach (var image in images)
|
||||
{
|
||||
var limit = await SubscriptionService.GetLimit("image." + image.Id);
|
||||
|
||||
if (limit.Amount > 0)
|
||||
{
|
||||
Images.Add(image, limit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnValidSubmit()
|
||||
{
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user