Move form state ownership from Home to leaf controls

This commit is contained in:
2026-02-26 09:54:04 +01:00
parent b17490e5ac
commit 4d728f91cf
16 changed files with 315 additions and 143 deletions

View File

@@ -29,7 +29,7 @@
{
<p class="form-error">@CampaignState.ErrorMessage</p>
}
<form class="form-grid" @onsubmit="CreateCampaignSubmitted" @onsubmit:preventDefault>
<form class="form-grid" @onsubmit="SubmitCreateCampaignAsync" @onsubmit:preventDefault>
<label for="campaign-name">Campaign name</label>
<input id="campaign-name" @bind="CampaignState.Model.Name" @bind:event="oninput" />
@if (CampaignState.Errors.TryGetValue("name", out var campaignNameError))
@@ -98,6 +98,8 @@
</main>
@code {
private FormState<CampaignFormModel> CampaignState { get; } = new();
[Parameter]
public IReadOnlyList<CampaignSummary> Campaigns { get; set; } = [];
@@ -110,9 +112,6 @@
[Parameter]
public CampaignDetails? SelectedCampaign { get; set; }
[Parameter]
public FormState<CampaignFormModel> CampaignState { get; set; } = new();
[Parameter]
public IReadOnlyList<RulesetDefinition> Rulesets { get; set; } = [];
@@ -129,11 +128,42 @@
public EventCallback<ChangeEventArgs> CampaignSelectionChanged { get; set; }
[Parameter]
public EventCallback CreateCampaignSubmitted { get; set; }
public Func<CampaignFormModel, Task<FormSubmissionResult>> CreateCampaignSubmitted { get; set; } = _ => Task.FromResult(new FormSubmissionResult());
[Parameter]
public EventCallback CreateCharacterRequested { get; set; }
[Parameter]
public EventCallback<CharacterSummary> EditCharacterRequested { get; set; }
protected override void OnParametersSet()
{
if (string.IsNullOrWhiteSpace(CampaignState.Model.RulesetId) && Rulesets.Count > 0)
{
CampaignState.Model.RulesetId = Rulesets[0].Id;
}
}
private async Task SubmitCreateCampaignAsync()
{
CampaignState.ResetValidation();
var result = await CreateCampaignSubmitted.Invoke(new CampaignFormModel
{
Name = CampaignState.Model.Name,
RulesetId = CampaignState.Model.RulesetId
});
CampaignState.Errors.Clear();
foreach (var (key, value) in result.Errors)
{
CampaignState.Errors[key] = value;
}
CampaignState.ErrorMessage = result.ErrorMessage;
if (result.IsSuccess)
{
CampaignState.Model.Name = string.Empty;
}
}
}