< Summary

Information
Class: Chronicis.Client.Components.Context.WorldCampaignSelector
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Context/WorldCampaignSelector.razor
Line coverage
100%
Covered lines: 15
Uncovered lines: 0
Coverable lines: 15
Total lines: 170
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
BuildRenderTree(...)100%88100%
OnInitialized()100%11100%
OnContextChanged()100%11100%
UpdateSelections()100%22100%
Dispose()100%11100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Context/WorldCampaignSelector.razor

#LineLine coverage
 1@using Chronicis.Client.Components.Dialogs
 2@inject IAppContextService AppContext
 3@inject IDialogService DialogService
 4@inject ISnackbar Snackbar
 5@implements IDisposable
 6
 7<div class="world-campaign-selector">
 208    @if (!AppContext.IsInitialized)
 9    {
 10        <MudProgressCircular Size="Size.Small" Indeterminate="true" />
 11    }
 1912    else if (AppContext.Worlds.Count == 0)
 13    {
 14        <MudAlert Severity="Severity.Info" Dense="true">No worlds available</MudAlert>
 15    }
 16    else
 17    {
 18        <div class="selector-row">
 19            <MudSelect T="Guid"
 20                       Value="_selectedWorldId"
 21                       ValueChanged="OnWorldChanged"
 22                       Label="World"
 23                       Variant="Variant.Outlined"
 24                       Dense="true"
 25                       Margin="Margin.Dense"
 26                       Class="selector-dropdown">
 27                @foreach (var world in AppContext.Worlds)
 28                {
 29                    <MudSelectItem Value="@world.Id">
 30                        <div class="selector-item">
 31                            <span class="selector-icon">🌍</span>
 32                            <span>@world.Name</span>
 33                        </div>
 34                    </MudSelectItem>
 35                }
 36            </MudSelect>
 37
 38            <MudIconButton
 39                           Size="Size.Small"
 40                           Color="Color.Primary"
 41                           OnClick="OpenCreateWorldDialog"
 42                           title="Create new world" />
 43        </div>
 44
 1845        @if (AppContext.CurrentWorld?.Campaigns.Count > 0)
 46        {
 147            var campaigns = AppContext.CurrentWorld!.Campaigns;
 48            <div class="selector-row">
 49                <MudSelect T="Guid?"
 50                           Value="_selectedCampaignId"
 51                           ValueChanged="OnCampaignChanged"
 52                           Label="Campaign"
 53                           Variant="Variant.Outlined"
 54                           Dense="true"
 55                           Margin="Margin.Dense"
 56                           Class="selector-dropdown">
 57                    <MudSelectItem T="Guid?" Value="@((Guid?)null)">
 58                        <div class="selector-item">
 59                            <span class="selector-icon">📚</span>
 60                            <span>Wiki & Characters</span>
 61                        </div>
 62                    </MudSelectItem>
 63                    @foreach (var campaign in campaigns)
 64                    {
 65                        <MudSelectItem T="Guid?" Value="@((Guid?)campaign.Id)">
 66                            <div class="selector-item">
 67                                <span class="selector-icon">⚔️</span>
 68                                <span>@campaign.Name</span>
 69                            </div>
 70                        </MudSelectItem>
 71                    }
 72                </MudSelect>
 73
 74                <MudIconButton Icon="@Icons.Material.Filled.Add"
 75                               Size="Size.Small"
 76                               Color="Color.Primary"
 77                               OnClick="OpenCreateCampaignDialog"
 78                               title="Create new campaign" />
 79            </div>
 80        }
 81        else
 82        {
 83            <div class="selector-row">
 84                <MudButton Variant="Variant.Outlined"
 85                           Color="Color.Primary"
 86                           StartIcon="@Icons.Material.Filled.Add"
 87                           OnClick="OpenCreateCampaignDialog"
 88                           FullWidth="true"
 89                           Size="Size.Small">
 90                    Create First Campaign
 91                </MudButton>
 92            </div>
 93        }
 94    }
 95</div>
 96
 97@code {
 98    private Guid _selectedWorldId;
 99    private Guid? _selectedCampaignId;
 100
 101    protected override void OnInitialized()
 102    {
 18103        AppContext.OnContextChanged += OnContextChanged;
 18104        UpdateSelections();
 18105    }
 106
 107    private void OnContextChanged()
 108    {
 2109        UpdateSelections();
 2110        InvokeAsync(StateHasChanged);
 2111    }
 112
 113    private void UpdateSelections()
 114    {
 20115        _selectedWorldId = AppContext.CurrentWorldId ?? Guid.Empty;
 20116        _selectedCampaignId = AppContext.CurrentCampaignId;
 20117    }
 118
 119    private async Task OnWorldChanged(Guid worldId)
 120    {
 121        if (worldId != Guid.Empty && worldId != AppContext.CurrentWorldId)
 122        {
 123            await AppContext.SelectWorldAsync(worldId);
 124        }
 125    }
 126
 127    private async Task OnCampaignChanged(Guid? campaignId)
 128    {
 129        await AppContext.SelectCampaignAsync(campaignId);
 130    }
 131
 132    private async Task OpenCreateWorldDialog()
 133    {
 134        var dialog = await DialogService.ShowAsync<CreateWorldDialog>("Create New World");
 135        var result = await dialog.Result;
 136
 137        if (result is not null && !result.Canceled && result.Data is WorldDto newWorld)
 138        {
 139            await AppContext.RefreshWorldsAsync();
 140            await AppContext.SelectWorldAsync(newWorld.Id);
 141            Snackbar.Add($"World '{newWorld.Name}' created!", Severity.Success);
 142        }
 143    }
 144
 145    private async Task OpenCreateCampaignDialog()
 146    {
 147        if (!AppContext.CurrentWorldId.HasValue)
 148            return;
 149
 150        var parameters = new DialogParameters
 151        {
 152            ["WorldId"] = AppContext.CurrentWorldId.Value
 153        };
 154
 155        var dialog = await DialogService.ShowAsync<CreateCampaignDialog>("Create New Campaign", parameters);
 156        var result = await dialog.Result;
 157
 158        if (result is not null && !result.Canceled && result.Data is CampaignDto newCampaign)
 159        {
 160            await AppContext.RefreshCurrentWorldAsync();
 161            await AppContext.SelectCampaignAsync(newCampaign.Id);
 162            Snackbar.Add($"Campaign '{newCampaign.Name}' created!", Severity.Success);
 163        }
 164    }
 165
 166    public void Dispose()
 167    {
 19168        AppContext.OnContextChanged -= OnContextChanged;
 19169    }
 170}