@@ -25,6 +25,7 @@ import './editor/editor';
25
25
26
26
// our imports.
27
27
import { SEARCH_MEDIA , SearchMediaEventArgs } from './events/search-media' ;
28
+ import { FILTER_SECTION_MEDIA , FilterSectionMediaEventArgs } from './events/filter-section-media' ;
28
29
import { CATEGORY_DISPLAY , CategoryDisplayEventArgs } from './events/category-display' ;
29
30
import { EDITOR_CONFIG_AREA_SELECTED , EditorConfigAreaSelectedEventArgs } from './events/editor-config-area-selected' ;
30
31
import { PROGRESS_STARTED } from './events/progress-started' ;
@@ -36,7 +37,18 @@ import { CardConfig } from './types/card-config';
36
37
import { CustomImageUrls } from './types/custom-image-urls' ;
37
38
import { SearchMediaTypes } from './types/search-media-types' ;
38
39
import { SearchBrowser } from './sections/search-media-browser' ;
40
+ import { FavBrowserBase } from './sections/fav-browser-base' ;
41
+ import { AlbumFavBrowser } from './sections/album-fav-browser' ;
42
+ import { ArtistFavBrowser } from './sections/artist-fav-browser' ;
43
+ import { AudiobookFavBrowser } from './sections/audiobook-fav-browser' ;
39
44
import { CategoryBrowser } from './sections/category-browser' ;
45
+ import { DeviceBrowser } from './sections/device-browser' ;
46
+ import { EpisodeFavBrowser } from './sections/episode-fav-browser' ;
47
+ import { PlaylistFavBrowser } from './sections/playlist-fav-browser' ;
48
+ import { RecentBrowser } from './sections/recent-browser' ;
49
+ import { ShowFavBrowser } from './sections/show-fav-browser' ;
50
+ import { TrackFavBrowser } from './sections/track-fav-browser' ;
51
+ import { UserPresetBrowser } from './sections/userpreset-browser' ;
40
52
import { formatTitleInfo , removeSpecialChars } from './utils/media-browser-utils' ;
41
53
import { BRAND_LOGO_IMAGE_BASE64 , BRAND_LOGO_IMAGE_SIZE , FOOTER_ICON_SIZE_DEFAULT } from './constants' ;
42
54
import {
@@ -98,8 +110,19 @@ export class Card extends LitElement {
98
110
@state ( ) private cancelLoader ! : boolean ;
99
111
@state ( ) private playerId ! : string ;
100
112
113
+ // card section references.
101
114
@query ( "#elmSearchMediaBrowserForm" , false ) private elmSearchMediaBrowserForm ! : SearchBrowser ;
102
115
@query ( "#elmCategoryBrowserForm" , false ) private elmCategoryBrowserForm ! : CategoryBrowser ;
116
+ @query ( "#elmAlbumFavBrowserForm" , false ) private elmAlbumFavBrowserForm ! : AlbumFavBrowser ;
117
+ @query ( "#elmArtistFavBrowserForm" , false ) private elmArtistFavBrowserForm ! : ArtistFavBrowser ;
118
+ @query ( "#elmAudiobookFavBrowserForm" , false ) private elmAudiobookFavBrowserForm ! : AudiobookFavBrowser ;
119
+ @query ( "#elmDeviceBrowserForm" , false ) private elmDeviceBrowserForm ! : DeviceBrowser ;
120
+ @query ( "#elmEpisodeFavBrowserForm" , false ) private elmEpisodeFavBrowserForm ! : EpisodeFavBrowser ;
121
+ @query ( "#elmPlaylistFavBrowserForm" , false ) private elmPlaylistFavBrowserForm ! : PlaylistFavBrowser ;
122
+ @query ( "#elmRecentBrowserForm" , false ) private elmRecentBrowserForm ! : RecentBrowser ;
123
+ @query ( "#elmShowFavBrowserForm" , false ) private elmShowFavBrowserForm ! : ShowFavBrowser ;
124
+ @query ( "#elmTrackFavBrowserForm" , false ) private elmTrackFavBrowserForm ! : TrackFavBrowser ;
125
+ @query ( "#elmUserPresetBrowserForm" , false ) private elmUserPresetBrowserForm ! : UserPresetBrowser ;
103
126
104
127
/** Indicates if createStore method is executing for the first time (true) or not (false). */
105
128
private isFirstTimeSetup : boolean = true ;
@@ -168,19 +191,19 @@ export class Card extends LitElement {
168
191
${
169
192
this . playerId
170
193
? choose ( this . section , [
171
- [ Section . ALBUM_FAVORITES , ( ) => html `<spc- album- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- album- fav- browser> ` ] ,
172
- [ Section . ARTIST_FAVORITES , ( ) => html `<spc- artis t- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- artis t- fav- browser> ` ] ,
173
- [ Section . AUDIOBOOK_FAVORITES , ( ) => html `<spc- audiobook- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- audiobook- fav- browser> ` ] ,
194
+ [ Section . ALBUM_FAVORITES , ( ) => html `<spc- album- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmAlbumFavBrowserForm" > </ spc- album- fav- browser> ` ] ,
195
+ [ Section . ARTIST_FAVORITES , ( ) => html `<spc- artis t- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmArtistFavBrowserForm" > </ spc- artis t- fav- browser> ` ] ,
196
+ [ Section . AUDIOBOOK_FAVORITES , ( ) => html `<spc- audiobook- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmAudiobookFavBrowserForm" > </ spc- audiobook- fav- browser> ` ] ,
174
197
[ Section . CATEGORYS , ( ) => html `<spc- categor y- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id= "elmCategoryBrowserForm" > </ spc- categor y- browser> ` ] ,
175
- [ Section . DEVICES , ( ) => html `<spc- device- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- device- browser> ` ] ,
176
- [ Section . EPISODE_FAVORITES , ( ) => html `<spc- epis ode-fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- epis ode-fav- browser> ` ] ,
198
+ [ Section . DEVICES , ( ) => html `<spc- device- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmDeviceBrowserForm" > </ spc- device- browser> ` ] ,
199
+ [ Section . EPISODE_FAVORITES , ( ) => html `<spc- epis ode-fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmEpisodeFavBrowserForm" > </ spc- epis ode-fav- browser> ` ] ,
177
200
[ Section . PLAYER , ( ) => html `<spc- player id= "spcPlayer" .store = ${ this . store } > </ spc- player> ` ] ,
178
- [ Section . PLAYLIST_FAVORITES , ( ) => html `<spc- playlis t- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- playlis t- fav- browser> ` ] ,
179
- [ Section . RECENTS , ( ) => html `<spc- recent- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- recents- browser> ` ] ,
201
+ [ Section . PLAYLIST_FAVORITES , ( ) => html `<spc- playlis t- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmPlaylistFavBrowserForm" > </ spc- playlis t- fav- browser> ` ] ,
202
+ [ Section . RECENTS , ( ) => html `<spc- recent- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmRecentBrowserForm" > </ spc- recents- browser> ` ] ,
180
203
[ Section . SEARCH_MEDIA , ( ) => html `<spc- search- media- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id= "elmSearchMediaBrowserForm" > </ spc- search- media- browser> ` ] ,
181
- [ Section . SHOW_FAVORITES , ( ) => html `<spc- show- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- show- fav- browser> ` ] ,
182
- [ Section . TRACK_FAVORITES , ( ) => html `<spc- track- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- track- fav- browser> ` ] ,
183
- [ Section . USERPRESETS , ( ) => html `<spc- userpreset- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } > </ spc- userpresets- browser> ` ] ,
204
+ [ Section . SHOW_FAVORITES , ( ) => html `<spc- show- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmShowFavBrowserForm" > </ spc- show- fav- browser> ` ] ,
205
+ [ Section . TRACK_FAVORITES , ( ) => html `<spc- track- fav- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmTrackFavBrowserForm" > </ spc- track- fav- browser> ` ] ,
206
+ [ Section . USERPRESETS , ( ) => html `<spc- userpreset- browser .store = ${ this . store } @item-selected = ${ this . onMediaListItemSelected } id = "elmUserPresetBrowserForm" > </ spc- userpresets- browser> ` ] ,
184
207
[ Section . UNDEFINED , ( ) => html `<div class= "spc-not-configured" > SpotifyPlus card configuration error .<br/ > Please configure section (s) to dis play.</ div> ` ] ,
185
208
] )
186
209
: html `<div class= "spc-initial-config" > Welcome to the SpotifyPlus media player card .<br/ > Start by configuring a media player entity .</ div> `
@@ -418,6 +441,7 @@ export class Card extends LitElement {
418
441
this . addEventListener ( PROGRESS_STARTED , this . onProgressStartedEventHandler ) ;
419
442
this . addEventListener ( SEARCH_MEDIA , this . onSearchMediaEventHandler ) ;
420
443
this . addEventListener ( CATEGORY_DISPLAY , this . onCategoryDisplayEventHandler ) ;
444
+ this . addEventListener ( FILTER_SECTION_MEDIA , this . onFilterSectionMediaEventHandler ) ;
421
445
422
446
// only add the following events if card configuration is being edited.
423
447
if ( isCardInEditPreview ( this ) ) {
@@ -447,6 +471,7 @@ export class Card extends LitElement {
447
471
this . removeEventListener ( PROGRESS_STARTED , this . onProgressStartedEventHandler ) ;
448
472
this . removeEventListener ( SEARCH_MEDIA , this . onSearchMediaEventHandler ) ;
449
473
this . removeEventListener ( CATEGORY_DISPLAY , this . onCategoryDisplayEventHandler ) ;
474
+ this . removeEventListener ( FILTER_SECTION_MEDIA , this . onFilterSectionMediaEventHandler ) ;
450
475
451
476
// the following event is only added when the card configuration editor is created.
452
477
// always remove the following events, as isCardInEditPreview() can sometimes
@@ -658,6 +683,86 @@ export class Card extends LitElement {
658
683
}
659
684
660
685
686
+ /**
687
+ * Handles the `FILTER_SECTION_MEDIA` event.
688
+ * This will show the specified section, and apply the specified filter criteria
689
+ * passed in the event arguments.
690
+ *
691
+ * @param ev Event definition and arguments.
692
+ */
693
+ protected onFilterSectionMediaEventHandler = ( ev : Event ) => {
694
+
695
+ // map event arguments.
696
+ const evArgs = ( ev as CustomEvent ) . detail as FilterSectionMediaEventArgs ;
697
+
698
+ // validate section id.
699
+ const enumValues : string [ ] = Object . values ( Section ) ;
700
+ if ( ! enumValues . includes ( evArgs . section || "" ) ) {
701
+ debuglog ( "%onFilterSectionMediaEventHandler - Ignoring Filter request; section is not a valid Section enum value:\n%s" ,
702
+ "color:red" ,
703
+ JSON . stringify ( evArgs , null , 2 ) ,
704
+ ) ;
705
+ }
706
+
707
+ // is section activated? if so, then select it.
708
+ if ( this . config . sections ?. includes ( evArgs . section as Section ) ) {
709
+
710
+ // show the search section.
711
+ this . section = evArgs . section as Section ;
712
+ this . store . section = this . section ;
713
+
714
+ // wait just a bit before executing the search.
715
+ setTimeout ( ( ) => {
716
+
717
+ if ( debuglog . enabled ) {
718
+ debuglog ( "onFilterSectionMediaEventHandler - executing filter:\n%s" ,
719
+ JSON . stringify ( evArgs , null , 2 ) ,
720
+ ) ;
721
+ }
722
+
723
+ // reference the section browser.
724
+ let browserBase : FavBrowserBase ;
725
+ if ( evArgs . section == Section . ALBUM_FAVORITES ) {
726
+ browserBase = this . elmAlbumFavBrowserForm ;
727
+ } else if ( evArgs . section == Section . ARTIST_FAVORITES ) {
728
+ browserBase = this . elmArtistFavBrowserForm ;
729
+ } else if ( evArgs . section == Section . AUDIOBOOK_FAVORITES ) {
730
+ browserBase = this . elmAudiobookFavBrowserForm ;
731
+ } else if ( evArgs . section == Section . DEVICES ) {
732
+ browserBase = this . elmDeviceBrowserForm ;
733
+ } else if ( evArgs . section == Section . EPISODE_FAVORITES ) {
734
+ browserBase = this . elmEpisodeFavBrowserForm ;
735
+ } else if ( evArgs . section == Section . PLAYLIST_FAVORITES ) {
736
+ browserBase = this . elmPlaylistFavBrowserForm ;
737
+ } else if ( evArgs . section == Section . RECENTS ) {
738
+ browserBase = this . elmRecentBrowserForm ;
739
+ } else if ( evArgs . section == Section . SHOW_FAVORITES ) {
740
+ browserBase = this . elmShowFavBrowserForm ;
741
+ } else if ( evArgs . section == Section . TRACK_FAVORITES ) {
742
+ browserBase = this . elmTrackFavBrowserForm ;
743
+ } else if ( evArgs . section == Section . USERPRESETS ) {
744
+ browserBase = this . elmUserPresetBrowserForm ;
745
+ } else {
746
+ return ;
747
+ }
748
+
749
+ // execute the filter.
750
+ browserBase . filterSectionMedia ( evArgs ) ;
751
+ //super.requestUpdate();
752
+
753
+ } , 50 ) ;
754
+
755
+ } else {
756
+
757
+ // section is not activated; cannot search.
758
+ debuglog ( "%onFilterSectionMediaEventHandler - Filter section is not enabled; ignoring filter request:\n%s" ,
759
+ "color:red" ,
760
+ JSON . stringify ( evArgs , null , 2 ) ,
761
+ ) ;
762
+ }
763
+ }
764
+
765
+
661
766
/**
662
767
* Handles the `SEARCH_MEDIA` event.
663
768
* This will execute a search on the specified criteria passed in the event arguments.
0 commit comments