diff --git a/ErsatzTV/Locals/Shared/MainLayout.resx b/ErsatzTV/Locals/Shared/MainLayout.resx
index 67110bc83..2b334293a 100644
--- a/ErsatzTV/Locals/Shared/MainLayout.resx
+++ b/ErsatzTV/Locals/Shared/MainLayout.resx
@@ -141,6 +141,9 @@
XMLTV
+
+ Opens in ChicoryTV
+
Support
diff --git a/ErsatzTV/Shared/MainLayout.razor b/ErsatzTV/Shared/MainLayout.razor
index 1373fd51e..41232a333 100644
--- a/ErsatzTV/Shared/MainLayout.razor
+++ b/ErsatzTV/Shared/MainLayout.razor
@@ -117,7 +117,7 @@
{
- @StringLocalizer["ButtonChannels"]
+ @StringLocalizer["ButtonChannels"]@ChicoryCue
@StringLocalizer["ButtonFFmpegProfiles"]
@StringLocalizer["ButtonWatermarks"]
@@ -127,7 +127,7 @@
@StringLocalizer["ButtonMediaSourcesPlex"]
- @StringLocalizer["ButtonMediaLibraries"]
+ @StringLocalizer["ButtonMediaLibraries"]@ChicoryCue
@StringLocalizer["ButtonMediaTrash"]
@StringLocalizer["ButtonMediaTvShows"]
@StringLocalizer["ButtonMediaMovies"]
@@ -161,7 +161,7 @@
}
- @StringLocalizer["ButtonSchedulingSchedules"]
+ @StringLocalizer["ButtonSchedulingSchedules"]@ChicoryCue
@StringLocalizer["ButtonSchedulingBlocks"]
@StringLocalizer["ButtonSchedulingTemplates"]
@StringLocalizer["ButtonSchedulingDecos"]
@@ -180,17 +180,18 @@
{
@StringLocalizer["ButtonSchedulingPlayouts"]
}
+ @ChicoryCue
- @StringLocalizer["ButtonSettingsFFmpeg"]
- @StringLocalizer["ButtonSettingsLogging"]
- @StringLocalizer["ButtonSettingsHdHomeRun"]
- @StringLocalizer["ButtonSettingsScanner"]
- @StringLocalizer["ButtonSettingsPlayout"]
- @StringLocalizer["ButtonSettingsUi"]
- @StringLocalizer["ButtonSettingsXmltv"]
+ @StringLocalizer["ButtonSettingsFFmpeg"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsLogging"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsHdHomeRun"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsScanner"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsPlayout"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsUi"]@ChicoryCue
+ @StringLocalizer["ButtonSettingsXmltv"]@ChicoryCue
@@ -260,6 +261,15 @@
@code {
+ // Lightweight cue (ersatztv#147): marks nav entries that 302-redirect into the
+ // ChicoryTV SPA (see LegacyUiRedirects.Map) so it's clear before clicking that the
+ // entry leaves this Blazor UI. Non-redirecting entries in the same MudNavGroup are
+ // left bare.
+ private RenderFragment ChicoryCue =>
+ @
+
+ ;
+
private static readonly string InfoVersion = Assembly.GetEntryAssembly().GetCustomAttribute()?.InformationalVersion ?? "unknown";
private static readonly string BuildConfiguration = Assembly.GetEntryAssembly().GetCustomAttribute()?.Configuration?.ToLower() ?? "unset";
diff --git a/web/src/App.test.tsx b/web/src/App.test.tsx
index 866ab5736..01ed499d0 100644
--- a/web/src/App.test.tsx
+++ b/web/src/App.test.tsx
@@ -2728,6 +2728,15 @@ describe('Settings screen (#93)', () => {
expect(await screen.findByText('Local')).toBeInTheDocument();
});
+ it('shows a Classic UI link to the legacy Blazor app in the System pane (#147)', async () => {
+ mockDashboardApi();
+ await openSettings();
+ fireEvent.click(await screen.findByRole('button', { name: /^System/ }));
+
+ const link = await screen.findByRole('link', { name: /Open Classic UI/ });
+ expect(link).toHaveAttribute('href', '/system/health');
+ });
+
it('renders and stays editable when media sources (tier-2 reference data) fail to load', async () => {
mockDashboardApi({ mediaSourcesFailuresBeforeSuccess: 99 });
await openSettings();
diff --git a/web/src/screens/SettingsScreen.tsx b/web/src/screens/SettingsScreen.tsx
index fb2f9f43c..e087cb62f 100644
--- a/web/src/screens/SettingsScreen.tsx
+++ b/web/src/screens/SettingsScreen.tsx
@@ -854,6 +854,12 @@ function SystemPane({
Open Dashboard
+
+
+ Open Classic UI
+
+
+
);