diff --git a/CaddyManager/CaddyManager.csproj b/CaddyManager/CaddyManager.csproj index 4e70ac2..9eccf9c 100644 --- a/CaddyManager/CaddyManager.csproj +++ b/CaddyManager/CaddyManager.csproj @@ -27,8 +27,9 @@ - - + + + diff --git a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor similarity index 95% rename from CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor rename to CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor index 49f8516..a0c5c67 100644 --- a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor @@ -23,7 +23,7 @@ @bind-SelectedValues="_selectedCaddyConfigurations"> @foreach (var caddyConfig in _availableCaddyConfigurations) { - + } \ No newline at end of file diff --git a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor.cs b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs similarity index 52% rename from CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor.cs rename to CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs index 1ea7f0f..9b32781 100644 --- a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxiesPage.razor.cs +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs @@ -1,27 +1,25 @@ +using System.Globalization; +using CaddyManager.Components.Pages.Generic; using CaddyManager.Contracts.Caddy; using CaddyManager.Contracts.Docker; using Microsoft.AspNetCore.Components; using MudBlazor; -namespace CaddyManager.Components.Pages.Caddy.ReverseProxies; +namespace CaddyManager.Components.Pages.Caddy.CaddyReverseProxies; -public partial class ReverseProxiesPage : ComponentBase +public partial class CaddyReverseProxiesPage : ComponentBase { private bool _isProcessing; private List _availableCaddyConfigurations = []; private IReadOnlyCollection _selectedCaddyConfigurations = []; - - [Inject] - private ICaddyService CaddyService { get; set; } = null!; - - [Inject] - private IDockerService DockerService { get; set; } = null!; - - [Inject] - private IDialogService DialogService { get; set; } = null!; - - [Inject] - private ISnackbar Snackbar { get; set; } = null!; + + [Inject] private ICaddyService CaddyService { get; set; } = null!; + + [Inject] private IDockerService DockerService { get; set; } = null!; + + [Inject] private IDialogService DialogService { get; set; } = null!; + + [Inject] private ISnackbar Snackbar { get; set; } = null!; protected override void OnAfterRender(bool firstRender) { @@ -46,15 +44,15 @@ public partial class ReverseProxiesPage : ComponentBase { { "FileName", string.Empty } }); - + var result = await dialog.Result; - + if (result is { Data: bool, Canceled: false } && (bool)result.Data) { Refresh(); } } - + /// /// Get the latest information from the server /// @@ -63,27 +61,51 @@ public partial class ReverseProxiesPage : ComponentBase _availableCaddyConfigurations = CaddyService.GetExistingCaddyConfigurations(); StateHasChanged(); } - + /// /// Have the selected configurations be deleted /// - private void Delete() + private Task Delete() { - var response = CaddyService.DeleteCaddyConfigurations(_selectedCaddyConfigurations.ToList()); - - _selectedCaddyConfigurations = _selectedCaddyConfigurations.Except(response.DeletedConfigurations).ToList(); - - if (response.Success) + var confWord = _selectedCaddyConfigurations.Count > 1 ? "configurations" : "configuration"; + + return DialogService.ShowAsync($"Delete {confWord}", options: new DialogOptions { - Snackbar.Add("Configuration(s) deleted successfully", Severity.Success); - Refresh(); - } - else + FullWidth = true, + MaxWidth = MaxWidth.ExtraSmall, + }, parameters: new DialogParameters { - Snackbar.Add(response.Message, Severity.Error); - } + { + "Message", + $"Are you sure you want to delete the selected {confWord}?" + }, + { + "OnConfirm", EventCallback.Factory.Create(this, () => + { + var response = CaddyService.DeleteCaddyConfigurations(_selectedCaddyConfigurations.ToList()); + + _selectedCaddyConfigurations = + _selectedCaddyConfigurations.Except(response.DeletedConfigurations).ToList(); + + if (response.Success) + { + Snackbar.Add( + $"{CultureInfo.InvariantCulture.TextInfo.ToTitleCase(confWord)} deleted successfully", + Severity.Success); + Refresh(); + } + else + { + Snackbar.Add(response.Message, Severity.Error); + } + }) + }, + { "ConfirmText", "Yes" }, + { "ConfirmColor", Color.Error }, + { "CancelText", "No" } + }); } - + /// /// Restart the Caddy container /// diff --git a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxyItem.razor b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor similarity index 100% rename from CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxyItem.razor rename to CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor diff --git a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxyItem.razor.cs b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs similarity index 85% rename from CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxyItem.razor.cs rename to CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs index 67ccd2c..c472eea 100644 --- a/CaddyManager/Components/Pages/Caddy/ReverseProxies/ReverseProxyItem.razor.cs +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs @@ -2,9 +2,9 @@ using CaddyManager.Contracts.Caddy; using Microsoft.AspNetCore.Components; using MudBlazor; -namespace CaddyManager.Components.Pages.Caddy.ReverseProxies; +namespace CaddyManager.Components.Pages.Caddy.CaddyReverseProxies; -public partial class ReverseProxyItem : ComponentBase +public partial class CaddyReverseProxyItem : ComponentBase { /// /// File path of the Caddy configuration file diff --git a/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor b/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor new file mode 100644 index 0000000..187b044 --- /dev/null +++ b/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor @@ -0,0 +1,9 @@ + + + @Message + + + @CancelText + @ConfirmText + + \ No newline at end of file diff --git a/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor.cs b/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor.cs new file mode 100644 index 0000000..0937c35 --- /dev/null +++ b/CaddyManager/Components/Pages/Generic/ConfirmationDialog.razor.cs @@ -0,0 +1,64 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace CaddyManager.Components.Pages.Generic; + +public partial class ConfirmationDialog : ComponentBase +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + /// + /// The message to display to the user, to be set in the body of the dialog + /// + [Parameter] + public string Message { get; set; } = string.Empty; + + /// + /// Callback when the user confirms the action. The dialog will close after this callback is invoked. + /// + [Parameter] + public EventCallback OnConfirm { get; set; } = EventCallback.Empty; + + /// + /// Callback when the user cancels the action. The dialog will close after this callback is invoked. + /// + [Parameter] + public EventCallback OnCancel { get; set; } = EventCallback.Empty; + + /// + /// The text to display on the confirm button + /// + [Parameter] + public string ConfirmText { get; set; } = "Confirm"; + + /// + /// The color of the confirm button + /// + [Parameter] + public Color ConfirmColor { get; set; } = Color.Primary; + + /// + /// The text to display on the cancel button + /// + [Parameter] + public string CancelText { get; set; } = "Cancel"; + + /// + /// Perform the confirmation action + /// + private async Task Confirm() + { + await OnConfirm.InvokeAsync(); + MudDialog.Close(); + } + + /// + /// Cancel the cancel action + /// + private async Task Cancel() + { + await OnCancel.InvokeAsync(); + MudDialog.Close(); + } +} \ No newline at end of file diff --git a/CaddyManager/Components/Pages/Error.razor b/CaddyManager/Components/Pages/Generic/Error.razor similarity index 100% rename from CaddyManager/Components/Pages/Error.razor rename to CaddyManager/Components/Pages/Generic/Error.razor