${LabelSelectFolderGroups}
diff --git a/dashboard-ui/mypreferenceswebclient.html b/dashboard-ui/mypreferenceswebclient.html
index 8903e21942..ea68025001 100644
--- a/dashboard-ui/mypreferenceswebclient.html
+++ b/dashboard-ui/mypreferenceswebclient.html
@@ -28,6 +28,7 @@
+
@@ -40,6 +41,7 @@
+
@@ -53,6 +55,7 @@
+
@@ -66,6 +69,7 @@
+
diff --git a/dashboard-ui/scripts/channelslatest.js b/dashboard-ui/scripts/channelslatest.js
index 01f80738e6..337dc07223 100644
--- a/dashboard-ui/scripts/channelslatest.js
+++ b/dashboard-ui/scripts/channelslatest.js
@@ -1,79 +1,8 @@
(function ($, document) {
- function reloadFromChannels(page, channels) {
-
- var channelsHtml = channels.map(function (c) {
-
- return '
';
-
- }).join('');
-
- $('.items', page).html(channelsHtml);
-
- for (var i = 0, length = channels.length; i < length; i++) {
-
- var channel = channels[i];
-
- reloadFromChannel(page, channel, i);
- }
- }
-
- function reloadFromChannel(page, channel, index) {
-
- var screenWidth = $(window).width();
-
- var options = {
-
- Limit: screenWidth >= 1920 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 6 : 6)),
- Fields: "PrimaryImageAspectRatio",
- Filters: "IsUnplayed",
- UserId: Dashboard.getCurrentUserId(),
- ChannelIds: channel.Id
- };
-
- $.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).done(function (result) {
-
- var html = '';
-
- if (result.Items.length) {
-
- var text = Globalize.translate('HeaderLatestFromChannel').replace('{0}', channel.Name);
- if (index) {
- html += '';
- } else {
- html += '';
- }
- }
- html += LibraryBrowser.getPosterViewHtml({
- items: result.Items,
- shape: 'auto',
- defaultShape: 'square',
- showTitle: true,
- centerText: true,
- context: 'channels',
- lazy: true
- });
-
- $('#channel' + channel.Id + '', page).html(html).trigger('create').createPosterItemMenus();
- });
- }
-
function reloadItems(page) {
- Dashboard.showLoadingMsg();
-
- var options = {
-
- UserId: Dashboard.getCurrentUserId(),
- SupportsLatestItems: true
- };
-
- $.getJSON(ApiClient.getUrl("Channels", options)).done(function (result) {
-
- reloadFromChannels(page, result.Items);
-
- Dashboard.hideLoadingMsg();
- });
+ Sections.loadLatestChannelItems($(".items", page), Dashboard.getCurrentUserId());
}
$(document).on('pagebeforeshow', "#channelsLatestPage", function () {
diff --git a/dashboard-ui/scripts/extensions.js b/dashboard-ui/scripts/extensions.js
index b235b1f263..b367344ea9 100644
--- a/dashboard-ui/scripts/extensions.js
+++ b/dashboard-ui/scripts/extensions.js
@@ -13,6 +13,16 @@
return true;
}
+function htmlEncode(value) {
+ //create a in-memory div, set it's inner text(which jQuery automatically encodes)
+ //then grab the encoded contents back out. The div never exists on the page.
+ return $('
').text(value).html();
+}
+
+function htmlDecode(value) {
+ return $('
').html(value).text();
+}
+
// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function (from, to) {
var rest = this.slice((to || from) + 1 || this.length);
diff --git a/dashboard-ui/scripts/homelatest.js b/dashboard-ui/scripts/homelatest.js
new file mode 100644
index 0000000000..59d6c83a72
--- /dev/null
+++ b/dashboard-ui/scripts/homelatest.js
@@ -0,0 +1,35 @@
+(function ($, document, apiClient) {
+
+ function loadSections(page, userId) {
+
+ var i, length;
+ var sectionCount = 3;
+
+ var elem = $('.sections', page);
+
+ if (!elem.html().length) {
+ var html = '';
+ for (i = 0, length = sectionCount; i < length; i++) {
+
+ html += '
';
+ }
+
+ elem.html(html);
+ }
+
+ Sections.loadRecentlyAdded($('.section0', page), userId);
+ Sections.loadLatestLiveTvRecordings($(".section1", page), userId);
+ Sections.loadLatestChannelItems($(".section2", page), userId);
+ }
+
+ $(document).on('pagebeforeshow', "#homeLatestPage", function () {
+
+ var page = this;
+
+ var userId = Dashboard.getCurrentUserId();
+
+ loadSections(page, userId);
+
+ });
+
+})(jQuery, document, ApiClient);
\ No newline at end of file
diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js
index ddec628bed..77ec5484a4 100644
--- a/dashboard-ui/scripts/indexpage.js
+++ b/dashboard-ui/scripts/indexpage.js
@@ -14,24 +14,6 @@
return deferred.promise();
}
- function getDefaultSection(index) {
-
- switch (index) {
-
- case 0:
- return 'smalllibrarytiles';
- case 1:
- return 'resume';
- case 2:
- return 'latestmedia';
- case 3:
- return '';
- default:
- return '';
- }
-
- }
-
function loadRecentlyAdded(elem, userId) {
var screenWidth = $(window).width();
@@ -40,7 +22,7 @@
SortBy: "DateCreated",
SortOrder: "Descending",
- Limit: screenWidth >= 2400 ? 30 : (screenWidth >= 1920 ? 20 : (screenWidth >= 1440 ? 10 : (screenWidth >= 800 ? 9 : 8))),
+ Limit: screenWidth >= 2400 ? 30 : (screenWidth >= 1920 ? 15 : (screenWidth >= 1440 ? 10 : (screenWidth >= 800 ? 9 : 8))),
Recursive: true,
Fields: "PrimaryImageAspectRatio",
Filters: "IsUnplayed,IsNotFolder",
@@ -115,9 +97,12 @@
if (items.length) {
- var cssClass = index ? 'listHeader' : 'listHeader firstListHeader';
+ var cssClass = index !== 0 ? 'listHeader' : 'listHeader firstListHeader';
- html += '
' + Globalize.translate('HeaderMyLibrary') + '
';
+ html += '
';
+ html += '
' + Globalize.translate('HeaderMyViews') + '
';
+ html += '';
+ html += '';
html += '
';
html += LibraryBrowser.getPosterViewHtml({
@@ -214,6 +199,158 @@
});
}
+ function handleLibraryLinkNavigations(elem) {
+
+ $('a.posterItem', elem).on('click', function () {
+
+ var text = $('.posterItemText', this).html();
+
+ LibraryMenu.setText(text);
+ });
+ }
+
+ function loadLatestChannelItems(elem, userId, options) {
+
+ options = $.extend(options || {}, {
+
+ UserId: userId,
+ SupportsLatestItems: true
+ });
+
+ $.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 >= 1920 ? 9 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 6 : 6)),
+ Fields: "PrimaryImageAspectRatio",
+ Filters: "IsUnplayed",
+ UserId: Dashboard.getCurrentUserId(),
+ ChannelIds: channel.Id
+ };
+
+ $.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 += LibraryBrowser.getPosterViewHtml({
+ items: result.Items,
+ shape: 'auto',
+ defaultShape: 'square',
+ showTitle: true,
+ centerText: true,
+ context: 'channels',
+ lazy: true
+ });
+
+ $('#channel' + channel.Id + '', page).html(html).trigger('create').createPosterItemMenus();
+ });
+ }
+
+ function loadLatestLiveTvRecordings(elem, userId, index) {
+
+ ApiClient.getLiveTvRecordings({
+
+ userId: userId,
+ limit: 9,
+ 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: "auto",
+ showTitle: true,
+ showParentTitle: true,
+ overlayText: screenWidth >= 600,
+ coverImage: true,
+ lazy: true
+ });
+
+ elem.html(html).trigger('create').createPosterItemMenus();
+
+ });
+ }
+
+ window.Sections = {
+ loadRecentlyAdded: loadRecentlyAdded,
+ loadLatestChannelMedia: loadLatestChannelMedia,
+ loadLibraryTiles: loadLibraryTiles,
+ loadLibraryFolders: loadLibraryFolders,
+ loadResume: loadResume,
+ loadLatestChannelItems: loadLatestChannelItems,
+ loadLatestLiveTvRecordings: loadLatestLiveTvRecordings
+ };
+
+})(jQuery, document, ApiClient);
+
+(function ($, document, apiClient) {
+
+ function getDefaultSection(index) {
+
+ switch (index) {
+
+ case 0:
+ return 'smalllibrarytiles';
+ case 1:
+ return 'resume';
+ case 2:
+ return '';
+ case 3:
+ return '';
+ default:
+ return '';
+ }
+
+ }
+
function loadSection(page, userId, displayPreferences, index) {
var section = displayPreferences.CustomPrefs['home' + index] || getDefaultSection(index);
@@ -221,23 +358,27 @@
var elem = $('.section' + index, page);
if (section == 'latestmedia') {
- loadRecentlyAdded(elem, userId);
+ Sections.loadRecentlyAdded(elem, userId);
}
else if (section == 'librarytiles') {
- loadLibraryTiles(elem, userId, 'backdrop', index);
+ Sections.loadLibraryTiles(elem, userId, 'backdrop', index);
}
else if (section == 'smalllibrarytiles' || section == 'librarybuttons') {
- loadLibraryTiles(elem, userId, 'miniBackdrop', index);
+ Sections.loadLibraryTiles(elem, userId, 'smallBackdrop', index);
}
else if (section == 'resume') {
- loadResume(elem, userId);
+ Sections.loadResume(elem, userId);
+ }
+
+ else if (section == 'latesttvrecordings') {
+ Sections.loadLatestLiveTvRecordings(elem, userId);
}
else if (section == 'folders') {
- loadLibraryFolders(elem, userId, 'backdrop', index);
+ Sections.loadLibraryFolders(elem, userId, 'smallBackdrop', index);
} else if (section == 'latestchannelmedia') {
- loadLatestChannelMedia(elem, userId);
+ Sections.loadLatestChannelMedia(elem, userId);
} else {
@@ -268,16 +409,6 @@
}
}
- function handleLibraryLinkNavigations(elem) {
-
- $('a', elem).on('click', function () {
-
- var text = $('.posterItemText', this).html();
-
- LibraryMenu.setText(text);
- });
- }
-
var homePageDismissValue = '2';
function dismissWelcome(page, userId) {
diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js
index b2d9745fd1..54e530b93e 100644
--- a/dashboard-ui/scripts/librarybrowser.js
+++ b/dashboard-ui/scripts/librarybrowser.js
@@ -377,11 +377,11 @@
return 'movieslatest.html?topParentId=' + item.Id;
}
- if (item.CollectionType == 'boxsets' || item.Type == 'ManualCollectionsFolder') {
+ if (item.CollectionType == 'boxsets') {
return 'collections.html?topParentId=' + item.Id;
}
- if (item.CollectionType == 'trailers' || item.Type == 'TrailerCollectionFolder') {
+ if (item.CollectionType == 'trailers') {
return 'movietrailers.html?topParentId=' + item.Id;
}
@@ -807,7 +807,7 @@
if (!imgUrl && !options.showTitle) {
html += "
";
- html += name;
+ html += htmlEncode(name);
html += "
";
}
@@ -828,7 +828,7 @@
if (options.showTitle || forceName) {
- lines.push(name);
+ lines.push(htmlEncode(name));
}
if (options.showItemCounts) {
diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js
index 7ac5a59113..c7e85b79ce 100644
--- a/dashboard-ui/scripts/librarylist.js
+++ b/dashboard-ui/scripts/librarylist.js
@@ -34,15 +34,16 @@
html += '
';
- var isSmallItem = $(posterItem).hasClass('smallBackdropPosterItem');
+ var isSmallItem = $(posterItem).hasClass('smallBackdropPosterItem') || $(posterItem).hasClass('miniBackdropPosterItem');
+ var isMiniItem = $(posterItem).hasClass('miniBackdropPosterItem');
var isPortrait = $(posterItem).hasClass('portraitPosterItem');
var isSquare = $(posterItem).hasClass('squarePosterItem');
- var parentName = isSmallItem || isPortrait ? null : item.SeriesName;
+ var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName;
var name = LibraryBrowser.getPosterViewDisplayName(item, true);
html += '
';
- var logoHeight = isSmallItem ? 20 : 26;
+ var logoHeight = isSmallItem || isMiniItem ? 20 : 26;
var maxLogoWidth = isPortrait ? 100 : 200;
var imgUrl;
@@ -76,27 +77,29 @@
html += '
';
html += name;
html += '
';
- } else if (!isSmallItem) {
+ } else if (!isSmallItem && !isMiniItem) {
html += '
';
html += LibraryBrowser.getMiscInfoHtml(item);
html += '
';
}
- html += '
';
- html += '';
+ if (!isMiniItem) {
+ html += '
';
+ html += '';
- if (isPortrait) {
- html += '';
- html += LibraryBrowser.getUserDataIconsHtml(item);
- html += '';
- } else {
- html += '';
- html += LibraryBrowser.getUserDataIconsHtml(item);
- html += '';
+ if (isPortrait) {
+ html += '';
+ html += LibraryBrowser.getUserDataIconsHtml(item);
+ html += '';
+ } else {
+ html += '';
+ html += LibraryBrowser.getUserDataIconsHtml(item);
+ html += '';
+ }
+ html += '
';
}
- html += '
';
html += '
';
@@ -179,9 +182,7 @@
}
- $.fn.createPosterItemMenus = function (options) {
-
- options = options || {};
+ $.fn.createPosterItemMenus = function () {
var preventHover = false;
@@ -243,7 +244,7 @@
preventHover = true;
}
- var elems = '.backdropPosterItem,.smallBackdropPosterItem,.portraitPosterItem,.squarePosterItem';
+ var elems = '.backdropPosterItem,.smallBackdropPosterItem,.portraitPosterItem,.squarePosterItem,.miniBackdropPosterItem';
return this.off('.posterItemHoverMenu')
.on('mouseenter.posterItemHoverMenu', elems, onHoverIn)
diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js
index 2dfa9b1a40..88247280f0 100644
--- a/dashboard-ui/scripts/librarymenu.js
+++ b/dashboard-ui/scripts/librarymenu.js
@@ -26,7 +26,7 @@
html += '').insertBefore($('.headerUserButton')).on('click', Notifications.showNotificationsFlyout);
+ $('').insertAfter($('.headerUserButton')).on('click', Notifications.showNotificationsFlyout);
Notifications.updateNotificationCount();
});
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index 22ff375628..8e16f43bd0 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -231,7 +231,7 @@ var Dashboard = {
var html = '
Please restart to finish updating.';
if (systemInfo.CanSelfRestart) {
- html += '
';
+ html += '
';
}
Dashboard.showFooterNotification({ id: "serverRestartWarning", html: html, forceShow: true, allowHide: false });
diff --git a/dashboard-ui/scripts/tvrecommended.js b/dashboard-ui/scripts/tvrecommended.js
index 878db7b4d8..c61e6a4391 100644
--- a/dashboard-ui/scripts/tvrecommended.js
+++ b/dashboard-ui/scripts/tvrecommended.js
@@ -104,8 +104,10 @@
if (result.Items.length) {
$('#resumableSection', page).show();
+ $('.nextUpHeader', page).removeClass('firstListHeader');
} else {
$('#resumableSection', page).hide();
+ $('.nextUpHeader', page).addClass('firstListHeader');
}
$('#resumableItems', page).html(LibraryBrowser.getPosterViewHtml({
diff --git a/dashboard-ui/thirdparty/mediabrowser.apiclient.js b/dashboard-ui/thirdparty/mediabrowser.apiclient.js
index 54ab1bfbc9..2b8970cc1e 100644
--- a/dashboard-ui/thirdparty/mediabrowser.apiclient.js
+++ b/dashboard-ui/thirdparty/mediabrowser.apiclient.js
@@ -2625,7 +2625,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
options = options || {};
options.userId = userId;
- var url = self.getUrl("AlbumArtists", options);
+ var url = self.getUrl("Artists/AlbumArtists", options);
return self.ajax({
type: "GET",
diff --git a/dashboard-ui/tvrecommended.html b/dashboard-ui/tvrecommended.html
index b1f9f67427..b5d03e3d20 100644
--- a/dashboard-ui/tvrecommended.html
+++ b/dashboard-ui/tvrecommended.html
@@ -8,6 +8,7 @@
-
+
diff --git a/dashboard-ui/tvupcoming.html b/dashboard-ui/tvupcoming.html
index 6f8dbfcb5a..1979b1b91e 100644
--- a/dashboard-ui/tvupcoming.html
+++ b/dashboard-ui/tvupcoming.html
@@ -7,6 +7,7 @@