• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

samsmithnz / SatisfactoryTree / 17901817043

22 Sep 2025 01:21AM UTC coverage: 67.322% (-0.9%) from 68.215%
17901817043

Pull #312

github

web-flow
Merge 938d1164c into 6a09e2b40
Pull Request #312: Add "Add factory" button to create new factories with default naming

427 of 744 branches covered (57.39%)

Branch coverage included in aggregate %.

0 of 18 new or added lines in 2 files covered. (0.0%)

10 existing lines in 2 files now uncovered.

1149 of 1597 relevant lines covered (71.95%)

1158.95 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/SatisfactoryTree.Web/Layout/NavMenu.razor
1
@using SatisfactoryTree.Web.Services
2
@inject PlanService PlanService
3
@implements IDisposable
4

5
<div class="top-row ps-3 navbar navbar-dark">
6
    <div class="container-fluid">
7
        <a class="navbar-brand" href="">SatisfactoryTree.Web</a>
8
        <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
9
            <span class="navbar-toggler-icon"></span>
10
        </button>
11
    </div>
12
</div>
13

14
<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
15
    <nav class="flex-column">
16
        <div class="nav-item px-3">
17
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
18
                <span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
19
            </NavLink>
20
        </div>
21
        <div class="nav-item px-3">
22
            <NavLink class="nav-link" href="counter">
23
                <span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
24
            </NavLink>
25
        </div>
26
        <div class="nav-item px-3">
27
            <NavLink class="nav-link" href="weather">
28
                <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
29
            </NavLink>
30
        </div>
31

32
        @if (PlanService.HasPlan && PlanService.Plan?.Factories != null && PlanService.Plan.Factories.Any())
×
33
        {
×
34
            <hr class="nav-divider">
35
            <div class="nav-section-header px-3">
36
                <small class="text-muted text-uppercase">Factories</small>
37
            </div>
38
            @foreach (var factory in PlanService.Plan.Factories)
×
39
            {
×
40
                <div class="nav-item px-3">
41
                    <a class="nav-link factory-link" href="#@GetFactoryAnchor(factory)" @onclick="() => ScrollToFactory(factory)" @onclick:preventDefault="false">
×
42
                        <span class="bi bi-gear-fill" aria-hidden="true"></span> 
43
                        <span class="factory-name">@factory.Name</span>
×
44
                    </a>
45
                </div>
46
            }
×
47
            <div class="nav-item px-3">
48
                <button class="btn btn-outline-light btn-sm add-factory-btn" @onclick="AddNewFactory">
49
                    <span class="bi bi-plus-circle" aria-hidden="true"></span> Add factory
50
                </button>
51
            </div>
NEW
52
        }
×
NEW
53
        else if (PlanService.Plan != null)
×
NEW
54
        {
×
55
            <hr class="nav-divider">
56
            <div class="nav-section-header px-3">
57
                <small class="text-muted text-uppercase">Factories</small>
58
            </div>
59
            <div class="nav-item px-3">
60
                <button class="btn btn-outline-light btn-sm add-factory-btn" @onclick="AddNewFactory">
61
                    <span class="bi bi-plus-circle" aria-hidden="true"></span> Add factory
62
                </button>
63
            </div>
UNCOV
64
        }
×
65
    </nav>
66
</div>
67

68
@code {
69
    private bool collapseNavMenu = true;
×
70

71
    private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
×
72

73
    protected override void OnInitialized()
74
    {
×
75
        PlanService.PlanChanged += StateHasChanged;
×
76
    }
×
77

78
    public void Dispose()
79
    {
×
80
        PlanService.PlanChanged -= StateHasChanged;
×
81
    }
×
82

83
    private void ToggleNavMenu()
84
    {
×
85
        collapseNavMenu = !collapseNavMenu;
×
86
    }
×
87

88
    private string GetFactoryAnchor(SatisfactoryTree.Logic.Models.Factory factory)
89
    {
×
90
        // Create a URL-friendly anchor from the factory name
91
        return factory.Name.ToLowerInvariant()
×
92
            .Replace(" ", "-")
×
93
            .Replace("'", "")
×
94
            .Replace("&", "and")
×
95
            .Replace("/", "-")
×
96
            .Replace("\\", "-")
×
97
            .Replace("(", "")
×
98
            .Replace(")", "");
×
99
    }
×
100

101
    private async Task ScrollToFactory(SatisfactoryTree.Logic.Models.Factory factory)
102
    {
×
103
        // Close the nav menu on mobile after clicking
104
        collapseNavMenu = true;
×
105
        
106
        // Small delay to let the page render and nav menu close
107
        await Task.Delay(100);
×
108
        
109
        // The browser will handle the anchor scrolling automatically due to the href="#anchor"
110
        // The CSS smooth scrolling will make it animate nicely
111
        StateHasChanged();
×
112
    }
×
113

114
    private void AddNewFactory()
NEW
115
    {
×
NEW
116
        PlanService.AddFactory();
×
117
        // Close the nav menu on mobile after clicking
NEW
118
        collapseNavMenu = true;
×
NEW
119
    }
×
120
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc