Added update model with progress animations. Backend not implemented
This commit is contained in:
119
Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor
Normal file
119
Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor
Normal file
@@ -0,0 +1,119 @@
|
||||
@inherits ShadcnBlazor.Extras.Dialogs.DialogBase
|
||||
|
||||
@using LucideBlazor
|
||||
@using ShadcnBlazor.Dialogs
|
||||
@using ShadcnBlazor.Extras.AlertDialogs
|
||||
@using ShadcnBlazor.Progresses
|
||||
@using ShadcnBlazor.Spinners
|
||||
|
||||
@inject AlertDialogService AlertService
|
||||
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
Updating...
|
||||
</DialogTitle>
|
||||
</DialogHeader>
|
||||
|
||||
<div class="text-base flex flex-col p-2 gap-y-0.5">
|
||||
@for (var i = 0; i < Steps.Length; i++)
|
||||
{
|
||||
if (CurrentStep == i)
|
||||
{
|
||||
<div class="flex flex-row items-center gap-x-2">
|
||||
<Spinner ClassName="size-4" />
|
||||
<span>
|
||||
@Steps[i]
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
if (i < CurrentStep)
|
||||
{
|
||||
<div class="flex flex-row items-center gap-x-2">
|
||||
<CheckIcon ClassName="text-green-500 size-4" />
|
||||
<span>
|
||||
@Steps[i]
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="text-muted-foreground flex flex-row items-center gap-x-2">
|
||||
<span class="size-4"></span>
|
||||
@Steps[i]
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
</div>
|
||||
|
||||
<DialogFooter>
|
||||
<Progress Value="@Progress"></Progress>
|
||||
</DialogFooter>
|
||||
|
||||
@code
|
||||
{
|
||||
private int Progress = 0;
|
||||
|
||||
private int CurrentStep;
|
||||
|
||||
private string[] Steps =
|
||||
[
|
||||
"Preparing",
|
||||
"Updating configuration files",
|
||||
"Building docker image",
|
||||
"Redeploying container instance",
|
||||
"Waiting for container instance to start up",
|
||||
"Update complete"
|
||||
];
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (!firstRender)
|
||||
return;
|
||||
|
||||
CurrentStep = 0;
|
||||
Progress = 0;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(2000);
|
||||
|
||||
CurrentStep = 1;
|
||||
Progress = 20;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(6000);
|
||||
|
||||
CurrentStep = 2;
|
||||
Progress = 40;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(2000);
|
||||
|
||||
CurrentStep = 3;
|
||||
Progress = 60;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(4000);
|
||||
|
||||
CurrentStep = 4;
|
||||
Progress = 80;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(4000);
|
||||
|
||||
CurrentStep = 5;
|
||||
Progress = 100;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await Task.Delay(1000);
|
||||
|
||||
await AlertService.SuccessAsync(
|
||||
"Update completed",
|
||||
"Update successfully completed. Please refresh the page to load new frontend changes"
|
||||
);
|
||||
|
||||
await CloseAsync();
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
@page "/admin"
|
||||
@using LucideBlazor
|
||||
@using Moonlight.Frontend.UI.Admin.Modals
|
||||
@using Moonlight.Shared.Http.Responses.Admin
|
||||
@using ShadcnBlazor.Buttons
|
||||
@using ShadcnBlazor.Cards
|
||||
@using ShadcnBlazor.Extras.Dialogs
|
||||
@using ShadcnBlazor.Spinners
|
||||
|
||||
@inject HttpClient HttpClient
|
||||
@inject DialogService DialogService
|
||||
|
||||
<h1 class="text-xl font-semibold">Overview</h1>
|
||||
<div class="text-muted-foreground">
|
||||
@@ -130,7 +133,7 @@
|
||||
{
|
||||
<CardTitle ClassName="text-lg text-primary">Update available</CardTitle>
|
||||
<CardAction ClassName="self-center">
|
||||
<Button>Update</Button>
|
||||
<Button @onclick="LaunchUpdateModalAsync">Update</Button>
|
||||
</CardAction>
|
||||
}
|
||||
</CardHeader>
|
||||
@@ -153,4 +156,9 @@
|
||||
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task LaunchUpdateModalAsync() => await DialogService.LaunchAsync<UpdateInstanceModal>(onConfigure: model =>
|
||||
{
|
||||
model.ShowCloseButton = false;
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user