diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 9ce0576fe4..b68354d80a 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -776,6 +776,10 @@ a.itemTag:hover { max-width: 950px; } + .detailPageContent { + max-width: 930px; + } + .primaryDetailPageContent { max-width: 850px; } @@ -788,9 +792,6 @@ a.itemTag:hover { } } -@media all and (min-width: 1920px) { -} - .detailPageParentLink { text-decoration: none; } diff --git a/dashboard-ui/css/posteritem.css b/dashboard-ui/css/posteritem.css index 8b3d4958f2..2219aef369 100644 --- a/dashboard-ui/css/posteritem.css +++ b/dashboard-ui/css/posteritem.css @@ -308,14 +308,6 @@ @media all and (min-width: 1920px) { - .portraitPosterItem { - width: 160px; - } - - .portraitPosterItem .posterItemImage { - height: 240px; - } - .squarePosterItem { width: 190px; } diff --git a/dashboard-ui/itemdetails.html b/dashboard-ui/itemdetails.html index bbc0a18c59..44b6097f65 100644 --- a/dashboard-ui/itemdetails.html +++ b/dashboard-ui/itemdetails.html @@ -160,10 +160,10 @@

+
-
+
-
diff --git a/dashboard-ui/scripts/edititemmetadata.js b/dashboard-ui/scripts/edititemmetadata.js index be2c17f00c..47b24ebf72 100644 --- a/dashboard-ui/scripts/edititemmetadata.js +++ b/dashboard-ui/scripts/edititemmetadata.js @@ -287,7 +287,17 @@ $('#fldYear', page).show(); } - if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "AdultVideo" || item.Type == "Series" || item.Type == "Game" || item.Type == "BoxSet" || item.Type == "Person" || item.Type == "Book") { + if (item.Type == "Movie" || + item.Type == "Trailer" || + item.Type == "AdultVideo" || + item.Type == "Series" || + item.Type == "Game" || + item.Type == "BoxSet" || + item.Type == "Person" || + item.Type == "Book" || + item.Type == "MusicAlbum" || + item.Type == "MusicArtist") { + $('#btnIdentify', page).show(); } else { $('#btnIdentify', page).hide(); diff --git a/dashboard-ui/scripts/editorsidebar.js b/dashboard-ui/scripts/editorsidebar.js index b3dbdd9810..b4b8071974 100644 --- a/dashboard-ui/scripts/editorsidebar.js +++ b/dashboard-ui/scripts/editorsidebar.js @@ -46,7 +46,7 @@ } if (!item.BackdropImageTags || !item.BackdropImageTags.length) { - if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "Channel") { + if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "Channel" && item.Type !== "MusicAlbum") { htmlName += ''; } } diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index afb52cf254..a6b54ae506 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -36,13 +36,6 @@ $('#editButtonContainer', page).hide(); } - if (user.Configuration.IsAdministrator && item.Type == "BoxSet") { - $('#btnEditCollectionTitles', page).show().attr('href', 'editcollectionitems.html?id=' + item.Id); - - } else { - $('#btnEditCollectionTitles', page).hide(); - } - if (MediaPlayer.canPlay(item, user)) { var url = MediaPlayer.getPlayUrl(item); @@ -184,8 +177,15 @@ function setInitialCollapsibleState(page, item, context, user) { + $('.collectionItems', page).empty(); + if (item.IsFolder) { - $('#childrenCollapsible', page).removeClass('hide'); + + if (item.Type == "BoxSet") { + $('#childrenCollapsible', page).addClass('hide'); + } else { + $('#childrenCollapsible', page).removeClass('hide'); + } renderChildren(page, item, user); } else { @@ -579,7 +579,7 @@ var html = ''; - if (item.Type == "Series" || item.Type == "BoxSet") { + if (item.Type == "Series") { html = LibraryBrowser.getPosterViewHtml({ items: result.Items, shape: "portrait", @@ -608,9 +608,20 @@ }); } - $('#childrenContent', page).html(html).createPosterItemHoverMenu(); + if (item.Type == "BoxSet") { + + var collectionItemTypes = [ + { name: 'Movies', type: 'Movie' }, + { name: 'Series', type: 'Series' }, + { name: 'Albums', type: 'MusicAlbum' }, + { name: 'Games', type: 'Game' }, + { name: 'Books', type: 'Book' } + ]; + + renderCollectionItems(page, collectionItemTypes, result.Items, user); + } } }); @@ -620,9 +631,6 @@ else if (item.Type == "Series") { $('#childrenTitle', page).html('Seasons'); } - else if (item.Type == "BoxSet") { - $('#childrenTitle', page).html('Titles'); - } else if (item.Type == "MusicAlbum") { $('#childrenTitle', page).html('Tracks'); } @@ -633,6 +641,82 @@ $('#childrenTitle', page).html('Items'); } } + + function renderCollectionItems(page, types, items, user) { + + for (var i = 0, length = types.length; i < length; i++) { + + var type = types[i]; + + var typeItems = items.filter(function (curr) { + + return curr.Type == type.type; + + }); + + if (!typeItems.length) { + continue; + } + + renderCollectionItemType(page, type, typeItems, user); + } + + var otherType = { name: 'Other Items' }; + + var otherTypeItems = items.filter(function (curr) { + + return !types.filter(function(t) { + + return t.type == curr.Type; + + }).length; + + }); + + if (otherTypeItems.length) { + renderCollectionItemType(page, otherType, otherTypeItems, user); + } + + if (!items.length) { + renderCollectionItemType(page, {name: 'Titles'}, items, user); + } + + $('.collectionItems', page).trigger('create').createPosterItemHoverMenu(); + } + + function renderCollectionItemType(page, type, items, user) { + + var html = ''; + + html += '
'; + + html += '
'; + html += '' + type.name + ''; + + if (user.Configuration.IsAdministrator) { + html += 'Edit'; + } + + html += '
'; + + html += '
'; + + var shape = type.type == 'MusicAlbum' ? 'square' : 'portrait'; + + html += LibraryBrowser.getPosterViewHtml({ + items: items, + shape: shape, + useAverageAspectRatio: true, + showTitle: true, + centerText: true + }); + html += '
'; + + html += '
'; + + $('.collectionItems', page).append(html); + } + function renderUserDataIcons(page, item) { $('.userDataIcons', page).html(LibraryBrowser.getUserDataIconsHtml(item)); } diff --git a/dashboard-ui/scripts/libraryreport.js b/dashboard-ui/scripts/libraryreport.js index 4575595da5..6669a92c06 100644 --- a/dashboard-ui/scripts/libraryreport.js +++ b/dashboard-ui/scripts/libraryreport.js @@ -1,9 +1,11 @@ (function ($, document, window) { + var defaultSortBy = "SortName"; + // The base query options var query = { - SortBy: "SeriesSortName,SortName", + SortBy: defaultSortBy, SortOrder: "Ascending", Recursive: true, Fields: "MediaStreams,DateCreated,Settings,Studios", @@ -21,21 +23,22 @@ { return [ {}, - { name: 'Series' }, - { name: 'Season' }, - { name: 'Date Added' } + { name: 'Series', sortField: 'SeriesSortName,SortName' }, + { name: 'Season', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' } ]; } case 'Series': { return [ {}, - { name: 'Name' }, - { name: 'Network' }, - { name: 'Date Added' }, - { name: 'Year' }, - { name: 'Rating' }, - { name: 'Runtime' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Network', sortField: 'Studio,SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Year', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' }, + { name: 'Runtime', sortField: 'Runtime,SortName' }, { name: 'Trailers' }, { name: 'Specials' } ]; @@ -44,12 +47,13 @@ { return [ {}, - { name: 'Name' }, - { name: 'Game System' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Rating' }, - { name: 'Players' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Game System', sortField: 'GameSystem,SortName' }, + { name: 'Date Added', sortField: 'DateCreated,GameSystem,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,GameSystem,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,GameSystem,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,GameSystem,SortName' }, + { name: 'Players', sortField: 'Players,GameSystem,SortName' }, { name: 'Trailers' } ]; } @@ -57,13 +61,14 @@ { return [ {}, - { name: 'Album Artist' }, - { name: 'Album' }, - { name: 'Track' }, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Runtime' }, + { name: 'Album Artist', sortField: 'AlbumArtist,SortName' }, + { name: 'Album', sortField: 'Album,SortName' }, + { name: 'Disc', sortField: 'Album,SortName' }, + { name: 'Track', sortField: 'Album,SortName' }, + { name: 'Name', sortField: 'Name' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Runtime', sortField: 'Runtime,SortName' }, { name: 'Audio' }, { name: 'Embedded Image' } ]; @@ -72,12 +77,13 @@ { return [ {}, - { name: 'Series' }, + { name: 'Series', sortField: 'SeriesSortName,SortName' }, { name: 'Season' }, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Runtime' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' }, + { name: 'Runtime', sortField: 'Runtime,SortName' }, { name: 'Video' }, { name: 'Audio' }, { name: 'Subtitles' } @@ -87,10 +93,11 @@ { return [ {}, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Rating' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' }, { name: 'Trailers' } ]; } @@ -99,41 +106,44 @@ return [ {}, { name: 'Series' }, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Rating' } + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' } ]; } case 'MusicArtist': { return [ {}, - { name: 'Name' }, - { name: 'Date Added' } + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' } ]; } case 'MusicAlbum': { return [ {}, - { name: 'Album Artist' }, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Rating' }, - { name: 'Runtime' } + { name: 'Album Artist', sortField: 'AlbumArtist,SortName' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' }, + { name: 'Runtime', sortField: 'Runtime,SortName' } ]; } default: { return [ {}, - { name: 'Name' }, - { name: 'Date Added' }, - { name: 'Release Date' }, - { name: 'Rating' }, - { name: 'Runtime' }, + { name: 'Name', sortField: 'SortName' }, + { name: 'Date Added', sortField: 'DateCreated,SortName' }, + { name: 'Release Date', sortField: 'ProductionYear,PremiereDate,SortName' }, + { name: 'Parental Rating', sortField: 'OfficialRating,SortName' }, + { name: 'Community Rating', sortField: 'CommunityRating,SortName' }, + { name: 'Runtime', sortField: 'Runtime,SortName' }, { name: 'Video' }, { name: 'Audio' }, { name: 'Subtitles' }, @@ -178,6 +188,11 @@ html += item.Studios.length ? item.Studios[0].Name : ' '; break; } + case 'Disc': + { + html += item.ParentIndexNumber == null ? '' : item.ParentIndexNumber; + break; + } case 'Track': { html += item.IndexNumber == null ? '' : item.IndexNumber; @@ -265,7 +280,7 @@ } break; } - + case 'Season': { if (item.Type == "Episode") { @@ -281,12 +296,17 @@ html += '' + LibraryBrowser.getPosterViewDisplayName(item, false, false) + ''; break; } - case 'Rating': + case 'Community Rating': + { + html += item.CommunityRating || ' '; + break; + } + case 'Parental Rating': { html += item.OfficialRating || ' '; break; } - + case 'Year': case 'Release Date': { @@ -357,7 +377,7 @@ } if (!item.BackdropImageTags || !item.BackdropImageTags.length) { - if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "Channel") { + if (item.Type !== "Episode" && item.Type !== "Season" && item.MediaType !== "Audio" && item.Type !== "Channel" && item.Type !== "MusicAlbum") { html += ''; } } @@ -378,11 +398,11 @@ }).join(''); } - function getReportHtml(items, reportType) { + function getReportHtml(items, reportType, currentSortField, currentSortDirection) { var html = ''; - html += ''; + html += '
'; html += ''; html += ''; @@ -391,7 +411,31 @@ html += cells.map(function (c) { - return ''; + var cellHtml = ''; + + return cellHtml; }).join(''); @@ -427,7 +471,7 @@ $('.listBottomPaging', page).html(LibraryBrowser.getPagingHtml(query, result.TotalRecordCount)).trigger('create'); - $('.reportContainer', page).html(getReportHtml(result.Items, reportType)).trigger('create'); + $('.reportContainer', page).html(getReportHtml(result.Items, reportType, query.SortBy, query.SortOrder)).trigger('create'); $('.btnNextPage', page).on('click', function () { query.StartIndex += query.Limit; @@ -444,6 +488,34 @@ query.StartIndex = 0; reloadItems(page); }); + + $('.lnkColumnSort', page).on('click', function () { + + var order = this.getAttribute('data-sortfield'); + + if (query.SortBy == order) { + + if (query.SortOrder == "Descending") { + + query.SortOrder = "Ascending"; + query.SortBy = defaultSortBy; + + } else { + + query.SortOrder = "Descending"; + query.SortBy = order; + } + + } else { + + query.SortOrder = "Ascending"; + query.SortBy = order; + } + + query.StartIndex = 0; + + reloadItems(page); + }); } function reloadItems(page) { diff --git a/dashboard-ui/scripts/moviesrecommended.js b/dashboard-ui/scripts/moviesrecommended.js index bab40a53a0..99d6ad1e06 100644 --- a/dashboard-ui/scripts/moviesrecommended.js +++ b/dashboard-ui/scripts/moviesrecommended.js @@ -11,7 +11,7 @@ SortBy: "DateCreated", SortOrder: "Descending", IncludeItemTypes: "Movie", - Limit: screenWidth >= 1920 ? 21 : (screenWidth >= 1440 ? 16 : 12), + Limit: screenWidth >= 1920 ? 24 : (screenWidth >= 1440 ? 16 : 12), Recursive: true, Fields: "PrimaryImageAspectRatio,DateCreated,UserData", Filters: "IsUnplayed" @@ -62,7 +62,7 @@ SortBy: "DateCreated", SortOrder: "Descending", IncludeItemTypes: "Trailer", - Limit: screenWidth >= 1920 ? 7 : (screenWidth >= 1440 ? 8 : 6), + Limit: screenWidth >= 1920 ? 8 : (screenWidth >= 1440 ? 8 : 6), Recursive: true, Fields: "PrimaryImageAspectRatio,DateCreated,UserData", Filters: "IsUnplayed"
' + (c.name || ' ') + ''; + + if (c.sortField) { + cellHtml += ''; + } + + cellHtml += (c.name || ' '); + + if (c.sortField) { + + cellHtml += ''; + + if (c.sortField == currentSortField) { + + if (currentSortDirection == "Descending") { + cellHtml += ''; + } else { + cellHtml += ''; + } + } + } + + cellHtml += '