From d0bb0f709a64b19b6758deca5c4b77910561d90a Mon Sep 17 00:00:00 2001 From: Duy Dao Date: Sat, 12 Jul 2025 10:55:04 +0700 Subject: [PATCH] feat: allow searching by server name --- .../CaddyReverseProxiesPage.razor | 5 ++- .../CaddyReverseProxiesPage.razor.cs | 26 ++++++------ .../CaddyReverseProxyItem.razor | 5 ++- .../CaddyReverseProxyItem.razor.cs | 42 +++---------------- CaddyManager/Contracts/Caddy/ICaddyService.cs | 2 +- .../Models/Caddy/CaddyConfigurationInfo.cs | 5 +++ CaddyManager/Services/Caddy/CaddyService.cs | 15 ++++--- 7 files changed, 42 insertions(+), 58 deletions(-) diff --git a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor index 40df286..0589609 100644 --- a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor @@ -1,5 +1,6 @@ @page "/" @attribute [StreamRendering] +@using CaddyManager.Models.Caddy Reverse proxy configurations @@ -24,11 +25,11 @@ AdornmentIcon="@(string.IsNullOrWhiteSpace(_debouncedText) ? Icons.Material.Filled.Search : Icons.Material.Filled.Close)" OnAdornmentClick="HandleSearchBarAdornmentClick" /> - @foreach (var (index, caddyConfig) in _availableCaddyConfigurations.Index()) { - + @if (index < _availableCaddyConfigurations.Count - 1) { diff --git a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs index 73e7dbb..87a7314 100644 --- a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxiesPage.razor.cs @@ -2,9 +2,11 @@ using System.Globalization; using CaddyManager.Components.Pages.Generic; using CaddyManager.Contracts.Caddy; using CaddyManager.Contracts.Docker; +using CaddyManager.Models.Caddy; using Humanizer; using Microsoft.AspNetCore.Components; using MudBlazor; +using CaddyfileEditorComponent = CaddyManager.Components.Pages.Caddy.CaddyfileEditor.CaddyfileEditor; namespace CaddyManager.Components.Pages.Caddy.CaddyReverseProxies; @@ -15,8 +17,8 @@ namespace CaddyManager.Components.Pages.Caddy.CaddyReverseProxies; public partial class CaddyReverseProxiesPage : ComponentBase { private bool _isProcessing; - private List _availableCaddyConfigurations = []; - private IReadOnlyCollection _selectedCaddyConfigurations = []; + private List _availableCaddyConfigurations = []; + private IReadOnlyCollection _selectedCaddyConfigurations = []; private string _debouncedText = string.Empty; [Inject] private ICaddyService CaddyService { get; set; } = null!; @@ -41,14 +43,14 @@ public partial class CaddyReverseProxiesPage : ComponentBase /// private async Task NewReverseProxy() { - var dialog = await DialogService.ShowAsync("New configuration", - options: new MudBlazor.DialogOptions + var dialog = await DialogService.ShowAsync("New configuration", + options: new DialogOptions { FullWidth = true, - MaxWidth = MudBlazor.MaxWidth.Medium - }, parameters: new MudBlazor.DialogParameters + MaxWidth = MaxWidth.Medium + }, parameters: new DialogParameters { - { "FileName", string.Empty } + { p => p.FileName, string.Empty } }); var result = await dialog.Result; @@ -66,9 +68,9 @@ public partial class CaddyReverseProxiesPage : ComponentBase private void Refresh() { var notSearching = string.IsNullOrWhiteSpace(_debouncedText); - _availableCaddyConfigurations = CaddyService.GetExistingCaddyConfigurations() - .Where(confName => notSearching || confName.Contains(_debouncedText, StringComparison.OrdinalIgnoreCase)) - .ToList(); + _availableCaddyConfigurations = [..CaddyService.GetExistingCaddyConfigurations() + .Where(conf => notSearching || conf.FileName.Contains(_debouncedText, StringComparison.OrdinalIgnoreCase) || conf.ReverseProxyHostname.Contains(_debouncedText, StringComparison.OrdinalIgnoreCase)) + .OrderBy(conf => conf.FileName)]; StateHasChanged(); } @@ -93,10 +95,10 @@ public partial class CaddyReverseProxiesPage : ComponentBase { p => p.OnConfirm, EventCallback.Factory.Create(this, () => { - var response = CaddyService.DeleteCaddyConfigurations(_selectedCaddyConfigurations.ToList()); + var response = CaddyService.DeleteCaddyConfigurations(_selectedCaddyConfigurations.Select(c => c.FileName).ToList()); _selectedCaddyConfigurations = - _selectedCaddyConfigurations.Except(response.DeletedConfigurations).ToList(); + _selectedCaddyConfigurations.Where(c => !response.DeletedConfigurations.Contains(c.FileName)).ToList(); if (response.Success) { diff --git a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor index 6c28dac..e830624 100644 --- a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor @@ -1,10 +1,11 @@ @using Humanizer +@using CaddyManager.Models.Caddy @attribute [StreamRendering] - + - @FileName + @ConfigurationInfo.FileName @ConfigurationInfo.ReverseProxyHostname diff --git a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs index 938da40..6cc4420 100644 --- a/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs +++ b/CaddyManager/Components/Pages/Caddy/CaddyReverseProxies/CaddyReverseProxyItem.razor.cs @@ -11,48 +11,20 @@ namespace CaddyManager.Components.Pages.Caddy.CaddyReverseProxies; /// public partial class CaddyReverseProxyItem : ComponentBase { - /// - /// File path of the Caddy configuration file - /// - [Parameter] - public string FileName { get; set; } = string.Empty; - /// /// Callback to refresh the Caddy reverse proxies on the main page /// [Parameter] public EventCallback OnCaddyRestartRequired { get; set; } + [Parameter] + public CaddyConfigurationInfo ConfigurationInfo { get; set; } = null!; + /// /// Dialog service for showing the Caddy file editor dialog /// [Inject] private IDialogService DialogService { get; set; } = null!; - - /// - /// Caddy service for getting the Caddy configuration file information - /// - [Inject] - private ICaddyService CaddyService { get; set; } = null!; - - private CaddyConfigurationInfo ConfigurationInfo { get; set; } = new(); - - /// - /// Refresh the current state of the component. - /// - private void Refresh() - { - ConfigurationInfo = CaddyService.GetCaddyConfigurationInfo(FileName); - StateHasChanged(); - } - - /// - protected override void OnAfterRender(bool firstRender) - { - if (!firstRender) return; - - Refresh(); - } /// /// Show the Caddy file editor dialog @@ -63,10 +35,10 @@ public partial class CaddyReverseProxyItem : ComponentBase var dialog = await DialogService.ShowAsync("Caddy file", options: new DialogOptions { FullWidth = true, - MaxWidth = MaxWidth.Medium, - }, parameters: new DialogParameters + MaxWidth = MudBlazor.MaxWidth.Medium, + }, parameters: new MudBlazor.DialogParameters { - { "FileName", FileName } + { "FileName", ConfigurationInfo.FileName } }); var result = await dialog.Result; @@ -75,7 +47,5 @@ public partial class CaddyReverseProxyItem : ComponentBase { await OnCaddyRestartRequired.InvokeAsync(); } - - Refresh(); } } \ No newline at end of file diff --git a/CaddyManager/Contracts/Caddy/ICaddyService.cs b/CaddyManager/Contracts/Caddy/ICaddyService.cs index 56a890b..757b06d 100644 --- a/CaddyManager/Contracts/Caddy/ICaddyService.cs +++ b/CaddyManager/Contracts/Caddy/ICaddyService.cs @@ -11,7 +11,7 @@ public interface ICaddyService /// Returns the existing Caddy configurations within the configured directory /// /// - List GetExistingCaddyConfigurations(); + List GetExistingCaddyConfigurations(); /// /// Method to get the content of a Caddy configuration file by its name diff --git a/CaddyManager/Models/Caddy/CaddyConfigurationInfo.cs b/CaddyManager/Models/Caddy/CaddyConfigurationInfo.cs index abfabd5..cc9a62e 100644 --- a/CaddyManager/Models/Caddy/CaddyConfigurationInfo.cs +++ b/CaddyManager/Models/Caddy/CaddyConfigurationInfo.cs @@ -19,4 +19,9 @@ public class CaddyConfigurationInfo /// Ports being used with the reverse proxy hostname /// public List ReverseProxyPorts { get; set; } = []; + + /// + /// The name of the configuration file. + /// + public string FileName { get; set; } = string.Empty; } \ No newline at end of file diff --git a/CaddyManager/Services/Caddy/CaddyService.cs b/CaddyManager/Services/Caddy/CaddyService.cs index 000210e..0109736 100644 --- a/CaddyManager/Services/Caddy/CaddyService.cs +++ b/CaddyManager/Services/Caddy/CaddyService.cs @@ -18,18 +18,23 @@ public class CaddyService( private CaddyServiceConfigurations Configurations => configurationsService.Get(); /// - public List GetExistingCaddyConfigurations() + public List GetExistingCaddyConfigurations() { if (!Directory.Exists(Configurations.ConfigDir)) { Directory.CreateDirectory(Configurations.ConfigDir); } - return Directory.GetFiles(Configurations.ConfigDir) + return [.. Directory.GetFiles(Configurations.ConfigDir) .Where(filePath => Path.GetFileName(filePath) != CaddyGlobalConfigName) - .Select(Path.GetFileNameWithoutExtension) - .Order() - .ToList()!; + .Select(filePath => + { + var fileName = Path.GetFileNameWithoutExtension(filePath); + var info = GetCaddyConfigurationInfo(fileName); + info.FileName = fileName; + return info; + }) + .OrderBy(info => info.FileName)]; } ///