From beba983255db76d89d6beb81ec2a59f75fa1ca23 Mon Sep 17 00:00:00 2001 From: 4gray Date: Sun, 2 Aug 2026 15:58:55 +0200 Subject: [PATCH] fix(downloads): isolate season header build warnings --- .../season-container.component.html | 84 ++------------ .../season-container.component.scss | 103 ----------------- .../season-container.component.spec.ts | 3 + .../season-container.component.ts | 8 +- .../season-header.component.html | 69 ++++++++++++ .../season-header.component.scss | 106 ++++++++++++++++++ .../season-header.component.ts | 40 +++++++ 7 files changed, 233 insertions(+), 180 deletions(-) create mode 100644 libs/ui/components/src/lib/season-container/season-header.component.html create mode 100644 libs/ui/components/src/lib/season-container/season-header.component.scss create mode 100644 libs/ui/components/src/lib/season-container/season-header.component.ts diff --git a/libs/ui/components/src/lib/season-container/season-container.component.html b/libs/ui/components/src/lib/season-container/season-container.component.html index 325cbf69c..34cbe1f88 100644 --- a/libs/ui/components/src/lib/season-container/season-container.component.html +++ b/libs/ui/components/src/lib/season-container/season-container.component.html @@ -1,78 +1,14 @@
-
-
-

- {{ 'PORTALS.SEASONS_AND_EPISODES' | translate }} -

-
- @if ( - downloadPresenter.presentationVisible() || - (hasSeasons() && !showSeasonEmptyState()) - ) { -
- @if (downloadPresenter.presentationVisible()) { - - } - @if (hasSeasons() && !showSeasonEmptyState()) { -
- - - grid_view - - - view_list - - -
- } -
- } -
+ @if (hasSeasons()) { { expect(button.getAttribute('aria-label')).toBe( 'Download season, 1 episodes available' ); + expect( + button.querySelector('.season-download-button__label')?.textContent + ).toContain('Download season (1)'); expect(button.nextElementSibling?.classList).toContain('view-toggle'); button.click(); diff --git a/libs/ui/components/src/lib/season-container/season-container.component.ts b/libs/ui/components/src/lib/season-container/season-container.component.ts index 392d4d4e9..b885ecfe0 100644 --- a/libs/ui/components/src/lib/season-container/season-container.component.ts +++ b/libs/ui/components/src/lib/season-container/season-container.component.ts @@ -12,7 +12,6 @@ import { untracked, } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatDialog } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; @@ -41,9 +40,12 @@ import { parseDuration, } from './episode-progress.util'; import { SeasonDownloadPresenter } from './season-download-presenter'; +import { + type EpisodeViewMode, + SeasonHeaderComponent, +} from './season-header.component'; import { SeasonTabsComponent } from './season-tabs.component'; -type EpisodeViewMode = 'grid' | 'list'; const EPISODE_VIEW_MODE_KEY = 'iptvnator_episode_view_mode'; export interface SeasonContainerPlaybackToggleRequest { @@ -59,11 +61,11 @@ export interface SeasonContainerPlaybackToggleRequest { providers: [SeasonDownloadPresenter], imports: [ MatButtonModule, - MatButtonToggleModule, MatIcon, MatProgressSpinnerModule, MatTooltipModule, ProgressCapsuleComponent, + SeasonHeaderComponent, SeasonTabsComponent, TranslateModule, ], diff --git a/libs/ui/components/src/lib/season-container/season-header.component.html b/libs/ui/components/src/lib/season-container/season-header.component.html new file mode 100644 index 000000000..caaec0fbf --- /dev/null +++ b/libs/ui/components/src/lib/season-container/season-header.component.html @@ -0,0 +1,69 @@ +
+
+

+ {{ 'PORTALS.SEASONS_AND_EPISODES' | translate }} +

+
+ @if (downloadVisible() || viewToggleVisible()) { +
+ @if (downloadVisible()) { + + } + @if (viewToggleVisible()) { +
+ + + grid_view + + + view_list + + +
+ } +
+ } +
diff --git a/libs/ui/components/src/lib/season-container/season-header.component.scss b/libs/ui/components/src/lib/season-container/season-header.component.scss new file mode 100644 index 000000000..0e7b266b6 --- /dev/null +++ b/libs/ui/components/src/lib/season-container/season-header.component.scss @@ -0,0 +1,106 @@ +:host { + display: block; +} + +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + min-height: 32px; + gap: 16px; + + &__left { + display: flex; + align-items: center; + gap: 16px; + flex: 1; + } + + &__actions { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + gap: 8px; + } + + .section-title { + font-size: 1.25rem; + font-weight: 600; + margin: 0; + color: var(--text-primary); + letter-spacing: -0.01em; + } + + .view-toggle { + mat-button-toggle-group { + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 6px; + overflow: hidden; + background: rgba(255, 255, 255, 0.03); + + ::ng-deep { + .mat-button-toggle { + background: transparent; + + .mat-button-toggle-button { + padding: 0 8px; + height: 32px; + } + + mat-icon { + font-size: 18px; + width: 18px; + height: 18px; + color: var(--text-secondary); + } + + &.mat-button-toggle-checked { + background: rgba(255, 255, 255, 0.1); + + mat-icon { + color: var(--accent-color); + } + } + + &:hover:not(.mat-button-toggle-checked) { + background: rgba(255, 255, 255, 0.05); + } + } + + .mat-button-toggle-appearance-standard { + .mat-button-toggle-label-content { + line-height: 32px; + padding: 0; + } + } + + .mat-button-toggle + .mat-button-toggle { + border-left: 1px solid rgba(255, 255, 255, 0.1); + } + } + } + } +} + +.season-download-button { + min-height: 36px; + + mat-spinner { + display: inline-block; + margin-inline-end: 8px; + } +} + +@media (max-width: 560px) { + .section-header { + align-items: flex-start; + flex-wrap: wrap; + + &__actions { + width: 100%; + justify-content: space-between; + } + } +} diff --git a/libs/ui/components/src/lib/season-container/season-header.component.ts b/libs/ui/components/src/lib/season-container/season-header.component.ts new file mode 100644 index 000000000..9093d6995 --- /dev/null +++ b/libs/ui/components/src/lib/season-container/season-header.component.ts @@ -0,0 +1,40 @@ +import { + ChangeDetectionStrategy, + Component, + input, + output, +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatIcon } from '@angular/material/icon'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslateModule } from '@ngx-translate/core'; + +export type EpisodeViewMode = 'grid' | 'list'; + +@Component({ + selector: 'app-season-header', + templateUrl: './season-header.component.html', + styleUrls: ['./season-header.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + MatButtonModule, + MatButtonToggleModule, + MatIcon, + MatProgressSpinnerModule, + MatTooltipModule, + TranslateModule, + ], +}) +export class SeasonHeaderComponent { + readonly downloadVisible = input.required(); + readonly batchRunning = input.required(); + readonly seasonDisabled = input.required(); + readonly eligibleEpisodeCount = input.required(); + readonly viewToggleVisible = input.required(); + readonly viewMode = input.required(); + + readonly downloadSeason = output(); + readonly viewModeChange = output(); +}