diff --git a/dashboard-ui/css/card.css b/dashboard-ui/css/card.css index a8e51b208f..25c6f565f8 100644 --- a/dashboard-ui/css/card.css +++ b/dashboard-ui/css/card.css @@ -478,21 +478,21 @@ .detailPageSquareCard { - width: 50%; + width: 33.33%; } @media all and (min-width: 540px) { .detailPageSquareCard { - width: 33.33%; + width: 25%; } } -@media all and (min-width: 800px) { +@media all and (min-width: 600px) { .detailPageSquareCard { - width: 25%; + width: 20%; } } diff --git a/dashboard-ui/css/images/clients/nuvue.png b/dashboard-ui/css/images/clients/nuvue.png new file mode 100644 index 0000000000..1ff5ec47d6 Binary files /dev/null and b/dashboard-ui/css/images/clients/nuvue.png differ diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 1ddcd415a0..3e3e88432f 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -1185,15 +1185,20 @@ a.itemTag:hover { } } -.itemsListview { + +.itemsContainer .itemsListview { max-width: 800px; +} + +.itemsListview { margin: 0 auto !important; } .itemsListview .ui-li-aside { - right: 1.3em; - font-weight: normal; + right: 70px; font-size: 13px; + top: 35%; + font-weight: 300 !important; } .itemsListview .ui-li-count { @@ -1217,6 +1222,57 @@ a.itemTag:hover { background-position: center center; } +.listviewIcon { + position: absolute; + left: 0; + top: 0; + width: 70px; + height: 70px; + background-repeat: no-repeat; + background-size: cover; + background-position: center center; +} + +.ui-li-has-icon > .ui-btn { + padding-left: 5.25em !important; + padding-top: 5px !important; + padding-bottom: 5px !important; +} + +.listItem h3 { + font-weight: 400; +} + +.listItem p { + font-weight: 300 !important; +} + +.ui-li-has-icon h3 { + margin-bottom: 10px !important; +} + +.listItem > .ui-btn + .ui-btn { + border: 0 !important; + width: 60px !important; + height: 90% !important; + top: 5% !important; + padding-left: 0 !important; +} + +.listItem a:first-child { + margin-right: 0 !important; + background-color: transparent !important; + border-color: #282828 !important; +} + +.listItem a + a { + background-color: #202020 !important; +} + +.listItem:hover a { + background-color: #333 !important; +} + @media all and (max-width: 600px) { .itemsListview .ui-li-aside { diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 04d6cf45a7..befbc43ad6 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -120,10 +120,6 @@ h2 { font-weight: 500 !important; } -.ui-listview li h3 { - font-weight: 500; -} - h1 a { text-decoration: none; } @@ -136,6 +132,10 @@ h1 a:hover { text-decoration: underline; } +.ui-listview li h3 { + font-weight: 400; +} + pre, textarea.pre { display: block; padding: 8.5px; diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js index ddd7c93b12..e8b53382ed 100644 --- a/dashboard-ui/scripts/dashboardpage.js +++ b/dashboard-ui/scripts/dashboardpage.js @@ -622,6 +622,10 @@ return ""; } + if (clientLowered == "nuvue") { + + return ""; + } if (clientLowered == "roku") { return ""; diff --git a/dashboard-ui/scripts/itembynamedetailpage.js b/dashboard-ui/scripts/itembynamedetailpage.js index 98103c0c79..aebfffc85e 100644 --- a/dashboard-ui/scripts/itembynamedetailpage.js +++ b/dashboard-ui/scripts/itembynamedetailpage.js @@ -432,10 +432,9 @@ if (query.IncludeItemTypes == "Audio") { - html += LibraryBrowser.getSongTableHtml(result.Items, { - showAlbum: true, - showArtist: true, - showAlbumArtist: true + html = LibraryBrowser.getListViewHtml({ + items: result.Items, + smallIcon: true }); } diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index b2cfab4975..ff3a0369b3 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -562,7 +562,7 @@ var options = { userId: Dashboard.getCurrentUserId(), - limit: item.Type == "MusicAlbum" ? 4 : 5, + limit: 5, fields: "PrimaryImageAspectRatio,UserData" }; @@ -724,7 +724,11 @@ if (item.Type == "MusicAlbum") { - $('#childrenContent', page).html(LibraryBrowser.getSongTableHtml(result.Items, { showArtist: true })).trigger('create'); + $('#childrenContent', page).html(LibraryBrowser.getListViewHtml({ + items: result.Items, + smallIcon: true + + })).trigger('create').createCardMenus(); } else { @@ -760,7 +764,7 @@ }); } - $('#childrenContent', page).html(html).createCardMenus(); + $('#childrenContent', page).html(html).trigger('create').createCardMenus(); if (item.Type == "BoxSet") { @@ -996,7 +1000,12 @@ $('#themeSongsCollapsible', page).show(); - $('#themeSongsContent', page).html(LibraryBrowser.getSongTableHtml(items, { showArtist: true, showAlbum: true, showAlbumArtist: true })).trigger('create'); + var html = LibraryBrowser.getListViewHtml({ + items: items, + smallIcon: true + }); + + $('#themeSongsContent', page).html(html).trigger('create'); } else { $('#themeSongsCollapsible', page).hide(); } diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index cb7b59c1f6..4147354b1e 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -223,8 +223,6 @@ html += ''; - html += LibraryBrowser.getSongHeaderCellHtml('Disc', 'desktopColumn', options.enableColumnSorting); - html += LibraryBrowser.getSongHeaderCellHtml('#', 'desktopColumn', options.enableColumnSorting); html += LibraryBrowser.getSongHeaderCellHtml('Track', '', options.enableColumnSorting, 'Name', options.sortBy, options.sortOrder); if (options.showAlbum) { @@ -252,9 +250,6 @@ html += ''; - html += '' + (item.ParentIndexNumber || "") + ''; - html += '' + (item.IndexNumber || "") + ''; - html += '' + (item.Name || "") + ''; if (options.showAlbum) { @@ -685,7 +680,7 @@ var dataAttributes = LibraryBrowser.getItemDataAttributes(item, options); - var cssClass = 'ui-li-has-thumb listItem'; + var cssClass = options.smallIcon ? 'ui-li-has-icon listItem' : 'ui-li-has-thumb listItem'; if (item.UserData) { cssClass += ' ' + LibraryBrowser.getUserDataCssClass(item.UserData.Key); @@ -696,13 +691,14 @@ var imgUrl; + var downloadWidth = options.smallIcon ? 70 : 80; + // Scaling 400w episode images to 80 doesn't turn out very well + var minScale = item.Type == 'Episode' || item.Type == 'Game' || options.smallIcon ? 2 : 1.5; + if (item.ImageTags.Primary) { - // Scaling 400w episode images to 80 doesn't turn out very well - var minScale = item.Type == 'Episode' || item.Type == 'Game' ? 2 : null; - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - width: 80, + width: downloadWidth, tag: item.ImageTags.Primary, type: "Primary", index: 0, @@ -715,8 +711,9 @@ imgUrl = ApiClient.getScaledImageUrl(item.AlbumId, { type: "Primary", - width: 80, - tag: item.AlbumPrimaryImageTag + width: downloadWidth, + tag: item.AlbumPrimaryImageTag, + minScale: minScale }); } @@ -724,8 +721,9 @@ imgUrl = ApiClient.getScaledImageUrl(item.SeriesId, { type: "Primary", - width: 80, - tag: item.SeriesPrimaryImageTag + width: downloadWidth, + tag: item.SeriesPrimaryImageTag, + minScale: minScale }); } @@ -733,17 +731,26 @@ imgUrl = ApiClient.getImageUrl(item.ParentPrimaryImageItemId, { type: "Primary", - width: 80, - tag: item.ParentPrimaryImageTag + width: downloadWidth, + tag: item.ParentPrimaryImageTag, + minScale: minScale }); } if (imgUrl) { - if (index < 10) { - html += '
'; + if (options.smallIcon) { + if (index < 10) { + html += '
'; + } else { + html += '
'; + } } else { - html += '
'; + if (index < 10) { + html += '
'; + } else { + html += '
'; + } } } @@ -757,6 +764,10 @@ textlines.push(LibraryBrowser.getPosterViewDisplayName(item)); + if (item.Type == 'Audio') { + textlines.push(item.Artists.join(', ') || 'Unknown Artist'); + } + if (item.Type == 'Game') { textlines.push(item.GameSystem || 'Unknown Game System'); } diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js index f4540646c3..1818ebd151 100644 --- a/dashboard-ui/scripts/librarylist.js +++ b/dashboard-ui/scripts/librarylist.js @@ -123,12 +123,8 @@ buttonCount++; } - var moreCommands = LibraryBrowser.getMoreCommands(item, currentUser); - - if (moreCommands.length) { - html += ''; - buttonCount++; - } + html += ''; + buttonCount++; html += ''; @@ -153,14 +149,15 @@ function onMoreButtonClick() { - var id = this.getAttribute('data-itemid'); - var commands = this.getAttribute('data-morecommands').split(','); + var card = $(this).parents('.card')[0]; - LibraryBrowser.showMoreCommands(this, id, commands); - - // Used by the tab menu, not the slide up + // Used by the tab menu $('.tapHoldMenu').popup('close'); + showContextMenu(card, { + showPlayOptions: false + }); + return false; } @@ -255,13 +252,13 @@ function onCardTapHold(e) { - showContextMenu(this); + showContextMenu(this, {}); e.preventDefault(); return false; } - function showContextMenu(card) { + function showContextMenu(card, options) { $('.tapHoldMenu').popup("close").remove(); @@ -299,16 +296,18 @@ html += '
  • ' + Globalize.translate('ButtonEdit') + '
  • '; } - if (MediaController.canPlayByAttributes(itemType, mediaType, playAccess, locationType, isPlaceHolder)) { - html += '
  • ' + Globalize.translate('ButtonPlay') + '
  • '; - } + if (options.showPlayOptions !== false) { + if (MediaController.canPlayByAttributes(itemType, mediaType, playAccess, locationType, isPlaceHolder)) { + html += '
  • ' + Globalize.translate('ButtonPlay') + '
  • '; + } - if (playbackPositionTicks && mediaType != "Audio") { - html += '
  • ' + Globalize.translate('ButtonResume') + '
  • '; - } + if (playbackPositionTicks && mediaType != "Audio") { + html += '
  • ' + Globalize.translate('ButtonResume') + '
  • '; + } - if (commands.indexOf('trailer') != -1) { - html += '
  • ' + Globalize.translate('ButtonPlayTrailer') + '
  • '; + if (commands.indexOf('trailer') != -1) { + html += '
  • ' + Globalize.translate('ButtonPlayTrailer') + '
  • '; + } } if (MediaController.canQueueMediaType(mediaType, itemType)) { @@ -356,7 +355,7 @@ function onListViewMenuButtonClick(e) { - showContextMenu(this); + showContextMenu(this, {}); e.preventDefault(); return false; diff --git a/dashboard-ui/scripts/livetvchannel.js b/dashboard-ui/scripts/livetvchannel.js index e6dc27a8e5..70258f3135 100644 --- a/dashboard-ui/scripts/livetvchannel.js +++ b/dashboard-ui/scripts/livetvchannel.js @@ -68,7 +68,7 @@ html += ''+Globalize.translate('LabelPremiereProgram')+'  '; } else if (program.IsSeries && !program.IsRepeat) { - html += ''+Globalize.translate('newTvProgram')+'  '; + html += ''+Globalize.translate('LabelNewProgram')+'  '; } var minutes = program.RunTimeTicks / 600000000; diff --git a/dashboard-ui/scripts/livetvseriestimer.js b/dashboard-ui/scripts/livetvseriestimer.js index 8820b2bd6d..0ddb3fa77a 100644 --- a/dashboard-ui/scripts/livetvseriestimer.js +++ b/dashboard-ui/scripts/livetvseriestimer.js @@ -133,7 +133,7 @@ $('.recordingsTab', page).html(LibraryBrowser.getPosterViewHtml({ items: result.Items, - shape: "homePageSquare", + shape: "detailPageSquare", showTitle: true, overlayText: true, coverImage: true diff --git a/dashboard-ui/scripts/metadataimagespage.js b/dashboard-ui/scripts/metadataimagespage.js index d8b3ceb503..c405bc064d 100644 --- a/dashboard-ui/scripts/metadataimagespage.js +++ b/dashboard-ui/scripts/metadataimagespage.js @@ -12,7 +12,7 @@ var isChecked = i == 0 ? ' selected="selected"' : ''; - html += ''; + html += ''; } $('#selectItemType', page).html(html).selectmenu('refresh').trigger('change'); @@ -150,7 +150,7 @@ var i, length, plugin, id; - html += '
    Image Fetchers:
    '; + html += '
    ' + Globalize.translate('LabelImageFetchers') + '
    '; html += '
    '; html += '
    '; @@ -177,22 +177,22 @@ html += '
    '; if (i == 0) { - html += ''; - html += ''; + html += ''; + html += ''; } else if (i == (plugins.length - 1)) { - html += ''; - html += ''; + html += ''; + html += ''; } else { - html += ''; - html += ''; + html += ''; + html += ''; } html += '
    '; } } html += '
    '; - html += '
    Enable and rank your preferred image fetchers in order of priority.
    '; + html += '
    ' + Globalize.translate('LabelImageFetchersHelp') + '
    '; var elem = $('.imageFetchers', page).html(html).show().trigger('create'); @@ -238,7 +238,7 @@ } html += '
    '; - html += 'Metadata Savers:'; + html += '' + Globalize.translate('LabelMetadataSavers') + ''; for (var i = 0, length = plugins.length; i < length; i++) { @@ -253,7 +253,7 @@ } html += '
    '; - html += '
    Choose the file formats to save your metadata to.
    '; + html += '
    ' + Globalize.translate('LabelMetadataSaversHelp') + '
    '; $('.metadataSavers', page).html(html).show().trigger('create'); } @@ -273,7 +273,7 @@ var i, length, plugin, id; - html += '
    Metadata Downloaders:
    '; + html += '
    ' + Globalize.translate('LabelMetadataDownloaders') + '
    '; html += '
    '; html += '
    '; @@ -300,22 +300,22 @@ html += '
    '; if (i == 0) { - html += ''; - html += ''; + html += ''; + html += ''; } else if (i == (plugins.length - 1)) { - html += ''; - html += ''; + html += ''; + html += ''; } else { - html += ''; - html += ''; + html += ''; + html += ''; } html += '
    '; } } html += '
    '; - html += '
    Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.
    '; + html += '
    ' + Globalize.translate('LabelMetadataDownloadersHelp') + '
    '; var elem = $('.metadataFetchers', page).html(html).show().trigger('create'); @@ -360,7 +360,7 @@ return; } - html += '
    Metadata Readers:
    '; + html += '
    ' + Globalize.translate('LabelMetadataReaders') + '
    '; html += ''; - html += '
    Rank your preferred local metadata sources in order of priority. The first file found will be read.
    '; + html += '
    ' + Globalize.translate('LabelMetadataReadersHelp') + '
    '; $('.metadataReaders', page).html(html).show().trigger('create'); } @@ -404,24 +404,24 @@ loadTabs(page, [ - { name: 'Movies', type: 'Movie' }, + { name: 'OptionMovies', type: 'Movie' }, //{ name: 'Trailers', type: 'Trailer' }, - { name: 'Collections', type: 'BoxSet' }, - { name: 'TV Series', type: 'Series' }, - { name: 'TV Seasons', type: 'Season' }, - { name: 'TV Episodes', type: 'Episode' }, - { name: 'Games', type: 'Game' }, - { name: 'Game Systems', type: 'GameSystem' }, + { name: 'OptionCollections', type: 'BoxSet' }, + { name: 'OptionSeries', type: 'Series' }, + { name: 'OptionSeasons', type: 'Season' }, + { name: 'OptionEpisodes', type: 'Episode' }, + { name: 'OptionGames', type: 'Game' }, + { name: 'OptionGameSystems', type: 'GameSystem' }, //{ name: 'Game Genres', type: 'GameGenre' }, - { name: 'Music Artists', type: 'MusicArtist' }, - { name: 'Music Albums', type: 'MusicAlbum' }, - { name: 'Music Videos', type: 'MusicVideo' }, + { name: 'OptionMusicArtists', type: 'MusicArtist' }, + { name: 'OptionMusicAlbums', type: 'MusicAlbum' }, + { name: 'OptionMusicVideos', type: 'MusicVideo' }, //{ name: 'Music Genres', type: 'MusicGenre' }, - { name: 'Songs', type: 'Audio' }, - { name: 'Home Videos', type: 'Video' }, - { name: 'Books', type: 'Book' }, - { name: 'Adult Videos', type: 'AdultVideo' }, - { name: 'People', type: 'Person' } + { name: 'OptionSongs', type: 'Audio' }, + { name: 'OptionHomeVideos', type: 'Video' }, + { name: 'OptionBooks', type: 'Book' }, + { name: 'OptionAdultVideos', type: 'AdultVideo' }, + { name: 'OptionPeople', type: 'Person' } //{ name: 'Genres', type: 'Genre' }, //{ name: 'Studios', type: 'Studio' } ]); diff --git a/dashboard-ui/scripts/playlistedit.js b/dashboard-ui/scripts/playlistedit.js index bf42d61b5e..bdf226823b 100644 --- a/dashboard-ui/scripts/playlistedit.js +++ b/dashboard-ui/scripts/playlistedit.js @@ -74,7 +74,8 @@ sortBy: query.SortBy, showIndex: false, title: item.Name, - showRemoveFromPlaylist: true + showRemoveFromPlaylist: true, + smallIcon: true }); } diff --git a/dashboard-ui/scripts/userpassword.js b/dashboard-ui/scripts/userpassword.js index 1534c2ec7e..d903702726 100644 --- a/dashboard-ui/scripts/userpassword.js +++ b/dashboard-ui/scripts/userpassword.js @@ -8,16 +8,19 @@ Dashboard.setPageTitle(user.Name); - if (user.HasPassword) { + if (user.HasConfiguredPassword) { $('#btnResetPassword', page).show(); $('#fldCurrentPassword', page).show(); $('.formheader', page).hide(); + $('.localAccessSection', page).show(); } else { $('#btnResetPassword', page).hide(); $('#fldCurrentPassword', page).hide(); $('.formheader', page).show(); + $('.localAccessSection', page).hide(); } + $('#chkEnableLocalAccessWithoutPassword', page).checked(user.Configuration.EnableLocalPassword).checkboxradio('refresh'); }); $('#txtCurrentPassword', page).val(''); @@ -29,6 +32,24 @@ var userId = getParameterByName("userId"); + ApiClient.getUser(userId).done(function (user) { + + user.Configuration.EnableLocalPassword = $('#chkEnableLocalAccessWithoutPassword', page).checked(); + + ApiClient.updateUser(user).done(function() { + + Dashboard.hideLoadingMsg(); + + Dashboard.alert(Globalize.translate('MessageSettingsSaved')); + loadUser(page); + }); + }); + } + + function savePassword(page) { + + var userId = getParameterByName("userId"); + var currentPassword = $('#txtCurrentPassword', page).val(); var newPassword = $('#txtNewPassword', page).val(); @@ -59,6 +80,19 @@ Dashboard.showLoadingMsg(); + savePassword(page); + + // Disable default form submission + return false; + + }; + + self.onLocalAccessSubmit = function () { + + var page = $.mobile.activePage; + + Dashboard.showLoadingMsg(); + save(page); // Disable default form submission diff --git a/dashboard-ui/scripts/userprofilespage.js b/dashboard-ui/scripts/userprofilespage.js index d4cfae8212..5e26731b3c 100644 --- a/dashboard-ui/scripts/userprofilespage.js +++ b/dashboard-ui/scripts/userprofilespage.js @@ -41,7 +41,7 @@ html += ""; html += "

    "; - if (user.Configuration.HasPassword) html += '' + Globalize.translate('Password') + ''; + if (user.HasConfiguredPassword) html += '' + Globalize.translate('Password') + ''; if (user.Configuration.IsAdministrator) html += '' + Globalize.translate('Administrator') + ''; html += "

    "; diff --git a/dashboard-ui/songs.html b/dashboard-ui/songs.html index dcc6f93f3d..033376a75b 100644 --- a/dashboard-ui/songs.html +++ b/dashboard-ui/songs.html @@ -19,7 +19,7 @@
    -
    +
    diff --git a/dashboard-ui/thirdparty/mediabrowser.apiclient.js b/dashboard-ui/thirdparty/mediabrowser.apiclient.js index e715c8c512..60ad3c6f1c 100644 --- a/dashboard-ui/thirdparty/mediabrowser.apiclient.js +++ b/dashboard-ui/thirdparty/mediabrowser.apiclient.js @@ -2144,7 +2144,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi function normalizeImageOptions(options) { - var ratio = window.devicePixelRatio; + var ratio = window.devicePixelRatio || 1; if (ratio) { diff --git a/dashboard-ui/userpassword.html b/dashboard-ui/userpassword.html index 339b628264..9cd832134f 100644 --- a/dashboard-ui/userpassword.html +++ b/dashboard-ui/userpassword.html @@ -14,37 +14,67 @@ ${TabPassword}
    - -
    - -
    + +
    +
    +

    ${HeaderPassword}

    +
    +
    + +
    +
      + +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    +
    +
    +
    +
    +

    ${HeaderLocalAccess}

    +
    +
    +
    +
      +
    • + + +
      ${LabelAllowLocalAccessWithoutPasswordHelp}
      +
    • +
    • + +
    • +
    +
    +
    +
    +