diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index f08a235883..3f1d60e7fb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -15,12 +15,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.94", - "_release": "1.4.94", + "version": "1.4.96", + "_release": "1.4.96", "_resolution": { "type": "version", - "tag": "1.4.94", - "commit": "1914cf851948d6f4f5e730c5e831e5e604fe3c9e" + "tag": "1.4.96", + "commit": "4c9f9b8c4937da15ac8c81d554e768f0ef6e944e" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 7b6285f8a5..08e5393958 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -7,7 +7,7 @@ while (!elem.getAttribute(name)) { elem = elem.parentNode; - if (!elem) { + if (!elem || !elem.getAttribute) { return null; } } @@ -62,6 +62,26 @@ }; } + ItemsContainerProtoType.enableHoverMenu = function (enabled) { + + var current = this.hoverMenu; + + if (!enabled && current) { + current.destroy(); + this.hoverMenu = null; + return; + } + + if (current) { + return; + } + + var self = this; + require(['itemHoverMenu'], function (ItemHoverMenu) { + self.hoverMenu = new ItemHoverMenu(self); + }); + }; + ItemsContainerProtoType.attachedCallback = function () { this.addEventListener('click', onClick); @@ -73,6 +93,10 @@ this.addEventListener('contextmenu', onContextMenu); } + if (layoutManager.desktop) { + this.enableHoverMenu(true); + } + itemShortcuts.on(this, getShortcutOptions()); }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index a3e00bab21..0346d41bcc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -43,11 +43,20 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', if (!isTheater) { if (options.edit !== false) { + + var text = item.Type == 'Timer' ? globalize.translate('sharedcomponents#Edit') : globalize.translate('sharedcomponents#EditInfo'); + commands.push({ - name: globalize.translate('sharedcomponents#EditInfo'), + name: text, id: 'edit' }); } + } + } + + if (itemHelper.canEditImages(user, item.Type)) { + + if (!isTheater) { if (options.editImages !== false) { commands.push({ name: globalize.translate('sharedcomponents#EditImages'), @@ -55,6 +64,10 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } } + } + + if (itemHelper.canEdit(user, item.Type)) { + if (item.MediaType == 'Video' && item.Type != 'TvChannel' && item.Type != 'Program' && item.LocationType != 'Virtual') { if (options.editSubtitles !== false) { commands.push({ diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js index 65bb913559..2ee4afcd12 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js @@ -69,6 +69,20 @@ define(['apphost'], function (appHost) { return item.RunTimeTicks || item.IsFolder || item.Type == "Genre" || item.Type == "MusicGenre" || item.Type == "MusicArtist"; } + function canEdit(user, itemType) { + + if (itemType == "UserRootFolder" || /*itemType == "CollectionFolder" ||*/ itemType == "UserView") { + return false; + } + + if (user.Policy.IsAdministrator) { + + return true; + } + + return false; + } + return { getDisplayName: getDisplayName, supportsAddingToCollection: supportsAddingToCollection, @@ -95,18 +109,11 @@ define(['apphost'], function (appHost) { return false; }, - canEdit: function (user, itemType) { + canEdit: canEdit, - if (itemType == "UserRootFolder" || /*itemType == "CollectionFolder" ||*/ itemType == "UserView") { - return false; - } + canEditImages: function (user, itemType) { - if (user.Policy.IsAdministrator) { - - return true; - } - - return false; + return itemType != 'Timer' && canEdit(user, itemType); }, canSync: function (user, item) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.css b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.css new file mode 100644 index 0000000000..965a38acc9 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.css @@ -0,0 +1,51 @@ +.cardOverlayTarget { + position: absolute; + right: 0; + left: 0; + bottom: 0; + top: 0; + background-color: rgba(0, 0, 0, .85); + z-index: 998; + line-height: initial; +} + +.cardOverlayInner { + padding: 11px 12px 10px; + color: #fff; +} + + .cardOverlayInner button:last-child { + margin-right: 0 !important; + } + + .cardOverlayInner p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + +.cardOverlayMediaInfo { + display: flex; + align-items: center; + flex-wrap: wrap; + margin: 1em 0; + color: #ddd; +} + +.cardOverlayButtons { + display: flex; + align-items: center; + flex-wrap: wrap; +} + + .cardOverlayButtons .fab { + background-color: #333; + } + +@media all and (max-width: 1200px) { + + .cardOverlayInner { + padding-left: 7px; + padding-right: 7px; + } +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js new file mode 100644 index 0000000000..4b0ffa31fc --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js @@ -0,0 +1,280 @@ +define(['connectionManager', 'itemHelper', 'mediaInfo', 'userdataButtons', 'playbackManager', 'globalize', 'css!./itemhovermenu', 'emby-button'], function (connectionManager, itemHelper, mediaInfo, userdataButtons, playbackManager, globalize) { + + var preventHover = false; + var showOverlayTimeout; + var hoveringElement; + + function parentWithAttribute(elem, name) { + + while (!elem.getAttribute(name)) { + elem = elem.parentNode; + + if (!elem || !elem.getAttribute) { + return null; + } + } + + return elem; + } + + function onHoverOut(e) { + + var elem = e.target; + + if (elem != hoveringElement) { + return; + } + + if (showOverlayTimeout) { + clearTimeout(showOverlayTimeout); + showOverlayTimeout = null; + } + + elem = elem.querySelector('.cardOverlayTarget'); + + if (elem) { + slideDownToHide(elem); + } + } + + function slideDownToHide(elem) { + + if (elem.classList.contains('hide')) { + return; + } + + if (!elem.animate) { + elem.classList.add('hide'); + return; + } + + requestAnimationFrame(function () { + var keyframes = [ + { transform: 'translateY(0)', offset: 0 }, + { transform: 'translateY(100%)', offset: 1 }]; + var timing = { duration: 300, iterations: 1, fill: 'forwards', easing: 'ease-out' }; + + elem.animate(keyframes, timing).onfinish = function () { + elem.classList.add('hide'); + }; + }); + } + + function slideUpToShow(elem) { + + if (!elem.classList.contains('hide')) { + return; + } + + elem.classList.remove('hide'); + + if (!elem.animate) { + return; + } + + requestAnimationFrame(function () { + + var keyframes = [ + { transform: 'translateY(100%)', offset: 0 }, + { transform: 'translateY(0)', offset: 1 }]; + var timing = { duration: 300, iterations: 1, fill: 'forwards', easing: 'ease-out' }; + elem.animate(keyframes, timing); + }); + } + + function getOverlayHtml(item, currentUser, card) { + + var html = ''; + + html += '
'; + + var className = card.className.toLowerCase(); + + var isMiniItem = className.indexOf('mini') != -1; + var isSmallItem = isMiniItem || className.indexOf('small') != -1; + var isPortrait = className.indexOf('portrait') != -1; + + var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName; + var name = itemHelper.getDisplayName(item); + + html += '
'; + var logoHeight = isSmallItem || isMiniItem ? 20 : 26; + var imgUrl; + + if (parentName && item.ParentLogoItemId) { + + imgUrl = ApiClient.getScaledImageUrl(item.ParentLogoItemId, { + maxHeight: logoHeight, + type: 'logo', + tag: item.ParentLogoImageTag + }); + + html += ''; + + } + else if (item.ImageTags.Logo) { + + imgUrl = ApiClient.getScaledImageUrl(item.Id, { + maxHeight: logoHeight, + type: 'logo', + tag: item.ImageTags.Logo + }); + + html += ''; + } + else { + html += parentName || name; + } + html += '
'; + + if (parentName) { + html += '

'; + html += name; + html += '

'; + } else if (!isSmallItem && !isMiniItem) { + html += '
'; + html += mediaInfo.getPrimaryMediaInfoHtml(item, { + endsAt: false + }); + html += '
'; + } + + html += '
'; + + var buttonCount = 0; + + if (playbackManager.canPlay(item)) { + + html += ''; + buttonCount++; + } + + if (item.LocalTrailerCount) { + html += ''; + buttonCount++; + } + + html += ''; + buttonCount++; + + html += userdataButtons.getIconsHtml({ + item: item, + style: 'fab-mini' + }); + + html += '
'; + + html += '
'; + + return html; + } + + function parentWithClass(elem, className) { + + while (!elem.classList || !elem.classList.contains(className)) { + elem = elem.parentNode; + + if (!elem) { + return null; + } + } + + return elem; + } + + function onShowTimerExpired(elem) { + + elem = elem.querySelector('a'); + + var innerElem = elem.querySelector('.cardOverlayTarget'); + + if (!innerElem) { + innerElem = document.createElement('div'); + innerElem.classList.add('hide'); + innerElem.classList.add('cardOverlayTarget'); + parentWithClass(elem, 'cardContent').appendChild(innerElem); + } + + var dataElement = parentWithAttribute(elem, 'data-id'); + + var id = dataElement.getAttribute('data-id'); + var type = dataElement.getAttribute('data-type'); + + if (type == 'Timer') { + return; + } + + var serverId = dataElement.getAttribute('data-serverid'); + + var apiClient = connectionManager.getApiClient(serverId); + var promise1 = apiClient.getItem(apiClient.getCurrentUserId(), id); + var promise2 = apiClient.getCurrentUser(); + + Promise.all([promise1, promise2]).then(function (responses) { + + var item = responses[0]; + var user = responses[1]; + + var card = elem; + + elem = parentWithAttribute(elem, 'data-id'); + + innerElem.innerHTML = getOverlayHtml(item, user, card); + }); + + slideUpToShow(innerElem); + } + + function onHoverIn(e) { + + var elem = e.target; + + if (!elem.classList.contains('cardImage')) { + return; + } + + if (preventHover === true) { + preventHover = false; + return; + } + + if (showOverlayTimeout) { + clearTimeout(showOverlayTimeout); + showOverlayTimeout = null; + } + + elem = parentWithAttribute(elem, 'data-id'); + hoveringElement = elem; + + showOverlayTimeout = setTimeout(function () { + onShowTimerExpired(elem); + + }, 1200); + } + + function preventTouchHover() { + preventHover = true; + } + + function ItemHoverMenu(parentElement) { + + this.parent = parentElement; + + this.parent.addEventListener('mouseenter', onHoverIn, true); + this.parent.addEventListener('mouseleave', onHoverOut, true); + this.parent.addEventListener("touchstart", preventTouchHover); + } + + ItemHoverMenu.prototype = { + + constructor: ItemHoverMenu, + + destroy: function () { + this.parent.removeEventListener('mouseenter', onHoverIn, true); + this.parent.removeEventListener('mouseleave', onHoverOut, true); + this.parent.removeEventListener("touchstart", preventTouchHover); + } + } + + return ItemHoverMenu; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js index baf251fd92..cff8bb1153 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js +++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js @@ -293,7 +293,10 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (!clickEntireItem) { html += ''; html += ''; - html += userdataButtons.getIconsHtml(item, false); + html += userdataButtons.getIconsHtml({ + item: item, + includePlayed: false + }); html += ''; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js index 9edfdeca69..a6a15f0da1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js +++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js @@ -99,6 +99,9 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g var apiClient = connectionManager.getApiClient(serverId); + if (type == 'Timer') { + return apiClient.getLiveTvTimer(id); + } return apiClient.getItem(apiClient.getCurrentUserId(), id); } @@ -165,6 +168,8 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g function executeAction(card, target, action) { + target = target || card; + var id = card.getAttribute('data-id'); if (!id) { @@ -217,14 +222,26 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g } else if (action == 'menu') { - showContextMenu(card, { - identify: false, - positionTo: target || card - }); + + var options = target.getAttribute('data-playoptions') == 'false' ? + { + shuffle: false, + instantMix: false, + play: false, + playAllFromHere: false, + queue: false, + queueAllFromHere: false + } : + {}; + + options.identify = false; + options.positionTo = target; + + showContextMenu(card, options); } else if (action == 'playmenu') { - showPlayMenu(card, target || card); + showPlayMenu(card, target); } } @@ -318,7 +335,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g } if (action) { - executeAction(card, e.target, action); + executeAction(card, actionElement, action); e.preventDefault(); e.stopPropagation(); @@ -332,7 +349,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g while ((value ? elem.getAttribute(name) != value : !elem.getAttribute(name))) { elem = elem.parentNode; - if (!elem) { + if (!elem || !elem.getAttribute) { return null; } } @@ -356,7 +373,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g function onCommand(e) { var cmd = e.detail.command; - if (cmd == 'play' || cmd == 'record') { + if (cmd == 'play' || cmd == 'record' || cmd == 'menu' || cmd == 'info') { var card = parentWithClass(e.target, 'itemAction'); if (card) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index 651c8b85fc..95e8f67e58 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Del", "ServerUpdateNeeded": "Denne Emby server b\u00f8r opdateres. For at downloade den nyeste version bes\u00f8g venligst {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index 3ca2976beb..a80c1856dd 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Teilen", "ServerUpdateNeeded": "Dieser Emby Server sollte aktualisiert werden. Um die neueste Version zu laden, besuche bitte {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index 301adb1129..188d69b6ed 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -113,6 +113,7 @@ "QueueAllFromHere": "Queue All from Here", "PlayAllFromHere": "Play All from Here", "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume at {0}", - "RemoveFromPlaylist": "Remove from Playlist" + "ResumeAt": "Resume from {0}", + "RemoveFromPlaylist": "Remove from Playlist", + "Trailer": "Trailer" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json index e694d49f11..0ee9d004a1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartir", "ServerUpdateNeeded": "Este Servidor Emby necesita ser actualizado. Para descargar la ultima versi\u00f3n, por favor visite {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index 9bb888d920..6c1a881fb8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -1,6 +1,8 @@ { "EditInfo": "Modifier les informations", "RemoveFromPlaylist": "Supprimer de la liste de lecture", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", "Share": "Partager", "ServerUpdateNeeded": "Le serveur Emby doit \u00eatre mis \u00e0 jour. Pour t\u00e9l\u00e9charger la derni\u00e8re version, veuillez visiter {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 0c31cf5571..ce865a8b65 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", "ServerUpdateNeeded": "\u041e\u0441\u044b Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u04a3\u0493\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, {0} \u043a\u0456\u0440\u0456\u04a3\u0456\u0437", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index 72f9bc396b..ab43e5b393 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Spesial - {0}", "Share": "Del", "ServerUpdateNeeded": "Denne Emby serveren trenger en oppdatering. For \u00e5 laste ned nyeste versjon, vennligst bes\u00f8k: {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index 4a47303ebd..9a34b2c12d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -1,6 +1,8 @@ { - "EditInfo": "Edit Info", - "RemoveFromPlaylist": "Remove from Playlist", + "EditInfo": "Info Bewerken", + "RemoveFromPlaylist": "Verwijderen uit afspeellijst", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Speciaal - {0}", "Share": "Delen", "ServerUpdateNeeded": "Deze Emby Server moet worden bijgewerkt. Om de laatste versie te downloaden, gaat u naar {0}", @@ -94,23 +96,23 @@ "HeaderYouSaid": "U zei...", "MessageWeDidntRecognizeCommand": "Sorry, dat commando herkennen we niet.", "MessageIfYouBlockedVoice": "Als u spraak toegang uitgeschakeld heeft moet u dit opnieuw configureren voordat u verder gaat.", - "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", - "Favorite": "Favorite", - "Like": "Like", - "Dislike": "Dislike", - "Played": "Played", + "ValueDiscNumber": "Schijf {0}", + "Unrated": "Geen rating", + "Favorite": "Favoriet", + "Like": "Leuk", + "Dislike": "Niet leuk", + "Played": "Afgespeeld", "RefreshDialogHelp": "Metadata wordt vernieuwd op basis van de instellingen en internet diensten die zijn ingeschakeld in het dashboard van de Emby Server.", - "Open": "Open", - "Play": "Play", - "Queue": "Queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit Images", - "Sync": "Sync", + "Open": "Openen", + "Play": "Afspelen", + "Queue": "Wachtrij", + "Shuffle": "Willekeurig", + "Identify": "Identificeer", + "EditImages": "Bewerk afbeeldingen", + "Sync": "Synchronisatie", "InstantMix": "Instant Mix", - "ViewAlbum": "View Album", - "ViewArtist": "View Artist", - "QueueAllFromHere": "Queue All from Here", - "PlayAllFromHere": "Play All from Here" + "ViewAlbum": "Bekijk album", + "ViewArtist": "Bekijk artiest", + "QueueAllFromHere": "Plaats alles in de wachtrij vanaf hier", + "PlayAllFromHere": "Speel alles vanaf hier" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index ba4c52271e..1724fccd3b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -1,6 +1,8 @@ { - "EditInfo": "Edit Info", - "RemoveFromPlaylist": "Remove from Playlist", + "EditInfo": "Editar Informa\u00e7\u00f5es", + "RemoveFromPlaylist": "Remover da Lista de Reprodu\u00e7\u00e3o", + "PlayFromBeginning": "Reproduzir do in\u00edcio", + "ResumeAt": "Retomar de {0}", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartilhar", "ServerUpdateNeeded": "Este servidor Emby precisa ser atualizado. Para baixar a \u00faltima vers\u00e3o, por favor visite {0}", @@ -88,29 +90,29 @@ "ReplaceAllMetadata": "Substituir todos os metadados", "SearchForMissingMetadata": "Buscar por metadados que faltam", "LabelRefreshMode": "Mode de atualiza\u00e7\u00e3o:", - "NoItemsFound": "No items found.", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", - "Favorite": "Favorite", - "Like": "Like", - "Dislike": "Dislike", - "Played": "Played", + "NoItemsFound": "Nenhum item encontrado.", + "HeaderSaySomethingLike": "Diga algo como...", + "ButtonTryAgain": "Tente Novamente", + "HeaderYouSaid": "Voc\u00ea disse...", + "MessageWeDidntRecognizeCommand": "Desculpe-nos, n\u00e3o foi poss\u00edvel reconhecer este comando.", + "MessageIfYouBlockedVoice": "Se voc\u00ea negou acessos de voz ao app voc\u00ea precisar\u00e1 reconfigurar antes de tentar novamente.", + "ValueDiscNumber": "Disco {0}", + "Unrated": "Sem classifica\u00e7\u00e3o", + "Favorite": "Favorito", + "Like": "Gostei", + "Dislike": "N\u00e3o Gostei", + "Played": "Reproduzido", "RefreshDialogHelp": "Os metadados s\u00e3o atualizados com bases nas defini\u00e7\u00f5es e nos servi\u00e7os de internet que est\u00e3o ativos no painel do Servidor Emby.", - "Open": "Open", - "Play": "Play", - "Queue": "Queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit Images", - "Sync": "Sync", - "InstantMix": "Instant Mix", - "ViewAlbum": "View Album", - "ViewArtist": "View Artist", - "QueueAllFromHere": "Queue All from Here", - "PlayAllFromHere": "Play All from Here" + "Open": "Abrir", + "Play": "Reproduzir", + "Queue": "Enfileirar", + "Shuffle": "Embaralhar", + "Identify": "Identificar", + "EditImages": "Editar Imagens", + "Sync": "Sincronizar", + "InstantMix": "Mix Instant\u00e2neo", + "ViewAlbum": "Visualizar \u00c1lbum", + "ViewArtist": "Visualizar Artista", + "QueueAllFromHere": "Enfileirar todos daqui", + "PlayAllFromHere": "Reproduzir todos daqui" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json index 1d2dbd5820..da25029876 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Partilhar", "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 7996aa0175..6028c6d6c1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", "ServerUpdateNeeded": "\u0414\u0430\u043d\u043d\u044b\u0439 Emby Server \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index be0c522e81..aaa8b7ac2c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", "Share": "Dela", "ServerUpdateNeeded": "Den h\u00e4r Emby servern beh\u00f6ver uppdateras. F\u00f6r att ladda ner senaste versionen, g\u00e5 till {0}", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json index 6db832b5ab..66c4792126 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json @@ -1,6 +1,8 @@ { "EditInfo": "Edit Info", "RemoveFromPlaylist": "Remove from Playlist", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", "ValueSpecialEpisodeName": "Special - {0}", "Share": "\u5206\u4eab", "ServerUpdateNeeded": "\u6b64Emby\u4f3a\u670d\u5668\u9700\u8981\u66f4\u65b0\uff0c\u8acb\u81f3{0}\u53d6\u5f97\u6700\u65b0\u7248\u672c", diff --git a/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js b/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js index f44875f51e..66bc6a2dec 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js +++ b/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js @@ -2,10 +2,17 @@ define(['connectionManager', 'globalize', 'paper-icon-button-light', 'material-i function getUserDataButtonHtml(method, itemId, iconCssClass, icon, tooltip, style) { + if (style == 'fab-mini') { + style = 'fab'; + iconCssClass = iconCssClass ? (iconCssClass + ' mini') : 'mini'; + } + var is = style == 'fab' ? 'emby-button' : 'paper-icon-button-light'; var className = style == 'fab' ? 'autoSize fab' : 'autoSize'; - className += ' ' + iconCssClass; + if (iconCssClass) { + className += ' ' + iconCssClass; + } return ''; + return ''; }, getUserDataIconsHtml: function (item, includePlayed, style) { @@ -2316,7 +2311,7 @@ markPlayed: function (link) { - var id = link.getAttribute('data-itemid'); + var id = link.getAttribute('data-id'); var markAsPlayed = !link.classList.contains('btnUserItemRatingOn'); @@ -2331,7 +2326,7 @@ markFavorite: function (link) { - var id = link.getAttribute('data-itemid'); + var id = link.getAttribute('data-id'); var markAsFavorite = !link.classList.contains('btnUserItemRatingOn'); diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js index d59c51de06..3236b26dac 100644 --- a/dashboard-ui/scripts/librarylist.js +++ b/dashboard-ui/scripts/librarylist.js @@ -1,172 +1,5 @@ define(['appSettings', 'appStorage', 'libraryBrowser', 'apphost', 'itemHelper', 'mediaInfo'], function (appSettings, appStorage, LibraryBrowser, appHost, itemHelper, mediaInfo) { - var showOverlayTimeout; - - function onHoverOut(e) { - - var elem = e.target; - - if (!elem.classList.contains('card')) { - return; - } - - if (showOverlayTimeout) { - clearTimeout(showOverlayTimeout); - showOverlayTimeout = null; - } - - elem = elem.querySelector('.cardOverlayTarget'); - - if (elem) { - slideDownToHide(elem); - } - } - - function slideDownToHide(elem) { - - if (elem.classList.contains('hide')) { - return; - } - - if (!elem.animate) { - elem.classList.add('hide'); - return; - } - - requestAnimationFrame(function () { - var keyframes = [ - { transform: 'translateY(0)', offset: 0 }, - { transform: 'translateY(100%)', offset: 1 }]; - var timing = { duration: 300, iterations: 1, fill: 'forwards', easing: 'ease-out' }; - - elem.animate(keyframes, timing).onfinish = function () { - elem.classList.add('hide'); - }; - }); - } - - function slideUpToShow(elem) { - - if (!elem.classList.contains('hide')) { - return; - } - - elem.classList.remove('hide'); - - if (!elem.animate) { - return; - } - - requestAnimationFrame(function () { - - var keyframes = [ - { transform: 'translateY(100%)', offset: 0 }, - { transform: 'translateY(0)', offset: 1 }]; - var timing = { duration: 300, iterations: 1, fill: 'forwards', easing: 'ease-out' }; - elem.animate(keyframes, timing); - }); - } - - function getOverlayHtml(item, currentUser, card) { - - var html = ''; - - html += '
'; - - var className = card.className.toLowerCase(); - - var isMiniItem = className.indexOf('mini') != -1; - var isSmallItem = isMiniItem || className.indexOf('small') != -1; - var isPortrait = className.indexOf('portrait') != -1; - - var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName; - var name = itemHelper.getDisplayName(item); - - html += '
'; - var logoHeight = isSmallItem || isMiniItem ? 20 : 26; - var imgUrl; - - if (parentName && item.ParentLogoItemId) { - - imgUrl = ApiClient.getScaledImageUrl(item.ParentLogoItemId, { - maxHeight: logoHeight, - type: 'logo', - tag: item.ParentLogoImageTag - }); - - html += ''; - - } - else if (item.ImageTags.Logo) { - - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - maxHeight: logoHeight, - type: 'logo', - tag: item.ImageTags.Logo - }); - - html += ''; - } - else { - html += parentName || name; - } - html += '
'; - - if (parentName) { - html += '

'; - html += name; - html += '

'; - } else if (!isSmallItem && !isMiniItem) { - html += '
'; - html += mediaInfo.getPrimaryMediaInfoHtml(item, { - endsAt: false - }); - html += '
'; - } - - if (!isMiniItem) { - html += '
'; - - if (isPortrait) { - html += '
'; - html += LibraryBrowser.getUserDataIconsHtml(item); - html += '
'; - } else { - - html += ''; - html += LibraryBrowser.getUserDataIconsHtml(item); - html += ''; - } - html += '
'; - } - - html += '
'; - - var buttonCount = 0; - - if (MediaController.canPlay(item)) { - - var resumePosition = (item.UserData || {}).PlaybackPositionTicks || 0; - - html += ''; - buttonCount++; - } - - if (item.LocalTrailerCount) { - html += ''; - buttonCount++; - } - - html += ''; - buttonCount++; - - html += '
'; - - html += '
'; - - return html; - } - function isClickable(target) { while (target != null) { @@ -200,7 +33,7 @@ function onGroupedCardClick(e, card) { - var itemId = card.getAttribute('data-itemid'); + var itemId = card.getAttribute('data-id'); var context = card.getAttribute('data-context'); var userId = Dashboard.getCurrentUserId(); @@ -255,104 +88,9 @@ LibraryBrowser.createCardMenus = function (curr, options) { - var preventHover = false; - - function onShowTimerExpired(elem) { - - elem = elem.querySelector('a'); - - if (elem.querySelector('.itemSelectionPanel')) { - return; - } - - var innerElem = elem.querySelector('.cardOverlayTarget'); - - if (!innerElem) { - innerElem = document.createElement('div'); - innerElem.classList.add('hide'); - innerElem.classList.add('cardOverlayTarget'); - parentWithClass(elem, 'cardContent').appendChild(innerElem); - } - - var dataElement = elem; - while (dataElement && !dataElement.getAttribute('data-itemid')) { - dataElement = dataElement.parentNode; - } - - var id = dataElement.getAttribute('data-itemid'); - var type = dataElement.getAttribute('data-itemtype'); - - if (type == 'Timer') { - return; - } - - var promise1 = ApiClient.getItem(Dashboard.getCurrentUserId(), id); - var promise2 = Dashboard.getCurrentUser(); - - Promise.all([promise1, promise2]).then(function (responses) { - - var item = responses[0]; - var user = responses[1]; - - var card = elem; - - while (!card.classList.contains('card')) { - card = card.parentNode; - } - - innerElem.innerHTML = getOverlayHtml(item, user, card); - }); - - slideUpToShow(innerElem); - } - - function onHoverIn(e) { - - var elem = e.target; - - if (!elem.classList.contains('cardImage')) { - return; - } - - if (preventHover === true) { - preventHover = false; - return; - } - - if (showOverlayTimeout) { - clearTimeout(showOverlayTimeout); - showOverlayTimeout = null; - } - - while (!elem.classList.contains('card')) { - elem = elem.parentNode; - } - - showOverlayTimeout = setTimeout(function () { - onShowTimerExpired(elem); - - }, 1200); - } - - function preventTouchHover() { - preventHover = true; - } - curr.removeEventListener('click', onCardClick); curr.addEventListener('click', onCardClick); - if (!AppInfo.isTouchPreferred) { - - curr.removeEventListener('mouseenter', onHoverIn); - curr.addEventListener('mouseenter', onHoverIn, true); - - curr.removeEventListener('mouseleave', onHoverOut); - curr.addEventListener('mouseleave', onHoverOut, true); - - curr.removeEventListener("touchstart", preventTouchHover); - curr.addEventListener("touchstart", preventTouchHover); - } - //initTapHoldMenus(curr); }; @@ -584,7 +322,7 @@ var selectedItems = []; function updateItemSelection(chkItemSelect, selected) { - var id = parentWithClass(chkItemSelect, 'card').getAttribute('data-itemid'); + var id = parentWithClass(chkItemSelect, 'card').getAttribute('data-id'); if (selected) { diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js index dd18df4131..3d074002ce 100644 --- a/dashboard-ui/scripts/sections.js +++ b/dashboard-ui/scripts/sections.js @@ -111,7 +111,7 @@ icon = item.icon || icon; - html += ''; + html += ''; html += '
'; html += "
"; diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 62ef9b2847..14b1ff7148 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1804,6 +1804,7 @@ var AppInfo = {}; define("emby-collapse", [embyWebComponentsBowerPath + "/emby-collapse/emby-collapse"], returnFirstDependency); define("emby-button", [embyWebComponentsBowerPath + "/emby-button/emby-button"], returnFirstDependency); define("emby-itemscontainer", [embyWebComponentsBowerPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency); + define("itemHoverMenu", [embyWebComponentsBowerPath + "/itemhovermenu/itemhovermenu"], returnFirstDependency); define("alphaPicker", [embyWebComponentsBowerPath + "/alphapicker/alphapicker"], returnFirstDependency); define("paper-icon-button-light", [embyWebComponentsBowerPath + "/emby-button/paper-icon-button-light"]);