Added event system, soft error handler and added some things from helio
This commit is contained in:
66
Moonlight/Shared/Components/Forms/ConfirmButton.razor
Normal file
66
Moonlight/Shared/Components/Forms/ConfirmButton.razor
Normal file
@@ -0,0 +1,66 @@
|
||||
@if (ShowConfirm)
|
||||
{
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-success me-2 rounded-end" @onclick="Do">Confirm</button>
|
||||
<button class="btn btn-danger rounded-start" @onclick="() => SetConfirm(false)">Cancel</button>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Working)
|
||||
{
|
||||
<button class="btn @(CssClasses) disabled" disabled="">
|
||||
<span class="spinner-border spinner-border-sm align-middle me-2"></span>
|
||||
@WorkingText
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class="btn @(CssClasses)" @onclick="() => SetConfirm(true)">
|
||||
@Text
|
||||
@ChildContent
|
||||
</button>
|
||||
}
|
||||
}
|
||||
|
||||
@code
|
||||
{
|
||||
private bool Working { get; set; } = false;
|
||||
private bool ShowConfirm = false;
|
||||
|
||||
[Parameter]
|
||||
public string CssClasses { get; set; } = "btn-primary";
|
||||
|
||||
[Parameter]
|
||||
public string Text { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string WorkingText { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public Func<Task>? OnClick { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public RenderFragment ChildContent { get; set; }
|
||||
|
||||
private async Task SetConfirm(bool b)
|
||||
{
|
||||
ShowConfirm = b;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task Do()
|
||||
{
|
||||
Working = true;
|
||||
ShowConfirm = false;
|
||||
StateHasChanged();
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
if (OnClick != null)
|
||||
await OnClick.Invoke();
|
||||
|
||||
Working = false;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
});
|
||||
}
|
||||
}
|
||||
48
Moonlight/Shared/Components/Forms/WButton.razor
Normal file
48
Moonlight/Shared/Components/Forms/WButton.razor
Normal file
@@ -0,0 +1,48 @@
|
||||
@if (!Working)
|
||||
{
|
||||
<button class="btn @(CssClasses)" @onclick="Do">
|
||||
@Text
|
||||
@ChildContent
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class="btn @(CssClasses) disabled" disabled="">
|
||||
<span class="spinner-border spinner-border-sm align-middle me-2"></span>
|
||||
@WorkingText
|
||||
</button>
|
||||
}
|
||||
|
||||
@code
|
||||
{
|
||||
private bool Working { get; set; } = false;
|
||||
|
||||
[Parameter]
|
||||
public string CssClasses { get; set; } = "btn-primary";
|
||||
|
||||
[Parameter]
|
||||
public string Text { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string WorkingText { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public Func<Task>? OnClick { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public RenderFragment ChildContent { get; set; }
|
||||
|
||||
private async Task Do()
|
||||
{
|
||||
Working = true;
|
||||
StateHasChanged();
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
if (OnClick != null)
|
||||
await OnClick.Invoke();
|
||||
|
||||
Working = false;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
@using Moonlight.Shared.Layouts
|
||||
|
||||
<div class="app-sidebar flex-column @(Layout.ShowMobileSidebar ? "drawer drawer-start drawer-on" : "")">
|
||||
<div class="app-sidebar-header d-flex flex-stack d-none d-lg-flex pt-8 pb-2">
|
||||
<a href="/metronic8/demo38/../demo38/index.html" class="app-sidebar-logo">
|
||||
|
||||
70
Moonlight/Shared/Components/Partials/SoftErrorHandler.razor
Normal file
70
Moonlight/Shared/Components/Partials/SoftErrorHandler.razor
Normal file
@@ -0,0 +1,70 @@
|
||||
@using System.Diagnostics
|
||||
@using Moonlight.App.Exceptions
|
||||
@inherits ErrorBoundaryBase
|
||||
|
||||
@if (Crashed)
|
||||
{
|
||||
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") // TODO: Add check for admin perms to show exceptions to admins
|
||||
{
|
||||
if (Exception != null)
|
||||
{
|
||||
<div class="card border border-danger">
|
||||
<div class="card-header">
|
||||
<span class="card-title text-danger fw-bold fs-3">An unhandled exception occured</span>
|
||||
</div>
|
||||
<div class="card-body fw-bold">
|
||||
@(Formatter.FormatLineBreaks(Exception.ToStringDemystified()))
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<h1>Crashed lol :c</h1>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ErrorMessages.Any())
|
||||
{
|
||||
foreach (var errorMessage in ErrorMessages)
|
||||
{
|
||||
<div class="alert alert-danger bg-danger text-white p-3 mb-5 fw-bold">
|
||||
@errorMessage
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@ChildContent
|
||||
}
|
||||
|
||||
@code
|
||||
{
|
||||
private bool Crashed = false;
|
||||
private List<string> ErrorMessages = new();
|
||||
private Exception? Exception;
|
||||
|
||||
protected override Task OnErrorAsync(Exception exception)
|
||||
{
|
||||
if (exception is DisplayException displayException)
|
||||
{
|
||||
ErrorMessages.Add(displayException.Message);
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromSeconds(5));
|
||||
ErrorMessages.Remove(displayException.Message);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Exception = exception;
|
||||
Crashed = true;
|
||||
}
|
||||
|
||||
Recover();
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
@inherits LayoutComponentBase
|
||||
|
||||
<DefaultLayout>
|
||||
@Body
|
||||
<SoftErrorHandler>
|
||||
@Body
|
||||
</SoftErrorHandler>
|
||||
</DefaultLayout>
|
||||
@@ -1,3 +1,20 @@
|
||||
@page "/"
|
||||
@using Moonlight.App.Exceptions
|
||||
|
||||
<h1>Hello, world!</h1>
|
||||
<h1>Hello, world!</h1>
|
||||
|
||||
<ConfirmButton Text="Crash" WorkingText="Crashing" CssClasses="btn-danger" OnClick="Do" />
|
||||
<ConfirmButton Text="Crash" WorkingText="Crashing" CssClasses="btn-danger" OnClick="Do2" />
|
||||
|
||||
@code
|
||||
{
|
||||
private async Task Do()
|
||||
{
|
||||
throw new DisplayException("LOL");
|
||||
}
|
||||
|
||||
private async Task Do2()
|
||||
{
|
||||
throw new FormatException("LOL");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user