diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css index bc2adb4456..888e2703e4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css @@ -150,6 +150,22 @@ button.cardContent { transition: filter, -webkit-filter 600ms ease-out !important; } +.mediaSourceIndicator { + display: flex; + position: absolute; + align-items: center; + justify-content: center; + top: .3em; + left: .3em; + text-align: center; + vertical-align: middle; + width: 24px; + height: 24px; + border-radius: 50%; + color: #fff; + background: rgb(51, 136, 204); +} + .cardImageContainer { background-size: contain; background-repeat: no-repeat; @@ -163,6 +179,20 @@ button.cardContent { background-clip: content-box !important; } +button.cardImageContainer { + border: 0; + padding: 0; + background-color: transparent; + box-sizing: content-box; + outline: none !important; + cursor: pointer; +} + +/* Used by non-scalable cards */ +.forceRelative { + position: relative; +} + .cardContent { overflow: hidden; position: absolute; diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index cd9ab9a0f1..87b72cf3e8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -1007,10 +1007,34 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo cardImageContainerClass += " " + cardBoxClass; } + var overlayButtons = ''; + if (!layoutManager.tv) { + + var overlayPlayButton = options.overlayPlayButton; + + if (overlayPlayButton == null && !options.overlayMoreButton) { + overlayPlayButton = item.MediaType == 'Video'; + } + + if (overlayPlayButton && !item.IsPlaceHolder && (item.LocationType != 'Virtual' || !item.MediaType || item.Type == 'Program') && item.Type != 'Person' && item.PlayAccess == 'Full') { + overlayButtons += ''; + } + if (options.overlayMoreButton) { + + var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; + + overlayButtons += ''; + } + } + + if (options.showChildCountIndicator && item.ChildCount) { + className += ' groupedCard'; + } + // cardBox can be it's own separate element if an outer footer is ever needed - var cardImageContainerOpen = imgUrl ? ('
') : ('
'); + var cardImageContainerOpen; var cardImageContainerClose = ''; - var cardBoxClose = '
'; + var cardBoxClose = ''; var cardContentClose = ''; var cardScalableClose = ''; @@ -1024,10 +1048,22 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo cardContentOpen = ''; } + cardImageContainerOpen = imgUrl ? ('
') : ('
'); cardImageContainerOpen = '
' + cardContentOpen + cardImageContainerOpen; cardBoxClose = '
'; cardScalableClose = '
'; cardImageContainerClose = '
'; + } else { + + if (overlayButtons && !separateCardBox) { + cardImageContainerOpen = imgUrl ? (''; + + className += ' forceRelative'; + } else { + cardImageContainerOpen = imgUrl ? ('
') : ('
'); + cardImageContainerClose = '
'; + } } var indicatorsHtml = ''; @@ -1082,26 +1118,18 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo progressHtml = ''; } + var mediaSourceCount = item.MediaSourceCount || 1; + if (mediaSourceCount > 1) { + innerCardFooter += '
' + mediaSourceCount + '
'; + } + var outerCardFooter = ''; if (!options.overlayText && !footerOverlayed) { footerCssClass = options.cardLayout ? 'cardFooter' : 'cardFooter transparent'; outerCardFooter = getCardFooterText(item, options, showTitle, imgUrl, footerCssClass, progressHtml, true); } - var overlayButtons = ''; - if (!layoutManager.tv && scalable) { - if (options.overlayPlayButton && !item.IsPlaceHolder && (item.LocationType != 'Virtual' || !item.MediaType || item.Type == 'Program') && item.Type != 'Person' && item.PlayAccess == 'Full') { - overlayButtons += ''; - } - if (options.overlayMoreButton) { - - var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; - - overlayButtons += ''; - } - } - - var tagName = layoutManager.tv || !scalable ? 'button' : 'div'; + var tagName = (layoutManager.tv || !scalable) && !overlayButtons ? 'button' : 'div'; var prefix = (item.SortName || item.Name || '')[0]; @@ -1139,7 +1167,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return '\ <' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + ' data-prefix="' + prefix + '" class="' + className + '"> \ -' + cardImageContainerOpen + cardImageContainerClose + innerCardFooter + cardContentClose + overlayButtons + cardScalableClose + outerCardFooter + cardBoxClose + '\ +' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + cardContentClose + overlayButtons + cardScalableClose + outerCardFooter + cardBoxClose + '\ '; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js index b7f20c9fe4..0d7d4eebff 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js @@ -1,4 +1,4 @@ -define(['datetime', 'imageLoader', 'itemShortcuts'], function (datetime, imageLoader, itemShortcuts) { +define(['datetime', 'imageLoader', 'itemShortcuts', 'connectionManager'], function (datetime, imageLoader, itemShortcuts, connectionManager) { function buildChapterCardsHtml(item, chapters, options) { @@ -27,6 +27,8 @@ define(['datetime', 'imageLoader', 'itemShortcuts'], function (datetime, imageLo var html = ''; var itemsInRow = 0; + var apiClient = connectionManager.getApiClient(item.ServerId); + for (var i = 0, length = chapters.length; i < length; i++) { if (options.rows && itemsInRow == 0) { @@ -35,7 +37,7 @@ define(['datetime', 'imageLoader', 'itemShortcuts'], function (datetime, imageLo var chapter = chapters[i]; - html += buildChapterCard(item, chapter, options, className); + html += buildChapterCard(item, apiClient, chapter, i, options, className); itemsInRow++; if (options.rows && itemsInRow >= options.rows) { @@ -47,9 +49,25 @@ define(['datetime', 'imageLoader', 'itemShortcuts'], function (datetime, imageLo return html; } - function buildChapterCard(item, chapter, options, className) { + function getImgUrl(item, chapter, index, maxWidth, apiClient) { - var imgUrl = chapter.images ? chapter.images.primary : ''; + if (chapter.ImageTag) { + + return apiClient.getScaledImageUrl(item.Id, { + + maxWidth: maxWidth, + tag: chapter.ImageTag, + type: "Chapter", + index: index + }); + } + + return null; + } + + function buildChapterCard(item, apiClient, chapter, index, options, className) { + + var imgUrl = getImgUrl(item, chapter, index, options.width || 400, apiClient); var cardImageContainerClass = 'cardImageContainer'; if (options.coverImage) { @@ -84,12 +102,12 @@ define(['datetime', 'imageLoader', 'itemShortcuts'], function (datetime, imageLo function buildChapterCards(item, chapters, options) { - // Abort if the container has been disposed - if (!document.body.contains(options.parentContainer)) { - return; - } - if (options.parentContainer) { + // Abort if the container has been disposed + if (!document.body.contains(options.parentContainer)) { + return; + } + if (chapters.length) { options.parentContainer.classList.remove('hide'); } else { diff --git a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.css b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.css index f3b6d79b14..b5c3bf1559 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.css +++ b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.css @@ -34,3 +34,7 @@ top: 0 !important; border-radius: 0 !important; } + +.withMultiSelect { + position: relative; +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js index e214b75fa1..eea5733d4d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js +++ b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js @@ -16,7 +16,10 @@ selectedElements = []; var elems = document.querySelectorAll('.itemSelectionPanel'); for (var i = 0, length = elems.length; i < length; i++) { - elems[i].parentNode.removeChild(elems[i]); + + var parent = elems[i].parentNode; + parent.removeChild(elems[i]); + parent.classList.remove('withMultiSelect'); } } } @@ -75,7 +78,7 @@ function updateItemSelection(chkItemSelect, selected) { - var id = dom.parentWithClass(chkItemSelect, 'card').getAttribute('data-id'); + var id = dom.parentWithAttribute(chkItemSelect, 'data-id').getAttribute('data-id'); if (selected) { @@ -120,7 +123,9 @@ itemSelectionPanel = document.createElement('div'); itemSelectionPanel.classList.add('itemSelectionPanel'); - (item.querySelector('.cardBox') || item.querySelector('.cardContent')).appendChild(itemSelectionPanel); + var parent = item.querySelector('.cardBox') || item.querySelector('.cardContent'); + parent.classList.add('withMultiSelect'); + parent.appendChild(itemSelectionPanel); var cssClass = 'chkItemSelect'; if (isChecked && !browser.firefox) { diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index cb66f955d9..7f48c2e6b4 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -884,23 +884,6 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { font-size: 180%; } -.mediaSourceIndicator { - display: block; - position: absolute; - top: 5px; - left: 5px; - text-align: center; - vertical-align: middle; - width: 22px; - height: 19px; - padding-top: 3px; - border-radius: 50%; - color: #fff; - background: rgb(51, 136, 204); - background: rgba(51, 136, 204, .9); - line-height: 1.2; -} - .recordingProgressBar::-moz-progress-bar { background-color: #cc3333; } diff --git a/dashboard-ui/itemdetails.html b/dashboard-ui/itemdetails.html index 3b8cae5205..b63cbdb00b 100644 --- a/dashboard-ui/itemdetails.html +++ b/dashboard-ui/itemdetails.html @@ -153,7 +153,8 @@ -
+
+

diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 6508ef2445..6b81997769 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1583,82 +1583,38 @@ } function renderScenes(page, item, user, limit, isStatic) { - var html = ''; var chapters = item.Chapters || []; + var scenesContent = page.querySelector('#scenesContent'); if (enableScrollX()) { - html += '
'; + scenesContent.classList.add('smoothScrollX'); limit = null; } else { - html += '
'; + scenesContent.classList.add('vertical-wrap'); } - for (var i = 0, length = chapters.length; i < length; i++) { + var limitExceeded = limit && chapters.length > limit; - if (limit && i >= limit) { - break; - } - - var chapter = chapters[i]; - var chapterName = chapter.Name || "Chapter " + i; - - var onclick = item.PlayAccess == 'Full' && !isStatic ? ' onclick="ItemDetailPage.play(' + chapter.StartPositionTicks + ');"' : ''; - - html += ''; - - html += '
'; - html += '
'; - - var imgUrl; - - if (chapter.ImageTag) { - - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - maxWidth: 400, - tag: chapter.ImageTag, - type: "Chapter", - index: i - }); - } else { - imgUrl = "css/images/items/list/chapter.png"; - } - - html += '
'; - - html += '
'; - html += '
'; - - html += '
'; - html += '
' + chapterName + '
'; - html += '
'; - html += datetime.getDisplayRunningTime(chapter.StartPositionTicks); - html += '
'; - - //cardFooter - html += "
"; - - // cardContent - html += '
'; - - // cardScalable - html += '
'; - - // cardBox - html += '
'; - - html += '
'; + if (limitExceeded) { + chapters = chapters.slice(0); + chapters.length = Math.min(limit, chapters.length); } - html += '
'; + require(['chaptercardbuilder'], function (chaptercardbuilder) { - if (limit && chapters.length > limit) { - html += '

'; + chaptercardbuilder.buildChapterCards(item, chapters, { + itemsContainer: scenesContent, + coverImage: true, + width: 400 + }); + }); + + if (limitExceeded) { + page.querySelector('.moreScenes').classList.remove('hide'); + } else { + page.querySelector('.moreScenes').classList.add('hide'); } - - var scenesContent = page.querySelector('#scenesContent'); - scenesContent.innerHTML = html; - ImageLoader.lazyChildren(scenesContent); } function renderMediaSources(page, item) {