Skip to content

Commit 6bdd2c6

Browse files
committed
fix: changes
1 parent 23d34da commit 6bdd2c6

18 files changed

Lines changed: 1485 additions & 156 deletions

‎MakerPrompt.E2E.Maui/Tests/FarmModeTests.cs‎

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -81,81 +81,71 @@ public async Task FarmMode_C_Enabled_RedirectsToFleet()
8181
}
8282

8383
[Fact]
84-
public async Task FarmMode_D_Disabled_ShowsAddPrinterInNavbar()
84+
public async Task FarmMode_D_Disabled_ShowsControlPanel()
8585
{
8686
// Farm mode defaults to disabled — navigate to dashboard
8787
await AppiumSetup.NavigateAsync("/dashboard");
8888
await Page.Locator(".sidebar").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
8989

90+
// Dashboard should render ControlPanel directly; header-add-printer exists in farm mode only
9091
var addPrinterLink = Page.Locator("[data-testid='header-add-printer']");
91-
Assert.True(await addPrinterLink.IsVisibleAsync(), "Add Printer button should appear in navbar when farm mode is off");
92+
Assert.True(await addPrinterLink.CountAsync() == 0, "Add Printer button should NOT appear in navbar when farm mode is off");
9293
}
9394

9495
// ── Farm Name ──
9596

9697
[Fact]
97-
public async Task FarmName_E_DisplaysInHeader()
98+
public async Task FarmName_E_DefaultBrandLabel_ShowsMakerPrompt()
9899
{
100+
// Farm mode off and no active farm — header brand should show the app name
99101
await NavigateToSettingsAsync();
102+
var toggle = Page.Locator("#farmModeEnabled");
103+
if (await toggle.IsCheckedAsync())
104+
{
105+
await toggle.UncheckAsync();
106+
await SaveSettingsAsync();
107+
}
100108

101-
// Set a farm name
102-
var nameInput = Page.Locator("#farmName");
103-
await nameInput.ClearAsync();
104-
await nameInput.FillAsync("MAUI Test Farm");
105-
await SaveSettingsAsync();
106-
107-
// Navigate away and back to verify the farm name persists in the header
108109
await AppiumSetup.NavigateAsync("/dashboard");
109110
await Page.Locator(".sidebar").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
110111

111112
var brand = Page.Locator("header .brand-label");
112113
var text = await brand.InnerTextAsync();
113-
Assert.Equal("MAUI Test Farm", text);
114-
115-
// Clean up — reset farm name
116-
await NavigateToSettingsAsync();
117-
nameInput = Page.Locator("#farmName");
118-
await nameInput.ClearAsync();
119-
await SaveSettingsAsync();
114+
Assert.Equal("MakerPrompt", text);
120115
}
121116

122117
[Fact]
123118
public async Task FarmName_F_ShowsInSidebar_WhenFarmModeEnabled()
124119
{
125-
await NavigateToSettingsAsync();
120+
await EnableFarmModeAsync();
126121

127-
// Enable farm mode and set name
128-
var toggle = Page.Locator("#farmModeEnabled");
129-
if (!await toggle.IsCheckedAsync())
130-
{
131-
await toggle.CheckAsync();
132-
}
133-
var nameInput = Page.Locator("#farmName");
134-
await nameInput.ClearAsync();
135-
await nameInput.FillAsync("MAUI Sidebar Farm");
136-
// Blazor @bind uses onchange (blur), not oninput — press Tab to fire the event.
122+
// Create a farm and switch to it so the config FarmName gets populated
123+
var nameInput = Page.Locator("#farmNewName");
124+
await nameInput.WaitForAsync(new LocatorWaitForOptions { Timeout = 5_000 });
125+
await nameInput.FillAsync("Sidebar Test Farm");
137126
await nameInput.PressAsync("Tab");
138-
await SaveSettingsAsync();
127+
await Page.WaitForTimeoutAsync(300);
128+
var createBtn = Page.Locator("[data-testid='farm-create-btn']");
129+
await createBtn.ClickAsync();
130+
await Page.WaitForTimeoutAsync(500);
131+
132+
// Switch to the newly created farm
133+
var selectEl = Page.Locator("select");
134+
await selectEl.SelectOptionAsync(new SelectOptionValue { Label = "Sidebar Test Farm" });
135+
var switchBtn = Page.Locator("[data-testid='farm-switch-btn']");
136+
await switchBtn.ClickAsync();
137+
await Page.WaitForTimeoutAsync(500);
139138

140-
// Verify farm name appears in sidebar
139+
// Navigate to fleet and verify sidebar shows the farm name
141140
await AppiumSetup.NavigateAsync("/fleet");
142141
await Page.Locator(".sidebar").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
143142

144143
var sidebarFarm = Page.Locator(".sidebar .text-info");
145144
await sidebarFarm.WaitForAsync(new LocatorWaitForOptions { Timeout = 5_000 });
146145
var text = await sidebarFarm.InnerTextAsync();
147-
Assert.Contains("MAUI Sidebar Farm", text);
146+
Assert.Contains("Sidebar Test Farm", text);
148147

149-
// Clean up — disable farm mode and clear name
150-
await NavigateToSettingsAsync();
151-
toggle = Page.Locator("#farmModeEnabled");
152-
if (await toggle.IsCheckedAsync())
153-
{
154-
await toggle.UncheckAsync();
155-
}
156-
nameInput = Page.Locator("#farmName");
157-
await nameInput.ClearAsync();
158-
await SaveSettingsAsync();
148+
await RestoreDefaultFarmModeAsync();
159149
}
160150

161151
// ── Farm Configuration Management ──
@@ -247,7 +237,7 @@ public async Task FarmConfig_K_HiddenWhenFarmModeDisabled()
247237
private static async Task NavigateToSettingsAsync()
248238
{
249239
await AppiumSetup.NavigateAsync("/settings");
250-
await Page.Locator("#farmName").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
240+
await Page.Locator("#farmModeEnabled").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
251241
}
252242

253243
private static async Task SaveSettingsAsync()

‎MakerPrompt.E2E.Wasm/Tests/FarmModeTests.cs‎

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ public async Task FarmMode_Disabled_RedirectsToDashboard()
6666

6767
// Navigate to root — should redirect to dashboard
6868
await Page.GotoAsync(_fixture.BaseUrl);
69-
var welcome = Page.Locator("[data-testid='dashboard-welcome']");
70-
await welcome.WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
71-
Assert.True(await welcome.IsVisibleAsync());
69+
await Page.WaitForURLAsync("**/dashboard", new PageWaitForURLOptions { Timeout = 15_000 });
70+
Assert.Contains("dashboard", Page.Url, StringComparison.OrdinalIgnoreCase);
7271
}
7372

7473
[Fact]
@@ -78,57 +77,54 @@ public async Task FarmMode_Disabled_ShowsAddPrinterInNavbar()
7877
await Page.GotoAsync($"{_fixture.BaseUrl}/dashboard");
7978
await Page.Locator(".sidebar").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
8079

80+
// Add Printer button no longer appears in navbar for single-printer mode
8181
var addPrinterLink = Page.Locator("[data-testid='header-add-printer']");
82-
Assert.True(await addPrinterLink.IsVisibleAsync());
82+
Assert.True(await addPrinterLink.CountAsync() == 0, "Add Printer button should NOT appear in navbar when farm mode is off");
8383
}
8484

8585
// ── Farm Name ──
8686

8787
[Fact]
8888
public async Task FarmName_DisplaysInHeader()
8989
{
90+
// Farm mode off and no active farm — header brand should show the app name
9091
await NavigateToSettingsAsync();
92+
var toggle = Page.Locator("#farmModeEnabled");
93+
if (await toggle.IsCheckedAsync())
94+
{
95+
await toggle.UncheckAsync();
96+
await SaveSettingsAsync();
97+
}
9198

92-
// Set a farm name — press Tab after fill to trigger Blazor @bind (change event)
93-
var nameInput = Page.Locator("#farmName");
94-
await nameInput.ClearAsync();
95-
await nameInput.FillAsync("Test Farm");
96-
await nameInput.PressAsync("Tab");
97-
await SaveSettingsAsync();
98-
99-
// Navigate away and back to verify the farm name persists in the header
100-
await Page.GotoAsync(_fixture.BaseUrl);
99+
await Page.GotoAsync($"{_fixture.BaseUrl}/dashboard");
101100
await Page.Locator(".sidebar").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
102101

103102
var brand = Page.Locator("header .brand-label");
104103
var text = await brand.InnerTextAsync();
105-
Assert.Equal("Test Farm", text);
106-
107-
// Clean up — reset farm name
108-
await NavigateToSettingsAsync();
109-
nameInput = Page.Locator("#farmName");
110-
await nameInput.ClearAsync();
111-
await nameInput.PressAsync("Tab");
112-
await SaveSettingsAsync();
104+
Assert.Equal("MakerPrompt", text);
113105
}
114106

115107
[Fact]
116108
public async Task FarmName_ShowsInSidebar_WhenFarmModeEnabled()
117109
{
118-
await NavigateToSettingsAsync();
110+
await EnableFarmModeAsync();
119111

120-
// Enable farm mode and set name
121-
var toggle = Page.Locator("#farmModeEnabled");
122-
if (!await toggle.IsCheckedAsync())
123-
{
124-
await toggle.CheckAsync();
125-
await Page.WaitForTimeoutAsync(300);
126-
}
127-
var nameInput = Page.Locator("#farmName");
128-
await nameInput.ClearAsync();
112+
// Create a farm and switch to it so the config FarmName gets populated
113+
var nameInput = Page.Locator("#farmNewName");
114+
await nameInput.WaitForAsync(new LocatorWaitForOptions { Timeout = 5_000 });
129115
await nameInput.FillAsync("Sidebar Farm");
130116
await nameInput.PressAsync("Tab");
131-
await SaveSettingsAsync();
117+
await Page.WaitForTimeoutAsync(300);
118+
var createBtn = Page.Locator("[data-testid='farm-create-btn']");
119+
await createBtn.ClickAsync();
120+
await Page.WaitForTimeoutAsync(500);
121+
122+
// Switch to the newly created farm
123+
var selectEl = Page.Locator("select");
124+
await selectEl.SelectOptionAsync(new SelectOptionValue { Label = "Sidebar Farm" });
125+
var switchBtn = Page.Locator("[data-testid='farm-switch-btn']");
126+
await switchBtn.ClickAsync();
127+
await Page.WaitForTimeoutAsync(500);
132128

133129
// Verify farm name appears in sidebar
134130
await Page.GotoAsync($"{_fixture.BaseUrl}/fleet");
@@ -139,18 +135,7 @@ public async Task FarmName_ShowsInSidebar_WhenFarmModeEnabled()
139135
var text = await sidebarFarm.InnerTextAsync();
140136
Assert.Contains("Sidebar Farm", text);
141137

142-
// Clean up — disable farm mode and clear name
143-
await NavigateToSettingsAsync();
144-
toggle = Page.Locator("#farmModeEnabled");
145-
if (await toggle.IsCheckedAsync())
146-
{
147-
await toggle.UncheckAsync();
148-
await Page.WaitForTimeoutAsync(300);
149-
}
150-
nameInput = Page.Locator("#farmName");
151-
await nameInput.ClearAsync();
152-
await nameInput.PressAsync("Tab");
153-
await SaveSettingsAsync();
138+
await RestoreDefaultFarmModeAsync();
154139
}
155140

156141
// ── Farm Configuration Management ──
@@ -239,7 +224,7 @@ public async Task FarmConfig_HiddenWhenFarmModeDisabled()
239224
private async Task NavigateToSettingsAsync()
240225
{
241226
await Page.GotoAsync($"{_fixture.BaseUrl}/settings");
242-
await Page.Locator("#farmName").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
227+
await Page.Locator("#farmModeEnabled").WaitForAsync(new LocatorWaitForOptions { Timeout = 15_000 });
243228
}
244229

245230
private async Task SaveSettingsAsync()

‎MakerPrompt.Shared/Layout/MainLayout.razor‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,6 @@
88
<img class="ms-2" width="40" height="32" aria-hidden="true" src="_content/MakerPrompt.Shared/logo.svg" onerror="this.src='_content/MakerPrompt.Shared/favicon.png'" />
99
<span class="brand-label">@(string.IsNullOrWhiteSpace(ConfigService.Configuration.FarmName) ? "MakerPrompt" : ConfigService.Configuration.FarmName)</span>
1010
</a>
11-
@if (!ConfigService.Configuration.FarmModeEnabled)
12-
{
13-
<a href="/fleet" class="btn btn-sm btn-outline-primary ms-2 d-flex align-items-center gap-1" title="Add Printer" data-testid="header-add-printer">
14-
<i class="bi bi-plus-circle"></i>
15-
<span class="d-none d-md-inline">Add Printer</span>
16-
</a>
17-
}
1811
<NavTop />
1912
</header>
2013

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,7 @@
11
@page "/dashboard"
2-
@inject IAppConfigurationService ConfigService
3-
@inject PrinterConnectionManager ConnectionManager
4-
@inject NavigationManager Navigation
5-
@implements IDisposable
62

73
<LocalizedTitle TitleKey="Dashboard" />
84

95
<div class="container-fluid">
10-
@if (ConnectionManager.Printers.Any(p => p.Service?.IsConnected == true))
11-
{
12-
<ControlPanel />
13-
}
14-
else
15-
{
16-
<div class="row">
17-
<div class="col-12 text-center py-5">
18-
<i class="bi bi-printer" style="font-size: 4rem;"></i>
19-
<h3 class="mt-3" data-testid="dashboard-welcome">Welcome to MakerPrompt</h3>
20-
<p class="text-muted">Connect a printer to get started, or switch to Farm Mode in Settings to manage multiple printers.</p>
21-
<a href="/fleet" class="btn btn-outline-primary mt-2">
22-
<i class="bi bi-plus-circle me-1"></i>Add Printer
23-
</a>
24-
</div>
25-
</div>
26-
}
6+
<ControlPanel />
277
</div>
28-
29-
@code {
30-
protected override void OnInitialized()
31-
{
32-
ConnectionManager.PrintersChanged += HandleChange;
33-
}
34-
35-
private async void HandleChange(object? sender, EventArgs e)
36-
{
37-
await InvokeAsync(StateHasChanged);
38-
}
39-
40-
public void Dispose()
41-
{
42-
ConnectionManager.PrintersChanged -= HandleChange;
43-
}
44-
}

‎MakerPrompt.Shared/Pages/Index.razor‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
@inject NavigationManager Navigation
44

55
@code {
6-
protected override void OnInitialized()
6+
protected override async Task OnInitializedAsync()
77
{
8+
await ConfigService.InitializeAsync();
89
if (ConfigService.Configuration.FarmModeEnabled)
910
Navigation.NavigateTo("/fleet", replace: true);
1011
else

‎MakerPrompt.Shared/Pages/Settings.razor‎

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,6 @@
1414
<div class="container-fluid">
1515
<div class="row">
1616
<div class="col-md-6 col-sm-12">
17-
<div class="card mb-4">
18-
<div class="card-header">
19-
<strong>General</strong>
20-
</div>
21-
<div class="card-body">
22-
<div class="mb-3">
23-
<label class="form-label" for="farmName">Farm Name</label>
24-
<input type="text" class="form-control" id="farmName" @bind="_config.FarmName" placeholder="My Print Farm" />
25-
<div class="form-text">Optional name to display next to the logo.</div>
26-
</div>
27-
</div>
28-
</div>
29-
3017
<div class="card mb-4">
3118
<div class="card-header">
3219
<strong>Farm Mode</strong>
@@ -136,7 +123,6 @@
136123
{
137124
Theme = ConfigService.Configuration.Theme,
138125
Language = ConfigService.Configuration.Language,
139-
FarmName = ConfigService.Configuration.FarmName,
140126
FarmModeEnabled = ConfigService.Configuration.FarmModeEnabled,
141127
ActiveFarmId = ConfigService.Configuration.ActiveFarmId,
142128
AnalyticsEnabled = ConfigService.Configuration.AnalyticsEnabled,
@@ -151,16 +137,25 @@
151137

152138
private async Task SaveSettingsAsync()
153139
{
140+
var wasInFarmMode = ConfigService.Configuration.FarmModeEnabled;
141+
154142
ConfigService.Configuration.Theme = _config.Theme;
155143
ConfigService.Configuration.Language = _config.Language;
156-
ConfigService.Configuration.FarmName = _config.FarmName;
157144
ConfigService.Configuration.FarmModeEnabled = _config.FarmModeEnabled;
158145
ConfigService.Configuration.ActiveFarmId = _config.ActiveFarmId;
159146
ConfigService.Configuration.AnalyticsEnabled = _config.AnalyticsEnabled;
160147
ConfigService.Configuration.EnableFilamentInventory = _config.EnableFilamentInventory;
161148
ConfigService.Configuration.EnablePrintAnalytics = _config.EnablePrintAnalytics;
162149
ConfigService.Configuration.LastUpdated = DateTime.UtcNow;
163150

151+
// When disabling farm mode, clear the farm-loaded printers and reset the farm name
152+
if (wasInFarmMode && !_config.FarmModeEnabled)
153+
{
154+
ConfigService.Configuration.FarmName = string.Empty;
155+
ConfigService.Configuration.ActiveFarmId = null;
156+
await FarmService.ClearPrinterConnectionsAsync();
157+
}
158+
164159
await ConfigService.SaveConfigurationAsync();
165160
ToastService.Notify(new ToastMessage(ToastType.Success, "Settings Saved", "Your settings have been saved successfully."));
166161
}

‎MakerPrompt.Shared/Services/FarmConfigurationService.cs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@ public async Task SwitchFarmAsync(Guid farmId)
126126
FarmsChanged?.Invoke(this, EventArgs.Empty);
127127
}
128128

129+
/// <summary>
130+
/// Clears all printer connections from storage and reloads the connection manager.
131+
/// Called when farm mode is disabled to remove printers that were loaded from a farm.
132+
/// </summary>
133+
public async Task ClearPrinterConnectionsAsync()
134+
{
135+
var bytes = Encoding.UTF8.GetBytes("[]");
136+
using var stream = new MemoryStream(bytes);
137+
await _storage.SaveFileAsync(PrinterStorageKey, stream);
138+
await _connectionManager.ReloadAsync();
139+
}
140+
129141
/// <summary>
130142
/// Exports a farm configuration as a JSON string suitable for saving to a file.
131143
/// </summary>

0 commit comments

Comments
 (0)