Compare commits

..

No commits in common. "7cb1f0a34c3497b970ac9c2b007b28f43aad0a76" and "aa8e4942119faaa492b3b6b9d8b9fd98691126f6" have entirely different histories.

4 changed files with 97 additions and 90 deletions

View File

@ -5,92 +5,100 @@
<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" @bind-Value="config.CapacityLimit" Type="TextInputType.Number" /> <TextInput Id="capacityLimit" Value="@capacityLimitInput" ValueChanged="@((string? v) => capacityLimitInput = v)" ValueExpression="@(() => capacityLimitInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.CapacityLimit))" />
@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" @bind-Value="config.ActivitySeconds" Type="TextInputType.Number" /> <TextInput Id="activitySeconds" Value="@activitySecondsInput" ValueChanged="@((string? v) => activitySecondsInput = v)" ValueExpression="@(() => activitySecondsInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.ActivitySeconds))" />
@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" @bind-Value="config.ExpirationSeconds" Type="TextInputType.Number" /> <TextInput Id="expirationSeconds" Value="@expirationSecondsInput" ValueChanged="@((string? v) => expirationSecondsInput = v)" ValueExpression="@(() => expirationSecondsInput)" Type="TextInputType.Number" OnInput="e => OnInputChanged(e, nameof(config.ExpirationSeconds))" />
@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-Value="config.RollingExpiration" Label="Rolling Expiration" /> <Switch Id="rollingExpiration" @bind-Checked="rollingExpirationSwitch" Label="Rolling Expiration" />
</div> </div>
<Button Type="ButtonType.Submit" Color="ButtonColor.Primary">Save</Button> <Button Type="ButtonType.Submit" Color="ButtonColor.Primary" Disabled="@(!IsFormValid)">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 ConfigModel config = new(); private AccessQueueService.Models.AccessQueueConfig config = new();
private bool isCapacityLimitValid = true; private string? capacityLimitInput;
private bool isActivitySecondsValid = true; private string? activitySecondsInput;
private bool isExpirationSecondsValid = true; private string? expirationSecondsInput;
private string? successMessage; private bool rollingExpirationSwitch;
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 = new ConfigModel config = current.Clone();
{ capacityLimitInput = config.CapacityLimit?.ToString();
ActivitySeconds = (current.ActivitySeconds ?? 0).ToString(), activitySecondsInput = config.ActivitySeconds?.ToString();
CapacityLimit = (current.CapacityLimit ?? 0).ToString(), expirationSecondsInput = config.ExpirationSeconds?.ToString();
ExpirationSeconds = (current.ExpirationSeconds ?? 0).ToString(), rollingExpirationSwitch = config.RollingExpiration ?? true;
RollingExpiration = current.RollingExpiration ?? false ValidateInputs();
}; }
ValidateInputs();
}
private bool IsFormValid => isCapacityLimitValid && isActivitySecondsValid && isExpirationSecondsValid; private bool IsFormValid => isCapacityLimitValid && isActivitySecondsValid && isExpirationSecondsValid;
private void ValidateInputs() private void ValidateInputs()
{ {
isCapacityLimitValid = int.TryParse(config.CapacityLimit, out var cap) && cap > 0; isCapacityLimitValid = int.TryParse(capacityLimitInput, out var cap) && cap > 0;
isActivitySecondsValid = int.TryParse(config.ActivitySeconds, out var act) && act > 0; isActivitySecondsValid = int.TryParse(activitySecondsInput, out var act) && act > 0;
isExpirationSecondsValid = int.TryParse(config.ExpirationSeconds, out var exp) && exp > 0; isExpirationSecondsValid = int.TryParse(expirationSecondsInput, out var exp) && exp > 0;
} }
private async Task HandleValidSubmit() private async Task HandleValidSubmit()
{ {
successMessage = null; ValidateInputs();
ValidateInputs(); if (!IsFormValid)
if (!IsFormValid) return;
return; config.CapacityLimit = int.Parse(capacityLimitInput!);
await Task.Run(() => QueueManager.UpdateConfig(new () config.ActivitySeconds = int.Parse(activitySecondsInput!);
{ config.ExpirationSeconds = int.Parse(expirationSecondsInput!);
ActivitySeconds = int.Parse(config.ActivitySeconds), config.RollingExpiration = rollingExpirationSwitch;
CapacityLimit = int.Parse(config.CapacityLimit), await Task.Run(() => QueueManager.UpdateConfig(config));
ExpirationSeconds = int.Parse(config.ExpirationSeconds), successMessage = "Configuration updated successfully.";
RollingExpiration = config.RollingExpiration }
}));
successMessage = "Configuration updated successfully.";
}
public class ConfigModel private void OnInputChanged(ChangeEventArgs e, string field)
{ {
public string CapacityLimit { get; set; } = ""; switch (field)
public string ActivitySeconds { get; set; } = ""; {
public string ExpirationSeconds { get; set; } = ""; case nameof(config.CapacityLimit):
public bool RollingExpiration { get; set; } capacityLimitInput = e.Value?.ToString();
} break;
case nameof(config.ActivitySeconds):
activitySecondsInput = e.Value?.ToString();
break;
case nameof(config.ExpirationSeconds):
expirationSecondsInput = e.Value?.ToString();
break;
}
ValidateInputs();
}
} }

View File

@ -18,14 +18,13 @@
</p> </p>
} }
<p> <p>
<Button Color="ButtonColor.Success" @onclick="() => AddUser(true)">Add Active User</Button> <Button Color="ButtonColor.Success" @onclick="AddUser">Add User</Button>
<Button Color="ButtonColor.Success" Outline @onclick="() => AddUser(false)">Add Inctive User</Button>
<Button Color="ButtonColor.Danger" @onclick="RevokeAllAccess">Revoke All</Button> <Button Color="ButtonColor.Danger" @onclick="RevokeAllAccess">Revoke All</Button>
<Button Color="ButtonColor.Warning" @onclick="Reset">Reset Data</Button> <Button Color="ButtonColor.Warning" @onclick="Reset">Reset Data</Button>
</p> </p>
@if (Status != null) @if (Status != null)
{ {
<h4>Users with access</h4> <h2>Users with access</h2>
<Grid TItem="User" Data="Status.AccessUsers" Class="table table-bordered mt-3" AllowSorting> <Grid TItem="User" Data="Status.AccessUsers" Class="table table-bordered mt-3" AllowSorting>
<GridColumns> <GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id"> <GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id">
@ -46,7 +45,7 @@
</GridColumn> </GridColumn>
</GridColumns> </GridColumns>
</Grid> </Grid>
<h4>Users in queue</h4> <h2>Users in queue</h2>
<Grid TItem="User" Data="Status.QueuedUsers" Class="table table-bordered mt-3"> <Grid TItem="User" Data="Status.QueuedUsers" Class="table table-bordered mt-3">
<GridColumns> <GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id"> <GridColumn TItem="User" HeaderText="Id" PropertyName="Id">
@ -67,7 +66,7 @@
</GridColumn> </GridColumn>
</GridColumns> </GridColumns>
</Grid> </Grid>
<h4>Inactive users</h4> <h2>Inactive users</h2>
<Grid TItem="User" Data="Status.InactiveUsers" Class="table table-bordered mt-3" AllowSorting> <Grid TItem="User" Data="Status.InactiveUsers" Class="table table-bordered mt-3" AllowSorting>
<GridColumns> <GridColumns>
<GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id"> <GridColumn TItem="User" HeaderText="Id" PropertyName="Id" SortKeySelector="item => item.Id">
@ -101,9 +100,9 @@
}); });
} }
public void AddUser(bool isActive) public void AddUser()
{ {
Manager.AddUser(isActive); Manager.AddUser();
Status = Manager.GetStatus(); Status = Manager.GetStatus();
} }

View File

@ -36,13 +36,13 @@ namespace AccessQueuePlayground.Services
_accessService.UpdateConfiguration(config); _accessService.UpdateConfiguration(config);
} }
public Guid AddUser(bool isActive) public Guid AddUser()
{ {
var id = Guid.NewGuid(); var id = Guid.NewGuid();
_users[id] = new User _users[id] = new User
{ {
Id = id, Id = id,
Active = isActive, Active = false,
}; };
return id; return id;
} }

View File

@ -10,7 +10,7 @@ namespace AccessQueuePlayground.Services
public void UpdateConfig(AccessQueueConfig config); public void UpdateConfig(AccessQueueConfig config);
public Task RecalculateStatus(); public Task RecalculateStatus();
public AccessQueueStatus GetStatus(); public AccessQueueStatus GetStatus();
public Guid AddUser(bool isActive); public Guid AddUser();
public void SetUserActive(Guid userId, bool isActive); public void SetUserActive(Guid userId, bool isActive);
public void RevokeAccess(Guid userId); public void RevokeAccess(Guid userId);
public void RevokeAllAccess(); public void RevokeAllAccess();