diff --git a/src/components/itemhelper.js b/src/components/itemhelper.js index f0b1de4a12..8e0883474a 100644 --- a/src/components/itemhelper.js +++ b/src/components/itemhelper.js @@ -272,7 +272,13 @@ define(['apphost', 'globalize'], function (appHost, globalize) { canRate: function (item) { - if (item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'SeriesTimer' || item.Type === 'CollectionFolder' || item.Type === 'UserView' || item.Type === 'Channel') { + if (item.Type === 'Program' + || item.Type === 'Timer' + || item.Type === 'SeriesTimer' + || item.Type === 'CollectionFolder' + || item.Type === 'UserView' + || item.Type === 'Channel' + || !item.UserData) { return false; } diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index a6e4b9b3a9..25ca59da97 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,4 +1,4 @@ -define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "apphost", "layoutManager", "focusManager", "emby-itemscontainer", "emby-scroller"], function(appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { +define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "apphost", "layoutManager", "focusManager", "emby-itemscontainer", "emby-scroller"], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { "use strict"; function enableScrollX() { @@ -22,92 +22,103 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap name: "HeaderFavoriteMovies", types: "Movie", shape: getPosterShape(), - showTitle: !0, - showYear: !0, - overlayPlayButton: !0, - overlayText: !1, - centerText: !0 + showTitle: true, + showYear: true, + overlayPlayButton: true, + overlayText: false, + centerText: true }, { name: "HeaderFavoriteShows", types: "Series", shape: getPosterShape(), - showTitle: !0, - showYear: !0, - overlayPlayButton: !0, - overlayText: !1, - centerText: !0 + showTitle: true, + showYear: true, + overlayPlayButton: true, + overlayText: false, + centerText: true }, { name: "HeaderFavoriteEpisodes", types: "Episode", shape: getThumbShape(), - preferThumb: !1, - showTitle: !0, - showParentTitle: !0, - overlayPlayButton: !0, - overlayText: !1, - centerText: !0 + preferThumb: false, + showTitle: true, + showParentTitle: true, + overlayPlayButton: true, + overlayText: false, + centerText: true }, { name: "HeaderFavoriteVideos", types: "Video", shape: getThumbShape(), - preferThumb: !0, - showTitle: !0, - overlayPlayButton: !0, - overlayText: !1, - centerText: !0 + preferThumb: true, + showTitle: true, + overlayPlayButton: true, + overlayText: false, + centerText: true }, { name: "HeaderFavoriteCollections", types: "BoxSet", shape: getPosterShape(), - showTitle: !0, - overlayPlayButton: !0, - overlayText: !1, - centerText: !0 + showTitle: true, + overlayPlayButton: true, + overlayText: false, + centerText: true }, { name: "HeaderFavoritePlaylists", types: "Playlist", shape: getSquareShape(), - preferThumb: !1, - showTitle: !0, - overlayText: !1, - showParentTitle: !1, - centerText: !0, - overlayPlayButton: !0, - coverImage: !0 + preferThumb: false, + showTitle: true, + overlayText: false, + showParentTitle: false, + centerText: true, + overlayPlayButton: true, + coverImage: true + }, { + name: "HeaderFavoritePeople", + types: "Person", + shape: getPosterShape(), + preferThumb: false, + showTitle: true, + overlayText: false, + showParentTitle: false, + centerText: true, + overlayPlayButton: true, + coverImage: true }, { name: "HeaderFavoriteArtists", types: "MusicArtist", shape: getSquareShape(), - preferThumb: !1, - showTitle: !0, - overlayText: !1, - showParentTitle: !1, - centerText: !0, - overlayPlayButton: !0, - coverImage: !0 + preferThumb: false, + showTitle: true, + overlayText: false, + showParentTitle: false, + centerText: true, + overlayPlayButton: true, + coverImage: true }, { name: "HeaderFavoriteAlbums", types: "MusicAlbum", shape: getSquareShape(), - preferThumb: !1, - showTitle: !0, - overlayText: !1, - showParentTitle: !0, - centerText: !0, - overlayPlayButton: !0, - coverImage: !0 + preferThumb: false, + showTitle: true, + overlayText: false, + showParentTitle: true, + centerText: true, + overlayPlayButton: true, + coverImage: true }, { name: "HeaderFavoriteSongs", types: "Audio", shape: getSquareShape(), - preferThumb: !1, - showTitle: !0, - overlayText: !1, - showParentTitle: !0, - centerText: !0, - overlayMoreButton: !0, + preferThumb: false, + showTitle: true, + overlayText: false, + showParentTitle: true, + centerText: true, + overlayMoreButton: true, action: "instantmix", - coverImage: !0 + coverImage: true }, { name: "HeaderFavoriteBooks", types: "Book", @@ -117,41 +128,51 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayPlayButton: true, overlayText: false, centerText: true - }] + }]; } function getFetchDataFn(section) { - return function() { + return function () { var apiClient = this.apiClient; var options = { SortBy: (section.types, "SeriesName,SortName"), SortOrder: "Ascending", Filters: "IsFavorite", - Recursive: !0, + Recursive: true, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", - CollapseBoxSetItems: !1, + CollapseBoxSetItems: false, ExcludeLocationTypes: "Virtual", - EnableTotalRecordCount: !1 + EnableTotalRecordCount: false }; options.Limit = 20; var userId = apiClient.getCurrentUserId(); - return "MusicArtist" === section.types ? apiClient.getArtists(userId, options) : (options.IncludeItemTypes = section.types, apiClient.getItems(userId, options)) - } + + if ("MusicArtist" === section.types) { + return apiClient.getArtists(userId, options); + } + + if ("Person" === section.types) { + return apiClient.getPeople(userId, options); + } + + options.IncludeItemTypes = section.types; + return apiClient.getItems(userId, options); + }; } function getRouteUrl(section, serverId) { return appRouter.getRouteUrl("list", { serverId: serverId, itemTypes: section.types, - isFavorite: !0 - }) + isFavorite: true + }); } function getItemsHtmlFn(section) { - return function(items) { + return function (items) { var supportsImageAnalysis = appHost.supports("imageanalysis"); var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; - cardLayout = !1; + cardLayout = false; var serverId = this.apiClient.serverId(); var leadingButtons = layoutManager.tv ? [{ name: globalize.translate("All"), @@ -160,16 +181,29 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap routeUrl: getRouteUrl(section, serverId) }] : null; var lines = 0; - return section.showTitle && lines++, section.showYear && lines++, section.showParentTitle && lines++, cardBuilder.getCardsHtml({ + + if (section.showTitle) { + lines++; + } + + if (section.showYear) { + lines++; + } + + if (section.showParentTitle) { + lines++; + } + + return cardBuilder.getCardsHtml({ items: items, preferThumb: section.preferThumb, shape: section.shape, centerText: section.centerText && !cardLayout, - overlayText: !1 !== section.overlayText, + overlayText: false !== section.overlayText, showTitle: section.showTitle, showYear: section.showYear, showParentTitle: section.showParentTitle, - scalable: !0, + scalable: true, coverImage: section.coverImage, overlayPlayButton: section.overlayPlayButton, overlayMoreButton: section.overlayMoreButton && !cardLayout, @@ -178,12 +212,16 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap cardLayout: cardLayout, leadingButtons: leadingButtons, lines: lines - }) - } + }); + }; } function FavoritesTab(view, params) { - this.view = view, this.params = params, this.apiClient = connectionManager.currentApiClient(), this.sectionsContainer = view.querySelector(".sections"), createSections(this, this.sectionsContainer, this.apiClient) + this.view = view; + this.params = params; + this.apiClient = connectionManager.currentApiClient(); + this.sectionsContainer = view.querySelector(".sections"); + createSections(this, this.sectionsContainer, this.apiClient); } function createSections(instance, elem, apiClient) { @@ -191,28 +229,83 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap var length; var sections = getSections(); var html = ""; + for (i = 0, length = sections.length; i < length; i++) { var section = sections[i]; var sectionClass = "verticalSection"; - section.showTitle || (sectionClass += " verticalSection-extrabottompadding"), html += '
" + + if (!section.showTitle) { + sectionClass += " verticalSection-extrabottompadding"; + } + + html += ' "; } + elem.innerHTML = html; var elems = elem.querySelectorAll(".itemsContainer"); + for (i = 0, length = elems.length; i < length; i++) { var itemsContainer = elems[i]; - itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance), itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance), itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, "verticalSection") + itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance); + itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance); + itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, "verticalSection"); } } - return FavoritesTab.prototype.onResume = function(options) { - for (var promises = (this.apiClient, []), view = this.view, elems = this.sectionsContainer.querySelectorAll(".itemsContainer"), i = 0, length = elems.length; i < length; i++) promises.push(elems[i].resume(options)); - Promise.all(promises).then(function() { - options.autoFocus && focusManager.autoFocus(view) - }) - }, FavoritesTab.prototype.onPause = function() { - for (var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"), i = 0, length = elems.length; i < length; i++) elems[i].pause() - }, FavoritesTab.prototype.destroy = function() { - this.view = null, this.params = null, this.apiClient = null; - for (var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"), i = 0, length = elems.length; i < length; i++) elems[i].fetchData = null, elems[i].getItemsHtml = null, elems[i].parentContainer = null; - this.sectionsContainer = null - }, FavoritesTab + + FavoritesTab.prototype.onResume = function (options) { + var promises = (this.apiClient, []); + var view = this.view; + var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + + for (var i = 0, length = elems.length; i < length; i++) { + promises.push(elems[i].resume(options)); + } + + Promise.all(promises).then(function () { + if (options.autoFocus) { + focusManager.autoFocus(view); + } + }); + }; + + FavoritesTab.prototype.onPause = function () { + var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + + for (var i = 0, length = elems.length; i < length; i++) { + elems[i].pause(); + } + }; + + FavoritesTab.prototype.destroy = function () { + this.view = null; + this.params = null; + this.apiClient = null; + var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + + for (var i = 0, length = elems.length; i < length; i++) { + elems[i].fetchData = null; + elems[i].getItemsHtml = null; + elems[i].parentContainer = null; + } + + this.sectionsContainer = null; + }; + + return FavoritesTab; }); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 4d83b070d1..d72b74971a 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -354,6 +354,7 @@ "HeaderFavoriteShows": "Favorite Shows", "HeaderFavoriteEpisodes": "Favorite Episodes", "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoritePeople": "Favorite People", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderFavoriteVideos": "Favorite Videos",