From 4c0170535d8153a3f7d3763aaafbfdebc56c09b5 Mon Sep 17 00:00:00 2001 From: Sparky Date: Wed, 16 Jan 2019 09:32:47 -0500 Subject: [PATCH 1/7] Initial Deuglification Need to clean up afterwards. --- src/scripts/librarymenu.js | 1323 +++++++++++++++++++++++++----------- 1 file changed, 928 insertions(+), 395 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 8ba696ee25..13ad690ad3 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -1,451 +1,984 @@ -define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "viewManager", "libraryBrowser", "appRouter", "apphost", "playbackManager", "browser", "globalize", "paper-icon-button-light", "material-icons", "scrollStyles", "flexStyles"], function(dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, browser, globalize) { - "use strict"; +define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "viewManager", "libraryBrowser", "appRouter", "apphost", "playbackManager", "browser", "globalize", "paper-icon-button-light", "material-icons", "scrollStyles", "flexStyles"], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, browser, globalize) { + "use strict"; - function getCurrentApiClient() { - return currentUser && currentUser.localUser ? connectionManager.getApiClient(currentUser.localUser.ServerId) : connectionManager.currentApiClient() + function getCurrentApiClient() { + if (currentUser && currentUser.localUser) { + return connectionManager.getApiClient(currentUser.localUser.ServerId); } - function lazyLoadViewMenuBarImages() { - require(["imageLoader"], function(imageLoader) { - imageLoader.lazyChildren(skinHeader) - }) + return connectionManager.currentApiClient(); + } + + function lazyLoadViewMenuBarImages() { + require(["imageLoader"], function (imageLoader) { + imageLoader.lazyChildren(skinHeader); + }); + } + + function onBackClick() { + appRouter.back(); + } + + function updateUserInHeader(user) { + var hasImage; + + if (user && user.name) { + if (user.imageUrl) { + var url = user.imageUrl; + + if (user.supportsImageParams) { + url += "&height=" + Math.round(26 * Math.max(window.devicePixelRatio || 1, 2)); + } + + updateHeaderUserButton(url); + hasImage = true; + } + + headerUserButton.classList.remove("hide"); + } else { + headerUserButton.classList.add("hide"); } - function onBackClick() { - appRouter.back() + if (!hasImage) { + updateHeaderUserButton(null); } - function updateUserInHeader(user) { - var hasImage; - if (user && user.name) { - if (user.imageUrl) { - var url = user.imageUrl; - user.supportsImageParams && (url += "&height=" + Math.round(26 * Math.max(window.devicePixelRatio || 1, 2))), updateHeaderUserButton(url), hasImage = !0 - } - headerUserButton.classList.remove("hide") - } else headerUserButton.classList.add("hide"); - hasImage || updateHeaderUserButton(null), user && user.localUser ? (headerHomeButton && headerHomeButton.classList.remove("hide"), headerSearchButton && headerSearchButton.classList.remove("hide"), headerSettingsButton && (user.localUser.Policy.IsAdministrator ? headerSettingsButton.classList.remove("hide") : headerSettingsButton.classList.add("hide")), headerCastButton.classList.remove("hide")) : (headerHomeButton.classList.add("hide"), headerCastButton.classList.add("hide"), headerSearchButton && headerSearchButton.classList.add("hide"), headerSettingsButton && headerSettingsButton.classList.add("hide")), requiresUserRefresh = !1 + if (user && user.localUser) { + if (headerHomeButton) { + headerHomeButton.classList.remove("hide"); + } + + if (headerSearchButton) { + headerSearchButton.classList.remove("hide"); + } + + if (headerSettingsButton) { + if (user.localUser.Policy.IsAdministrator) { + headerSettingsButton.classList.remove("hide"); + } else { + headerSettingsButton.classList.add("hide"); + } + } + + headerCastButton.classList.remove("hide"); + } else { + headerHomeButton.classList.add("hide"); + headerCastButton.classList.add("hide"); + + if (headerSearchButton) { + headerSearchButton.classList.add("hide"); + } + + if (headerSettingsButton) { + headerSettingsButton.classList.add("hide"); + } } - function updateHeaderUserButton(src) { - src ? (headerUserButton.classList.add("headerUserButtonRound"), headerUserButton.innerHTML = '') : (headerUserButton.classList.remove("headerUserButtonRound"), headerUserButton.innerHTML = '') + requiresUserRefresh = false; + } + + function updateHeaderUserButton(src) { + if (src) { + headerUserButton.classList.add("headerUserButtonRound"); + headerUserButton.innerHTML = ''; + } else { + headerUserButton.classList.remove("headerUserButtonRound"); + headerUserButton.innerHTML = ''; + } + } + + function showSearch() { + inputManager.trigger("search"); + } + + function onHeaderUserButtonClick(e__q) { + Dashboard.navigate("mypreferencesmenu.html"); + } + + function onSettingsClick(e__w) { + Dashboard.navigate("dashboard.html"); + } + + function onHeaderHomeButtonClick() { + Dashboard.navigate("home.html"); + } + + function bindMenuEvents() { + if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { + mainDrawerButton.addEventListener("click", toggleMainDrawer); } - function showSearch() { - inputManager.trigger("search") + var headerBackButton = skinHeader.querySelector(".headerBackButton"); + + if (headerBackButton) { + headerBackButton.addEventListener("click", onBackClick); } - function onHeaderUserButtonClick(e) { - Dashboard.navigate("mypreferencesmenu.html") + if (headerSearchButton) { + headerSearchButton.addEventListener("click", showSearch); } - function onSettingsClick(e) { - Dashboard.navigate("dashboard.html") + headerUserButton.addEventListener("click", onHeaderUserButtonClick); + headerHomeButton.addEventListener("click", onHeaderHomeButtonClick); + initHeadRoom(skinHeader); + headerCastButton.addEventListener("click", onCastButtonClicked); + + if (headerSettingsButton) { + headerSettingsButton.addEventListener("click", onSettingsClick); + } + } + + function onCastButtonClicked() { + var btn = this; + + require(["playerSelectionMenu"], function (playerSelectionMenu) { + playerSelectionMenu.show(btn); + }); + } + + function getItemHref(item, context) { + return appRouter.getRouteUrl(item, { + context: context + }); + } + + function toggleMainDrawer() { + if (navDrawerInstance.isVisible) { + closeMainDrawer(); + } else { + openMainDrawer(); + } + } + + function openMainDrawer() { + navDrawerInstance.open(); + lastOpenTime = new Date().getTime(); + } + + function onMainDrawerOpened() { + if (layoutManager.mobile) { + document.body.classList.add("bodyWithPopupOpen"); + } + } + + function closeMainDrawer() { + navDrawerInstance.close(); + } + + function onMainDrawerSelect(e__e) { + if (navDrawerInstance.isVisible) { + onMainDrawerOpened(); + } else { + document.body.classList.remove("bodyWithPopupOpen"); + } + } + + function refreshLibraryInfoInDrawer(user, drawer) { + var html = ""; + html += '
'; + html += '' + globalize.translate("ButtonHome") + ""; + html += '
'; + html += '

'; + html += globalize.translate("sharedcomponents#HeaderMyDownloads"); + html += "

"; + html += '' + globalize.translate("sharedcomponents#Browse") + ""; + html += '' + globalize.translate("sharedcomponents#Manage") + ""; + html += "
"; + html += '
'; + html += "
"; + var localUser = user.localUser; + + if (localUser && localUser.Policy.IsAdministrator) { + html += '
'; + html += '

'; + html += globalize.translate("HeaderAdmin"); + html += "

"; + html += '' + globalize.translate("ButtonManageServer") + ""; + html += '' + globalize.translate("MetadataManager") + ""; + html += "
"; } - function onHeaderHomeButtonClick() { - Dashboard.navigate("home.html") + html += '
'; + + if (user.localUser) { + html += '' + globalize.translate("ButtonSettings") + ""; } - function bindMenuEvents() { - (mainDrawerButton = document.querySelector(".mainDrawerButton")) && mainDrawerButton.addEventListener("click", toggleMainDrawer); - var headerBackButton = skinHeader.querySelector(".headerBackButton"); - headerBackButton && headerBackButton.addEventListener("click", onBackClick), headerSearchButton && headerSearchButton.addEventListener("click", showSearch), headerUserButton.addEventListener("click", onHeaderUserButtonClick), headerHomeButton.addEventListener("click", onHeaderHomeButtonClick), initHeadRoom(skinHeader), headerCastButton.addEventListener("click", onCastButtonClicked), headerSettingsButton && headerSettingsButton.addEventListener("click", onSettingsClick) + html += '' + globalize.translate("sharedcomponents#Sync") + ""; + + if (AppInfo.isNativeApp) { + html += '' + globalize.translate("ButtonSelectServer") + ""; } - function onCastButtonClicked() { - var btn = this; - require(["playerSelectionMenu"], function(playerSelectionMenu) { - playerSelectionMenu.show(btn) - }) + if (!(!user.localUser || user.localUser.EnableAutoLogin)) { + html += '' + globalize.translate("ButtonSignOut") + ""; } - function getItemHref(item, context) { - return appRouter.getRouteUrl(item, { - context: context - }) + html += "
"; + navDrawerScrollContainer.innerHTML = html; + var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); + + if (btnLogout) { + btnLogout.addEventListener("click", onLogoutClick); + } + } + + function refreshDashboardInfoInDrawer(apiClient) { + currentDrawerType = "admin"; + loadNavDrawer(); + + if (navDrawerScrollContainer.querySelector(".adminDrawerLogo")) { + updateDashboardMenuSelectedItem(); + } else { + createDashboardMenu(apiClient); + } + } + + function isUrlInCurrentView(url) { + return -1 !== window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()); + } + + function updateDashboardMenuSelectedItem() { + var links = navDrawerScrollContainer.querySelectorAll(".navMenuOption"); + var currentViewId = viewManager.currentView().id; + + for (var i__r = 0, length = links.length; i__r < length; i__r++) { + var link = links[i__r]; + var selected = false; + var pageIds = link.getAttribute("data-pageids"); + + if (pageIds) { + pageIds = pageIds.split("|"); + selected = -1 != pageIds.indexOf(currentViewId); + } + + var pageUrls = link.getAttribute("data-pageurls"); + + if (pageUrls && (pageUrls = pageUrls.split("|"), selected = pageUrls.filter(isUrlInCurrentView).length > 0), selected) { + link.classList.add("navMenuOption-selected"); + var title = ""; + link = link.querySelector("span") || link; + title += (link.innerText || link.textContent).trim(); + LibraryMenu.setTitle(title); + } else { + link.classList.remove("navMenuOption-selected"); + } + } + } + + function createToolsMenuList(pluginItems) { + var links = [{ + name: globalize.translate("TabServer") + }, { + name: globalize.translate("TabDashboard"), + href: "dashboard.html", + pageIds: ["dashboardPage", "serverActivityPage"], + icon: "dashboard" + }, { + name: globalize.translate("TabSettings"), + href: "dashboardgeneral.html", + pageIds: ["dashboardGeneralPage"], + icon: "settings" + }, { + name: globalize.translate("TabUsers"), + href: "userprofiles.html", + pageIds: ["userProfilesPage", "newUserPage", "editUserPage", "userLibraryAccessPage", "userParentalControlPage", "userPasswordPage"], + icon: "people" + }, { + name: globalize.translate("TabLibrary"), + href: "library.html", + pageIds: ["mediaLibraryPage", "librarySettingsPage", "libraryDisplayPage", "metadataImagesConfigurationPage", "metadataNfoPage"], + icon: "folder", + color: "#38c" + }, { + name: globalize.translate("TabPlayback"), + icon: "play_circle_filled", + color: "#E5342E", + href: "playbackconfiguration.html", + pageIds: ["playbackConfigurationPage", "streamingSettingsPage"] + }, { + name: globalize.translate("TabTranscoding"), + icon: "transform", + href: "encodingsettings.html", + pageIds: ["encodingSettingsPage"] + }]; + addPluginPagesToMainMenu(links, pluginItems, "server"); + links.push({ + divider: true, + name: globalize.translate("TabDevices") + }); + links.push({ + name: globalize.translate("TabDevices"), + href: "devices/devices.html", + pageIds: ["devicesPage", "devicePage"], + icon: "tablet" + }); + links.push({ + name: globalize.translate("HeaderDownloadSync"), + icon: "file_download", + href: "syncactivity.html", + pageIds: ["syncActivityPage", "syncJobPage", "syncSettingsPage"], + color: "#009688" + }); + links.push({ + name: globalize.translate("TabCameraUpload"), + href: "devicesupload.html", + pageIds: ["devicesUploadPage"], + icon: "photo_camera" + }); + links.push({ + name: globalize.translate("DLNA"), + href: "dlnasettings.html", + pageIds: ["dlnaSettingsPage", "dlnaProfilesPage", "dlnaProfilePage"], + icon: "" + }); + links.push({ + divider: true, + name: globalize.translate("TabLiveTV") + }); + links.push({ + name: globalize.translate("TabLiveTV"), + href: "livetvstatus.html", + pageIds: ["liveTvStatusPage", "liveTvTunerPage"], + icon: "" + }); + links.push({ + name: globalize.translate("DVR"), + href: "livetvsettings.html", + pageIds: ["liveTvSettingsPage"], + icon: "dvr" + }); + links.push({ + divider: true, + name: globalize.translate("TabExpert") + }); + links.push({ + name: globalize.translate("TabAdvanced"), + icon: "settings", + href: "dashboardhosting.html", + color: "#F16834", + pageIds: ["dashboardHostingPage", "serverSecurityPage"] + }); + links.push({ + name: globalize.translate("TabLogs"), + href: "log.html", + pageIds: ["logPage"], + icon: "folder_open" + }); + links.push({ + name: globalize.translate("TabNotifications"), + icon: "notifications", + color: "brown", + href: "notificationsettings.html", + pageIds: ["notificationSettingsPage", "notificationSettingPage"] + }); + links.push({ + name: globalize.translate("TabPlugins"), + icon: "add_shopping_cart", + color: "#9D22B1", + href: "plugins.html", + pageIds: ["pluginsPage", "pluginCatalogPage"] + }); + links.push({ + name: globalize.translate("TabScheduledTasks"), + href: "scheduledtasks.html", + pageIds: ["scheduledTasksPage", "scheduledTaskPage"], + icon: "schedule" + }); + links.push({ + name: globalize.translate("MetadataManager"), + href: "edititemmetadata.html", + pageIds: [], + icon: "mode_edit" + }); + addPluginPagesToMainMenu(links, pluginItems); + return links; + } + + function addPluginPagesToMainMenu(links, pluginItems, section) { + for (var i__t = 0, length = pluginItems.length; i__t < length; i__t++) { + var pluginItem = pluginItems[i__t]; + + if (Dashboard.allowPluginPages(pluginItem.PluginId)) { + if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) { + links.push({ + name: pluginItem.DisplayName, + icon: pluginItem.MenuIcon || "folder", + href: Dashboard.getConfigurationPageUrl(pluginItem.Name), + pageUrls: [Dashboard.getConfigurationPageUrl(pluginItem.Name)] + }); + } + } + } + } + + function getToolsMenuLinks(apiClient) { + return apiClient.getJSON(apiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration&EnableInMainMenu=true").then(createToolsMenuList, function (err) { + return createToolsMenuList([]); + }); + } + + function getToolsLinkHtml(item) { + var menuHtml = ""; + var pageIds = item.pageIds ? item.pageIds.join("|") : ""; + pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ""; + var pageUrls = item.pageUrls ? item.pageUrls.join("|") : ""; + pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ""; + menuHtml += '"; + + if (item.icon) { + menuHtml += '' + item.icon + ""; } - function toggleMainDrawer() { - navDrawerInstance.isVisible ? closeMainDrawer() : openMainDrawer() + menuHtml += ''; + menuHtml += item.name; + menuHtml += ""; + return menuHtml += ""; + } + + function getToolsMenuHtml(apiClient) { + return getToolsMenuLinks(apiClient).then(function (items) { + var i__y; + var length; + var item; + var menuHtml = ""; + + for (menuHtml += '
', i__y = 0, length = items.length; i__y < length; i__y++) { + item = items[i__y]; + + if (item.href) { + menuHtml += getToolsLinkHtml(item); + } else { + if (item.name) { + menuHtml += '

'; + menuHtml += item.name; + menuHtml += "

"; + } + } + } + + return menuHtml += "
"; + }); + } + + function createDashboardMenu(apiClient) { + return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { + var html = ""; + html += '"; + html += toolsMenuHtml; + navDrawerScrollContainer.innerHTML = html; + updateDashboardMenuSelectedItem(); + }); + } + + function onSidebarLinkClick() { + var section = this.getElementsByClassName("sectionName")[0]; + var text = section ? section.innerHTML : this.innerHTML; + LibraryMenu.setTitle(text); + } + + function getUserViews(apiClient, userId) { + return apiClient.getUserViews({}, userId).then(function (result) { + var items = result.Items; + var list = []; + + for (var i__u = 0, length = items.length; i__u < length; i__u++) { + var view = items[i__u]; + + if (list.push(view), "livetv" == view.CollectionType) { + view.ImageTags = {}; + view.icon = "live_tv"; + var guideView = Object.assign({}, view); + guideView.Name = globalize.translate("ButtonGuide"); + guideView.ImageTags = {}; + guideView.icon = "dvr"; + guideView.url = "livetv.html?tab=1"; + list.push(guideView); + } + } + + return list; + }); + } + + function showBySelector(selector, show) { + var elem = document.querySelector(selector); + + if (elem) { + if (show) { + elem.classList.remove("hide"); + } else { + elem.classList.add("hide"); + } + } + } + + function updateLibraryMenu(user) { + if (!user) { + showBySelector(".libraryMenuDownloads", false); + showBySelector(".lnkSyncToOtherDevices", false); + return void showBySelector(".userMenuOptions", false); } - function openMainDrawer() { - navDrawerInstance.open(), lastOpenTime = (new Date).getTime() + if (user.Policy.EnableContentDownloading) { + showBySelector(".lnkSyncToOtherDevices", true); + } else { + showBySelector(".lnkSyncToOtherDevices", false); } - function onMainDrawerOpened() { - layoutManager.mobile && document.body.classList.add("bodyWithPopupOpen") + if (user.Policy.EnableContentDownloading && appHost.supports("sync")) { + showBySelector(".libraryMenuDownloads", true); + } else { + showBySelector(".libraryMenuDownloads", false); } - function closeMainDrawer() { - navDrawerInstance.close() - } + var userId = Dashboard.getCurrentUserId(); + var apiClient = getCurrentApiClient(); + var libraryMenuOptions = document.querySelector(".libraryMenuOptions"); - function onMainDrawerSelect(e) { - navDrawerInstance.isVisible ? onMainDrawerOpened() : document.body.classList.remove("bodyWithPopupOpen") - } - - function refreshLibraryInfoInDrawer(user, drawer) { + if (libraryMenuOptions) { + getUserViews(apiClient, userId).then(function (result) { + var items = result; var html = ""; - html += '
', html += '' + globalize.translate("ButtonHome") + "", html += '
', html += '

', html += globalize.translate("sharedcomponents#HeaderMyDownloads"), html += "

", html += '' + globalize.translate("sharedcomponents#Browse") + "", html += '' + globalize.translate("sharedcomponents#Manage") + "", html += "
", html += '
', html += "
"; - var localUser = user.localUser; - localUser && localUser.Policy.IsAdministrator && (html += '
', html += '

', html += globalize.translate("HeaderAdmin"), html += "

", html += '' + globalize.translate("ButtonManageServer") + "", html += '' + globalize.translate("MetadataManager") + "", html += "
"), html += '
', user.localUser && (html += '' + globalize.translate("ButtonSettings") + ""), html += '' + globalize.translate("sharedcomponents#Sync") + "", AppInfo.isNativeApp && (html += '' + globalize.translate("ButtonSelectServer") + ""), /* TODO cvium user is always localUser I think */!user.localUser || user.localUser.EnableAutoLogin || (html += '' + globalize.translate("ButtonSignOut") + ""), html += "
", navDrawerScrollContainer.innerHTML = html; - var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); - btnLogout && btnLogout.addEventListener("click", onLogoutClick) - } + html += '

'; + html += globalize.translate("HeaderMedia"); + html += "

"; + html += items.map(function (i__o) { + var icon = "folder"; + var itemId = i__o.Id; - function refreshDashboardInfoInDrawer(apiClient) { - currentDrawerType = "admin", loadNavDrawer(), navDrawerScrollContainer.querySelector(".adminDrawerLogo") ? updateDashboardMenuSelectedItem() : createDashboardMenu(apiClient) - } - - function isUrlInCurrentView(url) { - return -1 !== window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()) - } - - function updateDashboardMenuSelectedItem() { - for (var links = navDrawerScrollContainer.querySelectorAll(".navMenuOption"), currentViewId = viewManager.currentView().id, i = 0, length = links.length; i < length; i++) { - var link = links[i], - selected = !1, - pageIds = link.getAttribute("data-pageids"); - pageIds && (pageIds = pageIds.split("|"), selected = -1 != pageIds.indexOf(currentViewId)); - var pageUrls = link.getAttribute("data-pageurls"); - if (pageUrls && (pageUrls = pageUrls.split("|"), selected = pageUrls.filter(isUrlInCurrentView).length > 0), selected) { - link.classList.add("navMenuOption-selected"); - var title = ""; - link = link.querySelector("span") || link; - title += (link.innerText || link.textContent).trim(), LibraryMenu.setTitle(title) - } else link.classList.remove("navMenuOption-selected") - } - } - - function createToolsMenuList(pluginItems) { - var links = [{ - name: globalize.translate("TabServer") - }, { - name: globalize.translate("TabDashboard"), - href: "dashboard.html", - pageIds: ["dashboardPage", "serverActivityPage"], - icon: "dashboard" - }, { - name: globalize.translate("TabSettings"), - href: "dashboardgeneral.html", - pageIds: ["dashboardGeneralPage"], - icon: "settings" - }, { - name: globalize.translate("TabUsers"), - href: "userprofiles.html", - pageIds: ["userProfilesPage", "newUserPage", "editUserPage", "userLibraryAccessPage", "userParentalControlPage", "userPasswordPage"], - icon: "people" - }, { - name: globalize.translate("TabLibrary"), - href: "library.html", - pageIds: ["mediaLibraryPage", "librarySettingsPage", "libraryDisplayPage", "metadataImagesConfigurationPage", "metadataNfoPage"], - icon: "folder", - color: "#38c" - }, { - name: globalize.translate("TabPlayback"), - icon: "play_circle_filled", - color: "#E5342E", - href: "playbackconfiguration.html", - pageIds: ["playbackConfigurationPage", "streamingSettingsPage"] - }, { - name: globalize.translate("TabTranscoding"), - icon: "transform", - href: "encodingsettings.html", - pageIds: ["encodingSettingsPage"] - }]; - return addPluginPagesToMainMenu(links, pluginItems, "server"), links.push({ - divider: !0, - name: globalize.translate("TabDevices") - }), links.push({ - name: globalize.translate("TabDevices"), - href: "devices/devices.html", - pageIds: ["devicesPage", "devicePage"], - icon: "tablet" - }), links.push({ - name: globalize.translate("HeaderDownloadSync"), - icon: "file_download", - href: "syncactivity.html", - pageIds: ["syncActivityPage", "syncJobPage", "syncSettingsPage"], - color: "#009688" - }), links.push({ - name: globalize.translate("TabCameraUpload"), - href: "devicesupload.html", - pageIds: ["devicesUploadPage"], - icon: "photo_camera" - }), links.push({ - name: globalize.translate("DLNA"), - href: "dlnasettings.html", - pageIds: ["dlnaSettingsPage", "dlnaProfilesPage", "dlnaProfilePage"], - icon: "" - }), links.push({ - divider: !0, - name: globalize.translate("TabLiveTV") - }), links.push({ - name: globalize.translate("TabLiveTV"), - href: "livetvstatus.html", - pageIds: ["liveTvStatusPage", "liveTvTunerPage"], - icon: "" - }), links.push({ - name: globalize.translate("DVR"), - href: "livetvsettings.html", - pageIds: ["liveTvSettingsPage"], - icon: "dvr" - }), links.push({ - divider: !0, - name: globalize.translate("TabExpert") - }), links.push({ - name: globalize.translate("TabAdvanced"), - icon: "settings", - href: "dashboardhosting.html", - color: "#F16834", - pageIds: ["dashboardHostingPage", "serverSecurityPage"] - }), links.push({ - name: globalize.translate("TabLogs"), - href: "log.html", - pageIds: ["logPage"], - icon: "folder_open" - }), links.push({ - name: globalize.translate("TabNotifications"), - icon: "notifications", - color: "brown", - href: "notificationsettings.html", - pageIds: ["notificationSettingsPage", "notificationSettingPage"] - }), links.push({ - name: globalize.translate("TabPlugins"), - icon: "add_shopping_cart", - color: "#9D22B1", - href: "plugins.html", - pageIds: ["pluginsPage", "pluginCatalogPage"] - }), links.push({ - name: globalize.translate("TabScheduledTasks"), - href: "scheduledtasks.html", - pageIds: ["scheduledTasksPage", "scheduledTaskPage"], - icon: "schedule" - }), links.push({ - name: globalize.translate("MetadataManager"), - href: "edititemmetadata.html", - pageIds: [], - icon: "mode_edit" - }), addPluginPagesToMainMenu(links, pluginItems), links - } - - function addPluginPagesToMainMenu(links, pluginItems, section) { - for (var i = 0, length = pluginItems.length; i < length; i++) { - var pluginItem = pluginItems[i]; - Dashboard.allowPluginPages(pluginItem.PluginId) && (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section && links.push({ - name: pluginItem.DisplayName, - icon: pluginItem.MenuIcon || "folder", - href: Dashboard.getConfigurationPageUrl(pluginItem.Name), - pageUrls: [Dashboard.getConfigurationPageUrl(pluginItem.Name)] - })) - } - } - - function getToolsMenuLinks(apiClient) { - return apiClient.getJSON(apiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration&EnableInMainMenu=true").then(createToolsMenuList, function(err) { - return createToolsMenuList([]) - }) - } - - function getToolsLinkHtml(item) { - var menuHtml = "", - pageIds = item.pageIds ? item.pageIds.join("|") : ""; - pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ""; - var pageUrls = item.pageUrls ? item.pageUrls.join("|") : ""; - return pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : "", menuHtml += '", item.icon && (menuHtml += '' + item.icon + ""), menuHtml += '', menuHtml += item.name, menuHtml += "", menuHtml += "" - } - - function getToolsMenuHtml(apiClient) { - return getToolsMenuLinks(apiClient).then(function(items) { - var i, length, item, menuHtml = ""; - for (menuHtml += '
', i = 0, length = items.length; i < length; i++) item = items[i], item.href ? menuHtml += getToolsLinkHtml(item) : item.name && (menuHtml += '

', menuHtml += item.name, menuHtml += "

"); - return menuHtml += "
" - }) - } - - function createDashboardMenu(apiClient) { - return getToolsMenuHtml(apiClient).then(function(toolsMenuHtml) { - var html = ""; - html += '", html += toolsMenuHtml, navDrawerScrollContainer.innerHTML = html, updateDashboardMenuSelectedItem() - }) - } - - function onSidebarLinkClick() { - var section = this.getElementsByClassName("sectionName")[0], - text = section ? section.innerHTML : this.innerHTML; - LibraryMenu.setTitle(text) - } - - function getUserViews(apiClient, userId) { - return apiClient.getUserViews({}, userId).then(function(result) { - for (var items = result.Items, list = [], i = 0, length = items.length; i < length; i++) { - var view = items[i]; - if (list.push(view), "livetv" == view.CollectionType) { - view.ImageTags = {}, view.icon = "live_tv"; - var guideView = Object.assign({}, view); - guideView.Name = globalize.translate("ButtonGuide"), guideView.ImageTags = {}, guideView.icon = "dvr", guideView.url = "livetv.html?tab=1", list.push(guideView) - } + if ("channels" == i__o.CollectionType) { + itemId = "channels"; + } else { + if ("livetv" == i__o.CollectionType) { + itemId = "livetv"; } - return list - }) - } + } - function showBySelector(selector, show) { - var elem = document.querySelector(selector); - elem && (show ? elem.classList.remove("hide") : elem.classList.add("hide")) - } + if ("photos" == i__o.CollectionType) { + icon = "photo_library"; + } else { + if ("music" == i__o.CollectionType || "musicvideos" == i__o.CollectionType) { + icon = "library_music"; + } else { + if ("books" == i__o.CollectionType) { + icon = "library_books"; + } else { + if ("playlists" == i__o.CollectionType) { + icon = "view_list"; + } else { + if ("games" == i__o.CollectionType) { + icon = "games"; + } else { + if ("movies" == i__o.CollectionType) { + icon = "video_library"; + } else { + if ("channels" == i__o.CollectionType || "Channel" == i__o.Type) { + icon = "videocam"; + } else { + if ("tvshows" == i__o.CollectionType) { + icon = "tv"; + } else { + if ("livetv" == i__o.CollectionType) { + icon = "live_tv"; + } + } + } + } + } + } + } + } + } - function updateLibraryMenu(user) { - if (!user) return showBySelector(".libraryMenuDownloads", !1), showBySelector(".lnkSyncToOtherDevices", !1), void showBySelector(".userMenuOptions", !1); - user.Policy.EnableContentDownloading ? showBySelector(".lnkSyncToOtherDevices", !0) : showBySelector(".lnkSyncToOtherDevices", !1), user.Policy.EnableContentDownloading && appHost.supports("sync") ? showBySelector(".libraryMenuDownloads", !0) : showBySelector(".libraryMenuDownloads", !1); - var userId = Dashboard.getCurrentUserId(), - apiClient = getCurrentApiClient(), - libraryMenuOptions = document.querySelector(".libraryMenuOptions"); - libraryMenuOptions && getUserViews(apiClient, userId).then(function(result) { - var items = result, - html = ""; - html += '

', html += globalize.translate("HeaderMedia"), html += "

", html += items.map(function(i) { - var icon = "folder", - itemId = i.Id; - "channels" == i.CollectionType ? itemId = "channels" : "livetv" == i.CollectionType && (itemId = "livetv"), "photos" == i.CollectionType ? icon = "photo_library" : "music" == i.CollectionType || "musicvideos" == i.CollectionType ? icon = "library_music" : "books" == i.CollectionType ? icon = "library_books" : "playlists" == i.CollectionType ? icon = "view_list" : "games" == i.CollectionType ? icon = "games" : "movies" == i.CollectionType ? icon = "video_library" : "channels" == i.CollectionType || "Channel" == i.Type ? icon = "videocam" : "tvshows" == i.CollectionType ? icon = "tv" : "livetv" == i.CollectionType && (icon = "live_tv"), icon = i.icon || icon; - i.onclick && i.onclick; - return '' + icon + '' + i.Name + "" - }).join(""), libraryMenuOptions.innerHTML = html; - for (var elem = libraryMenuOptions, sidebarLinks = elem.querySelectorAll(".navMenuOption"), i = 0, length = sidebarLinks.length; i < length; i++) sidebarLinks[i].removeEventListener("click", onSidebarLinkClick), sidebarLinks[i].addEventListener("click", onSidebarLinkClick) - }) - } + icon = i__o.icon || icon; - function getTopParentId() { - return getParameterByName("topParentId") || null - } + if (i__o.onclick) { + i__o.onclick; + } - function onMainDrawerClick(e) { - dom.parentWithTag(e.target, "A") && setTimeout(closeMainDrawer, 30) - } + return '' + icon + '' + i__o.Name + ""; + }).join(""); + libraryMenuOptions.innerHTML = html; + var elem = libraryMenuOptions; + var sidebarLinks = elem.querySelectorAll(".navMenuOption"); - function onLogoutClick() { - Dashboard.logout() - } - - function updateCastIcon() { - var context = document, - info = playbackManager.getPlayerInfo(), - icon = headerCastButton.querySelector("i"); - info && !info.isLocalPlayer ? (icon.innerHTML = "", headerCastButton.classList.add("castButton-active"), context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name) : (icon.innerHTML = "", headerCastButton.classList.remove("castButton-active"), context.querySelector(".headerSelectedPlayer").innerHTML = "") - } - - function updateLibraryNavLinks(page) { - var i, length, isLiveTvPage = page.classList.contains("liveTvPage"), - isChannelsPage = page.classList.contains("channelsPage"), - isEditorPage = page.classList.contains("metadataEditorPage"), - isMySyncPage = page.classList.contains("mySyncPage"), - id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || "", - elems = document.getElementsByClassName("lnkMediaFolder"); - for (i = 0, length = elems.length; i < length; i++) { - var lnkMediaFolder = elems[i], - itemId = lnkMediaFolder.getAttribute("data-itemid"); - isChannelsPage && "channels" == itemId ? lnkMediaFolder.classList.add("navMenuOption-selected") : isLiveTvPage && "livetv" == itemId ? lnkMediaFolder.classList.add("navMenuOption-selected") : isEditorPage && "editor" == itemId ? lnkMediaFolder.classList.add("navMenuOption-selected") : isMySyncPage && "manageoffline" == itemId && -1 != window.location.href.toString().indexOf("mode=download") ? lnkMediaFolder.classList.add("navMenuOption-selected") : isMySyncPage && "syncotherdevices" == itemId && -1 == window.location.href.toString().indexOf("mode=download") ? lnkMediaFolder.classList.add("navMenuOption-selected") : id && itemId == id ? lnkMediaFolder.classList.add("navMenuOption-selected") : lnkMediaFolder.classList.remove("navMenuOption-selected") + for (var i__i = 0, length = sidebarLinks.length; i__i < length; i__i++) { + sidebarLinks[i__i].removeEventListener("click", onSidebarLinkClick); + sidebarLinks[i__i].addEventListener("click", onSidebarLinkClick); } + }); } + } - function updateMenuForPageType(isDashboardPage, isLibraryPage) { - var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; - if (currentPageType !== newPageType) { - currentPageType = newPageType, isDashboardPage && !layoutManager.mobile ? skinHeader.classList.add("headroomDisabled") : skinHeader.classList.remove("headroomDisabled"); - var bodyClassList = document.body.classList; - isLibraryPage ? (bodyClassList.add("libraryDocument"), bodyClassList.remove("dashboardDocument"), bodyClassList.remove("hideMainDrawer"), navDrawerInstance && navDrawerInstance.setEdgeSwipeEnabled(!0)) : isDashboardPage ? (bodyClassList.remove("libraryDocument"), bodyClassList.add("dashboardDocument"), bodyClassList.remove("hideMainDrawer"), navDrawerInstance && navDrawerInstance.setEdgeSwipeEnabled(!0)) : (bodyClassList.remove("libraryDocument"), bodyClassList.remove("dashboardDocument"), bodyClassList.add("hideMainDrawer"), navDrawerInstance && navDrawerInstance.setEdgeSwipeEnabled(!1)) + function getTopParentId() { + return getParameterByName("topParentId") || null; + } + + function onMainDrawerClick(e__p) { + if (dom.parentWithTag(e__p.target, "A")) { + setTimeout(closeMainDrawer, 30); + } + } + + function onLogoutClick() { + Dashboard.logout(); + } + + function updateCastIcon() { + var context = document; + var info = playbackManager.getPlayerInfo(); + var icon = headerCastButton.querySelector("i"); + + if (info && !info.isLocalPlayer) { + icon.innerHTML = ""; + headerCastButton.classList.add("castButton-active"); + context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name; + } else { + icon.innerHTML = ""; + headerCastButton.classList.remove("castButton-active"); + context.querySelector(".headerSelectedPlayer").innerHTML = ""; + } + } + + function updateLibraryNavLinks(page) { + var i__a; + var length; + var isLiveTvPage = page.classList.contains("liveTvPage"); + var isChannelsPage = page.classList.contains("channelsPage"); + var isEditorPage = page.classList.contains("metadataEditorPage"); + var isMySyncPage = page.classList.contains("mySyncPage"); + var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || ""; + var elems = document.getElementsByClassName("lnkMediaFolder"); + + for (i__a = 0, length = elems.length; i__a < length; i__a++) { + var lnkMediaFolder = elems[i__a]; + var itemId = lnkMediaFolder.getAttribute("data-itemid"); + + if (isChannelsPage && "channels" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + if (isLiveTvPage && "livetv" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + if (isEditorPage && "editor" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + if (isMySyncPage && "manageoffline" == itemId && -1 != window.location.href.toString().indexOf("mode=download")) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + if (isMySyncPage && "syncotherdevices" == itemId && -1 == window.location.href.toString().indexOf("mode=download")) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + if (id && itemId == id) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } else { + lnkMediaFolder.classList.remove("navMenuOption-selected"); + } + } + } + } } - requiresUserRefresh && connectionManager.user(getCurrentApiClient()).then(updateUserInHeader) + } } + } - function updateTitle(page) { - var title = page.getAttribute("data-title"); - title ? LibraryMenu.setTitle(title) : page.classList.contains("standalonePage") && LibraryMenu.setDefaultTitle() - } + function updateMenuForPageType(isDashboardPage, isLibraryPage) { + var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; - function updateBackButton(page) { - headerBackButton || (headerBackButton = document.querySelector(".headerBackButton")), headerBackButton && ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack() ? headerBackButton.classList.remove("hide") : headerBackButton.classList.add("hide")) - } + if (currentPageType !== newPageType) { + currentPageType = newPageType; - function initHeadRoom(elem) { - require(["headroom-window"], function(headroom) { - headroom.add(elem) - }) - } + if (isDashboardPage && !layoutManager.mobile) { + skinHeader.classList.add("headroomDisabled"); + } else { + skinHeader.classList.remove("headroomDisabled"); + } - function refreshLibraryDrawer(user) { - loadNavDrawer(), currentDrawerType = "library", (user ? Promise.resolve(user) : connectionManager.user(getCurrentApiClient())).then(function(user) { - refreshLibraryInfoInDrawer(user), updateLibraryMenu(user.localUser) - }) - } + var bodyClassList = document.body.classList; - function getNavDrawerOptions() { - var drawerWidth = screen.availWidth - 50; - return drawerWidth = Math.max(drawerWidth, 240), drawerWidth = Math.min(drawerWidth, 320), { - target: navDrawerElement, - onChange: onMainDrawerSelect, - width: drawerWidth + if (isLibraryPage) { + bodyClassList.add("libraryDocument"); + bodyClassList.remove("dashboardDocument"); + bodyClassList.remove("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(true); } + } else { + if (isDashboardPage) { + bodyClassList.remove("libraryDocument"); + bodyClassList.add("dashboardDocument"); + bodyClassList.remove("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(true); + } + } else { + bodyClassList.remove("libraryDocument"); + bodyClassList.remove("dashboardDocument"); + bodyClassList.add("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(false); + } + } + } } - function loadNavDrawer() { - return navDrawerInstance ? Promise.resolve(navDrawerInstance) : (navDrawerElement = document.querySelector(".mainDrawer"), navDrawerScrollContainer = navDrawerElement.querySelector(".scrollContainer"), navDrawerScrollContainer.addEventListener("click", onMainDrawerClick), new Promise(function(resolve, reject) { - require(["navdrawer"], function(navdrawer) { - navDrawerInstance = new navdrawer(getNavDrawerOptions()), navDrawerElement.classList.remove("hide"), resolve(navDrawerInstance) - }) - })) + if (requiresUserRefresh) { + connectionManager.user(getCurrentApiClient()).then(updateUserInHeader); } - var navDrawerElement, navDrawerScrollContainer, navDrawerInstance, mainDrawerButton, headerHomeButton, currentDrawerType, pageTitleElement, headerBackButton, headerUserButton, currentUser, headerSettingsButton, headerCastButton, headerSearchButton, enableLibraryNavDrawer = !layoutManager.tv, - skinHeader = document.querySelector(".skinHeader"), - requiresUserRefresh = !0, - lastOpenTime = (new Date).getTime(); - window.LibraryMenu = { - getTopParentId: getTopParentId, - onHardwareMenuButtonClick: function() { - toggleMainDrawer() - }, - setTabs: function(type, selectedIndex, builder) { - require(["mainTabsManager"], function(mainTabsManager) { - type ? mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function() { - return [] - }) : mainTabsManager.setTabs(null) - }) - }, - setDefaultTitle: function() { - pageTitleElement || (pageTitleElement = document.querySelector(".pageTitle")), pageTitleElement && (pageTitleElement.classList.add("pageTitleWithLogo"), pageTitleElement.classList.add("pageTitleWithDefaultLogo"), pageTitleElement.style.backgroundImage = null, pageTitleElement.innerHTML = ""), document.title = "Jellyfin" - }, - setTitle: function(title) { - if (null == title) return void LibraryMenu.setDefaultTitle(); - "-" === title && (title = ""); - var html = title; - pageTitleElement || (pageTitleElement = document.querySelector(".pageTitle")), pageTitleElement && (pageTitleElement.classList.remove("pageTitleWithLogo"), pageTitleElement.classList.remove("pageTitleWithDefaultLogo"), pageTitleElement.style.backgroundImage = null, pageTitleElement.innerHTML = html || ""), document.title = title || "Jellyfin" - }, - setTransparentMenu: function(transparent) { - transparent ? skinHeader.classList.add("semiTransparent") : skinHeader.classList.remove("semiTransparent") - } + } + + function updateTitle(page) { + var title = page.getAttribute("data-title"); + + if (title) { + LibraryMenu.setTitle(title); + } else { + if (page.classList.contains("standalonePage")) { + LibraryMenu.setDefaultTitle(); + } + } + } + + function updateBackButton(page) { + if (!headerBackButton) { + headerBackButton = document.querySelector(".headerBackButton"); + } + + if (headerBackButton) { + if ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack()) { + headerBackButton.classList.remove("hide"); + } else { + headerBackButton.classList.add("hide"); + } + } + } + + function initHeadRoom(elem) { + require(["headroom-window"], function (headroom) { + headroom.add(elem); + }); + } + + function refreshLibraryDrawer(user) { + loadNavDrawer(); + currentDrawerType = "library"; + (user ? Promise.resolve(user) : connectionManager.user(getCurrentApiClient())).then(function (user) { + refreshLibraryInfoInDrawer(user); + updateLibraryMenu(user.localUser); + }); + } + + function getNavDrawerOptions() { + var drawerWidth = screen.availWidth - 50; + drawerWidth = Math.max(drawerWidth, 240); + drawerWidth = Math.min(drawerWidth, 320); + return { + target: navDrawerElement, + onChange: onMainDrawerSelect, + width: drawerWidth }; - var currentPageType; - return pageClassOn("pagebeforeshow", "page", function(e) { - this.classList.contains("withTabs") || LibraryMenu.setTabs(null) - }), pageClassOn("pageshow", "page", function(e) { - var page = this, - isDashboardPage = page.classList.contains("type-interior"), - isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"), - apiClient = getCurrentApiClient(); - isDashboardPage ? (mainDrawerButton && mainDrawerButton.classList.remove("hide"), refreshDashboardInfoInDrawer(apiClient)) : (mainDrawerButton && (enableLibraryNavDrawer ? mainDrawerButton.classList.remove("hide") : mainDrawerButton.classList.add("hide")), "library" !== currentDrawerType && refreshLibraryDrawer()), updateMenuForPageType(isDashboardPage, isLibraryPage), e.detail.isRestored || window.scrollTo(0, 0), updateTitle(page), updateBackButton(page), updateLibraryNavLinks(page) - }), - function() { - var html = ""; - html += '
', html += '
', html += '", html += '', html += '', html += '

', html += "
", html += '
', html += '', html += '', html += '', html += '', layoutManager.mobile || (html += ''), html += "
", html += "
", html += '
', html += "
", skinHeader.classList.add("skinHeader-withBackground"), skinHeader.innerHTML = html, headerHomeButton = skinHeader.querySelector(".headerHomeButton"), headerUserButton = skinHeader.querySelector(".headerUserButton"), headerSettingsButton = skinHeader.querySelector(".headerSettingsButton"), headerCastButton = skinHeader.querySelector(".headerCastButton"), headerSearchButton = skinHeader.querySelector(".headerSearchButton"), browser.chrome || skinHeader.classList.add("skinHeader-blurred"), lazyLoadViewMenuBarImages(), bindMenuEvents() - }(), events.on(connectionManager, "localusersignedin", function(e, user) { - currentDrawerType = null, currentUser = { - localUser: user - }, loadNavDrawer(), connectionManager.user(connectionManager.getApiClient(user.ServerId)).then(function(user) { - currentUser = user, updateUserInHeader(user) - }) - }), events.on(connectionManager, "localusersignedout", function() { - currentUser = {}, updateUserInHeader() - }), events.on(playbackManager, "playerchange", updateCastIcon), loadNavDrawer(), LibraryMenu + } + + function loadNavDrawer() { + if (navDrawerInstance) { + return Promise.resolve(navDrawerInstance); + } + + navDrawerElement = document.querySelector(".mainDrawer"); + navDrawerScrollContainer = navDrawerElement.querySelector(".scrollContainer"); + navDrawerScrollContainer.addEventListener("click", onMainDrawerClick); + return new Promise(function (resolve, reject) { + require(["navdrawer"], function (navdrawer) { + navDrawerInstance = new navdrawer(getNavDrawerOptions()); + navDrawerElement.classList.remove("hide"); + resolve(navDrawerInstance); + }); + }); + } + + var navDrawerElement; + var navDrawerScrollContainer; + var navDrawerInstance; + var mainDrawerButton; + var headerHomeButton; + var currentDrawerType; + var pageTitleElement; + var headerBackButton; + var headerUserButton; + var currentUser; + var headerSettingsButton; + var headerCastButton; + var headerSearchButton; + var enableLibraryNavDrawer = !layoutManager.tv; + var skinHeader = document.querySelector(".skinHeader"); + var requiresUserRefresh = true; + var lastOpenTime = new Date().getTime(); + window.LibraryMenu = { + getTopParentId: getTopParentId, + onHardwareMenuButtonClick: function () { + toggleMainDrawer(); + }, + setTabs: function (type, selectedIndex, builder) { + require(["mainTabsManager"], function (mainTabsManager) { + if (type) { + mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { + return []; + }); + } else { + mainTabsManager.setTabs(null); + } + }); + }, + setDefaultTitle: function () { + if (!pageTitleElement) { + pageTitleElement = document.querySelector(".pageTitle"); + } + + if (pageTitleElement) { + pageTitleElement.classList.add("pageTitleWithLogo"); + pageTitleElement.classList.add("pageTitleWithDefaultLogo"); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = ""; + } + + document.title = "Jellyfin"; + }, + setTitle: function (title) { + if (null == title) { + return void LibraryMenu.setDefaultTitle(); + } + + if ("-" === title) { + title = ""; + } + + var html = title; + + if (!pageTitleElement) { + pageTitleElement = document.querySelector(".pageTitle"); + } + + if (pageTitleElement) { + pageTitleElement.classList.remove("pageTitleWithLogo"); + pageTitleElement.classList.remove("pageTitleWithDefaultLogo"); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = html || ""; + } + + document.title = title || "Jellyfin"; + }, + setTransparentMenu: function (transparent) { + if (transparent) { + skinHeader.classList.add("semiTransparent"); + } else { + skinHeader.classList.remove("semiTransparent"); + } + } + }; + var currentPageType; + pageClassOn("pagebeforeshow", "page", function (e__s) { + if (!this.classList.contains("withTabs")) { + LibraryMenu.setTabs(null); + } + }); + pageClassOn("pageshow", "page", function (e__d) { + var page = this; + var isDashboardPage = page.classList.contains("type-interior"); + var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"); + var apiClient = getCurrentApiClient(); + + if (isDashboardPage) { + if (mainDrawerButton) { + mainDrawerButton.classList.remove("hide"); + } + + refreshDashboardInfoInDrawer(apiClient); + } else { + if (mainDrawerButton) { + if (enableLibraryNavDrawer) { + mainDrawerButton.classList.remove("hide"); + } else { + mainDrawerButton.classList.add("hide"); + } + } + + if ("library" !== currentDrawerType) { + refreshLibraryDrawer(); + } + } + + updateMenuForPageType(isDashboardPage, isLibraryPage); + + if (!e__d.detail.isRestored) { + window.scrollTo(0, 0); + } + + updateTitle(page); + updateBackButton(page); + updateLibraryNavLinks(page); + }); + + (function () { + var html = ""; + html += '
'; + html += '
'; + html += '"; + html += ''; + html += ''; + html += '

'; + html += "
"; + html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; + + if (!layoutManager.mobile) { + html += ''; + } + + html += "
"; + html += "
"; + html += '
'; + html += "
"; + skinHeader.classList.add("skinHeader-withBackground"); + skinHeader.innerHTML = html; + headerHomeButton = skinHeader.querySelector(".headerHomeButton"); + headerUserButton = skinHeader.querySelector(".headerUserButton"); + headerSettingsButton = skinHeader.querySelector(".headerSettingsButton"); + headerCastButton = skinHeader.querySelector(".headerCastButton"); + headerSearchButton = skinHeader.querySelector(".headerSearchButton"); + + if (!browser.chrome) { + skinHeader.classList.add("skinHeader-blurred"); + } + + lazyLoadViewMenuBarImages(); + bindMenuEvents(); + })(); + + events.on(connectionManager, "localusersignedin", function (e__f, user) { + currentDrawerType = null; + currentUser = { + localUser: user + }; + loadNavDrawer(); + connectionManager.user(connectionManager.getApiClient(user.ServerId)).then(function (user) { + currentUser = user; + updateUserInHeader(user); + }); + }); + events.on(connectionManager, "localusersignedout", function () { + currentUser = {}; + updateUserInHeader(); + }); + events.on(playbackManager, "playerchange", updateCastIcon); + loadNavDrawer(); + return LibraryMenu; }); From 84dd50e995007eb4821e4bd68ff82f93569e0091 Mon Sep 17 00:00:00 2001 From: Sparky Date: Wed, 16 Jan 2019 10:34:09 -0500 Subject: [PATCH 2/7] Manual cleanup of deuglification Deuglification --- src/scripts/librarymenu.js | 1806 ++++++++++++++++++------------------ 1 file changed, 896 insertions(+), 910 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 13ad690ad3..2103ddc387 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -1,984 +1,970 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "viewManager", "libraryBrowser", "appRouter", "apphost", "playbackManager", "browser", "globalize", "paper-icon-button-light", "material-icons", "scrollStyles", "flexStyles"], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, browser, globalize) { - "use strict"; + "use strict"; - function getCurrentApiClient() { - if (currentUser && currentUser.localUser) { - return connectionManager.getApiClient(currentUser.localUser.ServerId); - } - - return connectionManager.currentApiClient(); - } - - function lazyLoadViewMenuBarImages() { - require(["imageLoader"], function (imageLoader) { - imageLoader.lazyChildren(skinHeader); - }); - } - - function onBackClick() { - appRouter.back(); - } - - function updateUserInHeader(user) { - var hasImage; - - if (user && user.name) { - if (user.imageUrl) { - var url = user.imageUrl; - - if (user.supportsImageParams) { - url += "&height=" + Math.round(26 * Math.max(window.devicePixelRatio || 1, 2)); + function getCurrentApiClient() { + if (currentUser && currentUser.localUser) { + return connectionManager.getApiClient(currentUser.localUser.ServerId); } - updateHeaderUserButton(url); - hasImage = true; - } - - headerUserButton.classList.remove("hide"); - } else { - headerUserButton.classList.add("hide"); + return connectionManager.currentApiClient(); } - if (!hasImage) { - updateHeaderUserButton(null); + function lazyLoadViewMenuBarImages() { + require(["imageLoader"], function (imageLoader) { + imageLoader.lazyChildren(skinHeader); + }); } - if (user && user.localUser) { - if (headerHomeButton) { - headerHomeButton.classList.remove("hide"); - } + function onBackClick() { + appRouter.back(); + } - if (headerSearchButton) { - headerSearchButton.classList.remove("hide"); - } + function updateUserInHeader(user) { + var hasImage; - if (headerSettingsButton) { - if (user.localUser.Policy.IsAdministrator) { - headerSettingsButton.classList.remove("hide"); + if (user && user.name) { + if (user.imageUrl) { + var url = user.imageUrl; + + if (user.supportsImageParams) { + url += "&height=" + Math.round(26 * Math.max(window.devicePixelRatio || 1, 2)); + } + + updateHeaderUserButton(url); + hasImage = true; + } + + headerUserButton.classList.remove("hide"); } else { - headerSettingsButton.classList.add("hide"); + headerUserButton.classList.add("hide"); } - } - headerCastButton.classList.remove("hide"); - } else { - headerHomeButton.classList.add("hide"); - headerCastButton.classList.add("hide"); - - if (headerSearchButton) { - headerSearchButton.classList.add("hide"); - } - - if (headerSettingsButton) { - headerSettingsButton.classList.add("hide"); - } - } - - requiresUserRefresh = false; - } - - function updateHeaderUserButton(src) { - if (src) { - headerUserButton.classList.add("headerUserButtonRound"); - headerUserButton.innerHTML = ''; - } else { - headerUserButton.classList.remove("headerUserButtonRound"); - headerUserButton.innerHTML = ''; - } - } - - function showSearch() { - inputManager.trigger("search"); - } - - function onHeaderUserButtonClick(e__q) { - Dashboard.navigate("mypreferencesmenu.html"); - } - - function onSettingsClick(e__w) { - Dashboard.navigate("dashboard.html"); - } - - function onHeaderHomeButtonClick() { - Dashboard.navigate("home.html"); - } - - function bindMenuEvents() { - if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { - mainDrawerButton.addEventListener("click", toggleMainDrawer); - } - - var headerBackButton = skinHeader.querySelector(".headerBackButton"); - - if (headerBackButton) { - headerBackButton.addEventListener("click", onBackClick); - } - - if (headerSearchButton) { - headerSearchButton.addEventListener("click", showSearch); - } - - headerUserButton.addEventListener("click", onHeaderUserButtonClick); - headerHomeButton.addEventListener("click", onHeaderHomeButtonClick); - initHeadRoom(skinHeader); - headerCastButton.addEventListener("click", onCastButtonClicked); - - if (headerSettingsButton) { - headerSettingsButton.addEventListener("click", onSettingsClick); - } - } - - function onCastButtonClicked() { - var btn = this; - - require(["playerSelectionMenu"], function (playerSelectionMenu) { - playerSelectionMenu.show(btn); - }); - } - - function getItemHref(item, context) { - return appRouter.getRouteUrl(item, { - context: context - }); - } - - function toggleMainDrawer() { - if (navDrawerInstance.isVisible) { - closeMainDrawer(); - } else { - openMainDrawer(); - } - } - - function openMainDrawer() { - navDrawerInstance.open(); - lastOpenTime = new Date().getTime(); - } - - function onMainDrawerOpened() { - if (layoutManager.mobile) { - document.body.classList.add("bodyWithPopupOpen"); - } - } - - function closeMainDrawer() { - navDrawerInstance.close(); - } - - function onMainDrawerSelect(e__e) { - if (navDrawerInstance.isVisible) { - onMainDrawerOpened(); - } else { - document.body.classList.remove("bodyWithPopupOpen"); - } - } - - function refreshLibraryInfoInDrawer(user, drawer) { - var html = ""; - html += '
'; - html += '' + globalize.translate("ButtonHome") + ""; - html += '
'; - html += '

'; - html += globalize.translate("sharedcomponents#HeaderMyDownloads"); - html += "

"; - html += '' + globalize.translate("sharedcomponents#Browse") + ""; - html += '' + globalize.translate("sharedcomponents#Manage") + ""; - html += "
"; - html += '
'; - html += "
"; - var localUser = user.localUser; - - if (localUser && localUser.Policy.IsAdministrator) { - html += '
'; - html += '

'; - html += globalize.translate("HeaderAdmin"); - html += "

"; - html += '' + globalize.translate("ButtonManageServer") + ""; - html += '' + globalize.translate("MetadataManager") + ""; - html += "
"; - } - - html += '
'; - - if (user.localUser) { - html += '' + globalize.translate("ButtonSettings") + ""; - } - - html += '' + globalize.translate("sharedcomponents#Sync") + ""; - - if (AppInfo.isNativeApp) { - html += '' + globalize.translate("ButtonSelectServer") + ""; - } - - if (!(!user.localUser || user.localUser.EnableAutoLogin)) { - html += '' + globalize.translate("ButtonSignOut") + ""; - } - - html += "
"; - navDrawerScrollContainer.innerHTML = html; - var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); - - if (btnLogout) { - btnLogout.addEventListener("click", onLogoutClick); - } - } - - function refreshDashboardInfoInDrawer(apiClient) { - currentDrawerType = "admin"; - loadNavDrawer(); - - if (navDrawerScrollContainer.querySelector(".adminDrawerLogo")) { - updateDashboardMenuSelectedItem(); - } else { - createDashboardMenu(apiClient); - } - } - - function isUrlInCurrentView(url) { - return -1 !== window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()); - } - - function updateDashboardMenuSelectedItem() { - var links = navDrawerScrollContainer.querySelectorAll(".navMenuOption"); - var currentViewId = viewManager.currentView().id; - - for (var i__r = 0, length = links.length; i__r < length; i__r++) { - var link = links[i__r]; - var selected = false; - var pageIds = link.getAttribute("data-pageids"); - - if (pageIds) { - pageIds = pageIds.split("|"); - selected = -1 != pageIds.indexOf(currentViewId); - } - - var pageUrls = link.getAttribute("data-pageurls"); - - if (pageUrls && (pageUrls = pageUrls.split("|"), selected = pageUrls.filter(isUrlInCurrentView).length > 0), selected) { - link.classList.add("navMenuOption-selected"); - var title = ""; - link = link.querySelector("span") || link; - title += (link.innerText || link.textContent).trim(); - LibraryMenu.setTitle(title); - } else { - link.classList.remove("navMenuOption-selected"); - } - } - } - - function createToolsMenuList(pluginItems) { - var links = [{ - name: globalize.translate("TabServer") - }, { - name: globalize.translate("TabDashboard"), - href: "dashboard.html", - pageIds: ["dashboardPage", "serverActivityPage"], - icon: "dashboard" - }, { - name: globalize.translate("TabSettings"), - href: "dashboardgeneral.html", - pageIds: ["dashboardGeneralPage"], - icon: "settings" - }, { - name: globalize.translate("TabUsers"), - href: "userprofiles.html", - pageIds: ["userProfilesPage", "newUserPage", "editUserPage", "userLibraryAccessPage", "userParentalControlPage", "userPasswordPage"], - icon: "people" - }, { - name: globalize.translate("TabLibrary"), - href: "library.html", - pageIds: ["mediaLibraryPage", "librarySettingsPage", "libraryDisplayPage", "metadataImagesConfigurationPage", "metadataNfoPage"], - icon: "folder", - color: "#38c" - }, { - name: globalize.translate("TabPlayback"), - icon: "play_circle_filled", - color: "#E5342E", - href: "playbackconfiguration.html", - pageIds: ["playbackConfigurationPage", "streamingSettingsPage"] - }, { - name: globalize.translate("TabTranscoding"), - icon: "transform", - href: "encodingsettings.html", - pageIds: ["encodingSettingsPage"] - }]; - addPluginPagesToMainMenu(links, pluginItems, "server"); - links.push({ - divider: true, - name: globalize.translate("TabDevices") - }); - links.push({ - name: globalize.translate("TabDevices"), - href: "devices/devices.html", - pageIds: ["devicesPage", "devicePage"], - icon: "tablet" - }); - links.push({ - name: globalize.translate("HeaderDownloadSync"), - icon: "file_download", - href: "syncactivity.html", - pageIds: ["syncActivityPage", "syncJobPage", "syncSettingsPage"], - color: "#009688" - }); - links.push({ - name: globalize.translate("TabCameraUpload"), - href: "devicesupload.html", - pageIds: ["devicesUploadPage"], - icon: "photo_camera" - }); - links.push({ - name: globalize.translate("DLNA"), - href: "dlnasettings.html", - pageIds: ["dlnaSettingsPage", "dlnaProfilesPage", "dlnaProfilePage"], - icon: "" - }); - links.push({ - divider: true, - name: globalize.translate("TabLiveTV") - }); - links.push({ - name: globalize.translate("TabLiveTV"), - href: "livetvstatus.html", - pageIds: ["liveTvStatusPage", "liveTvTunerPage"], - icon: "" - }); - links.push({ - name: globalize.translate("DVR"), - href: "livetvsettings.html", - pageIds: ["liveTvSettingsPage"], - icon: "dvr" - }); - links.push({ - divider: true, - name: globalize.translate("TabExpert") - }); - links.push({ - name: globalize.translate("TabAdvanced"), - icon: "settings", - href: "dashboardhosting.html", - color: "#F16834", - pageIds: ["dashboardHostingPage", "serverSecurityPage"] - }); - links.push({ - name: globalize.translate("TabLogs"), - href: "log.html", - pageIds: ["logPage"], - icon: "folder_open" - }); - links.push({ - name: globalize.translate("TabNotifications"), - icon: "notifications", - color: "brown", - href: "notificationsettings.html", - pageIds: ["notificationSettingsPage", "notificationSettingPage"] - }); - links.push({ - name: globalize.translate("TabPlugins"), - icon: "add_shopping_cart", - color: "#9D22B1", - href: "plugins.html", - pageIds: ["pluginsPage", "pluginCatalogPage"] - }); - links.push({ - name: globalize.translate("TabScheduledTasks"), - href: "scheduledtasks.html", - pageIds: ["scheduledTasksPage", "scheduledTaskPage"], - icon: "schedule" - }); - links.push({ - name: globalize.translate("MetadataManager"), - href: "edititemmetadata.html", - pageIds: [], - icon: "mode_edit" - }); - addPluginPagesToMainMenu(links, pluginItems); - return links; - } - - function addPluginPagesToMainMenu(links, pluginItems, section) { - for (var i__t = 0, length = pluginItems.length; i__t < length; i__t++) { - var pluginItem = pluginItems[i__t]; - - if (Dashboard.allowPluginPages(pluginItem.PluginId)) { - if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) { - links.push({ - name: pluginItem.DisplayName, - icon: pluginItem.MenuIcon || "folder", - href: Dashboard.getConfigurationPageUrl(pluginItem.Name), - pageUrls: [Dashboard.getConfigurationPageUrl(pluginItem.Name)] - }); + if (!hasImage) { + updateHeaderUserButton(null); } - } - } - } - function getToolsMenuLinks(apiClient) { - return apiClient.getJSON(apiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration&EnableInMainMenu=true").then(createToolsMenuList, function (err) { - return createToolsMenuList([]); - }); - } + if (user && user.localUser) { + if (headerHomeButton) { + headerHomeButton.classList.remove("hide"); + } - function getToolsLinkHtml(item) { - var menuHtml = ""; - var pageIds = item.pageIds ? item.pageIds.join("|") : ""; - pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ""; - var pageUrls = item.pageUrls ? item.pageUrls.join("|") : ""; - pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ""; - menuHtml += '"; + if (headerSearchButton) { + headerSearchButton.classList.remove("hide"); + } - if (item.icon) { - menuHtml += '' + item.icon + ""; - } + if (headerSettingsButton) { + if (user.localUser.Policy.IsAdministrator) { + headerSettingsButton.classList.remove("hide"); + } else { + headerSettingsButton.classList.add("hide"); + } + } - menuHtml += ''; - menuHtml += item.name; - menuHtml += ""; - return menuHtml += ""; - } - - function getToolsMenuHtml(apiClient) { - return getToolsMenuLinks(apiClient).then(function (items) { - var i__y; - var length; - var item; - var menuHtml = ""; - - for (menuHtml += '
', i__y = 0, length = items.length; i__y < length; i__y++) { - item = items[i__y]; - - if (item.href) { - menuHtml += getToolsLinkHtml(item); + headerCastButton.classList.remove("hide"); } else { - if (item.name) { - menuHtml += '

'; - menuHtml += item.name; - menuHtml += "

"; - } + headerHomeButton.classList.add("hide"); + headerCastButton.classList.add("hide"); + + if (headerSearchButton) { + headerSearchButton.classList.add("hide"); + } + + if (headerSettingsButton) { + headerSettingsButton.classList.add("hide"); + } } - } - return menuHtml += "
"; - }); - } + requiresUserRefresh = false; + } - function createDashboardMenu(apiClient) { - return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { - var html = ""; - html += '"; - html += toolsMenuHtml; - navDrawerScrollContainer.innerHTML = html; - updateDashboardMenuSelectedItem(); - }); - } - - function onSidebarLinkClick() { - var section = this.getElementsByClassName("sectionName")[0]; - var text = section ? section.innerHTML : this.innerHTML; - LibraryMenu.setTitle(text); - } - - function getUserViews(apiClient, userId) { - return apiClient.getUserViews({}, userId).then(function (result) { - var items = result.Items; - var list = []; - - for (var i__u = 0, length = items.length; i__u < length; i__u++) { - var view = items[i__u]; - - if (list.push(view), "livetv" == view.CollectionType) { - view.ImageTags = {}; - view.icon = "live_tv"; - var guideView = Object.assign({}, view); - guideView.Name = globalize.translate("ButtonGuide"); - guideView.ImageTags = {}; - guideView.icon = "dvr"; - guideView.url = "livetv.html?tab=1"; - list.push(guideView); + function updateHeaderUserButton(src) { + if (src) { + headerUserButton.classList.add("headerUserButtonRound"); + headerUserButton.innerHTML = ''; + } else { + headerUserButton.classList.remove("headerUserButtonRound"); + headerUserButton.innerHTML = ''; } - } - - return list; - }); - } - - function showBySelector(selector, show) { - var elem = document.querySelector(selector); - - if (elem) { - if (show) { - elem.classList.remove("hide"); - } else { - elem.classList.add("hide"); - } - } - } - - function updateLibraryMenu(user) { - if (!user) { - showBySelector(".libraryMenuDownloads", false); - showBySelector(".lnkSyncToOtherDevices", false); - return void showBySelector(".userMenuOptions", false); } - if (user.Policy.EnableContentDownloading) { - showBySelector(".lnkSyncToOtherDevices", true); - } else { - showBySelector(".lnkSyncToOtherDevices", false); + function showSearch() { + inputManager.trigger("search"); } - if (user.Policy.EnableContentDownloading && appHost.supports("sync")) { - showBySelector(".libraryMenuDownloads", true); - } else { - showBySelector(".libraryMenuDownloads", false); + function onHeaderUserButtonClick(e) { + Dashboard.navigate("mypreferencesmenu.html"); } - var userId = Dashboard.getCurrentUserId(); - var apiClient = getCurrentApiClient(); - var libraryMenuOptions = document.querySelector(".libraryMenuOptions"); + function onSettingsClick(e) { + Dashboard.navigate("dashboard.html"); + } - if (libraryMenuOptions) { - getUserViews(apiClient, userId).then(function (result) { - var items = result; + function onHeaderHomeButtonClick() { + Dashboard.navigate("home.html"); + } + + function bindMenuEvents() { + if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { + mainDrawerButton.addEventListener("click", toggleMainDrawer); + } + + var headerBackButton = skinHeader.querySelector(".headerBackButton"); + + if (headerBackButton) { + headerBackButton.addEventListener("click", onBackClick); + } + + if (headerSearchButton) { + headerSearchButton.addEventListener("click", showSearch); + } + + headerUserButton.addEventListener("click", onHeaderUserButtonClick); + headerHomeButton.addEventListener("click", onHeaderHomeButtonClick); + initHeadRoom(skinHeader); + headerCastButton.addEventListener("click", onCastButtonClicked); + + if (headerSettingsButton) { + headerSettingsButton.addEventListener("click", onSettingsClick); + } + } + + function onCastButtonClicked() { + var btn = this; + + require(["playerSelectionMenu"], function (playerSelectionMenu) { + playerSelectionMenu.show(btn); + }); + } + + function getItemHref(item, context) { + return appRouter.getRouteUrl(item, { + context: context + }); + } + + function toggleMainDrawer() { + if (navDrawerInstance.isVisible) { + closeMainDrawer(); + } else { + openMainDrawer(); + } + } + + function openMainDrawer() { + navDrawerInstance.open(); + lastOpenTime = new Date().getTime(); + } + + function onMainDrawerOpened() { + if (layoutManager.mobile) { + document.body.classList.add("bodyWithPopupOpen"); + } + } + + function closeMainDrawer() { + navDrawerInstance.close(); + } + + function onMainDrawerSelect(e) { + if (navDrawerInstance.isVisible) { + onMainDrawerOpened(); + } else { + document.body.classList.remove("bodyWithPopupOpen"); + } + } + + function refreshLibraryInfoInDrawer(user, drawer) { var html = ""; + html += '
'; + html += '' + globalize.translate("ButtonHome") + ""; + html += '
'; html += '

'; - html += globalize.translate("HeaderMedia"); + html += globalize.translate("sharedcomponents#HeaderMyDownloads"); html += "

"; - html += items.map(function (i__o) { - var icon = "folder"; - var itemId = i__o.Id; + html += '' + globalize.translate("sharedcomponents#Browse") + ""; + html += '' + globalize.translate("sharedcomponents#Manage") + ""; + html += "
"; + html += '
'; + html += "
"; + var localUser = user.localUser; - if ("channels" == i__o.CollectionType) { - itemId = "channels"; - } else { - if ("livetv" == i__o.CollectionType) { - itemId = "livetv"; + if (localUser && localUser.Policy.IsAdministrator) { + html += '
'; + html += '

'; + html += globalize.translate("HeaderAdmin"); + html += "

"; + html += '' + globalize.translate("ButtonManageServer") + ""; + html += '' + globalize.translate("MetadataManager") + ""; + html += "
"; + } + + html += '
'; + + if (user.localUser) { + html += '' + globalize.translate("ButtonSettings") + ""; + } + + html += '' + globalize.translate("sharedcomponents#Sync") + ""; + + if (AppInfo.isNativeApp) { + html += '' + globalize.translate("ButtonSelectServer") + ""; + } + + if (!(!user.localUser || user.localUser.EnableAutoLogin)) { + html += '' + globalize.translate("ButtonSignOut") + ""; + } + + html += "
"; + navDrawerScrollContainer.innerHTML = html; + var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); + + if (btnLogout) { + btnLogout.addEventListener("click", onLogoutClick); + } + } + + function refreshDashboardInfoInDrawer(apiClient) { + currentDrawerType = "admin"; + loadNavDrawer(); + + if (navDrawerScrollContainer.querySelector(".adminDrawerLogo")) { + updateDashboardMenuSelectedItem(); + } else { + createDashboardMenu(apiClient); + } + } + + function isUrlInCurrentView(url) { + return -1 !== window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()); + } + + function updateDashboardMenuSelectedItem() { + var links = navDrawerScrollContainer.querySelectorAll(".navMenuOption"); + var currentViewId = viewManager.currentView().id; + + for (var i = 0, length = links.length; i < length; i++) { + var link = links[i]; + var selected = false; + var pageIds = link.getAttribute("data-pageids"); + + if (pageIds) { + pageIds = pageIds.split("|"); + selected = -1 != pageIds.indexOf(currentViewId); } - } - if ("photos" == i__o.CollectionType) { - icon = "photo_library"; - } else { - if ("music" == i__o.CollectionType || "musicvideos" == i__o.CollectionType) { - icon = "library_music"; + var pageUrls = link.getAttribute("data-pageurls"); + + if (pageUrls && (pageUrls = pageUrls.split("|"), selected = pageUrls.filter(isUrlInCurrentView).length > 0), selected) { + link.classList.add("navMenuOption-selected"); + var title = ""; + link = link.querySelector("span") || link; + title += (link.innerText || link.textContent).trim(); + LibraryMenu.setTitle(title); } else { - if ("books" == i__o.CollectionType) { - icon = "library_books"; - } else { - if ("playlists" == i__o.CollectionType) { - icon = "view_list"; + link.classList.remove("navMenuOption-selected"); + } + } + } + + function createToolsMenuList(pluginItems) { + var links = [{ + name: globalize.translate("TabServer") + }, { + name: globalize.translate("TabDashboard"), + href: "dashboard.html", + pageIds: ["dashboardPage", "serverActivityPage"], + icon: "dashboard" + }, { + name: globalize.translate("TabSettings"), + href: "dashboardgeneral.html", + pageIds: ["dashboardGeneralPage"], + icon: "settings" + }, { + name: globalize.translate("TabUsers"), + href: "userprofiles.html", + pageIds: ["userProfilesPage", "newUserPage", "editUserPage", "userLibraryAccessPage", "userParentalControlPage", "userPasswordPage"], + icon: "people" + }, { + name: globalize.translate("TabLibrary"), + href: "library.html", + pageIds: ["mediaLibraryPage", "librarySettingsPage", "libraryDisplayPage", "metadataImagesConfigurationPage", "metadataNfoPage"], + icon: "folder", + color: "#38c" + }, { + name: globalize.translate("TabPlayback"), + icon: "play_circle_filled", + color: "#E5342E", + href: "playbackconfiguration.html", + pageIds: ["playbackConfigurationPage", "streamingSettingsPage"] + }, { + name: globalize.translate("TabTranscoding"), + icon: "transform", + href: "encodingsettings.html", + pageIds: ["encodingSettingsPage"] + }]; + addPluginPagesToMainMenu(links, pluginItems, "server"); + links.push({ + divider: true, + name: globalize.translate("TabDevices") + }); + links.push({ + name: globalize.translate("TabDevices"), + href: "devices/devices.html", + pageIds: ["devicesPage", "devicePage"], + icon: "tablet" + }); + links.push({ + name: globalize.translate("HeaderDownloadSync"), + icon: "file_download", + href: "syncactivity.html", + pageIds: ["syncActivityPage", "syncJobPage", "syncSettingsPage"], + color: "#009688" + }); + links.push({ + name: globalize.translate("TabCameraUpload"), + href: "devicesupload.html", + pageIds: ["devicesUploadPage"], + icon: "photo_camera" + }); + links.push({ + name: globalize.translate("DLNA"), + href: "dlnasettings.html", + pageIds: ["dlnaSettingsPage", "dlnaProfilesPage", "dlnaProfilePage"], + icon: "" + }); + links.push({ + divider: true, + name: globalize.translate("TabLiveTV") + }); + links.push({ + name: globalize.translate("TabLiveTV"), + href: "livetvstatus.html", + pageIds: ["liveTvStatusPage", "liveTvTunerPage"], + icon: "" + }); + links.push({ + name: globalize.translate("DVR"), + href: "livetvsettings.html", + pageIds: ["liveTvSettingsPage"], + icon: "dvr" + }); + links.push({ + divider: true, + name: globalize.translate("TabExpert") + }); + links.push({ + name: globalize.translate("TabAdvanced"), + icon: "settings", + href: "dashboardhosting.html", + color: "#F16834", + pageIds: ["dashboardHostingPage", "serverSecurityPage"] + }); + links.push({ + name: globalize.translate("TabLogs"), + href: "log.html", + pageIds: ["logPage"], + icon: "folder_open" + }); + links.push({ + name: globalize.translate("TabNotifications"), + icon: "notifications", + color: "brown", + href: "notificationsettings.html", + pageIds: ["notificationSettingsPage", "notificationSettingPage"] + }); + links.push({ + name: globalize.translate("TabPlugins"), + icon: "add_shopping_cart", + color: "#9D22B1", + href: "plugins.html", + pageIds: ["pluginsPage", "pluginCatalogPage"] + }); + links.push({ + name: globalize.translate("TabScheduledTasks"), + href: "scheduledtasks.html", + pageIds: ["scheduledTasksPage", "scheduledTaskPage"], + icon: "schedule" + }); + links.push({ + name: globalize.translate("MetadataManager"), + href: "edititemmetadata.html", + pageIds: [], + icon: "mode_edit" + }); + addPluginPagesToMainMenu(links, pluginItems); + return links; + } + + function addPluginPagesToMainMenu(links, pluginItems, section) { + for (var i = 0, length = pluginItems.length; i < length; i++) { + var pluginItem = pluginItems[i]; + + if (Dashboard.allowPluginPages(pluginItem.PluginId)) { + if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) { + links.push({ + name: pluginItem.DisplayName, + icon: pluginItem.MenuIcon || "folder", + href: Dashboard.getConfigurationPageUrl(pluginItem.Name), + pageUrls: [Dashboard.getConfigurationPageUrl(pluginItem.Name)] + }); + } + } + } + } + + function getToolsMenuLinks(apiClient) { + return apiClient.getJSON(apiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration&EnableInMainMenu=true").then(createToolsMenuList, function (err) { + return createToolsMenuList([]); + }); + } + + function getToolsLinkHtml(item) { + var menuHtml = ""; + var pageIds = item.pageIds ? item.pageIds.join("|") : ""; + pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ""; + var pageUrls = item.pageUrls ? item.pageUrls.join("|") : ""; + pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ""; + menuHtml += '"; + + if (item.icon) { + menuHtml += '' + item.icon + ""; + } + + menuHtml += ''; + menuHtml += item.name; + menuHtml += ""; + return menuHtml += ""; + } + + function getToolsMenuHtml(apiClient) { + return getToolsMenuLinks(apiClient).then(function (items) { + var i; + var length; + var item; + var menuHtml = ""; + + for (menuHtml += '
', i = 0, length = items.length; i < length; i++) { + item = items[i]; + + if (item.href) { + menuHtml += getToolsLinkHtml(item); } else { - if ("games" == i__o.CollectionType) { - icon = "games"; - } else { - if ("movies" == i__o.CollectionType) { - icon = "video_library"; - } else { - if ("channels" == i__o.CollectionType || "Channel" == i__o.Type) { - icon = "videocam"; - } else { - if ("tvshows" == i__o.CollectionType) { - icon = "tv"; - } else { - if ("livetv" == i__o.CollectionType) { - icon = "live_tv"; - } - } - } + if (item.name) { + menuHtml += '

'; + menuHtml += item.name; + menuHtml += "

"; } - } } - } } - } - icon = i__o.icon || icon; - - if (i__o.onclick) { - i__o.onclick; - } - - return '' + icon + '' + i__o.Name + ""; - }).join(""); - libraryMenuOptions.innerHTML = html; - var elem = libraryMenuOptions; - var sidebarLinks = elem.querySelectorAll(".navMenuOption"); - - for (var i__i = 0, length = sidebarLinks.length; i__i < length; i__i++) { - sidebarLinks[i__i].removeEventListener("click", onSidebarLinkClick); - sidebarLinks[i__i].addEventListener("click", onSidebarLinkClick); - } - }); + return menuHtml += "
"; + }); } - } - function getTopParentId() { - return getParameterByName("topParentId") || null; - } - - function onMainDrawerClick(e__p) { - if (dom.parentWithTag(e__p.target, "A")) { - setTimeout(closeMainDrawer, 30); + function createDashboardMenu(apiClient) { + return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { + var html = ""; + html += '"; + html += toolsMenuHtml; + navDrawerScrollContainer.innerHTML = html; + updateDashboardMenuSelectedItem(); + }); } - } - function onLogoutClick() { - Dashboard.logout(); - } - - function updateCastIcon() { - var context = document; - var info = playbackManager.getPlayerInfo(); - var icon = headerCastButton.querySelector("i"); - - if (info && !info.isLocalPlayer) { - icon.innerHTML = ""; - headerCastButton.classList.add("castButton-active"); - context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name; - } else { - icon.innerHTML = ""; - headerCastButton.classList.remove("castButton-active"); - context.querySelector(".headerSelectedPlayer").innerHTML = ""; + function onSidebarLinkClick() { + var section = this.getElementsByClassName("sectionName")[0]; + var text = section ? section.innerHTML : this.innerHTML; + LibraryMenu.setTitle(text); } - } - function updateLibraryNavLinks(page) { - var i__a; - var length; - var isLiveTvPage = page.classList.contains("liveTvPage"); - var isChannelsPage = page.classList.contains("channelsPage"); - var isEditorPage = page.classList.contains("metadataEditorPage"); - var isMySyncPage = page.classList.contains("mySyncPage"); - var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || ""; - var elems = document.getElementsByClassName("lnkMediaFolder"); + function getUserViews(apiClient, userId) { + return apiClient.getUserViews({}, userId).then(function (result) { + var items = result.Items; + var list = []; - for (i__a = 0, length = elems.length; i__a < length; i__a++) { - var lnkMediaFolder = elems[i__a]; - var itemId = lnkMediaFolder.getAttribute("data-itemid"); + for (var i = 0, length = items.length; i < length; i++) { + var view = items[i]; - if (isChannelsPage && "channels" == itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else { - if (isLiveTvPage && "livetv" == itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else { - if (isEditorPage && "editor" == itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else { - if (isMySyncPage && "manageoffline" == itemId && -1 != window.location.href.toString().indexOf("mode=download")) { - lnkMediaFolder.classList.add("navMenuOption-selected"); + if (list.push(view), "livetv" == view.CollectionType) { + view.ImageTags = {}; + view.icon = "live_tv"; + var guideView = Object.assign({}, view); + guideView.Name = globalize.translate("ButtonGuide"); + guideView.ImageTags = {}; + guideView.icon = "dvr"; + guideView.url = "livetv.html?tab=1"; + list.push(guideView); + } + } + + return list; + }); + } + + function showBySelector(selector, show) { + var elem = document.querySelector(selector); + + if (elem) { + if (show) { + elem.classList.remove("hide"); } else { - if (isMySyncPage && "syncotherdevices" == itemId && -1 == window.location.href.toString().indexOf("mode=download")) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else { - if (id && itemId == id) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else { - lnkMediaFolder.classList.remove("navMenuOption-selected"); - } - } + elem.classList.add("hide"); } - } } - } } - } - function updateMenuForPageType(isDashboardPage, isLibraryPage) { - var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; + function updateLibraryMenu(user) { + if (!user) { + showBySelector(".libraryMenuDownloads", false); + showBySelector(".lnkSyncToOtherDevices", false); + return void showBySelector(".userMenuOptions", false); + } - if (currentPageType !== newPageType) { - currentPageType = newPageType; + if (user.Policy.EnableContentDownloading) { + showBySelector(".lnkSyncToOtherDevices", true); + } else { + showBySelector(".lnkSyncToOtherDevices", false); + } - if (isDashboardPage && !layoutManager.mobile) { - skinHeader.classList.add("headroomDisabled"); - } else { - skinHeader.classList.remove("headroomDisabled"); - } + if (user.Policy.EnableContentDownloading && appHost.supports("sync")) { + showBySelector(".libraryMenuDownloads", true); + } else { + showBySelector(".libraryMenuDownloads", false); + } - var bodyClassList = document.body.classList; + var userId = Dashboard.getCurrentUserId(); + var apiClient = getCurrentApiClient(); + var libraryMenuOptions = document.querySelector(".libraryMenuOptions"); - if (isLibraryPage) { - bodyClassList.add("libraryDocument"); - bodyClassList.remove("dashboardDocument"); - bodyClassList.remove("hideMainDrawer"); + if (libraryMenuOptions) { + getUserViews(apiClient, userId).then(function (result) { + var items = result; + var html = ""; + html += '

'; + html += globalize.translate("HeaderMedia"); + html += "

"; + html += items.map(function (i) { + var icon = "folder"; + var itemId = i.Id; + if ("channels" == i.CollectionType) { + itemId = "channels"; + } + else if ("livetv" == i.CollectionType) { + itemId = "livetv"; + } + + else if ("photos" == i.CollectionType) { + icon = "photo_library"; + } + else if ("music" == i.CollectionType || "musicvideos" == i.CollectionType) { + icon = "library_music"; + } + else if ("books" == i.CollectionType) { + icon = "library_books"; + } + else if ("playlists" == i.CollectionType) { + icon = "view_list"; + } + else if ("games" == i.CollectionType) { + icon = "games"; + } + else if ("movies" == i.CollectionType) { + icon = "video_library"; + } + else if ("channels" == i.CollectionType || "Channel" == i.Type) { + icon = "videocam"; + } + else if ("tvshows" == i.CollectionType) { + icon = "tv"; + } + else if ("livetv" == i.CollectionType) { + icon = "live_tv"; + } + icon = i.icon || icon; + + if (i.onclick) { + i.onclick; + } + + return '' + icon + '' + i.Name + ""; + }).join(""); + libraryMenuOptions.innerHTML = html; + var elem = libraryMenuOptions; + var sidebarLinks = elem.querySelectorAll(".navMenuOption"); + + for (var i = 0, length = sidebarLinks.length; i < length; i++) { + sidebarLinks[i].removeEventListener("click", onSidebarLinkClick); + sidebarLinks[i].addEventListener("click", onSidebarLinkClick); + } + }); + } + } + + function getTopParentId() { + return getParameterByName("topParentId") || null; + } + + function onMainDrawerClick(e) { + if (dom.parentWithTag(e.target, "A")) { + setTimeout(closeMainDrawer, 30); + } + } + + function onLogoutClick() { + Dashboard.logout(); + } + + function updateCastIcon() { + var context = document; + var info = playbackManager.getPlayerInfo(); + var icon = headerCastButton.querySelector("i"); + + if (info && !info.isLocalPlayer) { + icon.innerHTML = ""; + headerCastButton.classList.add("castButton-active"); + context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name; + } else { + icon.innerHTML = ""; + headerCastButton.classList.remove("castButton-active"); + context.querySelector(".headerSelectedPlayer").innerHTML = ""; + } + } + + function updateLibraryNavLinks(page) { + var i; + var length; + var isLiveTvPage = page.classList.contains("liveTvPage"); + var isChannelsPage = page.classList.contains("channelsPage"); + var isEditorPage = page.classList.contains("metadataEditorPage"); + var isMySyncPage = page.classList.contains("mySyncPage"); + var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || ""; + var elems = document.getElementsByClassName("lnkMediaFolder"); + + for (i = 0, length = elems.length; i < length; i++) { + var lnkMediaFolder = elems[i]; + var itemId = lnkMediaFolder.getAttribute("data-itemid"); + + if (isChannelsPage && "channels" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else if (isLiveTvPage && "livetv" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else if (isEditorPage && "editor" == itemId) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else if (isMySyncPage && "manageoffline" == itemId && -1 != window.location.href.toString().indexOf("mode=download")) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else if (isMySyncPage && "syncotherdevices" == itemId && -1 == window.location.href.toString().indexOf("mode=download")) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else if (id && itemId == id) { + lnkMediaFolder.classList.add("navMenuOption-selected"); + } + else { + lnkMediaFolder.classList.remove("navMenuOption-selected"); + } + } + } + + function updateMenuForPageType(isDashboardPage, isLibraryPage) { + var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; + + if (currentPageType !== newPageType) { + currentPageType = newPageType; + + if (isDashboardPage && !layoutManager.mobile) { + skinHeader.classList.add("headroomDisabled"); + } else { + skinHeader.classList.remove("headroomDisabled"); + } + + var bodyClassList = document.body.classList; + + if (isLibraryPage) { + bodyClassList.add("libraryDocument"); + bodyClassList.remove("dashboardDocument"); + bodyClassList.remove("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(true); + } + } else { + if (isDashboardPage) { + bodyClassList.remove("libraryDocument"); + bodyClassList.add("dashboardDocument"); + bodyClassList.remove("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(true); + } + } else { + bodyClassList.remove("libraryDocument"); + bodyClassList.remove("dashboardDocument"); + bodyClassList.add("hideMainDrawer"); + + if (navDrawerInstance) { + navDrawerInstance.setEdgeSwipeEnabled(false); + } + } + } + } + + if (requiresUserRefresh) { + connectionManager.user(getCurrentApiClient()).then(updateUserInHeader); + } + } + + function updateTitle(page) { + var title = page.getAttribute("data-title"); + + if (title) { + LibraryMenu.setTitle(title); + } else { + if (page.classList.contains("standalonePage")) { + LibraryMenu.setDefaultTitle(); + } + } + } + + function updateBackButton(page) { + if (!headerBackButton) { + headerBackButton = document.querySelector(".headerBackButton"); + } + + if (headerBackButton) { + if ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack()) { + headerBackButton.classList.remove("hide"); + } else { + headerBackButton.classList.add("hide"); + } + } + } + + function initHeadRoom(elem) { + require(["headroom-window"], function (headroom) { + headroom.add(elem); + }); + } + + function refreshLibraryDrawer(user) { + loadNavDrawer(); + currentDrawerType = "library"; + (user ? Promise.resolve(user) : connectionManager.user(getCurrentApiClient())).then(function (user) { + refreshLibraryInfoInDrawer(user); + updateLibraryMenu(user.localUser); + }); + } + + function getNavDrawerOptions() { + var drawerWidth = screen.availWidth - 50; + drawerWidth = Math.max(drawerWidth, 240); + drawerWidth = Math.min(drawerWidth, 320); + return { + target: navDrawerElement, + onChange: onMainDrawerSelect, + width: drawerWidth + }; + } + + function loadNavDrawer() { if (navDrawerInstance) { - navDrawerInstance.setEdgeSwipeEnabled(true); + return Promise.resolve(navDrawerInstance); } - } else { + + navDrawerElement = document.querySelector(".mainDrawer"); + navDrawerScrollContainer = navDrawerElement.querySelector(".scrollContainer"); + navDrawerScrollContainer.addEventListener("click", onMainDrawerClick); + return new Promise(function (resolve, reject) { + require(["navdrawer"], function (navdrawer) { + navDrawerInstance = new navdrawer(getNavDrawerOptions()); + navDrawerElement.classList.remove("hide"); + resolve(navDrawerInstance); + }); + }); + } + + var navDrawerElement; + var navDrawerScrollContainer; + var navDrawerInstance; + var mainDrawerButton; + var headerHomeButton; + var currentDrawerType; + var pageTitleElement; + var headerBackButton; + var headerUserButton; + var currentUser; + var headerSettingsButton; + var headerCastButton; + var headerSearchButton; + var enableLibraryNavDrawer = !layoutManager.tv; + var skinHeader = document.querySelector(".skinHeader"); + var requiresUserRefresh = true; + var lastOpenTime = new Date().getTime(); + window.LibraryMenu = { + getTopParentId: getTopParentId, + onHardwareMenuButtonClick: function () { + toggleMainDrawer(); + }, + setTabs: function (type, selectedIndex, builder) { + require(["mainTabsManager"], function (mainTabsManager) { + if (type) { + mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { + return []; + }); + } else { + mainTabsManager.setTabs(null); + } + }); + }, + setDefaultTitle: function () { + if (!pageTitleElement) { + pageTitleElement = document.querySelector(".pageTitle"); + } + + if (pageTitleElement) { + pageTitleElement.classList.add("pageTitleWithLogo"); + pageTitleElement.classList.add("pageTitleWithDefaultLogo"); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = ""; + } + + document.title = "Jellyfin"; + }, + setTitle: function (title) { + if (null == title) { + return void LibraryMenu.setDefaultTitle(); + } + + if ("-" === title) { + title = ""; + } + + var html = title; + + if (!pageTitleElement) { + pageTitleElement = document.querySelector(".pageTitle"); + } + + if (pageTitleElement) { + pageTitleElement.classList.remove("pageTitleWithLogo"); + pageTitleElement.classList.remove("pageTitleWithDefaultLogo"); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = html || ""; + } + + document.title = title || "Jellyfin"; + }, + setTransparentMenu: function (transparent) { + if (transparent) { + skinHeader.classList.add("semiTransparent"); + } else { + skinHeader.classList.remove("semiTransparent"); + } + } + }; + var currentPageType; + pageClassOn("pagebeforeshow", "page", function (e) { + if (!this.classList.contains("withTabs")) { + LibraryMenu.setTabs(null); + } + }); + pageClassOn("pageshow", "page", function (e) { + var page = this; + var isDashboardPage = page.classList.contains("type-interior"); + var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"); + var apiClient = getCurrentApiClient(); + if (isDashboardPage) { - bodyClassList.remove("libraryDocument"); - bodyClassList.add("dashboardDocument"); - bodyClassList.remove("hideMainDrawer"); + if (mainDrawerButton) { + mainDrawerButton.classList.remove("hide"); + } - if (navDrawerInstance) { - navDrawerInstance.setEdgeSwipeEnabled(true); - } + refreshDashboardInfoInDrawer(apiClient); } else { - bodyClassList.remove("libraryDocument"); - bodyClassList.remove("dashboardDocument"); - bodyClassList.add("hideMainDrawer"); + if (mainDrawerButton) { + if (enableLibraryNavDrawer) { + mainDrawerButton.classList.remove("hide"); + } else { + mainDrawerButton.classList.add("hide"); + } + } - if (navDrawerInstance) { - navDrawerInstance.setEdgeSwipeEnabled(false); - } + if ("library" !== currentDrawerType) { + refreshLibraryDrawer(); + } } - } - } - if (requiresUserRefresh) { - connectionManager.user(getCurrentApiClient()).then(updateUserInHeader); - } - } + updateMenuForPageType(isDashboardPage, isLibraryPage); - function updateTitle(page) { - var title = page.getAttribute("data-title"); + if (!e.detail.isRestored) { + window.scrollTo(0, 0); + } - if (title) { - LibraryMenu.setTitle(title); - } else { - if (page.classList.contains("standalonePage")) { - LibraryMenu.setDefaultTitle(); - } - } - } - - function updateBackButton(page) { - if (!headerBackButton) { - headerBackButton = document.querySelector(".headerBackButton"); - } - - if (headerBackButton) { - if ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack()) { - headerBackButton.classList.remove("hide"); - } else { - headerBackButton.classList.add("hide"); - } - } - } - - function initHeadRoom(elem) { - require(["headroom-window"], function (headroom) { - headroom.add(elem); + updateTitle(page); + updateBackButton(page); + updateLibraryNavLinks(page); }); - } - function refreshLibraryDrawer(user) { + (function () { + var html = ""; + html += '
'; + html += '
'; + html += '"; + html += ''; + html += ''; + html += '

'; + html += "
"; + html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; + + if (!layoutManager.mobile) { + html += ''; + } + + html += "
"; + html += "
"; + html += '
'; + html += "
"; + skinHeader.classList.add("skinHeader-withBackground"); + skinHeader.innerHTML = html; + headerHomeButton = skinHeader.querySelector(".headerHomeButton"); + headerUserButton = skinHeader.querySelector(".headerUserButton"); + headerSettingsButton = skinHeader.querySelector(".headerSettingsButton"); + headerCastButton = skinHeader.querySelector(".headerCastButton"); + headerSearchButton = skinHeader.querySelector(".headerSearchButton"); + + if (!browser.chrome) { + skinHeader.classList.add("skinHeader-blurred"); + } + + lazyLoadViewMenuBarImages(); + bindMenuEvents(); + })(); + + events.on(connectionManager, "localusersignedin", function (e, user) { + currentDrawerType = null; + currentUser = { + localUser: user + }; + loadNavDrawer(); + connectionManager.user(connectionManager.getApiClient(user.ServerId)).then(function (user) { + currentUser = user; + updateUserInHeader(user); + }); + }); + events.on(connectionManager, "localusersignedout", function () { + currentUser = {}; + updateUserInHeader(); + }); + events.on(playbackManager, "playerchange", updateCastIcon); loadNavDrawer(); - currentDrawerType = "library"; - (user ? Promise.resolve(user) : connectionManager.user(getCurrentApiClient())).then(function (user) { - refreshLibraryInfoInDrawer(user); - updateLibraryMenu(user.localUser); - }); - } - - function getNavDrawerOptions() { - var drawerWidth = screen.availWidth - 50; - drawerWidth = Math.max(drawerWidth, 240); - drawerWidth = Math.min(drawerWidth, 320); - return { - target: navDrawerElement, - onChange: onMainDrawerSelect, - width: drawerWidth - }; - } - - function loadNavDrawer() { - if (navDrawerInstance) { - return Promise.resolve(navDrawerInstance); - } - - navDrawerElement = document.querySelector(".mainDrawer"); - navDrawerScrollContainer = navDrawerElement.querySelector(".scrollContainer"); - navDrawerScrollContainer.addEventListener("click", onMainDrawerClick); - return new Promise(function (resolve, reject) { - require(["navdrawer"], function (navdrawer) { - navDrawerInstance = new navdrawer(getNavDrawerOptions()); - navDrawerElement.classList.remove("hide"); - resolve(navDrawerInstance); - }); - }); - } - - var navDrawerElement; - var navDrawerScrollContainer; - var navDrawerInstance; - var mainDrawerButton; - var headerHomeButton; - var currentDrawerType; - var pageTitleElement; - var headerBackButton; - var headerUserButton; - var currentUser; - var headerSettingsButton; - var headerCastButton; - var headerSearchButton; - var enableLibraryNavDrawer = !layoutManager.tv; - var skinHeader = document.querySelector(".skinHeader"); - var requiresUserRefresh = true; - var lastOpenTime = new Date().getTime(); - window.LibraryMenu = { - getTopParentId: getTopParentId, - onHardwareMenuButtonClick: function () { - toggleMainDrawer(); - }, - setTabs: function (type, selectedIndex, builder) { - require(["mainTabsManager"], function (mainTabsManager) { - if (type) { - mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { - return []; - }); - } else { - mainTabsManager.setTabs(null); - } - }); - }, - setDefaultTitle: function () { - if (!pageTitleElement) { - pageTitleElement = document.querySelector(".pageTitle"); - } - - if (pageTitleElement) { - pageTitleElement.classList.add("pageTitleWithLogo"); - pageTitleElement.classList.add("pageTitleWithDefaultLogo"); - pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = ""; - } - - document.title = "Jellyfin"; - }, - setTitle: function (title) { - if (null == title) { - return void LibraryMenu.setDefaultTitle(); - } - - if ("-" === title) { - title = ""; - } - - var html = title; - - if (!pageTitleElement) { - pageTitleElement = document.querySelector(".pageTitle"); - } - - if (pageTitleElement) { - pageTitleElement.classList.remove("pageTitleWithLogo"); - pageTitleElement.classList.remove("pageTitleWithDefaultLogo"); - pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = html || ""; - } - - document.title = title || "Jellyfin"; - }, - setTransparentMenu: function (transparent) { - if (transparent) { - skinHeader.classList.add("semiTransparent"); - } else { - skinHeader.classList.remove("semiTransparent"); - } - } - }; - var currentPageType; - pageClassOn("pagebeforeshow", "page", function (e__s) { - if (!this.classList.contains("withTabs")) { - LibraryMenu.setTabs(null); - } - }); - pageClassOn("pageshow", "page", function (e__d) { - var page = this; - var isDashboardPage = page.classList.contains("type-interior"); - var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"); - var apiClient = getCurrentApiClient(); - - if (isDashboardPage) { - if (mainDrawerButton) { - mainDrawerButton.classList.remove("hide"); - } - - refreshDashboardInfoInDrawer(apiClient); - } else { - if (mainDrawerButton) { - if (enableLibraryNavDrawer) { - mainDrawerButton.classList.remove("hide"); - } else { - mainDrawerButton.classList.add("hide"); - } - } - - if ("library" !== currentDrawerType) { - refreshLibraryDrawer(); - } - } - - updateMenuForPageType(isDashboardPage, isLibraryPage); - - if (!e__d.detail.isRestored) { - window.scrollTo(0, 0); - } - - updateTitle(page); - updateBackButton(page); - updateLibraryNavLinks(page); - }); - - (function () { - var html = ""; - html += '
'; - html += '
'; - html += '"; - html += ''; - html += ''; - html += '

'; - html += "
"; - html += '
'; - html += ''; - html += ''; - html += ''; - html += ''; - - if (!layoutManager.mobile) { - html += ''; - } - - html += "
"; - html += "
"; - html += '
'; - html += "
"; - skinHeader.classList.add("skinHeader-withBackground"); - skinHeader.innerHTML = html; - headerHomeButton = skinHeader.querySelector(".headerHomeButton"); - headerUserButton = skinHeader.querySelector(".headerUserButton"); - headerSettingsButton = skinHeader.querySelector(".headerSettingsButton"); - headerCastButton = skinHeader.querySelector(".headerCastButton"); - headerSearchButton = skinHeader.querySelector(".headerSearchButton"); - - if (!browser.chrome) { - skinHeader.classList.add("skinHeader-blurred"); - } - - lazyLoadViewMenuBarImages(); - bindMenuEvents(); - })(); - - events.on(connectionManager, "localusersignedin", function (e__f, user) { - currentDrawerType = null; - currentUser = { - localUser: user - }; - loadNavDrawer(); - connectionManager.user(connectionManager.getApiClient(user.ServerId)).then(function (user) { - currentUser = user; - updateUserInHeader(user); - }); - }); - events.on(connectionManager, "localusersignedout", function () { - currentUser = {}; - updateUserInHeader(); - }); - events.on(playbackManager, "playerchange", updateCastIcon); - loadNavDrawer(); - return LibraryMenu; + return LibraryMenu; }); From 858decb4bbb75694c8614b4e81d797fcec4e6d36 Mon Sep 17 00:00:00 2001 From: Sparky Date: Wed, 16 Jan 2019 11:04:25 -0500 Subject: [PATCH 3/7] Removed back button from dashboard and metadata manager --- src/scripts/librarymenu.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 2103ddc387..d53194cf64 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -732,12 +732,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function updateBackButton(page) { + var isDashboardPage = page.classList.contains("type-interior"); + if (!headerBackButton) { headerBackButton = document.querySelector(".headerBackButton"); } if (headerBackButton) { - if ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack()) { + if ("false" !== !isDashboardPage && page.getAttribute("data-backbutton") && appRouter.canGoBack()) { headerBackButton.classList.remove("hide"); } else { headerBackButton.classList.add("hide"); From d090ac8d729323719430b3a8b9f5175c7356678f Mon Sep 17 00:00:00 2001 From: Sparky Date: Sat, 19 Jan 2019 11:05:30 -0500 Subject: [PATCH 4/7] Fix up some additional deuglification failures Replaced += on some strings Declared `var i`in for loops rather than just using `i` Fixed left over nest if, changed to else if Switched to `===` for string to string comparisons Unfurled ternary operator deuglification missed ...Applied suggestions from code review... --- src/scripts/librarymenu.js | 100 +++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index d53194cf64..b3d26edafa 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -104,7 +104,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function bindMenuEvents() { - if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { + var mainDrawerButton = document.querySelector(".mainDrawerButton"); + + if (mainDrawerButton) { mainDrawerButton.addEventListener("click", toggleMainDrawer); } @@ -254,7 +256,11 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var pageUrls = link.getAttribute("data-pageurls"); - if (pageUrls && (pageUrls = pageUrls.split("|"), selected = pageUrls.filter(isUrlInCurrentView).length > 0), selected) { + if (pageUrls) { + pageUrls = pageUrls.split("|"); + selected = pageUrls.filter(isUrlInCurrentView).length > 0; + } + if (selected) { link.classList.add("navMenuOption-selected"); var title = ""; link = link.querySelector("span") || link; @@ -433,31 +439,29 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " menuHtml += ''; menuHtml += item.name; menuHtml += ""; - return menuHtml += ""; + return menuHtml + ""; } function getToolsMenuHtml(apiClient) { return getToolsMenuLinks(apiClient).then(function (items) { - var i; - var length; var item; var menuHtml = ""; - for (menuHtml += '
', i = 0, length = items.length; i < length; i++) { + menuHtml += '
'; + for (var i = 0; i < items.length; i++) { item = items[i]; if (item.href) { menuHtml += getToolsLinkHtml(item); - } else { - if (item.name) { - menuHtml += '

'; - menuHtml += item.name; - menuHtml += "

"; - } + } + else if (item.name) { + menuHtml += '

'; + menuHtml += item.name; + menuHtml += "

"; } } - return menuHtml += "
"; + return menuHtml + "
"; }); } @@ -487,7 +491,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " for (var i = 0, length = items.length; i < length; i++) { var view = items[i]; - if (list.push(view), "livetv" == view.CollectionType) { + list.push(view); + if ("livetv" == view.CollectionType) { view.ImageTags = {}; view.icon = "live_tv"; var guideView = Object.assign({}, view); @@ -509,28 +514,34 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (elem) { if (show) { elem.classList.remove("hide"); - } else { + } + else { elem.classList.add("hide"); } } } function updateLibraryMenu(user) { + // FIXME: Potential equivalent might be + // showBySelector(".lnkSyncToOtherDevices", !!user.Policy.EnableContentDownloading); if (!user) { showBySelector(".libraryMenuDownloads", false); showBySelector(".lnkSyncToOtherDevices", false); return void showBySelector(".userMenuOptions", false); } + // FIXME: Potentially the same as above if (user.Policy.EnableContentDownloading) { showBySelector(".lnkSyncToOtherDevices", true); - } else { + } + else { showBySelector(".lnkSyncToOtherDevices", false); } if (user.Policy.EnableContentDownloading && appHost.supports("sync")) { showBySelector(".libraryMenuDownloads", true); - } else { + } + else { showBySelector(".libraryMenuDownloads", false); } @@ -549,38 +560,38 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var icon = "folder"; var itemId = i.Id; - if ("channels" == i.CollectionType) { + if ("channels" === i.CollectionType) { itemId = "channels"; } - else if ("livetv" == i.CollectionType) { + else if ("livetv" === i.CollectionType) { itemId = "livetv"; } - else if ("photos" == i.CollectionType) { + else if ("photos" === i.CollectionType) { icon = "photo_library"; } - else if ("music" == i.CollectionType || "musicvideos" == i.CollectionType) { + else if ("music" === i.CollectionType || "musicvideos" === i.CollectionType) { icon = "library_music"; } - else if ("books" == i.CollectionType) { + else if ("books" === i.CollectionType) { icon = "library_books"; } - else if ("playlists" == i.CollectionType) { + else if ("playlists" === i.CollectionType) { icon = "view_list"; } - else if ("games" == i.CollectionType) { + else if ("games" === i.CollectionType) { icon = "games"; } - else if ("movies" == i.CollectionType) { + else if ("movies" === i.CollectionType) { icon = "video_library"; } - else if ("channels" == i.CollectionType || "Channel" == i.Type) { + else if ("channels" === i.CollectionType || "Channel" === i.Type) { icon = "videocam"; } - else if ("tvshows" == i.CollectionType) { + else if ("tvshows" === i.CollectionType) { icon = "tv"; } - else if ("livetv" == i.CollectionType) { + else if ("livetv" === i.CollectionType) { icon = "live_tv"; } icon = i.icon || icon; @@ -643,23 +654,23 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || ""; var elems = document.getElementsByClassName("lnkMediaFolder"); - for (i = 0, length = elems.length; i < length; i++) { + for (var i = 0, length = elems.length; i < length; i++) { var lnkMediaFolder = elems[i]; var itemId = lnkMediaFolder.getAttribute("data-itemid"); - if (isChannelsPage && "channels" == itemId) { + if (isChannelsPage && "channels" === itemId) { lnkMediaFolder.classList.add("navMenuOption-selected"); } - else if (isLiveTvPage && "livetv" == itemId) { + else if (isLiveTvPage && "livetv" === itemId) { lnkMediaFolder.classList.add("navMenuOption-selected"); } - else if (isEditorPage && "editor" == itemId) { + else if (isEditorPage && "editor" === itemId) { lnkMediaFolder.classList.add("navMenuOption-selected"); } - else if (isMySyncPage && "manageoffline" == itemId && -1 != window.location.href.toString().indexOf("mode=download")) { + else if (isMySyncPage && "manageoffline" === itemId && -1 != window.location.href.toString().indexOf("mode=download")) { lnkMediaFolder.classList.add("navMenuOption-selected"); } - else if (isMySyncPage && "syncotherdevices" == itemId && -1 == window.location.href.toString().indexOf("mode=download")) { + else if (isMySyncPage && "syncotherdevices" === itemId && -1 == window.location.href.toString().indexOf("mode=download")) { lnkMediaFolder.classList.add("navMenuOption-selected"); } else if (id && itemId == id) { @@ -724,16 +735,15 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (title) { LibraryMenu.setTitle(title); - } else { - if (page.classList.contains("standalonePage")) { - LibraryMenu.setDefaultTitle(); - } + } + else if (page.classList.contains("standalonePage")) { + LibraryMenu.setDefaultTitle(); } } function updateBackButton(page) { var isDashboardPage = page.classList.contains("type-interior"); - + if (!headerBackButton) { headerBackButton = document.querySelector(".headerBackButton"); } @@ -756,10 +766,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function refreshLibraryDrawer(user) { loadNavDrawer(); currentDrawerType = "library"; - (user ? Promise.resolve(user) : connectionManager.user(getCurrentApiClient())).then(function (user) { - refreshLibraryInfoInDrawer(user); - updateLibraryMenu(user.localUser); - }); + if (user) { + Promise.resolve(user); + } else { + connectionManager.user(getCurrentApiClient()).then(function (user) { + refreshLibraryInfoInDrawer(user); + updateLibraryMenu(user.localUser); + }); + } } function getNavDrawerOptions() { From 036cf6ef95c17d0a96d0b049b6ee25cde2b64f12 Mon Sep 17 00:00:00 2001 From: Sparky Date: Sat, 19 Jan 2019 12:24:10 -0500 Subject: [PATCH 5/7] Fix broken hamburger menu --- src/scripts/librarymenu.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index b3d26edafa..e3adf32f66 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -104,9 +104,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function bindMenuEvents() { - var mainDrawerButton = document.querySelector(".mainDrawerButton"); - - if (mainDrawerButton) { + if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { mainDrawerButton.addEventListener("click", toggleMainDrawer); } From 91b716199303f16b6949c7581dc13404a067adf0 Mon Sep 17 00:00:00 2001 From: Sparky Date: Sat, 19 Jan 2019 12:43:36 -0500 Subject: [PATCH 6/7] "Fix" Back updateBackButton evaluation --- src/scripts/librarymenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index e3adf32f66..ceac9327f2 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -747,7 +747,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } if (headerBackButton) { - if ("false" !== !isDashboardPage && page.getAttribute("data-backbutton") && appRouter.canGoBack()) { + if (page.getAttribute("data-backbutton") && appRouter.canGoBack()) { headerBackButton.classList.remove("hide"); } else { headerBackButton.classList.add("hide"); From 4f6102d68eb90a95caf07105e959b3746f5264a5 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 19 Jan 2019 12:49:31 -0500 Subject: [PATCH 7/7] Cleanup bindMenuEvents Suggested bu @Vasily --- src/scripts/librarymenu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index ceac9327f2..136eb96601 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -104,7 +104,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function bindMenuEvents() { - if (mainDrawerButton = document.querySelector(".mainDrawerButton")) { + mainDrawerButton = document.querySelector(".mainDrawerButton"); + if (mainDrawerButton) { mainDrawerButton.addEventListener("click", toggleMainDrawer); }