< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 66
Coverable lines: 66
Total lines: 181
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 22
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: <BuildRenderTree()100%210%
File 2: get_ResourceProviderService()100%210%
File 2: get_Snackbar()100%210%
File 2: get_Logger()100%210%
File 2: get_WorldId()100%210%
File 2: .ctor()100%210%
File 2: OnParametersSetAsync()100%210%
File 2: LoadProviders()0%620%
File 2: OnToggleProvider()0%156120%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Settings/WorldResourceProviders.razor

#LineLine coverage
 1@using Chronicis.Shared.DTOs
 2@using Chronicis.Client.Services
 3
 4<MudPaper Class="pa-4 mb-4" Elevation="2">
 5    <MudText Typo="Typo.h6" Class="mb-3">External Resource Providers</MudText>
 6    <MudText Typo="Typo.body2" Class="mb-4">
 7        Enable external resource providers to link reference content in your articles.
 8    </MudText>
 9
 010    @if (_loading)
 11    {
 12        <MudProgressLinear Indeterminate="true" Color="Color.Primary" />
 13    }
 014    else if (_providers != null && _providers.Any())
 15    {
 16        <MudStack Spacing="3">
 017            @foreach (var provider in _providers)
 18            {
 19                <MudPaper Outlined="true" Class="pa-3">
 20                    <MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween">
 21                        <div style="flex: 1;">
 22                            <MudStack Spacing="1">
 23                                <MudText Typo="Typo.subtitle1">
 024                                    <strong>@provider.Provider.Name</strong>
 25                                </MudText>
 26                                <MudText Typo="Typo.body2" Color="Color.Default">
 027                                    @provider.Provider.Description
 28                                </MudText>
 29                                <MudStack Row="true" Spacing="2" Class="mt-1">
 30                                    <MudLink Href="@provider.Provider.DocumentationLink" Target="_blank" Typo="Typo.capt
 31                                        Documentation
 32                                    </MudLink>
 33                                    <MudLink Href="@provider.Provider.License" Target="_blank" Typo="Typo.caption">
 34                                        License
 35                                    </MudLink>
 36                                </MudStack>
 37                            </MudStack>
 38                        </div>
 39                        <MudSwitch
 40                            T="bool"
 41                            Color="Color.Primary"
 42                            Value="@provider.IsEnabled"
 043                            ValueChanged="@(async (bool enabled) => await OnToggleProvider(provider.Provider.Code, enabl
 44                            Disabled="@_updating" />
 45                    </MudStack>
 46                </MudPaper>
 47            }
 48        </MudStack>
 49
 50        <MudAlert Severity="Severity.Info" Class="mt-4" Dense="true">
 51            <MudText Typo="Typo.caption">
 52                <strong>License Agreement:</strong> By enabling a resource provider, you agree to abide by its license t
 53                and confirm that you have the right to reference this content in your world. Please review each provider
 54                license before enabling.
 55            </MudText>
 56        </MudAlert>
 57    }
 058    else if (_error)
 59    {
 60        <MudAlert Severity="Severity.Error">
 61            Failed to load resource providers. Please try refreshing the page.
 62        </MudAlert>
 63    }
 64</MudPaper>

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Settings/WorldResourceProviders.razor.cs

#LineLine coverage
 1using Chronicis.Client.Services;
 2using Chronicis.Shared.DTOs;
 3using Microsoft.AspNetCore.Components;
 4using MudBlazor;
 5
 6namespace Chronicis.Client.Components.Settings;
 7
 8public partial class WorldResourceProviders : ComponentBase
 9{
 010    [Inject] private IResourceProviderApiService ResourceProviderService { get; set; } = default!;
 011    [Inject] private ISnackbar Snackbar { get; set; } = default!;
 012    [Inject] private ILogger<WorldResourceProviders> Logger { get; set; } = default!;
 13
 014    [Parameter] public Guid WorldId { get; set; }
 15
 16    private List<WorldResourceProviderDto>? _providers;
 017    private bool _loading = true;
 18    private bool _updating = false;
 19    private bool _error = false;
 20
 21    protected override async Task OnParametersSetAsync()
 22    {
 023        await LoadProviders();
 024    }
 25
 26    private async Task LoadProviders()
 27    {
 028        _loading = true;
 029        _error = false;
 030        StateHasChanged();
 31
 32        try
 33        {
 034            _providers = await ResourceProviderService.GetWorldProvidersAsync(WorldId);
 35
 036            if (_providers == null)
 37            {
 038                _error = true;
 039                Logger.LogWarning("Failed to load providers for world {WorldId}", WorldId);
 40            }
 41            else
 42            {
 43                // Sort providers alphabetically by name
 044                _providers = _providers.OrderBy(p => p.Provider.Name).ToList();
 45            }
 046        }
 047        catch (Exception ex)
 48        {
 049            _error = true;
 050            Logger.LogError(ex, "Error loading providers for world {WorldId}", WorldId);
 051        }
 52        finally
 53        {
 054            _loading = false;
 055            StateHasChanged();
 56        }
 057    }
 58
 59    private async Task OnToggleProvider(string providerCode, bool enabled)
 60    {
 061        _updating = true;
 062        StateHasChanged();
 63
 64        try
 65        {
 066            var success = await ResourceProviderService.ToggleProviderAsync(WorldId, providerCode, enabled);
 67
 068            if (success)
 69            {
 70                // Update local state
 071                var provider = _providers?.FirstOrDefault(p => p.Provider.Code == providerCode);
 072                if (provider != null)
 73                {
 074                    provider.IsEnabled = enabled;
 75                }
 76
 077                Snackbar.Add(
 078                    $"{providerCode} {(enabled ? "enabled" : "disabled")} successfully",
 079                    Severity.Success);
 80
 081                Logger.LogDebug(
 082                    "Provider {ProviderCode} {Action} for world {WorldId}",
 083                    providerCode,
 084                    enabled ? "enabled" : "disabled",
 085                    WorldId);
 86            }
 87            else
 88            {
 089                Snackbar.Add(
 090                    $"Failed to {(enabled ? "enable" : "disable")} {providerCode}",
 091                    Severity.Error);
 92
 093                Logger.LogWarning(
 094                    "Failed to toggle provider {ProviderCode} for world {WorldId}",
 095                    providerCode,
 096                    WorldId);
 97            }
 098        }
 099        catch (Exception ex)
 100        {
 0101            Snackbar.Add(
 0102                $"Error updating provider: {ex.Message}",
 0103                Severity.Error);
 104
 0105            Logger.LogError(
 0106                ex,
 0107                "Error toggling provider {ProviderCode} for world {WorldId}",
 0108                providerCode,
 0109                WorldId);
 0110        }
 111        finally
 112        {
 0113            _updating = false;
 0114            StateHasChanged();
 115        }
 0116    }
 117}