From 777befdbf031bcc821fb77a66bc3fa94158f9080 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 5 May 2026 00:56:41 +0200 Subject: [PATCH] fix: sync custom roll visibility --- .../HomeControls/CampaignLogPanel.razor.cs | 6 +++++- .../Pages/PlayWorkspaceContent.razor | 19 ++++++++++++++++++- tests/e2e/smoke.js | 9 ++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs index cb1deae..839e51d 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs @@ -171,6 +171,8 @@ public partial class CampaignLogPanel [Parameter] public string RollVisibility { get; set; } = "public"; + [Parameter] public Func? ResolveRollVisibility { get; set; } + [Parameter] public bool IsMutating { get; set; } [Parameter] public EventCallback CustomRollCreated { get; set; } @@ -214,7 +216,9 @@ public partial class CampaignLogPanel string.Equals(NormalizedRollVisibility, "private", StringComparison.OrdinalIgnoreCase) ? "Private" : "Public"; private string NormalizedRollVisibility => - string.Equals(RollVisibility, "private", StringComparison.OrdinalIgnoreCase) ? "private" : "public"; + string.Equals(ResolveRollVisibility?.Invoke() ?? RollVisibility, "private", StringComparison.OrdinalIgnoreCase) + ? "private" + : "public"; private string CustomRollExpression { diff --git a/RpgRoller/Components/Pages/PlayWorkspaceContent.razor b/RpgRoller/Components/Pages/PlayWorkspaceContent.razor index 80482a2..dc43484 100644 --- a/RpgRoller/Components/Pages/PlayWorkspaceContent.razor +++ b/RpgRoller/Components/Pages/PlayWorkspaceContent.razor @@ -12,7 +12,7 @@ SelectedCharacterSkillGroups="Workspace.State.PlaySelectedCharacterSkillGroups" SelectedCampaignRulesetId="@(Workspace.State.PlaySelectedCampaign?.RulesetId ?? string.Empty)" RollVisibility="Workspace.State.RollVisibility" - RollVisibilityChanged="Workspace.Session.OnRollVisibilityChangedAsync" + RollVisibilityChanged="OnRollVisibilityChangedAsync" OwnerLabel="Workspace.State.OwnerLabel" SkillDefinitionLabel="Workspace.State.SkillDefinitionLabel" CanEditCharacter="Workspace.Campaigns.CanEditCharacter" @@ -37,6 +37,7 @@ SelectedCharacterName="@(Workspace.State.PlaySelectedCharacter?.Name)" SelectedCampaignRulesetId="@(Workspace.State.PlaySelectedCampaign?.RulesetId ?? string.Empty)" RollVisibility="Workspace.State.RollVisibility" + ResolveRollVisibility="ResolveRollVisibility" IsMutating="Workspace.State.IsMutating" ToggleRollDetailRequested="Workspace.Play.ToggleRollDetailAsync" ResolveRollDetail="Workspace.Play.ResolveRollDetail" @@ -74,4 +75,20 @@ [Parameter, EditorRequired] public WorkspacePageContext Workspace { get; set; } = null!; private bool IsCampaignDataLoading => !Workspace.HasSessionInitialized || Workspace.State.IsCampaignDataLoading; + + private async Task OnRollVisibilityChangedAsync(string visibility) + { + var normalizedVisibility = string.Equals(visibility, "private", StringComparison.OrdinalIgnoreCase) + ? "private" + : "public"; + + Workspace.State.RollVisibility = normalizedVisibility; + await Workspace.Session.OnRollVisibilityChangedAsync(visibility); + await InvokeAsync(StateHasChanged); + } + + private string ResolveRollVisibility() + { + return Workspace.State.RollVisibility; + } } diff --git a/tests/e2e/smoke.js b/tests/e2e/smoke.js index 83331bd..c6ac732 100644 --- a/tests/e2e/smoke.js +++ b/tests/e2e/smoke.js @@ -505,6 +505,13 @@ const tests = [ ); assert.match(await elementText(driver, ".custom-roll-composer-head .muted"), /uses public visibility/i); + await fillInput(driver, "#roll-visibility", "private"); + await waitFor( + driver, + () => elementText(driver, ".custom-roll-composer-head .muted").then((text) => /uses private visibility/i.test(text)), + "Expected custom roll status text to reflect private visibility." + ); + await fillInput(driver, "#custom-roll-expression", "bad"); await clickText(driver, ".custom-roll-composer button", "Roll"); @@ -529,7 +536,7 @@ const tests = [ const firstLogEntry = document.querySelector(".log-panel .log-entry"); return !/error/.test(className) && Boolean(firstLogEntry?.textContent.includes("Custom roll")) && - Boolean(firstLogEntry?.textContent.includes("Public")); + Boolean(firstLogEntry?.textContent.includes("Private")); }), "Expected successful custom roll entry." );