diff --git a/dashboard-ui/channelslatest.html b/dashboard-ui/channelslatest.html index 95eacc00d2..346450a178 100644 --- a/dashboard-ui/channelslatest.html +++ b/dashboard-ui/channelslatest.html @@ -4,7 +4,7 @@ Emby -
+
${TabLatest} diff --git a/dashboard-ui/homelatest.html b/dashboard-ui/homelatest.html index 3d2fbcfbd3..f884e569a2 100644 --- a/dashboard-ui/homelatest.html +++ b/dashboard-ui/homelatest.html @@ -4,7 +4,7 @@ Emby -
+
${TabHome} diff --git a/dashboard-ui/index.html b/dashboard-ui/index.html index 709ab25a5d..1a1411ec31 100644 --- a/dashboard-ui/index.html +++ b/dashboard-ui/index.html @@ -4,7 +4,7 @@ Emby -
+
${TabHome} diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js index bc775f4025..5ef6ce070e 100644 --- a/dashboard-ui/scripts/indexpage.js +++ b/dashboard-ui/scripts/indexpage.js @@ -1,466 +1,5 @@ (function ($, document) { - function getUserViews(userId) { - - var deferred = $.Deferred(); - - ApiClient.getUserViews(userId).done(function (result) { - - var items = result.Items; - - deferred.resolveWith(null, [items]); - }); - - return deferred.promise(); - } - - function enableScrollX() { - return $.browser.mobile && AppInfo.enableAppLayouts; - } - - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function getLibraryButtonsHtml(items) { - - var html = ""; - - // "My Library" backgrounds - for (var i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - - var icon; - var backgroundColor = 'rgba(82, 181, 75, 0.9)'; - - switch (item.CollectionType) { - case "movies": - icon = "fa-film"; - backgroundColor = 'rgba(176, 94, 81, 0.9)'; - break; - case "music": - icon = "fa-music"; - backgroundColor = 'rgba(217, 145, 67, 0.9)'; - break; - case "photos": - icon = "fa-photo"; - backgroundColor = 'rgba(127, 0, 0, 0.9)'; - break; - case "livetv": - icon = "fa-video-camera"; - backgroundColor = 'rgba(217, 145, 67, 0.9)'; - break; - case "tvshows": - icon = "fa-video-camera"; - backgroundColor = 'rgba(77, 88, 164, 0.9)'; - break; - case "games": - icon = "fa-gamepad"; - backgroundColor = 'rgba(183, 202, 72, 0.9)'; - break; - case "trailers": - icon = "fa-film"; - backgroundColor = 'rgba(176, 94, 81, 0.9)'; - break; - case "homevideos": - icon = "fa-video-camera"; - backgroundColor = 'rgba(110, 52, 32, 0.9)'; - break; - case "musicvideos": - icon = "fa-video-camera"; - backgroundColor = 'rgba(143, 54, 168, 0.9)'; - break; - case "books": - icon = "fa-book"; - break; - case "channels": - icon = "fa-globe"; - backgroundColor = 'rgba(51, 136, 204, 0.9)'; - break; - case "playlists": - icon = "fa-list"; - break; - default: - icon = "fa-folder-o"; - break; - } - - var cssClass = 'card smallBackdropCard buttonCard'; - - if (item.CollectionType) { - cssClass += ' ' + item.CollectionType + 'buttonCard'; - } - - var href = item.url || LibraryBrowser.getHref(item); - - html += ''; - html += '
'; - - html += "
"; - html += ''; - html += '' + item.Name + ''; - html += "
"; - - html += "
"; - - html += "
"; - } - - return html; - } - - function loadlibraryButtons(elem, userId, index) { - - return getUserViews(userId).done(function (items) { - - var html = '
'; - - if (index) { - html += '

' + Globalize.translate('HeaderMyMedia') + '

'; - } - html += '
'; - html += getLibraryButtonsHtml(items); - html += '
'; - - $(elem).html(html); - - handleLibraryLinkNavigations(elem); - }); - } - - function loadRecentlyAdded(elem, user, context) { - - var limit = AppInfo.hasLowImageBandwidth ? - 16 : - 24; - - var options = { - - Limit: limit, - Fields: "PrimaryImageAspectRatio,SyncInfo", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).done(function (items) { - - var html = ''; - - var cardLayout = false; - - if (items.length) { - html += '
'; - html += '

' + Globalize.translate('HeaderLatestMedia') + '

'; - - if (user.Policy.EnableUserPreferenceAccess && !AppInfo.isNativeApp) { - html += '' + Globalize.translate('ButtonEdit') + ''; - } - - html += '
'; - - html += '
'; - - html += LibraryBrowser.getPosterViewHtml({ - items: items, - preferThumb: true, - shape: 'backdrop', - context: context || 'home', - showUnplayedIndicator: false, - showChildCountIndicator: true, - lazy: true, - cardLayout: cardLayout, - showTitle: cardLayout, - showYear: cardLayout, - showDetailsMenu: true - }); - html += '
'; - } - - $(elem).html(html).lazyChildren().createCardMenus(); - }); - } - - function loadLatestChannelMedia(elem, userId) { - - var screenWidth = $(window).width(); - - var options = { - - Limit: screenWidth >= 2400 ? 10 : (screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 7 : 6))), - Fields: "PrimaryImageAspectRatio,SyncInfo", - Filters: "IsUnplayed", - UserId: userId - }; - - return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).done(function (result) { - - var html = ''; - - if (result.Items.length) { - html += '

' + Globalize.translate('HeaderLatestChannelMedia') + '

'; - html += '
'; - html += LibraryBrowser.getPosterViewHtml({ - items: result.Items, - preferThumb: true, - shape: 'auto', - showTitle: true, - centerText: true, - lazy: true, - showDetailsMenu: true - }); - html += '
'; - } - - $(elem).html(html).lazyChildren().createCardMenus(); - }); - } - - function loadLibraryTiles(elem, user, shape, index, autoHideOnMobile, showTitles) { - - return getUserViews(user.Id).done(function (items) { - - var html = ''; - - if (autoHideOnMobile) { - html += '
'; - } else { - html += '
'; - } - - if (items.length) { - - var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; - - html += '
'; - html += '

' + Globalize.translate('HeaderMyMedia') + '

'; - - if (user.Policy.EnableUserPreferenceAccess && !AppInfo.isNativeApp) { - html += '' + Globalize.translate('ButtonEdit') + ''; - } - - html += '
'; - - html += '
'; - html += LibraryBrowser.getPosterViewHtml({ - items: items, - shape: shape, - showTitle: showTitles, - centerText: true, - lazy: true, - autoThumb: true - }); - html += '
'; - } - - html += '
'; - - if (autoHideOnMobile) { - html += '
'; - html += getLibraryButtonsHtml(items); - html += '
'; - } - - $(elem).html(html).lazyChildren().createCardMenus({ showDetailsMenu: false }); - - handleLibraryLinkNavigations(elem); - }); - } - - function loadResume(elem, userId) { - - var screenWidth = $(window).width(); - - var options = { - - SortBy: "DatePlayed", - SortOrder: "Descending", - MediaTypes: "Video", - Filters: "IsResumable", - Limit: screenWidth >= 1920 ? 10 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)), - Recursive: true, - Fields: "PrimaryImageAspectRatio,SyncInfo", - CollapseBoxSetItems: false, - ExcludeLocationTypes: "Virtual", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" - }; - - return ApiClient.getItems(userId, options).done(function (result) { - - var html = ''; - - var cardLayout = AppInfo.hasLowImageBandwidth; - - if (result.Items.length) { - html += '

' + Globalize.translate('HeaderResume') + '

'; - if (enableScrollX()) { - html += '
'; - } else { - html += '
'; - } - html += LibraryBrowser.getPosterViewHtml({ - items: result.Items, - preferThumb: true, - shape: getThumbShape(), - overlayText: screenWidth >= 800 && !cardLayout, - showTitle: true, - showParentTitle: true, - context: 'home', - lazy: true, - cardLayout: cardLayout, - showDetailsMenu: true - }); - html += '
'; - } - - $(elem).html(html).lazyChildren().createCardMenus(); - }); - } - - function handleLibraryLinkNavigations(elem) { - - $('a.posterItem', elem).on('click', function () { - - var textElem = $('.posterItemText span', this); - - if (!textElem.length) { - textElem = $('.posterItemText', this); - } - var text = textElem.html(); - - LibraryMenu.setText(text); - }); - } - - function loadLatestChannelItems(elem, userId, options) { - - options = $.extend(options || {}, { - - UserId: userId, - SupportsLatestItems: true - }); - - return ApiClient.getJSON(ApiClient.getUrl("Channels", options)).done(function (result) { - - var channels = result.Items; - - var channelsHtml = channels.map(function (c) { - - return '
'; - - }).join(''); - - $(elem).html(channelsHtml); - - for (var i = 0, length = channels.length; i < length; i++) { - - var channel = channels[i]; - - loadLatestChannelItemsFromChannel(elem, channel, i); - } - - }); - } - - function loadLatestChannelItemsFromChannel(page, channel, index) { - - var screenWidth = $(window).width(); - - var options = { - - Limit: screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 5 : (screenWidth >= 800 ? 6 : 6)), - Fields: "PrimaryImageAspectRatio,SyncInfo", - Filters: "IsUnplayed", - UserId: Dashboard.getCurrentUserId(), - ChannelIds: channel.Id - }; - - ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).done(function (result) { - - var html = ''; - - if (result.Items.length) { - - var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; - - html += '
'; - var text = Globalize.translate('HeaderLatestFromChannel').replace('{0}', channel.Name); - html += '

' + text + '

'; - html += ''; - html += '
'; - } - html += '
'; - html += LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: 'autohome', - defaultShape: 'square', - showTitle: true, - centerText: true, - context: 'channels', - lazy: true, - showDetailsMenu: true - }); - html += '
'; - - $('#channel' + channel.Id + '', page).html(html).lazyChildren().trigger('create').createCardMenus(); - }); - } - - function loadLatestLiveTvRecordings(elem, userId, index) { - - return ApiClient.getLiveTvRecordings({ - - userId: userId, - limit: 5, - IsInProgress: false - - }).done(function (result) { - - var html = ''; - - if (result.Items.length) { - - var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; - - html += '
'; - html += '

' + Globalize.translate('HeaderLatestTvRecordings') + '

'; - html += ''; - html += '
'; - } - - var screenWidth = $(window).width(); - - html += LibraryBrowser.getPosterViewHtml({ - items: result.Items, - shape: "autohome", - showTitle: true, - showParentTitle: true, - overlayText: screenWidth >= 600, - coverImage: true, - lazy: true, - showDetailsMenu: true - }); - - elem.html(html).lazyChildren().trigger('create'); - - }); - } - - window.Sections = { - loadRecentlyAdded: loadRecentlyAdded, - loadLatestChannelMedia: loadLatestChannelMedia, - loadLibraryTiles: loadLibraryTiles, - loadResume: loadResume, - loadLatestChannelItems: loadLatestChannelItems, - loadLatestLiveTvRecordings: loadLatestLiveTvRecordings, - loadlibraryButtons: loadlibraryButtons - }; - -})(jQuery, document); - -(function ($, document) { - var defaultFirstSection = 'smalllibrarytiles'; function getDefaultSection(index) { diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js new file mode 100644 index 0000000000..a032cf3fb8 --- /dev/null +++ b/dashboard-ui/scripts/sections.js @@ -0,0 +1,460 @@ +(function ($, document) { + + function getUserViews(userId) { + + var deferred = $.Deferred(); + + ApiClient.getUserViews(userId).done(function (result) { + + var items = result.Items; + + deferred.resolveWith(null, [items]); + }); + + return deferred.promise(); + } + + function enableScrollX() { + return $.browser.mobile && AppInfo.enableAppLayouts; + } + + function getThumbShape() { + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; + } + + function getLibraryButtonsHtml(items) { + + var html = ""; + + // "My Library" backgrounds + for (var i = 0, length = items.length; i < length; i++) { + + var item = items[i]; + + var icon; + var backgroundColor = 'rgba(82, 181, 75, 0.9)'; + + switch (item.CollectionType) { + case "movies": + icon = "fa-film"; + backgroundColor = 'rgba(176, 94, 81, 0.9)'; + break; + case "music": + icon = "fa-music"; + backgroundColor = 'rgba(217, 145, 67, 0.9)'; + break; + case "photos": + icon = "fa-photo"; + backgroundColor = 'rgba(127, 0, 0, 0.9)'; + break; + case "livetv": + icon = "fa-video-camera"; + backgroundColor = 'rgba(217, 145, 67, 0.9)'; + break; + case "tvshows": + icon = "fa-video-camera"; + backgroundColor = 'rgba(77, 88, 164, 0.9)'; + break; + case "games": + icon = "fa-gamepad"; + backgroundColor = 'rgba(183, 202, 72, 0.9)'; + break; + case "trailers": + icon = "fa-film"; + backgroundColor = 'rgba(176, 94, 81, 0.9)'; + break; + case "homevideos": + icon = "fa-video-camera"; + backgroundColor = 'rgba(110, 52, 32, 0.9)'; + break; + case "musicvideos": + icon = "fa-video-camera"; + backgroundColor = 'rgba(143, 54, 168, 0.9)'; + break; + case "books": + icon = "fa-book"; + break; + case "channels": + icon = "fa-globe"; + backgroundColor = 'rgba(51, 136, 204, 0.9)'; + break; + case "playlists": + icon = "fa-list"; + break; + default: + icon = "fa-folder-o"; + break; + } + + var cssClass = 'card smallBackdropCard buttonCard'; + + if (item.CollectionType) { + cssClass += ' ' + item.CollectionType + 'buttonCard'; + } + + var href = item.url || LibraryBrowser.getHref(item); + + html += ''; + html += '
'; + + html += "
"; + html += ''; + html += '' + item.Name + ''; + html += "
"; + + html += "
"; + + html += "
"; + } + + return html; + } + + function loadlibraryButtons(elem, userId, index) { + + return getUserViews(userId).done(function (items) { + + var html = '
'; + + if (index) { + html += '

' + Globalize.translate('HeaderMyMedia') + '

'; + } + html += '
'; + html += getLibraryButtonsHtml(items); + html += '
'; + + $(elem).html(html); + + handleLibraryLinkNavigations(elem); + }); + } + + function loadRecentlyAdded(elem, user, context) { + + var limit = AppInfo.hasLowImageBandwidth ? + 16 : + 24; + + var options = { + + Limit: limit, + Fields: "PrimaryImageAspectRatio,SyncInfo", + ImageTypeLimit: 1, + EnableImageTypes: "Primary,Backdrop,Banner,Thumb" + }; + + return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).done(function (items) { + + var html = ''; + + var cardLayout = false; + + if (items.length) { + html += '
'; + html += '

' + Globalize.translate('HeaderLatestMedia') + '

'; + + if (user.Policy.EnableUserPreferenceAccess && !AppInfo.isNativeApp) { + html += '' + Globalize.translate('ButtonEdit') + ''; + } + + html += '
'; + + html += '
'; + + html += LibraryBrowser.getPosterViewHtml({ + items: items, + preferThumb: true, + shape: 'backdrop', + context: context || 'home', + showUnplayedIndicator: false, + showChildCountIndicator: true, + lazy: true, + cardLayout: cardLayout, + showTitle: cardLayout, + showYear: cardLayout, + showDetailsMenu: true + }); + html += '
'; + } + + $(elem).html(html).lazyChildren().createCardMenus(); + }); + } + + function loadLatestChannelMedia(elem, userId) { + + var screenWidth = $(window).width(); + + var options = { + + Limit: screenWidth >= 2400 ? 10 : (screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 7 : 6))), + Fields: "PrimaryImageAspectRatio,SyncInfo", + Filters: "IsUnplayed", + UserId: userId + }; + + return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).done(function (result) { + + var html = ''; + + if (result.Items.length) { + html += '

' + Globalize.translate('HeaderLatestChannelMedia') + '

'; + html += '
'; + html += LibraryBrowser.getPosterViewHtml({ + items: result.Items, + preferThumb: true, + shape: 'auto', + showTitle: true, + centerText: true, + lazy: true, + showDetailsMenu: true + }); + html += '
'; + } + + $(elem).html(html).lazyChildren().createCardMenus(); + }); + } + + function loadLibraryTiles(elem, user, shape, index, autoHideOnMobile, showTitles) { + + return getUserViews(user.Id).done(function (items) { + + var html = ''; + + if (autoHideOnMobile) { + html += '
'; + } else { + html += '
'; + } + + if (items.length) { + + var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; + + html += '
'; + html += '

' + Globalize.translate('HeaderMyMedia') + '

'; + + if (user.Policy.EnableUserPreferenceAccess && !AppInfo.isNativeApp) { + html += '' + Globalize.translate('ButtonEdit') + ''; + } + + html += '
'; + + html += '
'; + html += LibraryBrowser.getPosterViewHtml({ + items: items, + shape: shape, + showTitle: showTitles, + centerText: true, + lazy: true, + autoThumb: true + }); + html += '
'; + } + + html += '
'; + + if (autoHideOnMobile) { + html += '
'; + html += getLibraryButtonsHtml(items); + html += '
'; + } + + $(elem).html(html).lazyChildren().createCardMenus({ showDetailsMenu: false }); + + handleLibraryLinkNavigations(elem); + }); + } + + function loadResume(elem, userId) { + + var screenWidth = $(window).width(); + + var options = { + + SortBy: "DatePlayed", + SortOrder: "Descending", + MediaTypes: "Video", + Filters: "IsResumable", + Limit: screenWidth >= 1920 ? 10 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)), + Recursive: true, + Fields: "PrimaryImageAspectRatio,SyncInfo", + CollapseBoxSetItems: false, + ExcludeLocationTypes: "Virtual", + ImageTypeLimit: 1, + EnableImageTypes: "Primary,Backdrop,Banner,Thumb" + }; + + return ApiClient.getItems(userId, options).done(function (result) { + + var html = ''; + + var cardLayout = AppInfo.hasLowImageBandwidth; + + if (result.Items.length) { + html += '

' + Globalize.translate('HeaderResume') + '

'; + if (enableScrollX()) { + html += '
'; + } else { + html += '
'; + } + html += LibraryBrowser.getPosterViewHtml({ + items: result.Items, + preferThumb: true, + shape: getThumbShape(), + overlayText: screenWidth >= 800 && !cardLayout, + showTitle: true, + showParentTitle: true, + context: 'home', + lazy: true, + cardLayout: cardLayout, + showDetailsMenu: true + }); + html += '
'; + } + + $(elem).html(html).lazyChildren().createCardMenus(); + }); + } + + function handleLibraryLinkNavigations(elem) { + + $('a.posterItem', elem).on('click', function () { + + var textElem = $('.posterItemText span', this); + + if (!textElem.length) { + textElem = $('.posterItemText', this); + } + var text = textElem.html(); + + LibraryMenu.setText(text); + }); + } + + function loadLatestChannelItems(elem, userId, options) { + + options = $.extend(options || {}, { + + UserId: userId, + SupportsLatestItems: true + }); + + return ApiClient.getJSON(ApiClient.getUrl("Channels", options)).done(function (result) { + + var channels = result.Items; + + var channelsHtml = channels.map(function (c) { + + return '
'; + + }).join(''); + + $(elem).html(channelsHtml); + + for (var i = 0, length = channels.length; i < length; i++) { + + var channel = channels[i]; + + loadLatestChannelItemsFromChannel(elem, channel, i); + } + + }); + } + + function loadLatestChannelItemsFromChannel(page, channel, index) { + + var screenWidth = $(window).width(); + + var options = { + + Limit: screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 5 : (screenWidth >= 800 ? 6 : 6)), + Fields: "PrimaryImageAspectRatio,SyncInfo", + Filters: "IsUnplayed", + UserId: Dashboard.getCurrentUserId(), + ChannelIds: channel.Id + }; + + ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).done(function (result) { + + var html = ''; + + if (result.Items.length) { + + var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; + + html += '
'; + var text = Globalize.translate('HeaderLatestFromChannel').replace('{0}', channel.Name); + html += '

' + text + '

'; + html += ''; + html += '
'; + } + html += '
'; + html += LibraryBrowser.getPosterViewHtml({ + items: result.Items, + shape: 'autohome', + defaultShape: 'square', + showTitle: true, + centerText: true, + context: 'channels', + lazy: true, + showDetailsMenu: true + }); + html += '
'; + + $('#channel' + channel.Id + '', page).html(html).lazyChildren().trigger('create').createCardMenus(); + }); + } + + function loadLatestLiveTvRecordings(elem, userId, index) { + + return ApiClient.getLiveTvRecordings({ + + userId: userId, + limit: 5, + IsInProgress: false + + }).done(function (result) { + + var html = ''; + + if (result.Items.length) { + + var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader'; + + html += '
'; + html += '

' + Globalize.translate('HeaderLatestTvRecordings') + '

'; + html += ''; + html += '
'; + } + + var screenWidth = $(window).width(); + + html += LibraryBrowser.getPosterViewHtml({ + items: result.Items, + shape: "autohome", + showTitle: true, + showParentTitle: true, + overlayText: screenWidth >= 600, + coverImage: true, + lazy: true, + showDetailsMenu: true + }); + + elem.html(html).lazyChildren().trigger('create'); + + }); + } + + window.Sections = { + loadRecentlyAdded: loadRecentlyAdded, + loadLatestChannelMedia: loadLatestChannelMedia, + loadLibraryTiles: loadLibraryTiles, + loadResume: loadResume, + loadLatestChannelItems: loadLatestChannelItems, + loadLatestLiveTvRecordings: loadLatestLiveTvRecordings, + loadlibraryButtons: loadlibraryButtons + }; + +})(jQuery, document); \ No newline at end of file