diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 38c737a941..cd37d7b8b4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -16,12 +16,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.3.43", - "_release": "1.3.43", + "version": "1.3.45", + "_release": "1.3.45", "_resolution": { "type": "version", - "tag": "1.3.43", - "commit": "201076c748374aa6fed4be70ec43198099854aa8" + "tag": "1.3.45", + "commit": "dbaa46e3aa38a939b82f305c61e875e1a30da2fe" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js index 4a93209647..3a3e8b638d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js @@ -217,7 +217,16 @@ var keyframes = [ { transform: 'scale(0)', offset: 0 }, - { transform: 'scale(1,1)', offset: 1 }]; + { transform: 'none', offset: 1 }]; + var timing = elem.animationConfig.entry.timing; + return elem.animate(keyframes, timing).onfinish = onFinish; + } + + function slideUp(elem, onFinish) { + + var keyframes = [ + { transform: 'translate3d(0,30%,0)', opacity: 0, offset: 0 }, + { transform: 'none', opacity: 1, offset: 1 }]; var timing = elem.animationConfig.entry.timing; return elem.animate(keyframes, timing).onfinish = onFinish; } @@ -240,6 +249,15 @@ return elem.animate(keyframes, timing); } + function slideDown(elem, onFinish) { + + var keyframes = [ + { transform: 'none', opacity: 1, offset: 0 }, + { transform: 'translate3d(0,30%,0)', opacity: 0, offset: 1 }]; + var timing = elem.animationConfig.entry.timing; + return elem.animate(keyframes, timing); + } + function closeDialog(dlg) { if (!dlg.classList.contains('hide')) { @@ -260,7 +278,18 @@ return; } - fadeOut(dlg).onfinish = onAnimationFinish; + var animation; + + if (dlg.animationConfig.exit.name == 'fadeout') { + animation = fadeOut(dlg); + } else if (dlg.animationConfig.exit.name == 'slidedown') { + animation = slideDown(dlg); + } else { + onAnimationFinish(); + return; + } + + animation.onfinish = onAnimationFinish; } } @@ -276,10 +305,12 @@ onAnimationFinish(); return; } - if (dlg.animationConfig.entry.name == 'fade-in-animation') { + if (dlg.animationConfig.entry.name == 'fadein') { fadeIn(dlg, onAnimationFinish); - } else if (dlg.animationConfig.entry.name == 'scale-up-animation') { + } else if (dlg.animationConfig.entry.name == 'scaleup') { scaleUp(dlg, onAnimationFinish); + } else if (dlg.animationConfig.entry.name == 'slideup') { + slideUp(dlg, onAnimationFinish); } } @@ -355,12 +386,12 @@ dlg.setAttribute('data-autofocus', 'true'); } - var defaultEntryAnimation = browser.animate ? 'scale-up-animation' : 'fade-in-animation'; + var defaultEntryAnimation = browser.animate ? 'scaleup' : 'fadein'; dlg.entryAnimation = options.entryAnimation || defaultEntryAnimation; - dlg.exitAnimation = 'fade-out-animation'; + dlg.exitAnimation = 'fadeout'; // If it's not fullscreen then lower the default animation speed to make it open really fast - var entryAnimationDuration = options.entryAnimationDuration || (options.size ? 240 : 300); + var entryAnimationDuration = options.entryAnimationDuration || (options.size ? 200 : 300); dlg.animationConfig = { // scale up diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json new file mode 100644 index 0000000000..07f43fff45 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -0,0 +1,55 @@ +{ + "ValueSpecialEpisodeName": "Especial - {0}", + "Share": "Compartir", + "ServerUpdateNeeded": "Este Servidor Emby necesita ser actualizado. Para descargar la ultima versi\u00f3n, por favor visite {0}", + "LiveTvGuideRequiresUnlock": "La Guia de TV en Vivo actualmente esta limitada a {0} canales. De clic en el bot\u00f3n Desbloquear para saber como desbloquear la experiencia completa.", + "AttributeNew": "Nuevo", + "AttributePremiere": "Fecha de Estreno", + "AttributeLive": "En Vivo", + "TrackCount": "{0} Pistas", + "ItemCount": "{0} \u00edtems", + "ValueSeriesYearToPresent": "{0}-Presente", + "ReleaseYearValue": "A\u00f1o de estreno: {0}", + "OriginalAirDateValue": "Fecha de transmisi\u00f3n original: {0}", + "EndsAtValue": "Termina a las {0}", + "OptionSundayShort": "Dom", + "OptionMondayShort": "Lun", + "OptionTuesdayShort": "Mar", + "OptionWednesdayShort": "Mie", + "OptionThursdayShort": "Jue", + "OptionFridayShort": "Vie", + "OptionSaturdayShort": "Sab", + "HeaderSelectDate": "Seleccionar fecha", + "ButtonOk": "Ok", + "ButtonCancel": "Cancelar", + "ButtonGotIt": "Hecho", + "RecordingScheduled": "Grabaci\u00f3n programada.", + "HeaderNewRecording": "Nueva Grabaci\u00f3n", + "Sunday": "Domingo", + "Monday": "Lunes", + "Tuesday": "Martes", + "Wednesday": "Mi\u00e9rcoles", + "Thursday": "Jueves", + "Friday": "Viernes", + "Saturday": "S\u00e1bado", + "Days": "D\u00edas", + "RecordSeries": "Grabar Series", + "LabelPrePaddingMinutes": "Minutos de protecci\u00f3n previos:", + "LabelPostPaddingMinutes": "Minutos de protecci\u00f3n posterior:", + "RecordOnAllChannels": "Grabar en todos los canales", + "RecordAnytime": "Grabar en cualquier momento", + "RecordOnlyNewEpisodes": "Grabar s\u00f3lo nuevos episodios", + "HeaderBecomeProjectSupporter": "Obtener Emby Premiere", + "HeaderEnjoyDayTrial": "Disfrute de una Prueba Gratuita por 14 D\u00edas", + "MessageActiveSubscriptionRequiredSeriesRecordings": "Se requiere de una suscripci\u00f3n de Emby Premiere para crear grabaciones automatizadas de series.", + "OptionConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente las grabaciones a un formato amigable para transmisi\u00f3n", + "OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones ser\u00e1n convertidas en tiempo real a MP4 para una f\u00e1cil reproducci\u00f3n en sus dispositivos.", + "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica requiere de una suscripci\u00f3n activa de Emby Premiere.", + "Record": "Grabar", + "Save": "Guardar", + "Edit": "Editar", + "Download": "Descargar", + "Advanced": "Avanzado", + "Refresh": "Actualizar", + "RefreshQueued": "Actualizaci\u00f3n programada" +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json new file mode 100644 index 0000000000..d839d7c00b --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -0,0 +1,55 @@ +{ + "ValueSpecialEpisodeName": "Spesial - {0}", + "Share": "Del", + "ServerUpdateNeeded": "Denne Emby serveren trenger en oppdatering. For \u00e5 laste ned nyeste versjon, vennligst bes\u00f8k: {0}", + "LiveTvGuideRequiresUnlock": "Live TV Guide er p\u00e5 n\u00e5v\u00e6rende tidspunkter begrenset til {0} Kanaler. Trykk p\u00e5 l\u00e5s opp knappen for \u00e5 l\u00e6re hvordan f\u00e5 full opplevelse.", + "AttributeNew": "Ny", + "AttributePremiere": "Premiere", + "AttributeLive": "Direkte", + "TrackCount": "{0} spor", + "ItemCount": "{0} elementer", + "ValueSeriesYearToPresent": "{0}-N\u00e5v\u00e6rende", + "ReleaseYearValue": "Utgivelse \u00e5r: {0}", + "OriginalAirDateValue": "Original slippdato: {0}", + "EndsAtValue": "Ender p\u00e5 {0}", + "OptionSundayShort": "S\u00f8n", + "OptionMondayShort": "Man", + "OptionTuesdayShort": "Tir", + "OptionWednesdayShort": "Ons", + "OptionThursdayShort": "Tor", + "OptionFridayShort": "Fre", + "OptionSaturdayShort": "L\u00f8r", + "HeaderSelectDate": "Velg dato", + "ButtonOk": "Ok", + "ButtonCancel": "Avbryt", + "ButtonGotIt": "Skj\u00f8nner", + "RecordingScheduled": "Planlagte opptak.", + "HeaderNewRecording": "Tar opp n\u00e5", + "Sunday": "S\u00f8ndag", + "Monday": "Mandag", + "Tuesday": "Tirsdag", + "Wednesday": "Onsdag", + "Thursday": "Torsdag", + "Friday": "Fredag", + "Saturday": "L\u00f8rdag", + "Days": "Dager", + "RecordSeries": "Ta opp serien", + "LabelPrePaddingMinutes": "Pre-padding minutter:", + "LabelPostPaddingMinutes": "Post-padding minutter:", + "RecordOnAllChannels": "Ta opp fra alle kanaler", + "RecordAnytime": "Ta opp n\u00e5r som helst", + "RecordOnlyNewEpisodes": "Ta opp kun nye episoder", + "HeaderBecomeProjectSupporter": "Skaff Emby Premiere", + "HeaderEnjoyDayTrial": "Nyt en 14 dagers gratis pr\u00f8ve versjon", + "MessageActiveSubscriptionRequiredSeriesRecordings": "En aktiv Emby Premiere abonnement er n\u00f8dvendig for \u00e5 skape automatiserte serie innspillinger.", + "OptionConvertRecordingsToStreamingFormat": "Automatisk konvertere opptak til en str\u00f8mnings vennlig format", + "OptionConvertRecordingsToStreamingFormatHelp": "Innspillinger vil automatisk bli konvertert til MP4 for enkel avspilling p\u00e5 dine enheter.", + "FeatureRequiresEmbyPremiere": "Denne funksjonen krever et aktivt Emby Premiere abonnement.", + "Record": "Ta opp", + "Save": "Lagre", + "Edit": "Endre", + "Download": "Last ned", + "Advanced": "Avansert", + "Refresh": "Oppdater", + "RefreshQueued": "Oppdatering k\u00f8" +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-meta/.bower.json b/dashboard-ui/bower_components/iron-meta/.bower.json index f4bfef4a7c..e1304d174b 100644 --- a/dashboard-ui/bower_components/iron-meta/.bower.json +++ b/dashboard-ui/bower_components/iron-meta/.bower.json @@ -26,14 +26,14 @@ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, "main": "iron-meta.html", - "homepage": "https://github.com/polymerelements/iron-meta", + "homepage": "https://github.com/PolymerElements/iron-meta", "_release": "1.1.1", "_resolution": { "type": "version", "tag": "v1.1.1", "commit": "e171ee234b482219c9514e6f9551df48ef48bd9f" }, - "_source": "git://github.com/polymerelements/iron-meta.git", + "_source": "git://github.com/PolymerElements/iron-meta.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/iron-meta" + "_originalSource": "PolymerElements/iron-meta" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/paper-behaviors/.bower.json b/dashboard-ui/bower_components/paper-behaviors/.bower.json index a6b333d335..2b04bf9f8a 100644 --- a/dashboard-ui/bower_components/paper-behaviors/.bower.json +++ b/dashboard-ui/bower_components/paper-behaviors/.bower.json @@ -45,7 +45,7 @@ "tag": "v1.0.11", "commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5" }, - "_source": "git://github.com/polymerelements/paper-behaviors.git", + "_source": "git://github.com/PolymerElements/paper-behaviors.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/paper-behaviors" + "_originalSource": "PolymerElements/paper-behaviors" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/paper-ripple/.bower.json b/dashboard-ui/bower_components/paper-ripple/.bower.json index 2f654d71c6..157225ee71 100644 --- a/dashboard-ui/bower_components/paper-ripple/.bower.json +++ b/dashboard-ui/bower_components/paper-ripple/.bower.json @@ -32,14 +32,14 @@ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" }, "ignore": [], - "homepage": "https://github.com/polymerelements/paper-ripple", + "homepage": "https://github.com/PolymerElements/paper-ripple", "_release": "1.0.5", "_resolution": { "type": "version", "tag": "v1.0.5", "commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5" }, - "_source": "git://github.com/polymerelements/paper-ripple.git", + "_source": "git://github.com/PolymerElements/paper-ripple.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/paper-ripple" + "_originalSource": "PolymerElements/paper-ripple" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/polymer/.bower.json b/dashboard-ui/bower_components/polymer/.bower.json index 3e8a4009a3..bbad7fe7ba 100644 --- a/dashboard-ui/bower_components/polymer/.bower.json +++ b/dashboard-ui/bower_components/polymer/.bower.json @@ -34,6 +34,6 @@ "commit": "11c987b2eb3c73b388a79fc8aaea8ca01624f514" }, "_source": "git://github.com/Polymer/polymer.git", - "_target": "^1.0.0", + "_target": "^1.1.0", "_originalSource": "Polymer/polymer" } \ No newline at end of file diff --git a/dashboard-ui/components/collectioneditor/collectioneditor.js b/dashboard-ui/components/collectioneditor/collectioneditor.js index e8d1c1403d..d82b2d984e 100644 --- a/dashboard-ui/components/collectioneditor/collectioneditor.js +++ b/dashboard-ui/components/collectioneditor/collectioneditor.js @@ -123,7 +123,13 @@ html += '
'; + html += '
'; + html += Globalize.translate('CreateCollectionHelp'); + html += '
'; + html += '
'; + html += '
'; + html += '
'; html += ''; html += ''; html += '
'; @@ -206,6 +212,9 @@ html += '
'; html += title; html += '
'; + + html += '' + Globalize.translate('ButtonHelp') + ''; + html += ''; html += getEditorHtml(); diff --git a/dashboard-ui/components/subtitleeditor/subtitleeditor.template.html b/dashboard-ui/components/subtitleeditor/subtitleeditor.template.html index a34eac3ca4..2e8bafa10c 100644 --- a/dashboard-ui/components/subtitleeditor/subtitleeditor.template.html +++ b/dashboard-ui/components/subtitleeditor/subtitleeditor.template.html @@ -12,7 +12,7 @@ - +

diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 94a183c822..60ce8cde5e 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -836,14 +836,14 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { min-height: 60px; } - .itemMiscInfo { + .mobileDetails .itemMiscInfo { text-align: center; justify-content: center; } - .itemMiscInfo .endsAt { - display: none; - } + .itemMiscInfo .endsAt { + display: none; + } } @media all and (min-width: 750px) { diff --git a/dashboard-ui/css/librarymenu.css b/dashboard-ui/css/librarymenu.css index 93291fc951..dda04e7675 100644 --- a/dashboard-ui/css/librarymenu.css +++ b/dashboard-ui/css/librarymenu.css @@ -242,20 +242,21 @@ color: #fff !important; } - .pageTabButtonSelectionBar { - position: absolute; - left: 0; - border: 0; - bottom: 0; - height: 2px; - right: 0; - border-radius: 0; - z-index: 1; - } +.pageTabButtonSelectionBar { + position: absolute; + left: 0; + border: 0; + /* Need this or it will be partially covered by the drop-shadow on android */ + bottom: 1px; + height: 2px; + right: 0; + border-radius: 0; + z-index: 1000; +} - .pageTabButton.is-active .pageTabButtonSelectionBar { - background: #52B54B; - } +.pageTabButton.is-active .pageTabButtonSelectionBar { + background: #52B54B; +} .viewMenuBar, .libraryViewNav { background-color: #020202; diff --git a/dashboard-ui/css/polymer/paper-icon-button-light.css b/dashboard-ui/css/polymer/paper-icon-button-light.css index 0e3900a60e..e3ed5bcdd1 100644 --- a/dashboard-ui/css/polymer/paper-icon-button-light.css +++ b/dashboard-ui/css/polymer/paper-icon-button-light.css @@ -3,10 +3,13 @@ height: 40px; padding: 8px; } + [is=paper-icon-button-light] iron-icon { + width: 100%; + height: 100%; + } - [is=paper-icon-button-light] iron-icon, [is=paper-icon-button-light] img { - /* Don't specify both dimensions or it may not get sized properly */ - /*width: 100%;*/ + [is=paper-icon-button-light] img { + width: 100%; height: 100%; } @@ -18,3 +21,9 @@ background-color: currentcolor !important; opacity: .2 !important; } + + /* Make sure the img is on top of the ripple */ + [is=paper-icon-button-light] img { + position: relative; + z-index: 1; + } diff --git a/dashboard-ui/dashboardhosting.html b/dashboard-ui/dashboardhosting.html index 8de4ad9d19..6e9af2f7b6 100644 --- a/dashboard-ui/dashboardhosting.html +++ b/dashboard-ui/dashboardhosting.html @@ -1,4 +1,4 @@ -
+
@@ -14,10 +14,6 @@
${LabelPublicHttpPortHelp}
-
  • - -
    ${LabelExternalDDNSHelp}
    -
  • ${LabelHttpsPortHelp}
    @@ -31,6 +27,10 @@
    ${LabelCustomCertificatePathHelp}
  • +
  • + +
    ${LabelExternalDDNSHelp}
    +
  • ${LabelEnableHttps}
    ${LabelEnableHttpsHelp}
    diff --git a/dashboard-ui/movies.html b/dashboard-ui/movies.html index 51fb488300..b69b344b31 100644 --- a/dashboard-ui/movies.html +++ b/dashboard-ui/movies.html @@ -61,13 +61,13 @@
     
    + +
  • - -
    diff --git a/dashboard-ui/scripts/dashboardhosting.js b/dashboard-ui/scripts/dashboardhosting.js index 0c444e2145..56e3fbe501 100644 --- a/dashboard-ui/scripts/dashboardhosting.js +++ b/dashboard-ui/scripts/dashboardhosting.js @@ -1,22 +1,5 @@ define(['jQuery'], function ($) { - function loadPage(page, config) { - - $('#txtPortNumber', page).val(config.HttpServerPortNumber); - $('#txtPublicPort', page).val(config.PublicPort); - $('#txtPublicHttpsPort', page).val(config.PublicHttpsPort); - - $('#chkEnableHttps', page).checked(config.EnableHttps); - $('#txtHttpsPort', page).val(config.HttpsPortNumber); - - $('#txtDdns', page).val(config.WanDdns || ''); - $('#txtCertificatePath', page).val(config.CertificatePath || ''); - - $('#chkEnableUpnp', page).checked(config.EnableUPnP); - - Dashboard.hideLoadingMsg(); - } - function onSubmit() { Dashboard.showLoadingMsg(); @@ -52,24 +35,43 @@ }]; } - $(document).on('pageshow', "#dashboardHostingPage", function () { + return function (view, params) { - LibraryMenu.setTabs('adminadvanced', 0, getTabs); - Dashboard.showLoadingMsg(); + var self = this; - var page = this; + function loadPage(page, config) { - ApiClient.getServerConfiguration().then(function (config) { + $('#txtPortNumber', page).val(config.HttpServerPortNumber); + $('#txtPublicPort', page).val(config.PublicPort); + $('#txtPublicHttpsPort', page).val(config.PublicHttpsPort); - loadPage(page, config); + var chkEnableHttps = page.querySelector('#chkEnableHttps'); + chkEnableHttps.checked = config.EnableHttps; - }); + $('#txtHttpsPort', page).val(config.HttpsPortNumber); - }).on('pageinit', "#dashboardHostingPage", function () { + $('#txtDdns', page).val(config.WanDdns || ''); - var page = this; + var txtCertificatePath = page.querySelector('#txtCertificatePath'); + txtCertificatePath.value = config.CertificatePath || ''; - $('#btnSelectCertPath', page).on("click.selectDirectory", function () { + $('#chkEnableUpnp', page).checked(config.EnableUPnP); + + onCertPathChange.call(txtCertificatePath); + + Dashboard.hideLoadingMsg(); + } + + function onCertPathChange() { + + if (this.value) { + view.querySelector('#txtDdns').setAttribute('required', 'required'); + } else { + view.querySelector('#txtDdns').removeAttribute('required'); + } + } + + $('#btnSelectCertPath', view).on("click.selectDirectory", function () { require(['directorybrowser'], function (directoryBrowser) { @@ -83,7 +85,7 @@ callback: function (path) { if (path) { - $('#txtCertificatePath', page).val(path); + $('#txtCertificatePath', view).val(path); } picker.close(); }, @@ -94,6 +96,18 @@ }); $('.dashboardHostingForm').off('submit', onSubmit).on('submit', onSubmit); - }); + view.querySelector('#txtCertificatePath').addEventListener('change', onCertPathChange); + + view.addEventListener('viewshow', function (e) { + LibraryMenu.setTabs('adminadvanced', 0, getTabs); + Dashboard.showLoadingMsg(); + + ApiClient.getServerConfiguration().then(function (config) { + + loadPage(view, config); + + }); + }); + }; }); diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index f7bdfeb3e1..88e201b3c7 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'datetime', 'jQuery', 'mediaInfo', 'scrollStyles'], function (layoutManager, datetime, $, mediaInfo) { +define(['layoutManager', 'datetime', 'jQuery', 'mediaInfo', 'backdrop', 'scrollStyles'], function (layoutManager, datetime, $, mediaInfo, backdrop) { var currentItem; @@ -75,14 +75,13 @@ // For these types, make the backdrop a little smaller so that the items are more quickly accessible if (item.Type == 'MusicArtist' || item.Type == "MusicAlbum" || item.Type == "Playlist" || item.Type == "BoxSet" || item.MediaType == "Audio" || !layoutManager.mobile) { $('#itemBackdrop', page).addClass('noBackdrop').css('background-image', 'none'); - require(['backdrop'], function (backdrop) { - backdrop.setBackdrops([item]); - }); + backdrop.setBackdrops([item]); } else { //$('#itemBackdrop', page).addClass('noBackdrop').css('background-image', 'none'); //Backdrops.setBackdrops(page, [item]); hasBackdrop = LibraryBrowser.renderDetailPageBackdrop(page, item); + backdrop.clear(); } var transparentHeader = hasBackdrop && page.classList.contains('noSecondaryNavPage'); @@ -475,7 +474,7 @@ }); }); - $('.itemGenres', page).each(function() { + $('.itemGenres', page).each(function () { LibraryBrowser.renderGenres(this, item, null, isStatic); }); LibraryBrowser.renderStudios($('.itemStudios', page), item, isStatic); @@ -1098,10 +1097,13 @@ html += '
    '; + html += '
    '; html += '

    '; html += '' + type.name + ''; html += '

    '; + html += ''; + html += '
    '; html += '
    '; @@ -1131,6 +1133,15 @@ removeFromCollection(page, parentItem, [itemId], user, context); }); + + collectionItems.querySelector('.btnAddToCollection').addEventListener('click', function () { + require(['alert'], function (alert) { + alert({ + text: Globalize.translate('AddItemToCollectionHelp'), + html: Globalize.translate('AddItemToCollectionHelp') + '

    ' + Globalize.translate('ButtonLearnMore') + '' + }); + }); + }); } function removeFromCollection(page, parentItem, itemIds, user, context) { diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index d7e2362d0a..2a5616e31a 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -213,14 +213,11 @@ if (selected == null) { - var elem = tabs.querySelector('.pageTabButton.is-active'); - if (elem) { - return parseInt(elem.getAttribute('data-index')); - } - return 0; + return tabs.selectedTabIndex || 0; } var current = LibraryBrowser.selectedTab(tabs); + tabs.selectedTabIndex = selected; if (current == selected) { tabs.dispatchEvent(new CustomEvent("tabchange", { detail: { @@ -268,13 +265,13 @@ LibraryBrowser.configureSwipeTabs(ownerpage, tabs); } - var buttons = tabs.querySelectorAll('.pageTabButton'); - for (var i = 0, length = buttons.length; i < length; i++) { - //buttons[i].classList.add('mdl-button'); - //buttons[i].classList.add('mdl-js-button'); - var div = document.createElement('div'); - div.classList.add('pageTabButtonSelectionBar'); - buttons[i].appendChild(div); + if (!browserInfo.safari || !AppInfo.isNativeApp) { + var buttons = tabs.querySelectorAll('.pageTabButton'); + for (var i = 0, length = buttons.length; i < length; i++) { + var div = document.createElement('div'); + div.classList.add('pageTabButtonSelectionBar'); + buttons[i].appendChild(div); + } } tabs.classList.add('hiddenScrollX'); @@ -1069,7 +1066,8 @@ } if (item.CollectionType == 'games') { - return 'gamesrecommended.html?topParentId=' + item.Id; + return id ? "itemlist.html?parentId=" + id : "#"; + //return 'gamesrecommended.html?topParentId=' + item.Id; } if (item.CollectionType == 'playlists') { return 'playlists.html?topParentId=' + item.Id; @@ -1787,20 +1785,20 @@ var isSquareAspectRatio = primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1) < .33 || primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1.3333334) < .01; - if (options.shape == 'auto' || options.shape == 'autohome') { + if (options.shape == 'auto' || options.shape == 'autohome' || options.shape == 'autooverflow') { if (isThumbAspectRatio) { - options.shape = options.shape == 'auto' ? 'backdrop' : 'backdrop'; + options.shape = options.shape == 'autooverflow' ? 'overflowBackdrop' : 'backdrop'; } else if (isSquareAspectRatio) { options.coverImage = true; - options.shape = 'square'; + options.shape = options.shape == 'autooverflow' ? 'overflowSquare' : 'square'; } else if (primaryImageAspectRatio && primaryImageAspectRatio > 1.9) { options.shape = 'banner'; options.coverImage = true; } else if (primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 0.6666667) < .2) { - options.shape = options.shape == 'auto' ? 'portrait' : 'portrait'; + options.shape = options.shape == 'autooverflow' ? 'overflowPortrait' : 'portrait'; } else { - options.shape = options.defaultShape || (options.shape == 'auto' ? 'square' : 'square'); + options.shape = options.defaultShape || (options.shape == 'autooverflow' ? 'overflowSquare' : 'square'); } } diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js index bb83f29223..3fb2ff4bc6 100644 --- a/dashboard-ui/scripts/librarymenu.js +++ b/dashboard-ui/scripts/librarymenu.js @@ -743,7 +743,7 @@ var helpUrl = page.getAttribute('data-helpurl'); if (helpUrl) { - html += 'Help'; + html += '' + Globalize.translate('ButtonHelp') + ''; } } } diff --git a/dashboard-ui/scripts/livetvrecordings.js b/dashboard-ui/scripts/livetvrecordings.js index 9e16f38854..9758bf997e 100644 --- a/dashboard-ui/scripts/livetvrecordings.js +++ b/dashboard-ui/scripts/livetvrecordings.js @@ -54,10 +54,6 @@ Dashboard.hideLoadingMsg(); } - function getSquareShape() { - return enableScrollX() ? 'overflowSquare' : 'square'; - } - function enableScrollX() { return browserInfo.mobile && AppInfo.enableAppLayouts; } @@ -80,14 +76,12 @@ recordingItems.innerHTML = LibraryBrowser.getPosterViewHtml({ items: recordings, - shape: (enableScrollX() ? getSquareShape() : 'auto'), + shape: (enableScrollX() ? 'autooverflow' : 'auto'), showTitle: true, showParentTitle: true, - centerText: true, coverImage: true, lazy: true, - overlayPlayButton: true - + cardLayout: true }); ImageLoader.lazyChildren(recordingItems); @@ -113,7 +107,7 @@ ApiClient.getLiveTvRecordings({ userId: Dashboard.getCurrentUserId(), - limit: 4, + limit: enableScrollX() ? 12 : 4, IsInProgress: false, Fields: 'CanDelete,PrimaryImageAspectRatio' diff --git a/dashboard-ui/scripts/livetvsuggested.js b/dashboard-ui/scripts/livetvsuggested.js index d0722c1390..ed952e3ba2 100644 --- a/dashboard-ui/scripts/livetvsuggested.js +++ b/dashboard-ui/scripts/livetvsuggested.js @@ -8,14 +8,6 @@ return enableScrollX() ? 'overflowPortrait' : 'portrait'; } - function getThumbShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function getSquareShape() { - return enableScrollX() ? 'overflowSquare' : 'square'; - } - function getLimit() { return enableScrollX() ? 12 : 8; @@ -109,7 +101,7 @@ var html = libraryBrowser.getPosterViewHtml({ items: items, - shape: shape || (enableScrollX() ? getSquareShape() : 'auto'), + shape: shape || (enableScrollX() ? 'autooverflow' : 'auto'), showTitle: true, centerText: true, coverImage: true, diff --git a/dashboard-ui/scripts/moviesrecommended.js b/dashboard-ui/scripts/moviesrecommended.js index 2a9a40af5f..6d1ccab082 100644 --- a/dashboard-ui/scripts/moviesrecommended.js +++ b/dashboard-ui/scripts/moviesrecommended.js @@ -301,7 +301,7 @@ baseUrl += '?topParentId=' + topParentId; } - libraryBrowser.configurePaperLibraryTabs(view, mdlTabs, view.querySelectorAll('.pageTabContent'), [0, 4, 5]); + libraryBrowser.configurePaperLibraryTabs(view, mdlTabs, view.querySelectorAll('.pageTabContent'), [0, 3, 4, 5]); var tabControllers = []; var renderedTabs = []; diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index a674d3dc0d..f3e80e6418 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -2243,7 +2243,7 @@ var AppInfo = {}; var baseUrl = 'bower_components/emby-webcomponents/strings/'; - var languages = ['da', 'en-US', 'kk', 'nl', 'ru']; + var languages = ['da', 'en-US', 'es-MX', 'kk', 'nb', 'nl', 'ru']; var translations = languages.map(function (i) { return { @@ -2404,9 +2404,10 @@ var AppInfo = {}; defineRoute({ path: '/dashboardhosting.html', - dependencies: [], + dependencies: ['paper-checkbox', 'paper-input', 'paper-button'], autoFocus: false, - roles: 'admin' + roles: 'admin', + controller: 'scripts/dashboardhosting' }); defineRoute({ @@ -2698,7 +2699,7 @@ var AppInfo = {}; defineRoute({ path: '/movies.html', - dependencies: ['paper-checkbox', 'paper-fab', 'scripts/alphapicker', 'paper-button'], + dependencies: ['paper-checkbox', 'scripts/alphapicker', 'paper-button'], autoFocus: false, controller: 'scripts/moviesrecommended', transition: 'fade' diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json index 4d08016d0f..308f7dbd00 100644 --- a/dashboard-ui/strings/en-US.json +++ b/dashboard-ui/strings/en-US.json @@ -561,8 +561,8 @@ "LabelWebSocketPortNumber": "Web socket port number:", "LabelEnableAutomaticPortMap": "Enable automatic port mapping", "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", - "LabelExternalDDNS": "External WAN Address:", - "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. Leave empty for automatic detection.", + "LabelExternalDDNS": "External domain:", + "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. This field is required when used with a custom https certificate.", "TabResume": "Resume", "TabWeather": "Weather", "TitleAppSettings": "App Settings", @@ -2351,5 +2351,7 @@ "LabelOriginalTitle": "Original title:", "LabelSortTitle": "Sort title:", "OptionConvertRecordingPreserveAudio": "Preserve original audio when converting recordings", - "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices." + "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices.", + "CreateCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection." }