86 lines
3.4 KiB
Plaintext
86 lines
3.4 KiB
Plaintext
@inject WizardState State
|
|
|
|
<div class="step account-step">
|
|
<h1>Set Up Your Account</h1>
|
|
<p class="step-subtitle">Create your daily-use account and administrator credentials.</p>
|
|
|
|
<div class="field-group">
|
|
<label for="username">Daily Username</label>
|
|
<input id="username" type="text" placeholder="e.g. alice"
|
|
value="@State.Username"
|
|
@oninput="OnUsernameInput" />
|
|
@if (_touched.Contains("username") && _errors.TryGetValue("username", out var ue))
|
|
{
|
|
<span class="field-error">@ue</span>
|
|
}
|
|
</div>
|
|
|
|
<div class="field-group">
|
|
<label for="password">Daily Password</label>
|
|
<input id="password" type="password"
|
|
value="@State.Password"
|
|
@oninput="OnPasswordInput" />
|
|
@if (_touched.Contains("password") && _errors.TryGetValue("password", out var pe))
|
|
{
|
|
<span class="field-error">@pe</span>
|
|
}
|
|
</div>
|
|
|
|
<div class="field-group">
|
|
<label for="adminpassword">Administrator Password</label>
|
|
<input id="adminpassword" type="password"
|
|
value="@State.AdminPassword"
|
|
@oninput="OnAdminPasswordInput" />
|
|
@if (_touched.Contains("adminpassword") && _errors.TryGetValue("adminpassword", out var ae))
|
|
{
|
|
<span class="field-error">@ae</span>
|
|
}
|
|
</div>
|
|
|
|
<div class="field-group">
|
|
<label for="bitlockerpin">BitLocker PIN <small>(numeric, 6+ digits)</small></label>
|
|
<input id="bitlockerpin" type="password" inputmode="numeric" pattern="[0-9]*"
|
|
value="@State.BitLockerPin"
|
|
@oninput="OnPinInput" />
|
|
@if (_touched.Contains("bitlockerpin") && _errors.TryGetValue("bitlockerpin", out var be))
|
|
{
|
|
<span class="field-error">@be</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
private readonly Dictionary<string, string> _errors = new();
|
|
private readonly HashSet<string> _touched = new();
|
|
|
|
/// <summary>True when all fields are valid. Used by the wizard host to gate Next.</summary>
|
|
public bool IsValid { get; private set; }
|
|
|
|
protected override void OnInitialized() => Validate();
|
|
|
|
private void OnUsernameInput(ChangeEventArgs e) { State.Username = e.Value?.ToString() ?? ""; _touched.Add("username"); Validate(); }
|
|
private void OnPasswordInput(ChangeEventArgs e) { State.Password = e.Value?.ToString() ?? ""; _touched.Add("password"); Validate(); }
|
|
private void OnAdminPasswordInput(ChangeEventArgs e) { State.AdminPassword = e.Value?.ToString() ?? ""; _touched.Add("adminpassword"); Validate(); }
|
|
private void OnPinInput(ChangeEventArgs e) { State.BitLockerPin = e.Value?.ToString() ?? ""; _touched.Add("bitlockerpin"); Validate(); }
|
|
|
|
void Validate()
|
|
{
|
|
_errors.Clear();
|
|
|
|
if (string.IsNullOrWhiteSpace(State.Username))
|
|
_errors["username"] = "Daily username is required.";
|
|
|
|
if (string.IsNullOrWhiteSpace(State.Password))
|
|
_errors["password"] = "Password is required.";
|
|
|
|
if (string.IsNullOrWhiteSpace(State.AdminPassword))
|
|
_errors["adminpassword"] = "Administrator password is required.";
|
|
|
|
var pin = State.BitLockerPin ?? "";
|
|
if (!System.Text.RegularExpressions.Regex.IsMatch(pin, @"^\d{6,}$"))
|
|
_errors["bitlockerpin"] = "BitLocker PIN must be all digits and at least 6 digits long.";
|
|
|
|
IsValid = _errors.Count == 0;
|
|
}
|
|
}
|