feat(m3u): open the programme guide in place with a docked player

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5.1 committed 2026-09-06 13:16:18 +02:00
1 parent e20b9cc7a0
commit 44ad33beb9
13 files changed
+728 -386

No files matched your search

@@ -41,11 +41,11 @@ describe('WorkspaceCommandPaletteComponent', () => {
run: () => undefined,
},
{
id: 'multi-epg',
label: 'Open Multi-EPG',
id: 'epg-guide',
label: 'Open programme guide',
description: '',
group: 'view',
icon: 'view_list',
icon: 'grid_view',
keywords: ['epg', 'guide'],
priority: 0,
visible: true,
@@ -126,7 +126,7 @@ describe('WorkspaceCommandPaletteComponent', () => {
component.query.set('guide');
expect(component.flatCommands().map((command) => command.id)).toEqual([
'multi-epg',
'epg-guide',
]);
});
@@ -135,7 +135,7 @@ describe('WorkspaceCommandPaletteComponent', () => {
fixture.detectChanges();
expect(component.flatCommands().map((command) => command.id)).toEqual([
'multi-epg',
'epg-guide',
'playlist-search',
'global-search',
]);
@@ -158,7 +158,7 @@ describe('WorkspaceCommandPaletteComponent', () => {
component.onCommandClick(command);
expect(dialogRef.close).toHaveBeenCalledWith({
commandId: 'multi-epg',
commandId: 'epg-guide',
query: '',
});
});
@@ -120,6 +120,8 @@
type="button"
class="header-shortcut"
mat-icon-button
[class.is-active]="action.active?.() ?? false"
[attr.aria-pressed]="action.active ? action.active() : null"
(click)="onHeaderShortcutRequested()"
[matTooltip]="action.tooltipKey | translate"
[attr.aria-label]="action.ariaLabelKey | translate"
@@ -394,3 +394,8 @@
}
}
}
.header-shortcut.is-active {
background: var(--app-selection-surface);
color: var(--app-selection-color);
}
@@ -877,7 +877,7 @@ describe('WorkspaceShellFacade', () => {
);
});
it('includes M3U navigation, playlist actions, and Multi-EPG on playlist routes', () => {
it('includes M3U navigation, playlist actions, and the programme guide on playlist routes', () => {
const headerContext = TestBed.inject(WorkspaceHeaderContextService);
activePlaylistSignal.set({
@@ -889,14 +889,14 @@ describe('WorkspaceShellFacade', () => {
});
facade.currentUrl.set('/workspace/playlists/pl-m3u/groups');
headerContext.setAction({
id: 'm3u-multi-epg',
icon: 'view_list',
tooltipKey: 'TOP_MENU.OPEN_MULTI_EPG',
ariaLabelKey: 'TOP_MENU.OPEN_MULTI_EPG',
id: 'm3u-epg-guide',
icon: 'grid_view',
tooltipKey: 'TOP_MENU.OPEN_EPG_GUIDE',
ariaLabelKey: 'TOP_MENU.OPEN_EPG_GUIDE',
palette: {
labelKey: 'TOP_MENU.OPEN_MULTI_EPG',
labelKey: 'TOP_MENU.OPEN_EPG_GUIDE',
descriptionKey:
'WORKSPACE.SHELL.COMMANDS.OPEN_MULTI_EPG_DESCRIPTION',
'WORKSPACE.SHELL.COMMANDS.OPEN_EPG_GUIDE_DESCRIPTION',
keywords: ['epg', 'guide', 'schedule'],
priority: 10,
},
@@ -907,7 +907,7 @@ describe('WorkspaceShellFacade', () => {
expect(commands.map((command) => command.id)).toEqual(
expect.arrayContaining([
'm3u-multi-epg',
'm3u-epg-guide',
'go-to-all',
'go-to-favorites',
'go-to-recent',
@@ -915,7 +915,7 @@ describe('WorkspaceShellFacade', () => {
])
);
expect(
commands.find((command) => command.id === 'm3u-multi-epg')?.group
commands.find((command) => command.id === 'm3u-epg-guide')?.group
).toBe('view');
expect(commands.some((command) => command.id === 'account-info')).toBe(
false