diff --git a/src/Ngino.Server/ReverseProxyEndpoint.cs b/src/Ngino.Server/ReverseProxyEndpoint.cs index 5d98f2d..e48c88f 100644 --- a/src/Ngino.Server/ReverseProxyEndpoint.cs +++ b/src/Ngino.Server/ReverseProxyEndpoint.cs @@ -373,9 +373,13 @@ internal static class ReverseProxyEndpoint private static string GetClientDisabledMessage(string clientId, ClientAccess access) { + var reason = string.IsNullOrWhiteSpace(access.DisabledReason) + ? "" + : $" Reason: {access.DisabledReason.Trim()}."; + if (access.DisabledManually) { - return $"Tunnel client '{clientId}' is disabled until it is enabled manually."; + return $"Tunnel client '{clientId}' is disabled until it is enabled manually.{reason}"; } if (access.DisabledUntilUtc is { } disabledUntil) @@ -383,12 +387,12 @@ internal static class ReverseProxyEndpoint var from = access.DisabledFromUtc is { } fromUtc ? $" (scheduled from {fromUtc:O})" : ""; - return $"Tunnel client '{clientId}' is disabled until {disabledUntil:O}.{from}"; + return $"Tunnel client '{clientId}' is disabled until {disabledUntil:O}.{from}{reason}"; } return access.DisabledFromUtc is { } fromUtc2 - ? $"Tunnel client '{clientId}' is disabled (scheduled from {fromUtc2:O})." - : $"Tunnel client '{clientId}' is disabled."; + ? $"Tunnel client '{clientId}' is disabled (scheduled from {fromUtc2:O}).{reason}" + : $"Tunnel client '{clientId}' is disabled.{reason}"; } private static async Task GetRequestedModelAsync(HttpRequest request, PathString proxyPath) diff --git a/src/Ngino.Server/wwwroot/admin/app.js b/src/Ngino.Server/wwwroot/admin/app.js index b7f0ecd..558cc7b 100644 --- a/src/Ngino.Server/wwwroot/admin/app.js +++ b/src/Ngino.Server/wwwroot/admin/app.js @@ -1665,16 +1665,20 @@ function emptyState(text) { } function disabledText(client) { + var text = ""; if (client.disabledManually) { - return "Until enabled manually"; + text = "Until enabled manually"; + } else if (client.disabledUntilUtc) { + text = `Until ${formatDate(client.disabledUntilUtc)}`; + } else if (isScheduled(client)) { + text = `Scheduled from ${formatDate(client.disabledFromUtc)}`; + } else { + text = "Disabled"; } - if (client.disabledUntilUtc) { - return `Until ${formatDate(client.disabledUntilUtc)}`; + if (client.disabledReason) { + text += ` — ${escapeHtml(client.disabledReason)}`; } - if (isScheduled(client)) { - return `Scheduled from ${formatDate(client.disabledFromUtc)}`; - } - return "Disabled"; + return text; } function isScheduled(client) { @@ -1793,6 +1797,7 @@ function showDisableModal(clientId) { function updateWhen() { const val = overlay.querySelector('input[name="d-when"]:checked').value; + fromInput.style.display = val === "later" ? "" : "none"; fromInput.disabled = val !== "later"; if (val === "now") fromInput.value = ""; }