< 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
0%
Covered lines: 0
Uncovered lines: 43
Coverable lines: 43
Total lines: 169
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 38
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
BuildRenderTree(...)0%7280%
OnInitialized()100%210%
OnContextChanged()100%210%
UpdateSelections()0%620%
OnWorldChanged()0%4260%
OnCampaignChanged()100%210%
OpenCreateWorldDialog()0%4260%
OpenCreateCampaignDialog()0%7280%
Dispose()100%210%

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">
 08    @if (!AppContext.IsInitialized)
 9    {
 10        <MudProgressCircular Size="Size.Small" Indeterminate="true" />
 11    }
 012    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">
 027                @foreach (var world in AppContext.Worlds)
 28                {
 29                    <MudSelectItem Value="@world.Id">
 30                        <div class="selector-item">
 31                            <span class="selector-icon">🌍</span>
 032                            <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
 045        @if (AppContext.CurrentWorld?.Campaigns.Count > 0)
 46        {
 47            <div class="selector-row">
 48                <MudSelect T="Guid?"
 49                           Value="_selectedCampaignId"
 50                           ValueChanged="OnCampaignChanged"
 51                           Label="Campaign"
 52                           Variant="Variant.Outlined"
 53                           Dense="true"
 54                           Margin="Margin.Dense"
 55                           Class="selector-dropdown">
 56                    <MudSelectItem T="Guid?" Value="@((Guid?)null)">
 57                        <div class="selector-item">
 58                            <span class="selector-icon">📚</span>
 59                            <span>Wiki & Characters</span>
 60                        </div>
 61                    </MudSelectItem>
 062                    @foreach (var campaign in AppContext.CurrentWorld?.Campaigns ?? new List<CampaignDto>())
 63                    {
 64                        <MudSelectItem T="Guid?" Value="@((Guid?)campaign.Id)">
 65                            <div class="selector-item">
 66                                <span class="selector-icon">⚔️</span>
 067                                <span>@campaign.Name</span>
 68                            </div>
 69                        </MudSelectItem>
 70                    }
 71                </MudSelect>
 72
 73                <MudIconButton Icon="@Icons.Material.Filled.Add"
 74                               Size="Size.Small"
 75                               Color="Color.Primary"
 76                               OnClick="OpenCreateCampaignDialog"
 77                               title="Create new campaign" />
 78            </div>
 79        }
 80        else
 81        {
 82            <div class="selector-row">
 83                <MudButton Variant="Variant.Outlined"
 84                           Color="Color.Primary"
 85                           StartIcon="@Icons.Material.Filled.Add"
 86                           OnClick="OpenCreateCampaignDialog"
 87                           FullWidth="true"
 88                           Size="Size.Small">
 89                    Create First Campaign
 90                </MudButton>
 91            </div>
 92        }
 93    }
 94</div>
 95
 96@code {
 97    private Guid _selectedWorldId;
 98    private Guid? _selectedCampaignId;
 99
 100    protected override void OnInitialized()
 101    {
 0102        AppContext.OnContextChanged += OnContextChanged;
 0103        UpdateSelections();
 0104    }
 105
 106    private void OnContextChanged()
 107    {
 0108        UpdateSelections();
 0109        InvokeAsync(StateHasChanged);
 0110    }
 111
 112    private void UpdateSelections()
 113    {
 0114        _selectedWorldId = AppContext.CurrentWorldId ?? Guid.Empty;
 0115        _selectedCampaignId = AppContext.CurrentCampaignId;
 0116    }
 117
 118    private async Task OnWorldChanged(Guid worldId)
 119    {
 0120        if (worldId != Guid.Empty && worldId != AppContext.CurrentWorldId)
 121        {
 0122            await AppContext.SelectWorldAsync(worldId);
 123        }
 0124    }
 125
 126    private async Task OnCampaignChanged(Guid? campaignId)
 127    {
 0128        await AppContext.SelectCampaignAsync(campaignId);
 0129    }
 130
 131    private async Task OpenCreateWorldDialog()
 132    {
 0133        var dialog = await DialogService.ShowAsync<CreateWorldDialog>("Create New World");
 0134        var result = await dialog.Result;
 135
 0136        if (result is not null && !result.Canceled && result.Data is WorldDto newWorld)
 137        {
 0138            await AppContext.RefreshWorldsAsync();
 0139            await AppContext.SelectWorldAsync(newWorld.Id);
 0140            Snackbar.Add($"World '{newWorld.Name}' created!", Severity.Success);
 141        }
 0142    }
 143
 144    private async Task OpenCreateCampaignDialog()
 145    {
 0146        if (!AppContext.CurrentWorldId.HasValue)
 0147            return;
 148
 0149        var parameters = new DialogParameters
 0150        {
 0151            ["WorldId"] = AppContext.CurrentWorldId.Value
 0152        };
 153
 0154        var dialog = await DialogService.ShowAsync<CreateCampaignDialog>("Create New Campaign", parameters);
 0155        var result = await dialog.Result;
 156
 0157        if (result is not null && !result.Canceled && result.Data is CampaignDto newCampaign)
 158        {
 0159            await AppContext.RefreshCurrentWorldAsync();
 0160            await AppContext.SelectCampaignAsync(newCampaign.Id);
 0161            Snackbar.Add($"Campaign '{newCampaign.Name}' created!", Severity.Success);
 162        }
 0163    }
 164
 165    public void Dispose()
 166    {
 0167        AppContext.OnContextChanged -= OnContextChanged;
 0168    }
 169}