< Summary

Information
Class: Chronicis.Client.Pages.CampaignDetail
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Pages/CampaignDetail.razor
Line coverage
100%
Covered lines: 5
Uncovered lines: 0
Coverable lines: 5
Total lines: 175
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
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%44100%
OnViewModelChanged(...)100%11100%
Dispose()100%11100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Pages/CampaignDetail.razor

#LineLine coverage
 1@attribute [Authorize]
 2@implements IDisposable
 3@using Chronicis.Client.Components.Dialogs
 4@using Chronicis.Client.Components.Shared
 5@inject CampaignDetailViewModel ViewModel
 6@inject IAppContextService AppContext
 7
 38@if (ViewModel.IsLoading)
 9{
 10    <LoadingSkeleton />
 11}
 212else if (ViewModel.Campaign != null)
 13{
 14    <MudPaper Elevation="2" Class="chronicis-article-card chronicis-fade-in">
 15        <DetailPageHeader Breadcrumbs="ViewModel.Breadcrumbs"
 16                          Icon="@Icons.Material.Filled.AutoStories"
 17                          Title="@ViewModel.EditName"
 18                          TitleChanged="@(v => ViewModel.EditName = v)"
 19                          Placeholder="Campaign Name"
 20                          OnTitleEdited="@(() => {})"
 21                          OnEnterPressed="@(() => ViewModel.SaveAsync())"
 22                          ReadOnly="@(!ViewModel.CanManageCampaignDetails)" />
 23
 24        <MudTabs Elevation="0"
 25                 Rounded="true"
 26                 ApplyEffectsToContainer="true"
 27                 PanelClass="pa-4">
 28            <MudTabPanel Text="Overview" Icon="@Icons.Material.Filled.AutoStories">
 29                <MudTextField Value="@ViewModel.EditDescription"
 30                              ValueChanged="@((string v) => ViewModel.EditDescription = v)"
 31                              Label="Description"
 32                              Variant="Variant.Outlined"
 33                              Lines="3"
 34                              Placeholder="Describe your campaign..."
 35                              Class="mb-4"
 36                              Immediate="true"
 37                              ReadOnly="@(!ViewModel.CanManageCampaignDetails)" />
 38
 39                <div class="d-flex align-center justify-space-between mb-3">
 40                    <MudText Typo="Typo.h6" Style="color: var(--chronicis-beige-gold);">
 41                        <MudIcon Icon="@Icons.Material.Filled.Bookmark" Size="Size.Small" Class="mr-2" />
 42                        Arcs / Acts
 43                    </MudText>
 44                    @if (ViewModel.IsCurrentUserGM)
 45                    {
 46                        <MudButton Variant="Variant.Filled"
 47                                   Color="Color.Primary"
 48                                   Size="Size.Small"
 49                                   StartIcon="@Icons.Material.Filled.Add"
 50                                   OnClick="@(() => ViewModel.CreateArcAsync())">
 51                            New Arc
 52                        </MudButton>
 53                    }
 54                </div>
 55
 56                @if (ViewModel.Arcs.Any())
 57                {
 58                    <MudList T="ArcDto" Dense="true" Class="mb-4">
 59                        @foreach (var arc in ViewModel.Arcs.OrderBy(a => a.SortOrder))
 60                        {
 61                            <EntityListItem Icon="@Icons.Material.Filled.Bookmark"
 62                                            Title="@arc.Name"
 63                                            OnClick="@(() => ViewModel.NavigateToArcAsync(arc))">
 64                                <MudChip T="string" Size="Size.Small" Variant="Variant.Outlined">
 65                                    @arc.SessionCount sessions
 66                                </MudChip>
 67                            </EntityListItem>
 68                        }
 69                    </MudList>
 70                }
 71                else
 72                {
 73                    <MudAlert Severity="Severity.Info" Class="mb-4">
 74                        No arcs yet. Create your first arc to organize your sessions!
 75                    </MudAlert>
 76                }
 77
 78                <MudText Typo="Typo.h6" Class="mb-3" Style="color: var(--chronicis-beige-gold);">
 79                    Campaign Info
 80                </MudText>
 81
 82                <MudSimpleTable Dense="true" Hover="true" Class="mb-4">
 83                    <tbody>
 84                        <tr>
 85                            <td><MudIcon Icon="@Icons.Material.Filled.PlayCircle" Size="Size.Small" Class="mr-2" />Activ
 86                            <td>
 87                                <MudSwitch T="bool"
 88                                           Value="ViewModel.Campaign.IsActive"
 89                                           ValueChanged="@((bool v) => ViewModel.OnActiveToggleAsync(v))"
 90                                           Color="Color.Success"
 91                                           Size="Size.Small"
 92                                           Disabled="@(ViewModel.IsTogglingActive || !ViewModel.CanManageCampaignDetails
 93                            </td>
 94                        </tr>
 95                        <tr>
 96                            <td><MudIcon Icon="@Icons.Material.Filled.Layers" Size="Size.Small" Class="mr-2" />Arcs</td>
 97                            <td>@ViewModel.Campaign.ArcCount</td>
 98                        </tr>
 99                        <tr>
 100                            <td><MudIcon Icon="@Icons.Material.Filled.Person" Size="Size.Small" Class="mr-2" />Owner</td
 101                            <td>@ViewModel.Campaign.OwnerName</td>
 102                        </tr>
 103                        <tr>
 104                            <td><MudIcon Icon="@Icons.Material.Filled.CalendarToday" Size="Size.Small" Class="mr-2" />Cr
 105                            <td>@ViewModel.Campaign.CreatedAt.ToString("MMMM d, yyyy")</td>
 106                        </tr>
 107                        @if (ViewModel.Campaign.StartedAt.HasValue)
 108                        {
 109                            <tr>
 110                                <td><MudIcon Icon="@Icons.Material.Filled.PlayArrow" Size="Size.Small" Class="mr-2" />St
 111                                <td>@ViewModel.Campaign.StartedAt.Value.ToString("MMMM d, yyyy")</td>
 112                            </tr>
 113                        }
 114                    </tbody>
 115                </MudSimpleTable>
 116
 117                <AISummarySection EntityId="CampaignId"
 118                                  EntityType="Campaign"
 119                                  IsExpanded="ViewModel.SummaryExpanded"
 120                                  IsExpandedChanged="@((bool v) => ViewModel.SummaryExpanded = v)" />
 121            </MudTabPanel>
 122
 123            @if (ViewModel.CanViewPrivateNotes)
 124            {
 125                <MudTabPanel Text="Private Notes" Icon="@Icons.Material.Filled.Lock">
 126                    <MudText Typo="Typo.body2" Class="mud-text-secondary mb-3">
 127                        Visible only to the world owner and GMs.
 128                    </MudText>
 129                    <PrivateNotesTipTapEditor WorldId="@ViewModel.Campaign!.WorldId"
 130                                             Value="@ViewModel.EditPrivateNotes"
 131                                             ValueChanged="@((string v) => ViewModel.EditPrivateNotes = v)"
 132                                             ReadOnly="@(!ViewModel.CanManageCampaignDetails)"
 133                                             UploadContextLabel="campaign private notes" />
 134                </MudTabPanel>
 135            }
 136        </MudTabs>
 137
 138        <div class="chronicis-flex-between mt-4">
 139            <SaveStatusIndicator IsSaving="ViewModel.IsSaving" HasUnsavedChanges="ViewModel.HasUnsavedChanges" />
 140
 141            <MudButton Variant="Variant.Filled"
 142                       Color="Color.Primary"
 143                       OnClick="@(() => ViewModel.SaveAsync())"
 144                       Disabled="@(ViewModel.IsSaving || !ViewModel.CanManageCampaignDetails)"
 145                       StartIcon="@Icons.Material.Filled.Save">
 146                Save
 147            </MudButton>
 148        </div>
 149    </MudPaper>
 150}
 151
 152@code {
 153    [Parameter]
 154    public Guid CampaignId { get; set; }
 155
 156    protected override async Task OnParametersSetAsync()
 157    {
 158        ViewModel.PropertyChanged += OnViewModelChanged;
 159        await ViewModel.LoadAsync(CampaignId);
 160
 161        if (ViewModel.Campaign != null &&
 162            (AppContext.CurrentWorldId != ViewModel.Campaign.WorldId || AppContext.CurrentCampaignId != ViewModel.Campai
 163        {
 164            await AppContext.SelectWorldAsync(ViewModel.Campaign.WorldId, ViewModel.Campaign.Id);
 165        }
 166    }
 167
 168    private void OnViewModelChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
 15169        => InvokeAsync(StateHasChanged);
 170
 171    public void Dispose()
 172    {
 3173        ViewModel.PropertyChanged -= OnViewModelChanged;
 3174    }
 175}