diff --git a/dashboard-ui/bower_components/emby-webcomponents/dom.js b/dashboard-ui/bower_components/emby-webcomponents/dom.js index d06e621555..85924fa160 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dom.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dom.js @@ -13,9 +13,14 @@ define([], function () { return elem; } - function parentWithTag(elem, tagName) { + function parentWithTag(elem, tagNames) { - while (elem.tagName != tagName) { + // accept both string and array passed in + if (!Array.isArray(tagNames)) { + tagNames = [tagNames]; + } + + while (tagNames.indexOf(elem.tagName || '') == -1) { elem = elem.parentNode; if (!elem) { diff --git a/dashboard-ui/components/groupedcards.js b/dashboard-ui/components/groupedcards.js new file mode 100644 index 0000000000..ad8babd4c0 --- /dev/null +++ b/dashboard-ui/components/groupedcards.js @@ -0,0 +1,53 @@ +define(['dom'], function (dom) { + + function onGroupedCardClick(e, card) { + + var itemId = card.getAttribute('data-id'); + + var userId = Dashboard.getCurrentUserId(); + + var playedIndicator = card.querySelector('.playedIndicator'); + var playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null; + + var options = { + + Limit: parseInt(playedIndicatorHtml || '10'), + Fields: "PrimaryImageAspectRatio,DateCreated", + ParentId: itemId, + GroupItems: false + }; + + var actionableParent = dom.parentWithTag(e.target, ['A', 'BUTTON', 'INPUT']); + + if (actionableParent && !actionableParent.classList.contains('cardContent')) { + return; + } + + ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { + + if (items.length == 1) { + Dashboard.navigate(LibraryBrowser.getHref(items[0])); + return; + } + + var url = 'itemdetails.html?id=' + itemId; + + Dashboard.navigate(url); + }); + + e.stopPropagation(); + e.preventDefault(); + return false; + } + + function onItemsContainerClick(e) { + var groupedCard = dom.parentWithClass(e.target, 'groupedCard'); + + if (groupedCard) { + onGroupedCardClick(e, groupedCard); + } + } + return { + onItemsContainerClick: onItemsContainerClick + }; +}); \ No newline at end of file diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js index 5a18000c41..3d38436d7d 100644 --- a/dashboard-ui/scripts/sections.js +++ b/dashboard-ui/scripts/sections.js @@ -1,4 +1,4 @@ -define(['libraryBrowser', 'appSettings', 'scrollStyles', 'emby-button', 'paper-icon-button-light', 'emby-itemscontainer'], function (LibraryBrowser, appSettings) { +define(['libraryBrowser', 'appSettings', 'components/groupedcards', 'scrollStyles', 'emby-button', 'paper-icon-button-light', 'emby-itemscontainer'], function (LibraryBrowser, appSettings, groupedcards) { function getUserViews(userId) { @@ -321,6 +321,7 @@ } elem.innerHTML = html; + elem.addEventListener('click', groupedcards.onItemsContainerClick); ImageLoader.lazyChildren(elem); }); } diff --git a/dashboard-ui/scripts/tvlatest.js b/dashboard-ui/scripts/tvlatest.js index 16cd72b9f4..91989cfbf3 100644 --- a/dashboard-ui/scripts/tvlatest.js +++ b/dashboard-ui/scripts/tvlatest.js @@ -1,4 +1,4 @@ -define(['components/categorysyncbuttons'], function (categorysyncbuttons) { +define(['components/categorysyncbuttons', 'components/groupedcards'], function (categorysyncbuttons, groupedcards) { function getView() { @@ -74,19 +74,21 @@ Dashboard.hideLoadingMsg(); }); } - return function (view, params, tabContent) { + return function (view, params, tabContent) { var self = this; categorysyncbuttons.init(tabContent); var latestPromise; - self.preRender = function () { - latestPromise = getLatestPromise(view, params); + self.preRender = function () { + latestPromise = getLatestPromise(view, params); }; - self.renderTab = function() { + self.renderTab = function () { loadLatest(tabContent, params, latestPromise); }; - }; + + tabContent.querySelector('#latestEpisodes').addEventListener('click', groupedcards.onItemsContainerClick); + }; }); \ No newline at end of file