Initial pass on adding config page

This commit is contained in:
Henry Hobbs 2025-05-17 22:27:42 -04:00
parent 91afb0dd8e
commit aa8e494211
2 changed files with 107 additions and 0 deletions

View File

@ -14,6 +14,9 @@
<li class="nav-item">
<a class="nav-link" href="/about">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/config">Config</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://git.hobbs.zone/henry/AccessQueueService" target="_blank" rel="noopener">Source</a>
</li>

View File

@ -0,0 +1,104 @@
@page "/config"
@inject AccessQueuePlayground.Services.IAccessQueueManager QueueManager
@using BlazorBootstrap
<h3>Access Queue Configuration</h3>
<EditForm Model="config" OnValidSubmit="HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="mb-3">
<label for="capacityLimit">Capacity Limit</label>
<TextInput Id="capacityLimit" Value="@capacityLimitInput" ValueChanged="@((string? v) => capacityLimitInput = v)" ValueExpression="@(() => capacityLimitInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.CapacityLimit))" />
@if (!isCapacityLimitValid)
{
<div class="text-danger">Please enter a positive integer.</div>
}
</div>
<div class="mb-3">
<label for="activitySeconds">Activity Seconds</label>
<TextInput Id="activitySeconds" Value="@activitySecondsInput" ValueChanged="@((string? v) => activitySecondsInput = v)" ValueExpression="@(() => activitySecondsInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.ActivitySeconds))" />
@if (!isActivitySecondsValid)
{
<div class="text-danger">Please enter a positive integer.</div>
}
</div>
<div class="mb-3">
<label for="expirationSeconds">Expiration Seconds</label>
<TextInput Id="expirationSeconds" Value="@expirationSecondsInput" ValueChanged="@((string? v) => expirationSecondsInput = v)" ValueExpression="@(() => expirationSecondsInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.ExpirationSeconds))" />
@if (!isExpirationSecondsValid)
{
<div class="text-danger">Please enter a positive integer.</div>
}
</div>
<div class="mb-3">
<Switch Id="rollingExpiration" @bind-Checked="rollingExpirationSwitch" Label="Rolling Expiration" />
</div>
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary" Disabled="@(!IsFormValid)">Save</Button>
@if (successMessage != null)
{
<Alert Color="AlertColor.Success" Class="mt-3">@successMessage</Alert>
}
</EditForm>
@code {
private AccessQueueService.Models.AccessQueueConfig config = new();
private string? capacityLimitInput;
private string? activitySecondsInput;
private string? expirationSecondsInput;
private bool rollingExpirationSwitch;
private bool isCapacityLimitValid = true;
private bool isActivitySecondsValid = true;
private bool isExpirationSecondsValid = true;
private string? successMessage;
protected override void OnInitialized()
{
var current = QueueManager.GetConfig();
config = current.Clone();
capacityLimitInput = config.CapacityLimit?.ToString();
activitySecondsInput = config.ActivitySeconds?.ToString();
expirationSecondsInput = config.ExpirationSeconds?.ToString();
rollingExpirationSwitch = config.RollingExpiration ?? true;
ValidateInputs();
}
private bool IsFormValid => isCapacityLimitValid && isActivitySecondsValid && isExpirationSecondsValid;
private void ValidateInputs()
{
isCapacityLimitValid = int.TryParse(capacityLimitInput, out var cap) && cap > 0;
isActivitySecondsValid = int.TryParse(activitySecondsInput, out var act) && act > 0;
isExpirationSecondsValid = int.TryParse(expirationSecondsInput, out var exp) && exp > 0;
}
private async Task HandleValidSubmit()
{
ValidateInputs();
if (!IsFormValid)
return;
config.CapacityLimit = int.Parse(capacityLimitInput!);
config.ActivitySeconds = int.Parse(activitySecondsInput!);
config.ExpirationSeconds = int.Parse(expirationSecondsInput!);
config.RollingExpiration = rollingExpirationSwitch;
await Task.Run(() => QueueManager.UpdateConfig(config));
successMessage = "Configuration updated successfully.";
}
private void OnInputChanged(ChangeEventArgs e, string field)
{
switch (field)
{
case nameof(config.CapacityLimit):
capacityLimitInput = e.Value?.ToString();
break;
case nameof(config.ActivitySeconds):
activitySecondsInput = e.Value?.ToString();
break;
case nameof(config.ExpirationSeconds):
expirationSecondsInput = e.Value?.ToString();
break;
}
ValidateInputs();
}
}