From 7e7613d5de732bc5b59164613252b680895fba77 Mon Sep 17 00:00:00 2001 From: Guilherme Danno Date: Fri, 8 May 2020 19:06:44 -0300 Subject: [PATCH 01/30] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2eae7e6933..65bb24e9fc 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,7 @@ - [Thibault Nocchi](https://github.com/ThibaultNocchi) - [MrTimscampi](https://github.com/MrTimscampi) - [Sarab Singh](https://github.com/sarab97) + - [GuilhermeHideki](https://github.com/GuilhermeHideki) # Emby Contributors From 934797e07409e7e56cbed10f67504eaf4f0c9d41 Mon Sep 17 00:00:00 2001 From: Guilherme Danno Date: Sun, 3 May 2020 20:45:14 -0300 Subject: [PATCH 02/30] feat: add mixins file --- src/styles/_mixins.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/styles/_mixins.scss diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss new file mode 100644 index 0000000000..ed23ab0833 --- /dev/null +++ b/src/styles/_mixins.scss @@ -0,0 +1,23 @@ +@mixin background-cover($position) { + background-position: $position; + background-repeat: no-repeat; + background-size: cover; +} + +@mixin circle($size) { + @include square($size); + border-radius: 100%; +} + +@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) { + position: $position; + top: $top; + right: $right; + bottom: $bottom; + left: $left; +} + +@mixin square($size) { + height: $size; + width: $size; +} From 81731f4a8ed10963c962ed4ca6ad9b3d9cde2c92 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 26 Jul 2020 10:37:04 +0100 Subject: [PATCH 03/30] Migration of notification and notifications to ES6 modules --- package.json | 2 + .../dashboard/notifications/notification.js | 221 +++++++++--------- .../dashboard/notifications/notifications.js | 108 ++++----- 3 files changed, 167 insertions(+), 164 deletions(-) diff --git a/package.json b/package.json index dbedd2922e..088e820a85 100644 --- a/package.json +++ b/package.json @@ -177,6 +177,8 @@ "src/controllers/dashboard/metadataImages.js", "src/controllers/dashboard/metadatanfo.js", "src/controllers/dashboard/networking.js", + "src/controllers/dashboard/notifications/notification.js", + "src/controllers/dashboard/notifications/notifications.js", "src/controllers/dashboard/playback.js", "src/controllers/dashboard/plugins/repositories.js", "src/controllers/dashboard/scheduledtasks/scheduledtask.js", diff --git a/src/controllers/dashboard/notifications/notification.js b/src/controllers/dashboard/notifications/notification.js index af9301c13f..013e505f36 100644 --- a/src/controllers/dashboard/notifications/notification.js +++ b/src/controllers/dashboard/notifications/notification.js @@ -1,119 +1,118 @@ -define(['jQuery', 'emby-checkbox'], function ($) { - 'use strict'; +import $ from 'jQuery'; +import 'emby-checkbox'; - function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { - var html = '
'; - html += items.map(function (u) { - var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1; - var checkedHtml = isChecked ? ' checked="checked"' : ''; - return ''; - }).join(''); - html += '
'; - elem.html(html).trigger('create'); - } +function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { + let html = '
'; + html += items.map(function (u) { + const isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1; + const checkedHtml = isChecked ? ' checked="checked"' : ''; + return ''; + }).join(''); + html += '
'; + elem.html(html).trigger('create'); +} - function reload(page) { - var type = getParameterByName('type'); - var promise1 = ApiClient.getUsers(); - var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - var promise3 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); - var promise4 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Services')); - Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { - var users = responses[0]; - var notificationOptions = responses[1]; - var types = responses[2]; - var services = responses[3]; - var notificationConfig = notificationOptions.Options.filter(function (n) { - return n.Type == type; - })[0]; - var typeInfo = types.filter(function (n) { - return n.Type == type; - })[0] || {}; +function reload(page) { + const type = getParameterByName('type'); + const promise1 = ApiClient.getUsers(); + const promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); + const promise3 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); + const promise4 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Services')); + Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { + const users = responses[0]; + const notificationOptions = responses[1]; + const types = responses[2]; + const services = responses[3]; + let notificationConfig = notificationOptions.Options.filter(function (n) { + return n.Type == type; + })[0]; + const typeInfo = types.filter(function (n) { + return n.Type == type; + })[0] || {}; - if (typeInfo.IsBasedOnUserEvent) { - $('.monitorUsers', page).show(); - } else { - $('.monitorUsers', page).hide(); - } + if (typeInfo.IsBasedOnUserEvent) { + $('.monitorUsers', page).show(); + } else { + $('.monitorUsers', page).hide(); + } - $('.notificationType', page).html(typeInfo.Name || 'Unknown Notification'); + $('.notificationType', page).html(typeInfo.Name || 'Unknown Notification'); - if (!notificationConfig) { - notificationConfig = { - DisabledMonitorUsers: [], - SendToUsers: [], - DisabledServices: [], - SendToUserMode: 'Admins' - }; - } + if (!notificationConfig) { + notificationConfig = { + DisabledMonitorUsers: [], + SendToUsers: [], + DisabledServices: [], + SendToUserMode: 'Admins' + }; + } - fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers); - fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true); - fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices); - $('#chkEnabled', page).prop('checked', notificationConfig.Enabled || false); - $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); - }); - } - - function save(page) { - var type = getParameterByName('type'); - var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - // TODO: Check if this promise is really needed, as it's unused. - var promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); - Promise.all([promise1, promise2]).then(function (responses) { - var notificationOptions = responses[0]; - var notificationConfig = notificationOptions.Options.filter(function (n) { - return n.Type == type; - })[0]; - - if (!notificationConfig) { - notificationConfig = { - Type: type - }; - notificationOptions.Options.push(notificationConfig); - } - - notificationConfig.Enabled = $('#chkEnabled', page).is(':checked'); - notificationConfig.SendToUserMode = $('#selectUsers', page).val(); - notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - notificationConfig.SendToUsers = $('.chkSendTo', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - notificationConfig.DisabledServices = $('.chkService', page).get().filter(function (c) { - return !c.checked; - }).map(function (c) { - return c.getAttribute('data-itemid'); - }); - ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) { - Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate('notificationsettings.html'); - }); - }); - } - - function onSubmit() { - save($(this).parents('.page')); - return false; - } - - var notificationsConfigurationKey = 'notifications'; - $(document).on('pageinit', '#notificationSettingPage', function () { - var page = this; - $('#selectUsers', page).on('change', function () { - if ('Custom' == this.value) { - $('.selectCustomUsers', page).show(); - } else { - $('.selectCustomUsers', page).hide(); - } - }); - $('.notificationSettingForm').off('submit', onSubmit).on('submit', onSubmit); - }).on('pageshow', '#notificationSettingPage', function () { - reload(this); + fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers); + fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true); + fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices); + $('#chkEnabled', page).prop('checked', notificationConfig.Enabled || false); + $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); }); +} + +function save(page) { + const type = getParameterByName('type'); + const promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); + // TODO: Check if this promise is really needed, as it's unused. + const promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); + Promise.all([promise1, promise2]).then(function (responses) { + const notificationOptions = responses[0]; + let notificationConfig = notificationOptions.Options.filter(function (n) { + return n.Type == type; + })[0]; + + if (!notificationConfig) { + notificationConfig = { + Type: type + }; + notificationOptions.Options.push(notificationConfig); + } + + notificationConfig.Enabled = $('#chkEnabled', page).is(':checked'); + notificationConfig.SendToUserMode = $('#selectUsers', page).val(); + notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { + return !c.checked; + }).map(function (c) { + return c.getAttribute('data-itemid'); + }); + notificationConfig.SendToUsers = $('.chkSendTo', page).get().filter(function (c) { + return c.checked; + }).map(function (c) { + return c.getAttribute('data-itemid'); + }); + notificationConfig.DisabledServices = $('.chkService', page).get().filter(function (c) { + return !c.checked; + }).map(function (c) { + return c.getAttribute('data-itemid'); + }); + ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) { + Dashboard.processServerConfigurationUpdateResult(); + Dashboard.navigate('notificationsettings.html'); + }); + }); +} + +function onSubmit() { + save($(this).parents('.page')); + return false; +} + +const notificationsConfigurationKey = 'notifications'; +$(document).on('pageinit', '#notificationSettingPage', function () { + const page = this; + $('#selectUsers', page).on('change', function () { + if ('Custom' == this.value) { + $('.selectCustomUsers', page).show(); + } else { + $('.selectCustomUsers', page).hide(); + } + }); + $('.notificationSettingForm').off('submit', onSubmit).on('submit', onSubmit); +}).on('pageshow', '#notificationSettingPage', function () { + reload(this); }); diff --git a/src/controllers/dashboard/notifications/notifications.js b/src/controllers/dashboard/notifications/notifications.js index 4e049bc106..d12a5f2e61 100644 --- a/src/controllers/dashboard/notifications/notifications.js +++ b/src/controllers/dashboard/notifications/notifications.js @@ -1,60 +1,62 @@ -define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'], function(loading, libraryMenu, globalize) { - 'use strict'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import 'listViewStyle'; +import 'emby-button'; - function reload(page) { - loading.show(); - ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function(list) { - var html = ''; - var lastCategory = ''; - var showHelp = true; - html += list.map(function(notification) { - var itemHtml = ''; - if (notification.Category !== lastCategory) { - lastCategory = notification.Category; - if (lastCategory) { - itemHtml += ''; - itemHtml += ''; - } - itemHtml += '
'; - itemHtml += '
'; - itemHtml += '

'; - itemHtml += notification.Category; - itemHtml += '

'; - if (showHelp) { - showHelp = false; - itemHtml += ''; - itemHtml += globalize.translate('Help'); - itemHtml += ''; - } +function reload(page) { + loading.show(); + ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function (list) { + let html = ''; + let lastCategory = ''; + let showHelp = true; + html += list.map(function (notification) { + let itemHtml = ''; + if (notification.Category !== lastCategory) { + lastCategory = notification.Category; + if (lastCategory) { + itemHtml += '
'; itemHtml += '
'; - itemHtml += '
'; } - itemHtml += ''; - if (notification.Enabled) { - itemHtml += ''; - } else { - itemHtml += ''; + itemHtml += '
'; + itemHtml += '
'; + itemHtml += '

'; + itemHtml += notification.Category; + itemHtml += '

'; + if (showHelp) { + showHelp = false; + itemHtml += '
'; + itemHtml += globalize.translate('Help'); + itemHtml += ''; } - itemHtml += '
'; - itemHtml += '
' + notification.Name + '
'; itemHtml += '
'; - itemHtml += ''; - itemHtml += ''; - return itemHtml; - }).join(''); - - if (list.length) { - html += '
'; - html += '
'; + itemHtml += '
'; } - page.querySelector('.notificationList').innerHTML = html; - loading.hide(); - }); - } + itemHtml += ''; + if (notification.Enabled) { + itemHtml += ''; + } else { + itemHtml += ''; + } + itemHtml += '
'; + itemHtml += '
' + notification.Name + '
'; + itemHtml += '
'; + itemHtml += ''; + itemHtml += '
'; + return itemHtml; + }).join(''); - return function(view, params) { - view.addEventListener('viewshow', function() { - reload(view); - }); - }; -}); + if (list.length) { + html += '
'; + html += '
'; + } + page.querySelector('.notificationList').innerHTML = html; + loading.hide(); + }); +} + +export default function (view, params) { + view.addEventListener('viewshow', function () { + reload(view); + }); +} From 287cc06963b5935e1a7979c763d26a1cc7d3d17f Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 26 Jul 2020 11:29:02 +0100 Subject: [PATCH 04/30] Migration of edititemmetadata to ES6 module --- package.json | 1 + src/controllers/edititemmetadata.js | 51 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index dbedd2922e..ecb33b77c8 100644 --- a/package.json +++ b/package.json @@ -189,6 +189,7 @@ "src/controllers/dashboard/users/userparentalcontrol.js", "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", + "src/controllers/edititemmetadata.js", "src/controllers/playback/nowplaying.js", "src/controllers/playback/videoosd.js", "src/controllers/searchpage.js", diff --git a/src/controllers/edititemmetadata.js b/src/controllers/edititemmetadata.js index 1a3647a758..57c72dda28 100644 --- a/src/controllers/edititemmetadata.js +++ b/src/controllers/edititemmetadata.js @@ -1,31 +1,30 @@ -define(['loading', 'scripts/editorsidebar'], function (loading) { - 'use strict'; +import loading from 'loading'; +import 'scripts/editorsidebar'; - function reload(context, itemId) { - loading.show(); +function reload(context, itemId) { + loading.show(); - if (itemId) { - require(['metadataEditor'], function ({default: metadataEditor}) { - metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); - }); - } else { - context.querySelector('.editPageInnerContent').innerHTML = ''; - loading.hide(); - } + if (itemId) { + import('metadataEditor').then(({ default: metadataEditor }) => { + metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); + }); + } else { + context.querySelector('.editPageInnerContent').innerHTML = ''; + loading.hide(); } +} - return function (view, params) { - view.addEventListener('viewshow', function () { - reload(this, MetadataEditor.getCurrentItemId()); - }); - MetadataEditor.setCurrentItemId(null); - view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { - var data = event.detail; +export default function (view, params) { + view.addEventListener('viewshow', function () { + reload(this, MetadataEditor.getCurrentItemId()); + }); + MetadataEditor.setCurrentItemId(null); + view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { + var data = event.detail; - if (data.id != MetadataEditor.getCurrentItemId()) { - MetadataEditor.setCurrentItemId(data.id); - reload(view, data.id); - } - }); - }; -}); + if (data.id != MetadataEditor.getCurrentItemId()) { + MetadataEditor.setCurrentItemId(data.id); + reload(view, data.id); + } + }); +} From 3658b4471a1314d32bb84eb0cb83f6149fc5da1a Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 26 Jul 2020 11:29:26 +0100 Subject: [PATCH 05/30] Migration of Favorites and Hometab to ES6 modules --- package.json | 2 + src/controllers/favorites.js | 108 +++++++++++++++++++---------------- src/controllers/home.js | 2 +- src/controllers/hometab.js | 67 +++++++++++----------- 4 files changed, 97 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index ecb33b77c8..de3fe62adc 100644 --- a/package.json +++ b/package.json @@ -190,6 +190,8 @@ "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", "src/controllers/edititemmetadata.js", + "src/controllers/favorites.js", + "src/controllers/hometab.js", "src/controllers/playback/nowplaying.js", "src/controllers/playback/videoosd.js", "src/controllers/searchpage.js", diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index b4c7936239..532801bfaf 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,5 +1,15 @@ -define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'emby-itemscontainer', 'emby-scroller'], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { - 'use strict'; +import appRouter from 'appRouter'; +import cardBuilder from 'cardBuilder'; +import dom from 'dom'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import appHost from 'apphost'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import 'emby-itemscontainer'; +import 'emby-scroller'; + +/* eslint-disable indent */ function enableScrollX() { return true; @@ -133,8 +143,8 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap function getFetchDataFn(section) { return function () { - var apiClient = this.apiClient; - var options = { + const apiClient = this.apiClient; + const options = { SortBy: (section.types, 'SeriesName,SortName'), SortOrder: 'Ascending', Filters: 'IsFavorite', @@ -145,7 +155,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap EnableTotalRecordCount: false }; options.Limit = 20; - var userId = apiClient.getCurrentUserId(); + const userId = apiClient.getCurrentUserId(); if ('MusicArtist' === section.types) { return apiClient.getArtists(userId, options); @@ -170,17 +180,17 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap function getItemsHtmlFn(section) { return function (items) { - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; + const supportsImageAnalysis = appHost.supports('imageanalysis'); + let cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; cardLayout = false; - var serverId = this.apiClient.serverId(); - var leadingButtons = layoutManager.tv ? [{ + const serverId = this.apiClient.serverId(); + const leadingButtons = layoutManager.tv ? [{ name: globalize.translate('All'), id: 'more', icon: 'favorite', routeUrl: getRouteUrl(section, serverId) }] : null; - var lines = 0; + let lines = 0; if (section.showTitle) { lines++; @@ -216,23 +226,12 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap }; } - function FavoritesTab(view, params) { - this.view = view; - this.params = params; - this.apiClient = connectionManager.currentApiClient(); - this.sectionsContainer = view.querySelector('.sections'); - createSections(this, this.sectionsContainer, this.apiClient); - } - function createSections(instance, elem, apiClient) { - var i; - var length; - var sections = getSections(); - var html = ''; + const sections = getSections(); + let html = ''; - for (i = 0, length = sections.length; i < length; i++) { - var section = sections[i]; - var sectionClass = 'verticalSection'; + for (const section of sections) { + let sectionClass = 'verticalSection'; if (!section.showTitle) { sectionClass += ' verticalSection-extrabottompadding'; @@ -258,23 +257,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap } elem.innerHTML = html; - var elems = elem.querySelectorAll('.itemsContainer'); + const elems = elem.querySelectorAll('.itemsContainer'); - for (i = 0, length = elems.length; i < length; i++) { - var itemsContainer = elems[i]; + for (let i = 0, length = elems.length; i < length; i++) { + const itemsContainer = elems[i]; itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance); itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance); itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, 'verticalSection'); } } - FavoritesTab.prototype.onResume = function (options) { - var promises = (this.apiClient, []); - var view = this.view; - var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); +class FavoritesTab { + constructor(view, params) { + this.view = view; + this.params = params; + this.apiClient = connectionManager.currentApiClient(); + this.sectionsContainer = view.querySelector('.sections'); + createSections(this, this.sectionsContainer, this.apiClient); + } - for (var i = 0, length = elems.length; i < length; i++) { - promises.push(elems[i].resume(options)); + onResume(options) { + const promises = (this.apiClient, []); + const view = this.view; + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + + for (const elem of elems) { + promises.push(elem.resume(options)); } Promise.all(promises).then(function () { @@ -282,30 +290,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap focusManager.autoFocus(view); } }); - }; + } - FavoritesTab.prototype.onPause = function () { - var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + onPause() { + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].pause(); + for (const elem of elems) { + elem.pause(); } - }; + } - FavoritesTab.prototype.destroy = function () { + destroy() { this.view = null; this.params = null; this.apiClient = null; - var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].fetchData = null; - elems[i].getItemsHtml = null; - elems[i].parentContainer = null; + for (const elem of elems) { + elem.fetchData = null; + elem.getItemsHtml = null; + elem.parentContainer = null; } this.sectionsContainer = null; - }; + } +} - return FavoritesTab; -}); +export default FavoritesTab; + +/* eslint-enable indent */ diff --git a/src/controllers/home.js b/src/controllers/home.js index 9a4cea2227..ea3fef3ce2 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -40,7 +40,7 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby- var controller = instance.tabControllers[index]; if (!controller) { - controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params); + controller = new controllerFactory.default(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params); instance.tabControllers[index] = controller; } diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index 8e2a1f92e7..4b7ddee057 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,27 +1,23 @@ -define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { - 'use strict'; +import * as userSettings from 'userSettings'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import appHost from 'apphost'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import homeSections from 'homeSections'; +import 'emby-itemscontainer'; - function HomeTab(view, params) { +class HomeTab { + constructor(view, params) { this.view = view; this.params = params; this.apiClient = connectionManager.currentApiClient(); this.sectionsContainer = view.querySelector('.sections'); view.querySelector('.sections').addEventListener('settingschange', onHomeScreenSettingsChanged.bind(this)); } - - function onHomeScreenSettingsChanged() { - this.sectionsRendered = false; - - if (!this.paused) { - this.onResume({ - refresh: true - }); - } - } - - HomeTab.prototype.onResume = function (options) { + onResume(options) { if (this.sectionsRendered) { - var sectionsContainer = this.sectionsContainer; + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { return homeSections.resume(sectionsContainer, options); @@ -31,8 +27,8 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage } loading.show(); - var view = this.view; - var apiClient = this.apiClient; + const view = this.view; + const apiClient = this.apiClient; this.destroyHomeSections(); this.sectionsRendered = true; return apiClient.getCurrentUser().then(function (user) { @@ -44,31 +40,38 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage loading.hide(); }); }); - }; - - HomeTab.prototype.onPause = function () { - var sectionsContainer = this.sectionsContainer; + } + onPause() { + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { homeSections.pause(sectionsContainer); } - }; - - HomeTab.prototype.destroy = function () { + } + destroy() { this.view = null; this.params = null; this.apiClient = null; this.destroyHomeSections(); this.sectionsContainer = null; - }; - - HomeTab.prototype.destroyHomeSections = function () { - var sectionsContainer = this.sectionsContainer; + } + destroyHomeSections() { + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { homeSections.destroySections(sectionsContainer); } - }; + } +} - return HomeTab; -}); +function onHomeScreenSettingsChanged() { + this.sectionsRendered = false; + + if (!this.paused) { + this.onResume({ + refresh: true + }); + } +} + +export default HomeTab; From b6dfeb59fca3dffae15eaa0bdfcedbff94f6e7bb Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 27 Jul 2020 10:26:09 +0100 Subject: [PATCH 06/30] Migration of toast and upnextdialog to ES6 modules --- package.json | 2 + src/components/toast/toast.js | 66 ++++++++++----------- src/components/upnextdialog/upnextdialog.js | 40 ++++++++----- 3 files changed, 60 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index da8c87aedd..e88a68efbd 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,8 @@ "src/components/syncPlay/playbackPermissionManager.js", "src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/timeSyncManager.js", + "src/components/toast/toast.js", + "src/components/upnextdialog/upnextdialog.js", "src/controllers/session/addServer/index.js", "src/controllers/session/forgotPassword/index.js", "src/controllers/session/redeemPassword/index.js", diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index 7b8e49e4d2..36226ab8e3 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -1,42 +1,40 @@ -define(['css!./toast'], function () { - 'use strict'; +import 'css!./toast'; - function remove(elem) { +function remove(elem) { - setTimeout(function () { - elem.parentNode.removeChild(elem); - }, 300); + setTimeout(function () { + elem.parentNode.removeChild(elem); + }, 300); +} + +function animateRemove(elem) { + + setTimeout(function () { + + elem.classList.remove('toastVisible'); + remove(elem); + + }, 3300); +} + +export default function (options) { + + if (typeof options === 'string') { + options = { + text: options + }; } - function animateRemove(elem) { + var elem = document.createElement('div'); + elem.classList.add('toast'); + elem.innerHTML = options.text; - setTimeout(function () { + document.body.appendChild(elem); - elem.classList.remove('toastVisible'); - remove(elem); + setTimeout(function () { + elem.classList.add('toastVisible'); - }, 3300); - } + animateRemove(elem); - return function (options) { - - if (typeof options === 'string') { - options = { - text: options - }; - } - - var elem = document.createElement('div'); - elem.classList.add('toast'); - elem.innerHTML = options.text; - - document.body.appendChild(elem); - - setTimeout(function () { - elem.classList.add('toastVisible'); - - animateRemove(elem); - - }, 300); - }; -}); + }, 300); +} diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 3e9c9f9c5e..e45b3d5951 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -1,5 +1,17 @@ -define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) { - 'use strict'; +import dom from 'dom'; +import playbackManager from 'playbackManager'; +import connectionManager from 'connectionManager'; +import events from 'events'; +import mediaInfo from 'mediaInfo'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import globalize from 'globalize'; +import itemHelper from 'itemHelper'; +import 'css!./upnextdialog'; +import 'emby-button'; +import 'flexStyles'; + +/* eslint-disable indent */ var transitionEndEventName = dom.whichTransitionEvent(); @@ -289,14 +301,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l instance._countdownTextTimeout = setInterval(setNextVideoText.bind(instance), 400); } - function UpNextDialog(options) { +class UpNextDialog { + constructor(options) { this.options = options; init(this, options); } - - UpNextDialog.prototype.show = function () { + show() { var elem = this.options.parent; @@ -316,20 +328,20 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } startComingUpNextHideTimer(this); - }; - - UpNextDialog.prototype.hide = function () { + } + hide() { hideComingUpNext.call(this); - }; - - UpNextDialog.prototype.destroy = function () { + } + destroy() { hideComingUpNext.call(this); this.options = null; this.itemType = null; - }; + } +} - return UpNextDialog; -}); +export default UpNextDialog; + +/* eslint-enable indent */ From 1d74c5c85a57263a051c5bcc6e63dd609f0fa525 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 27 Jul 2020 10:30:24 +0100 Subject: [PATCH 07/30] Update variables --- src/components/toast/toast.js | 2 +- src/components/upnextdialog/upnextdialog.js | 48 ++++++++++----------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index 36226ab8e3..5eacc2787b 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -25,7 +25,7 @@ export default function (options) { }; } - var elem = document.createElement('div'); + const elem = document.createElement('div'); elem.classList.add('toast'); elem.innerHTML = options.text; diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index e45b3d5951..9879f0ed47 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -13,7 +13,7 @@ import 'flexStyles'; /* eslint-disable indent */ - var transitionEndEventName = dom.whichTransitionEvent(); + const transitionEndEventName = dom.whichTransitionEvent(); function seriesImageUrl(item, options) { @@ -79,7 +79,7 @@ import 'flexStyles'; if (item) { - var imgUrl = seriesImageUrl(item, { type: 'Primary' }) || + let imgUrl = seriesImageUrl(item, { type: 'Primary' }) || seriesImageUrl(item, { type: 'Thumb' }) || imageUrl(item, { type: 'Primary' }); @@ -100,7 +100,7 @@ import 'flexStyles'; function getHtml() { - var html = ''; + let html = ''; html += '
'; html += '
'; @@ -137,17 +137,17 @@ import 'flexStyles'; function setNextVideoText() { - var instance = this; + const instance = this; - var elem = instance.options.parent; + const elem = instance.options.parent; - var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); + const secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); console.debug('up next seconds remaining: ' + secondsRemaining); - var timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; + const timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; - var nextVideoText = instance.itemType === 'Episode' ? + const nextVideoText = instance.itemType === 'Episode' ? globalize.translate('HeaderNextEpisodePlayingInValue', timeText) : globalize.translate('HeaderNextVideoPlayingInValue', timeText); @@ -156,9 +156,9 @@ import 'flexStyles'; function fillItem(item) { - var instance = this; + const instance = this; - var elem = instance.options.parent; + const elem = instance.options.parent; setPoster(elem.querySelector('.upNextDialog-poster'), item); @@ -167,7 +167,7 @@ import 'flexStyles'; elem.querySelector('.upNextDialog-mediainfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, { }); - var title = itemHelper.getDisplayName(item); + let title = itemHelper.getDisplayName(item); if (item.SeriesName) { title = item.SeriesName + ' - ' + title; } @@ -188,11 +188,11 @@ import 'flexStyles'; function onStartNowClick() { - var options = this.options; + const options = this.options; if (options) { - var player = options.player; + const player = options.player; this.hide(); @@ -216,7 +216,7 @@ import 'flexStyles'; function clearHideAnimationEventListeners(instance, elem) { - var fn = instance._onHideAnimationComplete; + const fn = instance._onHideAnimationComplete; if (fn) { dom.removeEventListener(elem, transitionEndEventName, fn, { @@ -227,8 +227,8 @@ import 'flexStyles'; function onHideAnimationComplete(e) { - var instance = this; - var elem = e.target; + const instance = this; + const elem = e.target; elem.classList.add('hide'); @@ -238,14 +238,14 @@ import 'flexStyles'; function hideComingUpNext() { - var instance = this; + const instance = this; clearCountdownTextTimeout(this); if (!instance.options) { return; } - var elem = instance.options.parent; + const elem = instance.options.parent; if (!elem) { return; @@ -262,7 +262,7 @@ import 'flexStyles'; elem.classList.add('upNextDialog-hidden'); - var fn = onHideAnimationComplete.bind(instance); + const fn = onHideAnimationComplete.bind(instance); instance._onHideAnimationComplete = fn; dom.addEventListener(elem, transitionEndEventName, fn, { @@ -272,13 +272,13 @@ import 'flexStyles'; function getTimeRemainingMs(instance) { - var options = instance.options; + const options = instance.options; if (options) { - var runtimeTicks = playbackManager.duration(options.player); + const runtimeTicks = playbackManager.duration(options.player); if (runtimeTicks) { - var timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player); + const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player); return Math.round(timeRemainingTicks / 10000); } @@ -289,7 +289,7 @@ import 'flexStyles'; function startComingUpNextHideTimer(instance) { - var timeRemainingMs = getTimeRemainingMs(instance); + const timeRemainingMs = getTimeRemainingMs(instance); if (timeRemainingMs <= 0) { return; @@ -310,7 +310,7 @@ class UpNextDialog { } show() { - var elem = this.options.parent; + const elem = this.options.parent; clearHideAnimationEventListeners(this, elem); From 951d3ffc498f1f22735a04b5cdde643fb8f92313 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 27 Jul 2020 10:32:48 +0100 Subject: [PATCH 08/30] Update site.js --- src/scripts/site.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index cddf2506a0..85e8c427d0 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -152,13 +152,13 @@ var Dashboard = { processPluginConfigurationUpdateResult: function () { require(['loading', 'toast'], function (loading, toast) { loading.hide(); - toast(Globalize.translate('MessageSettingsSaved')); + toast.default(Globalize.translate('MessageSettingsSaved')); }); }, processServerConfigurationUpdateResult: function (result) { require(['loading', 'toast'], function (loading, toast) { loading.hide(); - toast(Globalize.translate('MessageSettingsSaved')); + toast.default(Globalize.translate('MessageSettingsSaved')); }); }, processErrorResponse: function (response) { @@ -180,7 +180,7 @@ var Dashboard = { alert: function (options) { if ('string' == typeof options) { return void require(['toast'], function (toast) { - toast({ + toast.default({ text: options }); }); From e2b7daf4b70e982a49cd672d9ff0788e419d4368 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 27 Jul 2020 13:08:16 +0100 Subject: [PATCH 09/30] fix lint --- src/components/imageeditor/imageeditor.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 0a873fa4c7..96c179404a 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -51,7 +51,6 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages'); for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) { - if (providers.length) { btnBrowseAllImages[i].classList.remove('hide'); } else { @@ -60,7 +59,6 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } apiClient.getItemImageInfos(currentItem.Id).then(function (imageInfos) { - renderStandardImages(page, apiClient, item, imageInfos, providers); renderBackdrops(page, apiClient, item, imageInfos, providers); renderScreenshots(page, apiClient, item, imageInfos, providers); From 116e73e5606a47da15c2cacb74f829f02c24924d Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 31 Jul 2020 11:30:02 +0100 Subject: [PATCH 10/30] Remove unused vars --- src/controllers/hometab.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index 4b7ddee057..d834e3e233 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,8 +1,6 @@ import * as userSettings from 'userSettings'; import loading from 'loading'; import connectionManager from 'connectionManager'; -import appHost from 'apphost'; -import layoutManager from 'layoutManager'; import focusManager from 'focusManager'; import homeSections from 'homeSections'; import 'emby-itemscontainer'; From 39a1d94c500134b45591a6d48fca02013cf8e159 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Sat, 1 Aug 2020 14:52:15 +0200 Subject: [PATCH 11/30] Migrated to es6 module --- package.json | 1 + src/controllers/livetvguideprovider.js | 50 +++++++++++++------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 17d175b7e7..efe1fcc2fa 100644 --- a/package.json +++ b/package.json @@ -207,6 +207,7 @@ "src/controllers/searchpage.js", "src/controllers/livetvtuner.js", "src/controllers/livetvstatus.js", + "src/controllers/livetvguideprovider.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index 8f8b9f91c7..6ab195a088 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -1,30 +1,30 @@ -define(['events', 'loading', 'globalize'], function (events, loading, globalize) { - 'use strict'; +import events from 'events'; +import loading from 'loading'; +import globalize from 'globalize'; - function onListingsSubmitted() { - Dashboard.navigate('livetvstatus.html'); - } +function onListingsSubmitted() { + Dashboard.navigate('livetvstatus.html'); +} - function init(page, type, providerId) { - var url = 'components/tvproviders/' + type + '.js'; +function init(page, type, providerId) { + const url = 'components/tvproviders/' + type + '.js'; - require([url], function (factory) { - var instance = new factory(page, providerId, {}); - events.on(instance, 'submitted', onListingsSubmitted); - instance.init(); - }); - } - - function loadTemplate(page, type, providerId) { - require(['text!./components/tvproviders/' + type + '.template.html'], function (html) { - page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); - init(page, type, providerId); - }); - } - - pageIdOn('pageshow', 'liveTvGuideProviderPage', function () { - loading.show(); - var providerId = getParameterByName('id'); - loadTemplate(this, getParameterByName('type'), providerId); + import(url).then(({default: factory}) => { + const instance = new factory(page, providerId, {}); + events.on(instance, 'submitted', onListingsSubmitted); + instance.init(); }); +} + +function loadTemplate(page, type, providerId) { + import('text!./../components/tvproviders/' + type + '.template.html').then(({default: html}) => { + page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); + init(page, type, providerId); + }); +} + +pageIdOn('pageshow', 'liveTvGuideProviderPage', function () { + loading.show(); + const providerId = getParameterByName('id'); + loadTemplate(this, getParameterByName('type'), providerId); }); From 1fe25e14ddb6131be62b1ed4dbb12f3a821a5702 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 2 Aug 2020 17:28:25 +0900 Subject: [PATCH 12/30] move themes and plugins into config file --- package.json | 2 + src/components/appRouter.js | 17 +- src/components/apphost.js | 9 +- .../displaySettings/displaySettings.js | 114 ++--------- .../displaySettings.template.html | 20 -- src/components/skinManager.js | 184 ------------------ src/config.template.json | 36 +++- src/index.html | 8 +- src/manifest.json | 2 +- ...romecastHelpers.js => chromecastHelper.js} | 0 src/plugins/chromecastPlayer/plugin.js | 2 +- src/scripts/autoThemes.js | 8 + src/scripts/inputManager.js | 1 + src/scripts/settings/appSettings.js | 41 ---- src/scripts/settings/webSettings.js | 20 +- src/scripts/site.js | 57 +++--- src/scripts/themeLoader.js | 29 --- src/scripts/themeManager.js | 66 +++++++ 18 files changed, 180 insertions(+), 436 deletions(-) delete mode 100644 src/components/skinManager.js rename src/plugins/chromecastPlayer/{chromecastHelpers.js => chromecastHelper.js} (100%) create mode 100644 src/scripts/autoThemes.js delete mode 100644 src/scripts/themeLoader.js create mode 100644 src/scripts/themeManager.js diff --git a/package.json b/package.json index 7943c22e54..8e725e1052 100644 --- a/package.json +++ b/package.json @@ -266,6 +266,8 @@ "src/scripts/globalize.js", "src/scripts/imagehelper.js", "src/scripts/inputManager.js", + "src/scripts/autoThemes.js", + "src/scripts/themeManager.js", "src/scripts/keyboardNavigation.js", "src/scripts/libraryBrowser.js", "src/scripts/multiDownload.js", diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 8c9b953d39..5dbcf765be 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -36,7 +36,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro switch (result.State) { case 'SignedIn': loading.hide(); - skinManager.loadUserSkin(); + Emby.Page.goHome(); break; case 'ServerSignIn': result.ApiClient.getPublicUsers().then(function (users) { @@ -149,7 +149,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro if (typeof route.path === 'string') { loadContentUrl(ctx, next, route, currentRequest); } else { - // ? TODO next(); } }; @@ -287,12 +286,9 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro connectionManager.connect({ enableAutoLogin: appSettings.enableAutoLogin() - }).then(function (result) { firstConnectionResult = result; - options = options || {}; - page({ click: options.click !== false, hashbang: options.hashbang !== false @@ -344,7 +340,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro if (route.isDefaultRoute) { console.debug('appRouter - loading skin home page'); - loadUserSkinWithOptions(ctx); + Emby.Page.goHome(); return; } else if (route.roles) { validateRoles(apiClient, route.roles).then(function () { @@ -358,15 +354,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro callback(); } - function loadUserSkinWithOptions(ctx) { - require(['queryString'], function (queryString) { - var params = queryString.parse(ctx.querystring); - skinManager.loadUserSkin({ - start: params.start - }); - }); - } - function validateRoles(apiClient, roles) { return Promise.all(roles.split(',').map(function (role) { return validateRole(apiClient, role); diff --git a/src/components/apphost.js b/src/components/apphost.js index 8a5581d817..931fcae1db 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -277,7 +277,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g features.push('targetblank'); features.push('screensaver'); - webSettings.enableMultiServer().then(enabled => { + webSettings.getMultiServer().then(enabled => { if (enabled) features.push('multiserver'); }); @@ -407,13 +407,6 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g getPushTokenInfo: function () { return {}; }, - setThemeColor: function (color) { - var metaThemeColor = document.querySelector('meta[name=theme-color]'); - - if (metaThemeColor) { - metaThemeColor.setAttribute('content', color); - } - }, setUserScalable: function (scalable) { if (!browser.tv) { var att = scalable ? 'width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes' : 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no'; diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index ba78ab99e1..d9c2fc0b49 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -16,17 +16,22 @@ import 'emby-button'; /* eslint-disable indent */ - function fillThemes(select, isDashboard) { - select.innerHTML = skinManager.getThemes().map(t => { - let value = t.id; - if (t.isDefault && !isDashboard) { - value = ''; - } else if (t.isDefaultServerDashboard && isDashboard) { - value = ''; - } + function fillThemes(context, userSettings) { + const select = context.querySelector('#selectTheme'); - return ``; - }).join(''); + skinManager.getThemes().then(themes => { + select.innerHTML = themes.map(t => { + return ``; + }).join(''); + + // get default theme + var defaultTheme = themes.find(theme => { + return theme.default; + }); + + // set the current theme + select.value = userSettings.theme() || defaultTheme.id; + }); } function loadScreensavers(context, userSettings) { @@ -46,6 +51,7 @@ import 'emby-button'; selectScreensaver.innerHTML = options.map(o => { return ``; }).join(''); + selectScreensaver.value = userSettings.screensaver(); if (!selectScreensaver.value) { @@ -54,57 +60,6 @@ import 'emby-button'; } } - function loadSoundEffects(context, userSettings) { - const selectSoundEffects = context.querySelector('.selectSoundEffects'); - const options = pluginManager.ofType('soundeffects').map(plugin => { - return { - name: plugin.name, - value: plugin.id - }; - }); - - options.unshift({ - name: globalize.translate('None'), - value: 'none' - }); - - selectSoundEffects.innerHTML = options.map(o => { - return ``; - }).join(''); - selectSoundEffects.value = userSettings.soundEffects(); - - if (!selectSoundEffects.value) { - // TODO: set the default instead of none - selectSoundEffects.value = 'none'; - } - } - - function loadSkins(context, userSettings) { - const selectSkin = context.querySelector('.selectSkin'); - - const options = pluginManager.ofType('skin').map(plugin => { - return { - name: plugin.name, - value: plugin.id - }; - }); - - selectSkin.innerHTML = options.map(o => { - return ``; - }).join(''); - selectSkin.value = userSettings.skin(); - - if (!selectSkin.value && options.length) { - selectSkin.value = options[0].value; - } - - if (options.length > 1 && appHost.supports('skins')) { - context.querySelector('.selectSkinContainer').classList.remove('hide'); - } else { - context.querySelector('.selectSkinContainer').classList.add('hide'); - } - } - function showOrHideMissingEpisodesField(context) { if (browser.tizen || browser.web0s) { context.querySelector('.fldDisplayMissingEpisodes').classList.add('hide'); @@ -115,12 +70,6 @@ import 'emby-button'; } function loadForm(context, user, userSettings) { - if (user.Policy.IsAdministrator) { - context.querySelector('.selectDashboardThemeContainer').classList.remove('hide'); - } else { - context.querySelector('.selectDashboardThemeContainer').classList.add('hide'); - } - if (appHost.supports('displaylanguage')) { context.querySelector('.languageSection').classList.remove('hide'); } else { @@ -139,18 +88,6 @@ import 'emby-button'; context.querySelector('.learnHowToContributeContainer').classList.add('hide'); } - if (appHost.supports('runatstartup')) { - context.querySelector('.fldAutorun').classList.remove('hide'); - } else { - context.querySelector('.fldAutorun').classList.add('hide'); - } - - if (appHost.supports('soundeffects')) { - context.querySelector('.fldSoundEffects').classList.remove('hide'); - } else { - context.querySelector('.fldSoundEffects').classList.add('hide'); - } - if (appHost.supports('screensaver')) { context.querySelector('.selectScreensaverContainer').classList.remove('hide'); } else { @@ -173,16 +110,8 @@ import 'emby-button'; context.querySelector('.fldThemeVideo').classList.add('hide'); } - context.querySelector('.chkRunAtStartup').checked = appSettings.runAtStartup(); - - const selectTheme = context.querySelector('#selectTheme'); - const selectDashboardTheme = context.querySelector('#selectDashboardTheme'); - - fillThemes(selectTheme); - fillThemes(selectDashboardTheme, true); + fillThemes(context, userSettings); loadScreensavers(context, userSettings); - loadSoundEffects(context, userSettings); - loadSkins(context, userSettings); context.querySelector('.chkDisplayMissingEpisodes').checked = user.Configuration.DisplayMissingEpisodes || false; @@ -198,9 +127,6 @@ import 'emby-button'; context.querySelector('#txtLibraryPageSize').value = userSettings.libraryPageSize(); - selectDashboardTheme.value = userSettings.dashboardTheme() || ''; - selectTheme.value = userSettings.theme() || ''; - context.querySelector('.selectLayout').value = layoutManager.getSavedLayout() || ''; showOrHideMissingEpisodesField(context); @@ -209,8 +135,6 @@ import 'emby-button'; } function saveUser(context, user, userSettingsInstance, apiClient) { - appSettings.runAtStartup(context.querySelector('.chkRunAtStartup').checked); - user.Configuration.DisplayMissingEpisodes = context.querySelector('.chkDisplayMissingEpisodes').checked; if (appHost.supports('displaylanguage')) { @@ -221,15 +145,11 @@ import 'emby-button'; userSettingsInstance.enableThemeSongs(context.querySelector('#chkThemeSong').checked); userSettingsInstance.enableThemeVideos(context.querySelector('#chkThemeVideo').checked); - userSettingsInstance.dashboardTheme(context.querySelector('#selectDashboardTheme').value); userSettingsInstance.theme(context.querySelector('#selectTheme').value); - userSettingsInstance.soundEffects(context.querySelector('.selectSoundEffects').value); userSettingsInstance.screensaver(context.querySelector('.selectScreensaver').value); userSettingsInstance.libraryPageSize(context.querySelector('#txtLibraryPageSize').value); - userSettingsInstance.skin(context.querySelector('.selectSkin').value); - userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked); userSettingsInstance.enableBlurhash(context.querySelector('#chkBlurhash').checked); userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked); diff --git a/src/components/displaySettings/displaySettings.template.html b/src/components/displaySettings/displaySettings.template.html index 7258edf208..fdaf8d70f1 100644 --- a/src/components/displaySettings/displaySettings.template.html +++ b/src/components/displaySettings/displaySettings.template.html @@ -1,5 +1,4 @@
-

${Display}

@@ -123,26 +122,14 @@
${LabelPleaseRestart}
-
- -
-
-
- -
-
-
- -
-
${LabelLibraryPageSizeHelp}
@@ -196,13 +183,6 @@
${EnableThemeVideosHelp}
-
- -
-