From 58d62a32ea9cf857526aefb59de556a2d1212869 Mon Sep 17 00:00:00 2001 From: 4gray Date: Sat, 2 Mar 2024 14:07:01 +0100 Subject: [PATCH] feat(type-filter): filter playlists by type --- .../recent-playlists.component.ts | 32 ++++++++-- .../components/header/header.component.html | 23 +++++++- .../components/header/header.component.scss | 4 ++ .../components/header/header.component.ts | 59 +++++++++++++++++-- src/app/state/actions.ts | 5 ++ src/app/state/playlists.state.ts | 2 + src/app/state/reducers.ts | 14 ++++- src/app/state/selectors.ts | 6 ++ 8 files changed, 131 insertions(+), 14 deletions(-) diff --git a/src/app/home/recent-playlists/recent-playlists.component.ts b/src/app/home/recent-playlists/recent-playlists.component.ts index 5fc9e1af0..564e55ad0 100644 --- a/src/app/home/recent-playlists/recent-playlists.component.ts +++ b/src/app/home/recent-playlists/recent-playlists.component.ts @@ -19,6 +19,7 @@ import { Playlist } from '../../../../shared/playlist.interface'; import { DataService } from '../../services/data.service'; import * as PlaylistActions from '../../state/actions'; import { + selectActiveTypeFilters, selectAllPlaylistsMeta, selectPlaylistsLoadingFlag, } from '../../state/selectors'; @@ -47,20 +48,43 @@ export class RecentPlaylistsComponent implements OnDestroy { playlists$ = combineLatest([ this.store.select(selectAllPlaylistsMeta), this.searchQuery, + // eslint-disable-next-line @ngrx/avoid-combining-selectors + this.store.select(selectActiveTypeFilters), ]).pipe( - // eslint-disable-next-line @ngrx/avoid-mapping-selectors - map(([playlists, searchQuery]) => + map(([playlists, searchQuery, filters]) => playlists - .sort((a, b) => a.position - b.position) + .filter((item) => { + const isStalkerFilter = + item.macAddress && filters.includes('stalker'); + const isXtreamFilter = + item.username && + item.password && + item.serverUrl && + filters.includes('xtream'); + const isM3uFilter = + !item.username && + !item.password && + !item.serverUrl && + !item.macAddress && + filters.includes('m3u'); + + return ( + (isStalkerFilter && filters.includes('stalker')) || + (isXtreamFilter && filters.includes('xtream')) || + (isM3uFilter && filters.includes('m3u')) + ); + }) .filter((item) => item.title.toLowerCase().includes(searchQuery.toLowerCase()) ) + .sort((a, b) => a.position - b.position) ) ); allPlaylistsLoaded = this.store.selectSignal(selectPlaylistsLoadingFlag); @Input() sidebarMode = false; + @Output() playlistClicked = new EventEmitter(); /** IPC Renderer commands list with callbacks */ commandsList = [ @@ -113,8 +137,6 @@ export class RecentPlaylistsComponent implements OnDestroy { isMigrationPossible = false; migrationMessage = ''; - @Output() playlistClicked = new EventEmitter(); - constructor( private dialog: MatDialog, private dialogService: DialogService, diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index 9fc126b14..577bad3f7 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -21,14 +21,15 @@ data-test-id="filter-playlist-by-name" > search - + --> --> + + + +
+

{{ 'HOME.FILTER_BY_TYPE' | translate }}:

+ @for (type of playlistTypes; track $index) { +

+ {{ type.title }} +

+ } +
+
+