diff --git a/dashboard-ui/scripts/homenextup.js b/dashboard-ui/scripts/homenextup.js index a7d37c66a6..a14cc7d14c 100644 --- a/dashboard-ui/scripts/homenextup.js +++ b/dashboard-ui/scripts/homenextup.js @@ -1,13 +1,6 @@ define([], function () { - function reload(page) { - - Dashboard.showLoadingMsg(); - - loadNextUp(page, 'home-nextup'); - } - - function loadNextUp(page) { + function getNextUpPromise() { var query = { @@ -18,7 +11,11 @@ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }; - ApiClient.getNextUpEpisodes(query).then(function (result) { + return ApiClient.getNextUpEpisodes(query); + } + function loadNextUp(page, promise) { + + promise.then(function (result) { if (result.Items.length) { page.querySelector('.noNextUpItems').classList.add('hide'); @@ -50,11 +47,17 @@ } return function (view, params, tabContent) { - var self = this; + var self = this; + var nextUpPromise; + + self.preRender = function () { + nextUpPromise = getNextUpPromise(); + }; self.renderTab = function () { - reload(tabContent); + Dashboard.showLoadingMsg(); + loadNextUp(view, nextUpPromise); }; }; diff --git a/dashboard-ui/scripts/homeupcoming.js b/dashboard-ui/scripts/homeupcoming.js index aac1f69098..54be1863a2 100644 --- a/dashboard-ui/scripts/homeupcoming.js +++ b/dashboard-ui/scripts/homeupcoming.js @@ -1,6 +1,7 @@ define(['datetime', 'scrollStyles'], function (datetime) { - function loadUpcoming(page) { + function getUpcomingPromise() { + Dashboard.showLoadingMsg(); var query = { @@ -13,7 +14,12 @@ EnableTotalRecordCount: false }; - ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query)).then(function (result) { + return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query)); + } + + function loadUpcoming(page, promise) { + + promise.then(function (result) { var items = result.Items; @@ -124,11 +130,17 @@ } return function (view, params, tabContent) { - var self = this; + var self = this; + var upcomingPromise; + + self.preRender = function () { + upcomingPromise = getUpcomingPromise(); + }; self.renderTab = function () { - loadUpcoming(tabContent); + Dashboard.showLoadingMsg(); + loadUpcoming(view, upcomingPromise); }; }; diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js index 2d67e7c223..d9a2840251 100644 --- a/dashboard-ui/scripts/indexpage.js +++ b/dashboard-ui/scripts/indexpage.js @@ -250,14 +250,13 @@ var mdlTabs = view.querySelector('.libraryViewNav'); - libraryBrowser.configurePaperLibraryTabs(view, mdlTabs, view.querySelectorAll('.pageTabContent'), [0,1,2,3]); + libraryBrowser.configurePaperLibraryTabs(view, mdlTabs, view.querySelectorAll('.pageTabContent'), [0, 1, 2, 3]); var tabControllers = []; var renderedTabs = []; - function loadTab(page, index) { + function getTabController(page, index, callback) { - var tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); var depends = []; switch (index) { @@ -279,12 +278,14 @@ } require(depends, function (controllerFactory) { - + var tabContent; if (index == 0) { + tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); self.tabContent = tabContent; } var controller = tabControllers[index]; if (!controller) { + tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); controller = index ? new controllerFactory(view, params, tabContent) : self; tabControllers[index] = controller; @@ -293,6 +294,24 @@ } } + callback(controller); + }); + } + + function preLoadTab(page, index) { + + getTabController(page, index, function (controller) { + if (renderedTabs.indexOf(index) == -1) { + if (controller.preRender) { + controller.preRender(); + } + } + }); + } + + function loadTab(page, index) { + + getTabController(page, index, function (controller) { if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); @@ -300,6 +319,10 @@ }); } + mdlTabs.addEventListener('beforetabchange', function (e) { + preLoadTab(view, parseInt(e.detail.selectedTabIndex)); + }); + mdlTabs.addEventListener('tabchange', function (e) { loadTab(view, parseInt(e.detail.selectedTabIndex)); }); diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index 6f46f65ffb..34bb65fe1f 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -215,6 +215,11 @@ var current = LibraryBrowser.selectedTab(tabs); tabs.selectedTabIndex = selected; if (current == selected) { + tabs.dispatchEvent(new CustomEvent("beforetabchange", { + detail: { + selectedTabIndex: selected + } + })); tabs.dispatchEvent(new CustomEvent("tabchange", { detail: { selectedTabIndex: selected @@ -289,6 +294,12 @@ var index = parseInt(link.getAttribute('data-index')); var newPanel = panels[index]; + tabs.dispatchEvent(new CustomEvent("beforetabchange", { + detail: { + selectedTabIndex: index + } + })); + // If toCenter is called syncronously within the click event, it sometimes ends up canceling it setTimeout(function () { @@ -355,6 +366,11 @@ LibraryBrowser.selectedTab(pageTabsContainer, 0); return; } + pageTabsContainer.dispatchEvent(new CustomEvent("beforetabchange", { + detail: { + selectedTabIndex: LibraryBrowser.selectedTab(pageTabsContainer) + } + })); pageTabsContainer.dispatchEvent(new CustomEvent("tabchange", { detail: { selectedTabIndex: LibraryBrowser.selectedTab(pageTabsContainer) diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 9d9e8a7ec1..6b551d3a69 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -3028,7 +3028,7 @@ var AppInfo = {}; defineRoute({ path: '/wizardcomponents.html', - dependencies: ['dashboardcss', 'emby-button', 'emby-input'], + dependencies: ['dashboardcss', 'emby-button', 'emby-input', 'emby-select'], autoFocus: false, anonymous: true, controller: 'scripts/wizardcomponents' diff --git a/dashboard-ui/scripts/wizardcomponents.js b/dashboard-ui/scripts/wizardcomponents.js index 3515a9382e..71bf5c5c9a 100644 --- a/dashboard-ui/scripts/wizardcomponents.js +++ b/dashboard-ui/scripts/wizardcomponents.js @@ -12,6 +12,12 @@ ApiClient.getSystemInfo().then(function (systemInfo) { + if (systemInfo.OperatingSystem == 'Windows') { + view.querySelector('.fldSelectEncoderPathType').classList.add('hide'); + } else { + view.querySelector('.fldSelectEncoderPathType').classList.remove('hide'); + } + if (systemInfo.OperatingSystem == 'Windows' && systemInfo.SystemArchitecture != 'Arm') { view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'https://ffmpeg.zeranoe.com'); @@ -45,6 +51,10 @@ view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', 'https://ffmpeg.org/download.html'); view.querySelector('.downloadInstructions').innerHTML = ''; } + + var selectEncoderPath = view.querySelector('#selectEncoderPath'); + selectEncoderPath.value = 'Custom'; + onSelectEncoderPathChange.call(selectEncoderPath); }); } @@ -60,6 +70,30 @@ }); } + function parentWithClass(elem, className) { + + while (!elem.classList || !elem.classList.contains(className)) { + elem = elem.parentNode; + + if (!elem) { + return null; + } + } + + return elem; + } + + function onSelectEncoderPathChange(e) { + + var page = parentWithClass(this, 'page'); + + if (this.value == 'Custom') { + page.querySelector('.fldEncoderPath').classList.remove('hide'); + } else { + page.querySelector('.fldEncoderPath').classList.add('hide'); + } + } + return function (view, params) { view.querySelector('#btnSelectEncoderPath').addEventListener("click", function () { @@ -99,6 +133,7 @@ return false; }); + view.querySelector('#selectEncoderPath').addEventListener('change', onSelectEncoderPathChange); view.addEventListener('viewbeforeshow', function (e) { diff --git a/dashboard-ui/wizardcomponents.html b/dashboard-ui/wizardcomponents.html index c05910b49b..7d701bd025 100644 --- a/dashboard-ui/wizardcomponents.html +++ b/dashboard-ui/wizardcomponents.html @@ -31,7 +31,14 @@