From ecc799ae7f8f80508c4cab12a84e15dea56b9100 Mon Sep 17 00:00:00 2001 From: Frank Tovar Date: Mon, 18 May 2026 20:13:14 +0200 Subject: [PATCH] Move campaign selector into header --- .../Pages/CampaignsWorkspaceContent.razor | 10 +--- .../Pages/HomeControls/AppHeader.razor | 20 +++++++- .../Pages/HomeControls/AppHeader.razor.cs | 12 +++-- .../CampaignManagementPanel.razor | 15 +++--- .../CampaignManagementPanel.razor.cs | 8 +--- .../Pages/HomeControls/CharacterPanel.razor | 4 +- RpgRoller/Components/Pages/Workspace.razor | 6 ++- RpgRoller/Components/Pages/Workspace.razor.cs | 10 +++- RpgRoller/Components/Pages/WorkspaceState.cs | 8 +--- RpgRoller/wwwroot/styles.css | 48 +++++++++++++++++-- 10 files changed, 98 insertions(+), 43 deletions(-) diff --git a/RpgRoller/Components/Pages/CampaignsWorkspaceContent.razor b/RpgRoller/Components/Pages/CampaignsWorkspaceContent.razor index 675cb59..6c3faa9 100644 --- a/RpgRoller/Components/Pages/CampaignsWorkspaceContent.razor +++ b/RpgRoller/Components/Pages/CampaignsWorkspaceContent.razor @@ -1,9 +1,8 @@ -@using Microsoft.AspNetCore.Components +@using Microsoft.AspNetCore.Components @using RpgRoller.Components.Pages.HomeControls +

@Title

@if (User is null) @@ -15,7 +15,23 @@ } @if (ShowCampaign) { -

Campaign: @(CampaignName ?? "No campaign selected")

+
+ + @if (Campaigns.Count == 0) + { + No campaigns yet + } + else + { + + } +
}
@if (ShowConnectionState) diff --git a/RpgRoller/Components/Pages/HomeControls/AppHeader.razor.cs b/RpgRoller/Components/Pages/HomeControls/AppHeader.razor.cs index 6b1a47a..949b412 100644 --- a/RpgRoller/Components/Pages/HomeControls/AppHeader.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/AppHeader.razor.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Components; using RpgRoller.Contracts; @@ -18,7 +18,13 @@ public partial class AppHeader [Parameter] public bool ShowCampaign { get; set; } - [Parameter] public string? CampaignName { get; set; } + [Parameter] public IReadOnlyList Campaigns { get; set; } = []; + + [Parameter] public Guid? SelectedCampaignId { get; set; } + + [Parameter] public string CampaignSelectId { get; set; } = "header-campaign-select"; + + [Parameter] public EventCallback CampaignSelectionChanged { get; set; } [Parameter] public bool ShowConnectionState { get; set; } = true; @@ -44,4 +50,4 @@ public sealed class AppHeaderMenuItem public string Label { get; init; } = string.Empty; public bool IsActive { get; init; } public Func? OnSelected { get; init; } -} \ No newline at end of file +} diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor b/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor index f9f84dd..5f220cf 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor +++ b/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor @@ -1,4 +1,4 @@ -
+

Campaign

@@ -9,13 +9,14 @@ } else { - - +
}
-} \ No newline at end of file +} diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor.cs b/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor.cs index f2fa546..87cd693 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/CampaignManagementPanel.razor.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Components; using RpgRoller.Contracts; @@ -74,9 +74,6 @@ public partial class CampaignManagementPanel [Parameter] public IReadOnlyList Campaigns { get; set; } = []; - [Parameter] - public Guid? SelectedCampaignId { get; set; } - [Parameter] public CampaignRoster? SelectedCampaign { get; set; } @@ -98,9 +95,6 @@ public partial class CampaignManagementPanel [Parameter] public bool CanDeleteCampaign { get; set; } - [Parameter] - public EventCallback CampaignSelectionChanged { get; set; } - [Parameter] public EventCallback CampaignCreated { get; set; } diff --git a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor index c8343e9..e99b13a 100644 --- a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor +++ b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor @@ -1,4 +1,4 @@ -
+
@if (IsCampaignDataLoading) {
@@ -9,7 +9,7 @@ } else if (SelectedCampaign is null) { -

No campaign selected. Choose one in Campaign Management.

+

No campaign selected. Choose one in the header.

} else if (SelectedCampaign.Characters.Length == 0) { diff --git a/RpgRoller/Components/Pages/Workspace.razor b/RpgRoller/Components/Pages/Workspace.razor index 0065a4c..341f82f 100644 --- a/RpgRoller/Components/Pages/Workspace.razor +++ b/RpgRoller/Components/Pages/Workspace.razor @@ -1,4 +1,4 @@ -@using RpgRoller.Components.Pages.HomeControls +@using RpgRoller.Components.Pages.HomeControls

@State.LiveAnnouncement

@@ -17,7 +17,9 @@ CampaignLogDetailsLoading { get; } = []; public Dictionary CampaignLogDetailErrors { get; } = []; - public string? SelectedCampaignName => SelectedCampaign?.Name ?? - Campaigns.FirstOrDefault(campaign => campaign.Id == SelectedCampaignId) - ?.Name; - public CharacterSummary? SelectedCharacter => SelectedCampaign?.Characters.FirstOrDefault(character => character.Id == SelectedCharacterId); @@ -185,4 +181,4 @@ public sealed class WorkspaceState "reconnecting" => "warn", _ => "offline" }; -} \ No newline at end of file +} diff --git a/RpgRoller/wwwroot/styles.css b/RpgRoller/wwwroot/styles.css index 6b4772f..7207763 100644 --- a/RpgRoller/wwwroot/styles.css +++ b/RpgRoller/wwwroot/styles.css @@ -1,4 +1,4 @@ -:root { +:root { --bg-top: #f7f0d8; --bg-bottom: #ecdfc4; --button-hover: #dccfb4; @@ -120,14 +120,33 @@ h3 { font-size: 1.15rem; } -.header-identity, -.header-campaign { +.header-identity { margin: 0; white-space: nowrap; } .header-campaign { + display: flex; + align-items: center; + gap: 0.35rem; color: var(--muted); + min-width: 12rem; + white-space: nowrap; +} + +.header-campaign label { + font-weight: 700; +} + +.header-campaign select { + max-width: 16rem; + min-width: 9rem; + padding: 0.25rem 0.45rem; +} + +.header-campaign span { + font-weight: 700; + color: var(--text); } .header-connection-cell { @@ -156,6 +175,20 @@ h3 { gap: 0.75rem; } +.campaign-current { + display: grid; + gap: 0.15rem; +} + +.campaign-current span, +.campaign-current p { + color: var(--muted); +} + +.campaign-current p { + margin: 0; +} + .auth-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -1180,6 +1213,15 @@ select:focus-visible { white-space: normal; } + .header-campaign { + flex-wrap: wrap; + min-width: 0; + } + + .header-campaign select { + max-width: 100%; + } + .mobile-bottom-nav { display: flex; }