diff --git a/web/src/App.test.tsx b/web/src/App.test.tsx index 01ed499d0..98019317f 100644 --- a/web/src/App.test.tsx +++ b/web/src/App.test.tsx @@ -2712,7 +2712,7 @@ describe('Settings screen (#93)', () => { expect(screen.queryByRole('button', { name: 'Delete 1920×1080' })).not.toBeInTheDocument(); }); - it('renders FFmpeg profiles and media sources as read-only cards with a Legacy UI callout', async () => { + it('renders FFmpeg profiles read-only with a link to the FFmpeg Profiles editor, and media sources', async () => { mockDashboardApi({ ffmpegProfiles: [ffmpegProfile({ id: 1, name: '1080p H.264' }), ffmpegProfile({ id: 2, name: '720p H.264' })], mediaSources: [mediaSource({ id: 30, kind: 'Local', name: 'Local' })] @@ -2722,7 +2722,7 @@ describe('Settings screen (#93)', () => { expect((await screen.findAllByText('1080p H.264')).length).toBeGreaterThan(0); expect(screen.getAllByText('720p H.264').length).toBeGreaterThan(0); - expect(screen.getAllByText('Legacy UI').length).toBeGreaterThan(0); + expect(screen.getByRole('button', { name: /Manage FFmpeg profiles/ })).toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: /^System/ })); expect(await screen.findByText('Local')).toBeInTheDocument(); diff --git a/web/src/App.tsx b/web/src/App.tsx index 29f9a517c..8f2dc601e 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -45,7 +45,9 @@ import { Server, Settings, Shuffle, + SlidersHorizontal, Sparkles, + Stamp, Stethoscope, Timer, Trash2, @@ -56,7 +58,10 @@ import chicoryMarkUrl from '../../design-system/assets/chicory-mark.svg'; import { ChannelBuilderScreen } from './builder/ChannelBuilder'; import { ChannelEditScreen } from './screens/ChannelEditScreen'; import { CollectionsScreen } from './screens/CollectionsScreen'; +import { FFmpegProfilesScreen } from './screens/FFmpegProfilesScreen'; +import { FillerPresetsScreen } from './screens/FillerPresetsScreen'; import { SettingsScreen } from './screens/SettingsScreen'; +import { WatermarksScreen } from './screens/WatermarksScreen'; import { navigateToPath } from './routing'; import { Badge, @@ -131,7 +136,10 @@ type ScreenId = | 'schedules' | 'playouts' | 'collections' + | 'fillerPresets' | 'libraries' + | 'ffmpegProfiles' + | 'watermarks' | 'settings'; interface ScreenRoute { @@ -244,6 +252,18 @@ const routes: ScreenRoute[] = [ primaryAction: 'Add Collection', placeholder: 'Collections workspace' }, + { + id: 'fillerPresets', + path: '/app/filler-presets', + label: 'Filler Presets', + title: 'Filler Presets', + kicker: 'Media', + description: 'Pre/mid/post-roll, tail and fallback filler presets used by schedules.', + icon: