feat(downloads): finish manager MVP

This commit is contained in:
4gray committed 2026-08-01 16:29:49 +02:00
1 parent eb55c17a05
commit bcc2e36a05
48 files changed
+4145 -1844

No files matched your search

@@ -137,9 +137,7 @@
[class.is-active]="isDownloadsView()"
[class.has-activity]="hasActiveDownloads()"
(click)="onDownloadsRequested()"
[matTooltip]="
'WORKSPACE.SHELL.RAIL_DOWNLOADS' | translate
"
[matTooltip]="'WORKSPACE.SHELL.RAIL_DOWNLOADS' | translate"
[attr.aria-label]="
('WORKSPACE.SHELL.OPEN_DOWNLOADS' | translate) +
(hasActiveDownloads()
@@ -1,10 +1,6 @@
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import {
Component,
input,
output,
} from '@angular/core';
import { Component, input, output } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MatIconButton } from '@angular/material/button';
@@ -86,8 +82,9 @@ describe('WorkspaceShellHeaderComponent', () => {
it('emits search input changes as user types', () => {
const emitted: string[] = [];
component.searchChanged.subscribe((value) => emitted.push(value));
const input: HTMLInputElement =
fixture.nativeElement.querySelector('input[type="search"]');
const input: HTMLInputElement = fixture.nativeElement.querySelector(
'input[type="search"]'
);
input.value = 'matrix';
input.dispatchEvent(new Event('input'));
@@ -96,8 +93,9 @@ describe('WorkspaceShellHeaderComponent', () => {
});
it('focuses and selects the search input on request', () => {
const input: HTMLInputElement =
fixture.nativeElement.querySelector('input[type="search"]');
const input: HTMLInputElement = fixture.nativeElement.querySelector(
'input[type="search"]'
);
input.value = 'matrix';
input.blur();
@@ -1,8 +1,4 @@
<div
class="workspace-shell"
appPlaylistDropZone
#dropZone="playlistDropZone"
>
<div class="workspace-shell" appPlaylistDropZone #dropZone="playlistDropZone">
<app-playlist-drop-overlay [state]="dropZone.overlayState()" />
@if (facade.showXtreamImportOverlay()) {
<app-workspace-shell-import-overlay />
@@ -54,7 +50,10 @@
(accountInfoRequested)="facade.openAccountInfo()"
/>
<div class="workspace-body" [class.single-pane]="!facade.showContextPanel()">
<div
class="workspace-body"
[class.single-pane]="!facade.showContextPanel()"
>
@if (facade.showContextPanel()) {
<app-workspace-shell-context-sidebar
[variant]="facade.contextPanel()"
@@ -75,9 +74,7 @@
<app-external-playback-dock
[session]="session"
(closeClicked)="facade.closeActiveExternalSession()"
(artworkClicked)="
facade.openActiveExternalSessionTarget()
"
(artworkClicked)="facade.openActiveExternalSessionTarget()"
/>
</footer>
}
@@ -1,10 +1,4 @@
import {
Component,
Directive,
input,
output,
signal,
} from '@angular/core';
import { Component, Directive, input, output, signal } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { RouterOutlet, provideRouter } from '@angular/router';
import { By } from '@angular/platform-browser';