#17 Make configuration eidtable at runtime #18

Merged
henry merged 4 commits from edit-config-runtime into main 2025-05-18 03:21:26 +00:00
1 changed files with 80 additions and 88 deletions
Showing only changes of commit 7cb1f0a34c - Show all commits

View File

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