From 02baff1fe0c5a22d9b1563f7101d0a01824e34cd Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Thu, 9 Apr 2020 00:35:54 +0800 Subject: [PATCH 001/362] add more separate hw decoding toggles --- src/controllers/dashboard/dashboard.js | 12 +++--------- src/controllers/encodingsettings.js | 2 ++ src/encodingsettings.html | 23 ++++++++++++++++------- src/strings/en-us.json | 4 +++- src/strings/zh-cn.json | 4 +++- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 78f5cdca0..addcfc6e7 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -258,12 +258,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html += ""; html += ""; - if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - html += '
' + session.TranscodingInfo.Framerate + " fps
"; - } else { - html += '
'; - } - html += '
'; var nowPlayingName = DashboardPage.getNowPlayingName(session); html += '
'; @@ -398,9 +392,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } else if (displayPlayMethod === "Transcode") { html += globalize.translate("Transcoding"); - if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - html += " (" + session.TranscodingInfo.Framerate + " fps)"; - } + if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { + html += " (" + session.TranscodingInfo.Framerate + " fps)"; + } showTranscodingInfo = true; } else if (displayPlayMethod === "DirectPlay") { diff --git a/src/controllers/encodingsettings.js b/src/controllers/encodingsettings.js index 1b2718866..5a540a5e2 100644 --- a/src/controllers/encodingsettings.js +++ b/src/controllers/encodingsettings.js @@ -5,6 +5,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) { c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec")); }); + page.querySelector("#chkDecodingColorDepth10").checked = config.EnableDecodingColorDepth10; page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding; $("#selectVideoDecoder", page).val(config.HardwareAccelerationType); $("#selectThreadCount", page).val(config.EncodingThreadCount); @@ -67,6 +68,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo }), function (c) { return c.getAttribute("data-codec"); }); + config.EnableDecodingColorDepth10 = form.querySelector("#chkDecodingColorDepth10").checked; config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked; ApiClient.updateNamedConfiguration("encoding", config).then(function () { updateEncoder(form); diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 5a005d800..b3c9f42b2 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -35,36 +35,44 @@

${LabelEnableHardwareDecodingFor}

+
+ +
${EnableDecodingColorDepth10Help}
+
+
+ diff --git a/src/strings/en-us.json b/src/strings/en-us.json index d5fc40ef0..a3b4257ae 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1496,5 +1496,7 @@ "EveryXMinutes": "Every {0} minutes", "EveryHour": "Every hour", "EveryXHours": "Every {0} hours", - "OnApplicationStartup": "On application startup" + "OnApplicationStartup": "On application startup", + "EnableDecodingColorDepth10": "Enable 10-Bit hardware decoding", + "EnableDecodingColorDepth10Help" : "Enable 10-Bit hardware decoding on supported hardware. Only works for HEVC and VP9 formats. Turn this off if you experience playback issues." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index acdfb2d5e..80ab75908 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1502,5 +1502,7 @@ "YadifBob": "Yadif Bob", "Yadif": "Yadif", "LabelDeinterlaceMethod": "反交错方法:", - "DeinterlaceMethodHelp": "选择对隔行扫描内容进行转码时所用的反交错方法。" + "DeinterlaceMethodHelp": "选择对隔行扫描内容进行转码时所用的反交错方法。", + "EnableDecodingColorDepth10": "启用 10-Bit 硬件解码", + "EnableDecodingColorDepth10Help" : "在支持的硬件上启用 10-Bit 硬件解码。仅对 HEVC 和 VP9 格式起作用。如果你遇到了播放问题,请关闭这个选项。" } From 45ced60cc1340a1c25640ead454e225352db69ac Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Thu, 9 Apr 2020 01:15:43 +0800 Subject: [PATCH 002/362] fix lint --- src/controllers/dashboard/dashboard.js | 6 +++--- src/encodingsettings.html | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index addcfc6e7..2901a6966 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -392,9 +392,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } else if (displayPlayMethod === "Transcode") { html += globalize.translate("Transcoding"); - if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - html += " (" + session.TranscodingInfo.Framerate + " fps)"; - } + if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { + html += " (" + session.TranscodingInfo.Framerate + " fps)"; + } showTranscodingInfo = true; } else if (displayPlayMethod === "DirectPlay") { diff --git a/src/encodingsettings.html b/src/encodingsettings.html index b3c9f42b2..8e8c8fc5a 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -177,4 +177,3 @@ - From 257ce4974ebee7c0977ae95cba4269805f6f8b77 Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sun, 3 May 2020 20:30:35 +0200 Subject: [PATCH 003/362] ~ migrate subtitlesettings.js to es6 ~ migrate subtitleappearancehelper.js to es6 ~ replace duplicated "populateLanguages" function ( playbacksettings.js:18 ) ~ replace duplicated "onSubmit" function ( playbacksettings.js:266 ) - remove empty function getWindowStyles Signed-off-by: Christoph Potas --- package.json | 2 + .../subtitleappearancehelper.js | 242 ++++++------- .../subtitlesettings/subtitlesettings.js | 330 +++++++++--------- 3 files changed, 276 insertions(+), 298 deletions(-) diff --git a/package.json b/package.json index 53f3d225a..fda29b810 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,8 @@ "test": [ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", + "src/components/subtitlesettings/subtitlesettings.js", + "src/components/subtitlesettings/subtitleappearancehelper.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index fdc64f0df..7bf473783 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,159 +1,149 @@ -define([], function () { - "use strict"; +function getTextStyles(settings, isCue) { - function getTextStyles(settings, isCue) { + let list = []; - var list = []; + if (isCue) { + switch (settings.textSize || '') { - if (isCue) { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.5em' }); - break; - case 'small': - list.push({ name: 'font-size', value: '.7em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.3em' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '1.72em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2em' }); - break; - default: - case 'medium': - break; - } - } else { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.8em' }); - break; - case 'small': - list.push({ name: 'font-size', value: 'inherit' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '2em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2.2em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.72em' }); - break; - default: - case 'medium': - list.push({ name: 'font-size', value: '1.36em' }); - break; - } - } - - switch (settings.dropShadow || '') { - - case 'raised': - list.push({ name: 'text-shadow', value: '-1px -1px white, 0px -1px white, -1px 0px white, 1px 1px black, 0px 1px black, 1px 0px black' }); + case 'smaller': + list.push({ name: 'font-size', value: '.5em' }); break; - case 'depressed': - list.push({ name: 'text-shadow', value: '1px 1px white, 0px 1px white, 1px 0px white, -1px -1px black, 0px -1px black, -1px 0px black' }); + case 'small': + list.push({ name: 'font-size', value: '.7em' }); break; - case 'uniform': - list.push({ name: 'text-shadow', value: '-1px 0px #000000, 0px 1px #000000, 1px 0px #000000, 0px -1px #000000' }); + case 'large': + list.push({ name: 'font-size', value: '1.3em' }); break; - case 'none': - list.push({ name: 'text-shadow', value: 'none' }); + case 'larger': + list.push({ name: 'font-size', value: '1.72em' }); + break; + case 'extralarge': + list.push({ name: 'font-size', value: '2em' }); break; default: - case 'dropshadow': - list.push({ name: 'text-shadow', value: '#000000 0px 0px 7px' }); + case 'medium': break; } + } else { + switch (settings.textSize || '') { - var background = settings.textBackground || 'transparent'; - if (background) { - list.push({ name: 'background-color', value: background }); - } - - var textColor = settings.textColor || '#ffffff'; - if (textColor) { - list.push({ name: 'color', value: textColor }); - } - - switch (settings.font || '') { - - case 'typewriter': - list.push({ name: 'font-family', value: '"Courier New",monospace' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'smaller': + list.push({ name: 'font-size', value: '.8em' }); break; - case 'print': - list.push({ name: 'font-family', value: 'Georgia,Times New Roman,Arial,Helvetica,serif' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'small': + list.push({ name: 'font-size', value: 'inherit' }); break; - case 'console': - list.push({ name: 'font-family', value: 'Consolas,Lucida Console,Menlo,Monaco,monospace' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'larger': + list.push({ name: 'font-size', value: '2em' }); break; - case 'cursive': - list.push({ name: 'font-family', value: 'Lucida Handwriting,Brush Script MT,Segoe Script,cursive,Quintessential,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'extralarge': + list.push({ name: 'font-size', value: '2.2em' }); break; - case 'casual': - list.push({ name: 'font-family', value: 'Gabriola,Segoe Print,Comic Sans MS,Chalkboard,Short Stack,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'none' }); - break; - case 'smallcaps': - list.push({ name: 'font-family', value: 'Copperplate Gothic,Copperplate Gothic Bold,Copperplate,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'small-caps' }); + case 'large': + list.push({ name: 'font-size', value: '1.72em' }); break; default: - list.push({ name: 'font-family', value: 'inherit' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'medium': + list.push({ name: 'font-size', value: '1.36em' }); break; } - - return list; } - function getWindowStyles(settings) { + switch (settings.dropShadow || '') { - return []; + case 'raised': + list.push({ name: 'text-shadow', value: '-1px -1px white, 0px -1px white, -1px 0px white, 1px 1px black, 0px 1px black, 1px 0px black' }); + break; + case 'depressed': + list.push({ name: 'text-shadow', value: '1px 1px white, 0px 1px white, 1px 0px white, -1px -1px black, 0px -1px black, -1px 0px black' }); + break; + case 'uniform': + list.push({ name: 'text-shadow', value: '-1px 0px #000000, 0px 1px #000000, 1px 0px #000000, 0px -1px #000000' }); + break; + case 'none': + list.push({ name: 'text-shadow', value: 'none' }); + break; + default: + case 'dropshadow': + list.push({ name: 'text-shadow', value: '#000000 0px 0px 7px' }); + break; } - function getStyles(settings, isCue) { - - return { - text: getTextStyles(settings, isCue), - window: getWindowStyles(settings) - }; + const background = settings.textBackground || 'transparent'; + if (background) { + list.push({ name: 'background-color', value: background }); } - function applyStyleList(styles, elem) { - - for (var i = 0, length = styles.length; i < length; i++) { - - var style = styles[i]; - - elem.style[style.name] = style.value; - } + const textColor = settings.textColor || '#ffffff'; + if (textColor) { + list.push({ name: 'color', value: textColor }); } - function applyStyles(elements, appearanceSettings) { + switch (settings.font || '') { - var styles = getStyles(appearanceSettings); - - if (elements.text) { - applyStyleList(styles.text, elements.text); - } - if (elements.window) { - applyStyleList(styles.window, elements.window); - } + case 'typewriter': + list.push({ name: 'font-family', value: '"Courier New",monospace' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'print': + list.push({ name: 'font-family', value: 'Georgia,Times New Roman,Arial,Helvetica,serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'console': + list.push({ name: 'font-family', value: 'Consolas,Lucida Console,Menlo,Monaco,monospace' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'cursive': + list.push({ name: 'font-family', value: 'Lucida Handwriting,Brush Script MT,Segoe Script,cursive,Quintessential,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'casual': + list.push({ name: 'font-family', value: 'Gabriola,Segoe Print,Comic Sans MS,Chalkboard,Short Stack,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'smallcaps': + list.push({ name: 'font-family', value: 'Copperplate Gothic,Copperplate Gothic Bold,Copperplate,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'small-caps' }); + break; + default: + list.push({ name: 'font-family', value: 'inherit' }); + list.push({ name: 'font-variant', value: 'none' }); + break; } + return list; +} + +export function getStyles(settings, isCue) { + return { - getStyles: getStyles, - applyStyles: applyStyles + text: getTextStyles(settings, isCue), + window: [] }; -}); +} + +function applyStyleList(styles, elem) { + + for (let i = 0, length = styles.length; i < length; i++) { + + let style = styles[i]; + + elem.style[style.name] = style.value; + } +} + +export function applyStyles(elements, appearanceSettings) { + + let styles = getStyles(appearanceSettings); + + if (elements.text) { + applyStyleList(styles.text, elements.text); + } + if (elements.window) { + applyStyleList(styles.window, elements.window); + } +} +export default { + getStyles: getStyles, + applyStyles: applyStyles +}; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 2c8692919..8f5038fd6 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,213 +1,199 @@ -define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loading', 'connectionManager', 'subtitleAppearanceHelper', 'dom', 'events', 'listViewStyle', 'emby-select', 'emby-input', 'emby-checkbox', 'flexStyles'], function (require, globalize, appSettings, appHost, focusManager, loading, connectionManager, subtitleAppearanceHelper, dom, events) { - "use strict"; +import require from 'require'; +import globalize from 'globalize'; +import appHost from 'apphost'; +import appSettings from 'appSettings'; +import focusManager from 'focusManager'; +import loading from 'loading'; +import connectionManager from 'connectionmanager'; +import subtitleAppearanceHelper from 'subtitleappearancehelper'; +import playbacksettings from 'playbacksettings'; +import dom from 'dom'; +import events from 'events'; +import 'listViewStyle'; +import 'emby-select'; +import 'emby-input'; +import 'emby-checkbox'; +import 'flexStyles'; - function populateLanguages(select, languages) { - var html = ""; +function getSubtitleAppearanceObject(context) { + let appearanceSettings = {}; - html += ""; - for (var i = 0, length = languages.length; i < length; i++) { - var culture = languages[i]; - html += ""; + appearanceSettings.textSize = context.querySelector('#selectTextSize').value; + appearanceSettings.dropShadow = context.querySelector('#selectDropShadow').value; + appearanceSettings.font = context.querySelector('#selectFont').value; + appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; + appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + + return appearanceSettings; +} + +function loadForm(context, user, userSettings, appearanceSettings, apiClient) { + + apiClient.getCultures().then(function (allCultures) { + + if (appHost.supports('subtitleburnsettings') && user.Policy.EnableVideoPlaybackTranscoding) { + context.querySelector('.fldBurnIn').classList.remove('hide'); } - select.innerHTML = html; - } + let selectSubtitleLanguage = context.querySelector( '#selectSubtitleLanguage' ); - function getSubtitleAppearanceObject(context) { - var appearanceSettings = {}; + playbacksettings.populateLanguages(selectSubtitleLanguage, allCultures); - appearanceSettings.textSize = context.querySelector('#selectTextSize').value; - appearanceSettings.dropShadow = context.querySelector('#selectDropShadow').value; - appearanceSettings.font = context.querySelector('#selectFont').value; - appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; - appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; + context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; - return appearanceSettings; - } + context.querySelector('#selectSubtitlePlaybackMode').dispatchEvent(new CustomEvent('change', {})); - function loadForm(context, user, userSettings, appearanceSettings, apiClient) { + context.querySelector('#selectTextSize').value = appearanceSettings.textSize || ''; + context.querySelector('#selectDropShadow').value = appearanceSettings.dropShadow || ''; + context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; + context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; + context.querySelector('#selectFont').value = appearanceSettings.font || ''; - apiClient.getCultures().then(function (allCultures) { + context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; - if (appHost.supports('subtitleburnsettings') && user.Policy.EnableVideoPlaybackTranscoding) { - context.querySelector('.fldBurnIn').classList.remove('hide'); - } + onAppearanceFieldChange({ + target: context.querySelector('#selectTextSize') + }); - var selectSubtitleLanguage = context.querySelector('#selectSubtitleLanguage'); + loading.hide(); + }); +} - populateLanguages(selectSubtitleLanguage, allCultures); +function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) { - selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; - context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; + let appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings( appearanceKey ); + appearanceSettings = Object.assign(appearanceSettings, getSubtitleAppearanceObject(context)); - context.querySelector('#selectSubtitlePlaybackMode').dispatchEvent(new CustomEvent('change', {})); + userSettingsInstance.setSubtitleAppearanceSettings(appearanceSettings, appearanceKey); - context.querySelector('#selectTextSize').value = appearanceSettings.textSize || ''; - context.querySelector('#selectDropShadow').value = appearanceSettings.dropShadow || ''; - context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; - context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; - context.querySelector('#selectFont').value = appearanceSettings.font || ''; + user.Configuration.SubtitleLanguagePreference = context.querySelector('#selectSubtitleLanguage').value; + user.Configuration.SubtitleMode = context.querySelector('#selectSubtitlePlaybackMode').value; - context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; + return apiClient.updateUserConfiguration(user.Id, user.Configuration); +} - onAppearanceFieldChange({ - target: context.querySelector('#selectTextSize') - }); +export function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { + + loading.show(); + + appSettings.set('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value); + + apiClient.getUser(userId).then(function (user) { + + saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { loading.hide(); + if (enableSaveConfirmation) { + require(['toast'], function (toast) { + toast(globalize.translate('SettingsSaved')); + }); + } + + events.trigger(instance, 'saved'); + + }, function () { + loading.hide(); }); + }); +} + +function onSubtitleModeChange(e) { + + let view = dom.parentWithClass( e.target, 'subtitlesettings' ); + + let subtitlesHelp = view.querySelectorAll( '.subtitlesHelp' ); + for (let i = 0, length = subtitlesHelp.length; i < length; i++) { + subtitlesHelp[i].classList.add('hide'); } + view.querySelector('.subtitles' + this.value + 'Help').classList.remove('hide'); +} - function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) { +function onAppearanceFieldChange(e) { - var appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings(appearanceKey); - appearanceSettings = Object.assign(appearanceSettings, getSubtitleAppearanceObject(context)); + let view = dom.parentWithClass( e.target, 'subtitlesettings' ); - userSettingsInstance.setSubtitleAppearanceSettings(appearanceSettings, appearanceKey); + let appearanceSettings = getSubtitleAppearanceObject( view ); - user.Configuration.SubtitleLanguagePreference = context.querySelector('#selectSubtitleLanguage').value; - user.Configuration.SubtitleMode = context.querySelector('#selectSubtitlePlaybackMode').value; + let elements = { + window: view.querySelector( '.subtitleappearance-preview-window' ), + text: view.querySelector( '.subtitleappearance-preview-text' ) + }; - return apiClient.updateUserConfiguration(user.Id, user.Configuration); - } + subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); +} - function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { +export function embed(options, self) { - loading.show(); + require(['text!./subtitlesettings.template.html'], function (template) { - appSettings.set('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value); + options.element.classList.add('subtitlesettings'); + options.element.innerHTML = globalize.translateDocument(template, 'core'); - apiClient.getUser(userId).then(function (user) { + options.element.querySelector('form').addEventListener('submit', playbacksettings.OnSubmit.bind(self)); - saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { + options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); + options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#selectDropShadow').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#selectFont').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#inputTextColor').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#inputTextBackground').addEventListener('change', onAppearanceFieldChange); - loading.hide(); - if (enableSaveConfirmation) { - require(['toast'], function (toast) { - toast(globalize.translate('SettingsSaved')); - }); - } + if (options.enableSaveButton) { + options.element.querySelector('.btnSave').classList.remove('hide'); + } - events.trigger(instance, 'saved'); + if (appHost.supports('subtitleappearancesettings')) { + options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); + } - }, function () { - loading.hide(); - }); - }); - } + self.loadData(); - function onSubmit(e) { - var self = this; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userId = self.options.userId; - var userSettings = self.options.userSettings; + if (options.autoFocus) { + focusManager.autoFocus(options.element); + } + }); +} +export function SubtitleSettings(options) { + + this.options = options; + + embed(options, this); +} + +SubtitleSettings.prototype.loadData = function () { + + let self = this; + let context = self.options.element; + + loading.show(); + + let userId = self.options.userId; + let apiClient = connectionManager.getApiClient( self.options.serverId ); + let userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(function (user) { userSettings.setUserInfo(userId, apiClient).then(function () { - var enableSaveConfirmation = self.options.enableSaveConfirmation; - save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); + self.dataLoaded = true; + + let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); + + loadForm(context, user, userSettings, appearanceSettings, apiClient); }); + }); +}; - // Disable default form submission - if (e) { - e.preventDefault(); - } +SubtitleSettings.prototype.submit = function () { + playbacksettings.onSubmit.call(this); +}; - return false; - } +SubtitleSettings.prototype.destroy = function () { + this.options = null; +}; - function onSubtitleModeChange(e) { - - var view = dom.parentWithClass(e.target, 'subtitlesettings'); - - var subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); - for (var i = 0, length = subtitlesHelp.length; i < length; i++) { - subtitlesHelp[i].classList.add('hide'); - } - view.querySelector('.subtitles' + this.value + 'Help').classList.remove('hide'); - } - - function onAppearanceFieldChange(e) { - - var view = dom.parentWithClass(e.target, 'subtitlesettings'); - - var appearanceSettings = getSubtitleAppearanceObject(view); - - var elements = { - window: view.querySelector('.subtitleappearance-preview-window'), - text: view.querySelector('.subtitleappearance-preview-text') - }; - - subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); - } - - function embed(options, self) { - - require(['text!./subtitlesettings.template.html'], function (template) { - - options.element.classList.add('subtitlesettings'); - options.element.innerHTML = globalize.translateDocument(template, 'core'); - - options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); - - options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); - options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#selectDropShadow').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#selectFont').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#inputTextColor').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#inputTextBackground').addEventListener('change', onAppearanceFieldChange); - - if (options.enableSaveButton) { - options.element.querySelector('.btnSave').classList.remove('hide'); - } - - if (appHost.supports('subtitleappearancesettings')) { - options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); - } - - self.loadData(); - - if (options.autoFocus) { - focusManager.autoFocus(options.element); - } - }); - } - - function SubtitleSettings(options) { - - this.options = options; - - embed(options, this); - } - - SubtitleSettings.prototype.loadData = function () { - - var self = this; - var context = self.options.element; - - loading.show(); - - var userId = self.options.userId; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - userSettings.setUserInfo(userId, apiClient).then(function () { - self.dataLoaded = true; - - var appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey); - - loadForm(context, user, userSettings, appearanceSettings, apiClient); - }); - }); - }; - - SubtitleSettings.prototype.submit = function () { - onSubmit.call(this); - }; - - SubtitleSettings.prototype.destroy = function () { - this.options = null; - }; - - return SubtitleSettings; -}); +export default { + save: save, + embed: embed, + SubtitleSettings: SubtitleSettings +}; From 6f0843cc6d30629c6e8f190558389785b9037e3a Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Mon, 4 May 2020 03:20:38 +0200 Subject: [PATCH 004/362] ~ convert subtitlesettings to class ~ use base import name instead of relative file path ~ fix "new" calling Signed-off-by: Christoph Potas --- package.json | 1 + src/components/settingshelper.js | 24 ++++ .../subtitleappearancehelper.js | 4 + .../subtitlesettings/subtitlesettings.js | 112 +++++++++++------- src/controllers/user/subtitles.js | 2 +- 5 files changed, 97 insertions(+), 46 deletions(-) create mode 100644 src/components/settingshelper.js diff --git a/package.json b/package.json index fda29b810..c11b6db91 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", + "src/components/settingshelper.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js new file mode 100644 index 000000000..0c942ed04 --- /dev/null +++ b/src/components/settingshelper.js @@ -0,0 +1,24 @@ +import globalize from 'globalize'; +/** + * Helper for handling settings + * @module components/settingsHelper + */ +export function populateLanguages(select, languages) { + + let html = ""; + + html += ""; + + for (let i = 0, length = languages.length; i < length; i++) { + + const culture = languages[i]; + + html += ""; + } + + select.innerHTML = html; +} + +export default { + populateLanguages: populateLanguages +}; diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 7bf473783..d1c55e1ae 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,3 +1,7 @@ +/** + * Subtitle settings visual helper + * @module components/subtitleSettings/subtitleAppearanceHelper + */ function getTextStyles(settings, isCue) { let list = []; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 8f5038fd6..3e41da953 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -4,9 +4,9 @@ import appHost from 'apphost'; import appSettings from 'appSettings'; import focusManager from 'focusManager'; import loading from 'loading'; -import connectionManager from 'connectionmanager'; -import subtitleAppearanceHelper from 'subtitleappearancehelper'; -import playbacksettings from 'playbacksettings'; +import connectionManager from 'connectionManager'; +import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; +import settingsHelper from '../settingshelper'; import dom from 'dom'; import events from 'events'; import 'listViewStyle'; @@ -15,6 +15,11 @@ import 'emby-input'; import 'emby-checkbox'; import 'flexStyles'; +/** + * Subtitle settings + * @module components/subtitleSettings/subtitleSettings + */ + function getSubtitleAppearanceObject(context) { let appearanceSettings = {}; @@ -37,7 +42,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { let selectSubtitleLanguage = context.querySelector( '#selectSubtitleLanguage' ); - playbacksettings.populateLanguages(selectSubtitleLanguage, allCultures); + settingsHelper.populateLanguages(selectSubtitleLanguage, allCultures); selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; @@ -73,7 +78,7 @@ function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) return apiClient.updateUserConfiguration(user.Id, user.Configuration); } -export function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { +function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { loading.show(); @@ -123,14 +128,14 @@ function onAppearanceFieldChange(e) { subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); } -export function embed(options, self) { +function embed(options, self) { require(['text!./subtitlesettings.template.html'], function (template) { options.element.classList.add('subtitlesettings'); options.element.innerHTML = globalize.translateDocument(template, 'core'); - options.element.querySelector('form').addEventListener('submit', playbacksettings.OnSubmit.bind(self)); + options.element.querySelector('form').addEventListener('submit', self.onSubmit ); options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); @@ -155,45 +160,62 @@ export function embed(options, self) { }); } -export function SubtitleSettings(options) { +export class SubtitleSettings { - this.options = options; + constructor(options) { - embed(options, this); + this.options = options; + + embed(options, this); + } + + loadData() { + let self = this; + let context = self.options.element; + + loading.show(); + + let userId = self.options.userId; + let apiClient = connectionManager.getApiClient( self.options.serverId ); + let userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(function (user) { + userSettings.setUserInfo(userId, apiClient).then(function () { + self.dataLoaded = true; + + let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); + + loadForm(context, user, userSettings, appearanceSettings, apiClient); + }); + }); + } + + submit() { + this.onSubmit( null ); + } + + destroy() { + this.options = null; + } + + onSubmit( e ) { + const self = this; + let apiClient = connectionManager.getApiClient(self.options.serverId); + let userId = self.options.userId; + let userSettings = self.options.userSettings; + + userSettings.setUserInfo(userId, apiClient).then(function () { + + let enableSaveConfirmation = self.options.enableSaveConfirmation; + save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); + }); + + // Disable default form submission + if (e) { + e.preventDefault(); + } + return false; + } } -SubtitleSettings.prototype.loadData = function () { - - let self = this; - let context = self.options.element; - - loading.show(); - - let userId = self.options.userId; - let apiClient = connectionManager.getApiClient( self.options.serverId ); - let userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - userSettings.setUserInfo(userId, apiClient).then(function () { - self.dataLoaded = true; - - let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); - - loadForm(context, user, userSettings, appearanceSettings, apiClient); - }); - }); -}; - -SubtitleSettings.prototype.submit = function () { - playbacksettings.onSubmit.call(this); -}; - -SubtitleSettings.prototype.destroy = function () { - this.options = null; -}; - -export default { - save: save, - embed: embed, - SubtitleSettings: SubtitleSettings -}; +export default SubtitleSettings; diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index e2b98dc2d..f449b655c 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -18,7 +18,7 @@ define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSe if (subtitleSettingsInstance) { subtitleSettingsInstance.loadData(); } else { - subtitleSettingsInstance = new SubtitleSettings({ + subtitleSettingsInstance = new SubtitleSettings.default({ serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".settingsContainer"), From 5b40232b7bf96f5468429f17f928d26eb169076f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 7 May 2020 09:45:49 +0300 Subject: [PATCH 005/362] Use built-in swiper classes --- src/components/slideshow/slideshow.js | 5 ++--- src/components/slideshow/style.css | 21 --------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 4716135ce..b92d956ff 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -260,8 +260,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f loop: false, zoom: { minRatio: 1, - toggle: true, - containerClass: 'slider-zoom-container' + toggle: true }, autoplay: !options.interactive, keyboard: { @@ -328,7 +327,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f function getSwiperSlideHtmlFromSlide(item) { var html = ''; html += '
'; - html += '
'; + html += '
'; html += ''; html += '
'; if (item.title || item.subtitle) { diff --git a/src/components/slideshow/style.css b/src/components/slideshow/style.css index f1fea508d..400c47566 100644 --- a/src/components/slideshow/style.css +++ b/src/components/slideshow/style.css @@ -40,16 +40,6 @@ text-shadow: 3px 3px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; } -.swiper-slide-img { - max-height: 100%; - max-width: 100%; - display: flex; - justify-content: center; - align-items: center; - text-align: center; - margin: auto; -} - .slideshowButtonIcon { color: #fff; opacity: 0.7; @@ -134,14 +124,3 @@ .slideSubtitle { color: #ccc; } - -.swiper-slide { - display: flex; - flex-direction: column; -} - -.slider-zoom-container { - margin: auto; - max-height: 100%; - max-width: 100%; -} From f516bee14798ddd151d5d2c105b5ad845ce48737 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 7 May 2020 23:11:19 +0300 Subject: [PATCH 006/362] Fix iOS blurry zoomed image --- src/components/slideshow/slideshow.js | 44 ++++++++++++++++++++++++++- src/components/slideshow/style.css | 16 ++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index b92d956ff..e7302b734 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -2,9 +2,14 @@ * Image viewer component * @module components/slideshow/slideshow */ -define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost) { +define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) { 'use strict'; + /** + * Name of transition event. + */ + const transitionEndEventName = dom.whichTransitionEvent(); + /** * Retrieves an item's image URL from the API. * @param {object|string} item - Item used to generate the image URL. @@ -240,6 +245,41 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } } + /** + * Handles zoom changes. + */ + function onZoomChange(scale, imageEl, slideEl) { + const zoomImage = slideEl.querySelector('.swiper-zoom-fakeimg'); + + if (zoomImage) { + zoomImage.style.width = zoomImage.style.height = scale * 100 + '%'; + + if (scale > 1) { + if (zoomImage.classList.contains('swiper-zoom-fakeimg-hidden')) { + // Await for Swiper style changes + setTimeout(() => { + const callback = () => { + imageEl.removeEventListener(transitionEndEventName, callback); + zoomImage.classList.remove('swiper-zoom-fakeimg-hidden'); + }; + + // Swiper set 'transition-duration: 300ms' for auto zoom + // and 'transition-duration: 0s' for touch zoom + const transitionDuration = parseFloat(imageEl.style.transitionDuration.replace(/[a-z]/i, '')); + + if (transitionDuration > 0) { + imageEl.addEventListener(transitionEndEventName, callback); + } else { + callback(); + } + }, 0); + } + } else { + zoomImage.classList.add('swiper-zoom-fakeimg-hidden'); + } + } + } + /** * Initializes the Swiper instance and binds the relevant events. * @param {HTMLElement} dialog - Element containing the dialog. @@ -287,6 +327,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f swiperInstance.on('autoplayStart', onAutoplayStart); swiperInstance.on('autoplayStop', onAutoplayStop); + swiperInstance.on('zoomChange', onZoomChange); }); } @@ -328,6 +369,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f var html = ''; html += '
'; html += '
'; + html += `
`; html += ''; html += '
'; if (item.title || item.subtitle) { diff --git a/src/components/slideshow/style.css b/src/components/slideshow/style.css index 400c47566..af50eb9cd 100644 --- a/src/components/slideshow/style.css +++ b/src/components/slideshow/style.css @@ -124,3 +124,19 @@ .slideSubtitle { color: #ccc; } + +.swiper-zoom-fakeimg { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: contain; + z-index: 1; + pointer-events: none; +} + +.swiper-zoom-fakeimg-hidden { + display: none; +} From 1fe17007d6ba2db4553919351967988380e435b0 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Fri, 8 May 2020 01:23:17 +0300 Subject: [PATCH 007/362] Enable fake zoom image on Safari (WebKit) --- src/components/slideshow/slideshow.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index e7302b734..8e3f0d873 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -10,6 +10,12 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f */ const transitionEndEventName = dom.whichTransitionEvent(); + /** + * Flag to use fake image to fix blurry zoomed image. + * At least WebKit doesn't restore quality for zoomed images. + */ + const useFakeZoomImage = browser.safari; + /** * Retrieves an item's image URL from the API. * @param {object|string} item - Item used to generate the image URL. @@ -327,7 +333,10 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f swiperInstance.on('autoplayStart', onAutoplayStart); swiperInstance.on('autoplayStop', onAutoplayStop); - swiperInstance.on('zoomChange', onZoomChange); + + if (useFakeZoomImage) { + swiperInstance.on('zoomChange', onZoomChange); + } }); } @@ -369,7 +378,9 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f var html = ''; html += '
'; html += '
'; - html += `
`; + if (useFakeZoomImage) { + html += `
`; + } html += ''; html += '
'; if (item.title || item.subtitle) { From 658710e982db7a435d5396549d5712b955fb320b Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 01:20:32 +0200 Subject: [PATCH 008/362] + added settingshelper to site defines ~ convert subtitles controller to es6 module + added support for class controller Signed-off-by: Christoph Potas --- .../subtitlesettings/subtitlesettings.js | 2 +- src/components/viewManager/viewManager.js | 4 + src/controllers/user/subtitles.js | 102 ++++++++++-------- src/scripts/site.js | 1 + 4 files changed, 64 insertions(+), 45 deletions(-) diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 3e41da953..e03c718fc 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -6,7 +6,7 @@ import focusManager from 'focusManager'; import loading from 'loading'; import connectionManager from 'connectionManager'; import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; -import settingsHelper from '../settingshelper'; +import settingsHelper from 'settingsHelper'; import dom from 'dom'; import events from 'events'; import 'listViewStyle'; diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index a8e514e06..f39c4995f 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -25,6 +25,10 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi // Use controller method var controller = new options.controllerFactory(newView, eventDetail.detail.params); + } else if (typeof options.controllerFactory === 'object') { + + // Use controller class + var controller = new options.controllerFactory.default(newView, eventDetail.detail.params); } if (!options.controllerFactory || dispatchPageEvents) { diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index f449b655c..f1efe0c21 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -1,49 +1,63 @@ -define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSettings, userSettings, autoFocuser) { - "use strict"; +import subtitleSettings from 'subtitleSettings'; +import * as userSettings from 'userSettings'; +import autoFocuser from 'autoFocuser'; - return function (view, params) { - function onBeforeUnload(e) { - if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; - } +export class SubtitleController { + constructor(view, params) { + this.userId = params.userId || ApiClient.getCurrentUserId(); + this.currentSettings = this.userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + this.hasChanges = false; + this.subtitleSettingsInstance = null; + this.view = view; + + view.addEventListener("viewshow", this.viewShow.bind(this)); + view.addEventListener("change", this.change.bind(this)); + view.addEventListener("viewbeforehide", this.viewBeforeHide.bind(this)); + view.addEventListener("viewdestroy", this.viewDestroy.bind(this)); + } + + viewShow() { + window.addEventListener("beforeunload", this.beforeUnload.bind(this)); + + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.loadData(); + } else { + this.subtitleSettingsInstance = new subtitleSettings({ + serverId: ApiClient.serverId(), + userId: this.userId, + element: this.view.querySelector(".settingsContainer"), + userSettings: this.currentSettings, + enableSaveButton: false, + enableSaveConfirmation: false, + autoFocus: autoFocuser.isEnabled() + }); } + } - var subtitleSettingsInstance; - var hasChanges; - var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + viewDestroy() { + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.destroy(); + this.subtitleSettingsInstance = null; + } + } - if (subtitleSettingsInstance) { - subtitleSettingsInstance.loadData(); - } else { - subtitleSettingsInstance = new SubtitleSettings.default({ - serverId: ApiClient.serverId(), - userId: userId, - element: view.querySelector(".settingsContainer"), - userSettings: currentSettings, - enableSaveButton: false, - enableSaveConfirmation: false, - autoFocus: autoFocuser.isEnabled() - }); - } - }); - view.addEventListener("change", function () { - hasChanges = true; - }); - view.addEventListener("viewbeforehide", function () { - hasChanges = false; + viewBeforeHide() { + this.hasChanges = false; - if (subtitleSettingsInstance) { - subtitleSettingsInstance.submit(); - } - }); - view.addEventListener("viewdestroy", function () { - if (subtitleSettingsInstance) { - subtitleSettingsInstance.destroy(); - subtitleSettingsInstance = null; - } - }); - }; -}); + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.submit(); + } + } + + change() { + this.hasChanges = true; + } + + beforeUnload(e) { + if (this.hasChanges) { + e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + } + } +} + +export default SubtitleController; diff --git a/src/scripts/site.js b/src/scripts/site.js index 5ce093e62..37832af5c 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -831,6 +831,7 @@ var AppInfo = {}; define("upNextDialog", [componentsPath + "/upnextdialog/upnextdialog"], returnFirstDependency); define("subtitleAppearanceHelper", [componentsPath + "/subtitlesettings/subtitleappearancehelper"], returnFirstDependency); define("subtitleSettings", [componentsPath + "/subtitlesettings/subtitlesettings"], returnFirstDependency); + define("settingsHelper", [componentsPath + "/settingshelper"], returnFirstDependency); define("displaySettings", [componentsPath + "/displaysettings/displaysettings"], returnFirstDependency); define("playbackSettings", [componentsPath + "/playbacksettings/playbacksettings"], returnFirstDependency); define("homescreenSettings", [componentsPath + "/homescreensettings/homescreensettings"], returnFirstDependency); From e5bf9bc074d59af7b5e76c734e0af1c6741add52 Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 01:53:13 +0200 Subject: [PATCH 009/362] + add controller to es6 module list Signed-off-by: Christoph Potas --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c11b6db91..4d3d3047b 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", "src/components/settingshelper.js", + "src/controllers/user/subtitles.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", From 9469c208e19f34b97fda261ca58e7201c1359aed Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 15:42:37 +0200 Subject: [PATCH 010/362] ~ switch all strings to single quotes to match ESLint requirements Signed-off-by: Christoph Potas --- src/components/settingshelper.js | 6 +++--- src/controllers/user/subtitles.js | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js index 0c942ed04..3bbff9d8e 100644 --- a/src/components/settingshelper.js +++ b/src/components/settingshelper.js @@ -5,15 +5,15 @@ import globalize from 'globalize'; */ export function populateLanguages(select, languages) { - let html = ""; + let html = ''; - html += ""; + html += "'; for (let i = 0, length = languages.length; i < length; i++) { const culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index f1efe0c21..e88109cc6 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -10,14 +10,14 @@ export class SubtitleController { this.subtitleSettingsInstance = null; this.view = view; - view.addEventListener("viewshow", this.viewShow.bind(this)); - view.addEventListener("change", this.change.bind(this)); - view.addEventListener("viewbeforehide", this.viewBeforeHide.bind(this)); - view.addEventListener("viewdestroy", this.viewDestroy.bind(this)); + view.addEventListener('viewshow', this.viewShow.bind(this)); + view.addEventListener('change', this.change.bind(this)); + view.addEventListener('viewbeforehide', this.viewBeforeHide.bind(this)); + view.addEventListener('viewdestroy', this.viewDestroy.bind(this)); } viewShow() { - window.addEventListener("beforeunload", this.beforeUnload.bind(this)); + window.addEventListener('beforeunload', this.beforeUnload.bind(this)); if (this.subtitleSettingsInstance) { this.subtitleSettingsInstance.loadData(); @@ -25,7 +25,7 @@ export class SubtitleController { this.subtitleSettingsInstance = new subtitleSettings({ serverId: ApiClient.serverId(), userId: this.userId, - element: this.view.querySelector(".settingsContainer"), + element: this.view.querySelector('.settingsContainer'), userSettings: this.currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -55,7 +55,7 @@ export class SubtitleController { beforeUnload(e) { if (this.hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } } From 5dd6f108518622703422443b03ebc988a566bb00 Mon Sep 17 00:00:00 2001 From: ferferga Date: Sat, 16 May 2020 15:21:07 +0200 Subject: [PATCH 011/362] Revert 9a47428 changes --- src/addserver.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/addserver.html b/src/addserver.html index 02850fffb..fc0145e25 100644 --- a/src/addserver.html +++ b/src/addserver.html @@ -3,7 +3,7 @@

${HeaderConnectToServer}

- +
${LabelServerHostHelp}

From 5cfa0360ed17c883e217a2d5eff64e4c43ad7a92 Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 20 May 2020 15:37:58 +0200 Subject: [PATCH 012/362] Use novalidate for addserver.html form --- src/addserver.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/addserver.html b/src/addserver.html index fc0145e25..d25a8eef9 100644 --- a/src/addserver.html +++ b/src/addserver.html @@ -1,9 +1,9 @@
- +

${HeaderConnectToServer}

- +
${LabelServerHostHelp}

From e6287429e06c0faa09a7fa3c26878f951a7debf4 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Wed, 27 May 2020 16:14:24 +0300 Subject: [PATCH 013/362] Fix ability to change settings of another user --- src/controllers/user/display.js | 5 +- src/controllers/user/home.js | 5 +- src/controllers/user/playback.js | 5 +- src/controllers/user/subtitles.js | 5 +- src/scripts/settings/userSettings.js | 287 ++++++++++++++++++++------- 5 files changed, 232 insertions(+), 75 deletions(-) diff --git a/src/controllers/user/display.js b/src/controllers/user/display.js index 3aeb7db8c..26c75f209 100644 --- a/src/controllers/user/display.js +++ b/src/controllers/user/display.js @@ -1,6 +1,9 @@ define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySettings, userSettings, autoFocuser) { 'use strict'; + // Shortcuts + const UserSettings = userSettings.UserSettings; + return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { @@ -11,7 +14,7 @@ define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySett var settingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new UserSettings(); view.addEventListener('viewshow', function () { window.addEventListener('beforeunload', onBeforeUnload); diff --git a/src/controllers/user/home.js b/src/controllers/user/home.js index aa7d147c3..8f826c425 100644 --- a/src/controllers/user/home.js +++ b/src/controllers/user/home.js @@ -1,6 +1,9 @@ define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) { 'use strict'; + // Shortcuts + const UserSettings = userSettings.UserSettings; + return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { @@ -11,7 +14,7 @@ define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'au var homescreenSettingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new UserSettings(); view.addEventListener('viewshow', function () { window.addEventListener('beforeunload', onBeforeUnload); diff --git a/src/controllers/user/playback.js b/src/controllers/user/playback.js index e945a46aa..02a718eb8 100644 --- a/src/controllers/user/playback.js +++ b/src/controllers/user/playback.js @@ -1,6 +1,9 @@ define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) { 'use strict'; + // Shortcuts + const UserSettings = userSettings.UserSettings; + return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { @@ -11,7 +14,7 @@ define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'auto var settingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new UserSettings(); view.addEventListener('viewshow', function () { window.addEventListener('beforeunload', onBeforeUnload); diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index 152301f31..7e7e7fb8a 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -1,6 +1,9 @@ define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSettings, userSettings, autoFocuser) { 'use strict'; + // Shortcuts + const UserSettings = userSettings.UserSettings; + return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { @@ -11,7 +14,7 @@ define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSe var subtitleSettingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new UserSettings(); view.addEventListener('viewshow', function () { window.addEventListener('beforeunload', onBeforeUnload); diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index f92262152..d84a10a1c 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -1,23 +1,30 @@ -/* eslint-disable indent */ - import appSettings from 'appSettings'; import events from 'events'; - function onSaveTimeout() { - var self = this; - self.saveTimeout = null; - self.currentApiClient.updateDisplayPreferences('usersettings', self.displayPrefs, self.currentUserId, 'emby'); +function onSaveTimeout() { + var self = this; + self.saveTimeout = null; + self.currentApiClient.updateDisplayPreferences('usersettings', self.displayPrefs, self.currentUserId, 'emby'); +} + +function saveServerPreferences(instance) { + if (instance.saveTimeout) { + clearTimeout(instance.saveTimeout); } - function saveServerPreferences(instance) { - if (instance.saveTimeout) { - clearTimeout(instance.saveTimeout); - } + instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50); +} - instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50); +export class UserSettings { + constructor() { } - export function setUserInfo(userId, apiClient) { + /** + * Bind UserSettings instance to user. + * @param {string} - User identifier. + * @param {Object} - ApiClient instance. + */ + setUserInfo(userId, apiClient) { if (this.saveTimeout) { clearTimeout(this.saveTimeout); } @@ -38,15 +45,24 @@ import events from 'events'; }); } - export function getData() { + // FIXME: Seems unused + getData() { return this.displayPrefs; } - export function importFrom(instance) { + // FIXME: Seems unused + importFrom(instance) { this.displayPrefs = instance.getData(); } - export function set(name, value, enableOnServer) { + // FIXME: 'appSettings.set' doesn't return any value + /** + * Set value of setting. + * @param {string} name - Name of setting. + * @param {mixed} value - Value of setting. + * @param {boolean} enableOnServer - Flag to save preferences on server. + */ + set(name, value, enableOnServer) { var userId = this.currentUserId; var currentValue = this.get(name, enableOnServer); var result = appSettings.set(name, value, userId); @@ -63,7 +79,13 @@ import events from 'events'; return result; } - export function get(name, enableOnServer) { + /** + * Get value of setting. + * @param {string} name - Name of setting. + * @param {boolean} enableOnServer - Flag to return preferences from server (cached). + * @return {string} Value of setting. + */ + get(name, enableOnServer) { var userId = this.currentUserId; if (enableOnServer !== false && this.displayPrefs) { return this.displayPrefs.CustomPrefs[name]; @@ -72,7 +94,12 @@ import events from 'events'; return appSettings.get(name, userId); } - export function serverConfig(config) { + /** + * Get or set user config. + * @param {Object|undefined} config - Configuration or undefined. + * @return {Object|Promise} Configuration or Promise. + */ + serverConfig(config) { var apiClient = this.currentApiClient; if (config) { return apiClient.updateUserConfiguration(this.currentUserId, config); @@ -83,7 +110,12 @@ import events from 'events'; }); } - export function enableCinemaMode(val) { + /** + * Get or set 'Cinema Mode' state. + * @param {boolean|null} val - Flag to enable 'Cinema Mode' or undefined. + * @return {boolean} 'Cinema Mode' state. + */ + enableCinemaMode(val) { if (val !== undefined) { return this.set('enableCinemaMode', val.toString(), false); } @@ -92,7 +124,12 @@ import events from 'events'; return val !== 'false'; } - export function enableNextVideoInfoOverlay(val) { + /** + * Get or set 'Next Video Info Overlay' state. + * @param {boolean|null} val - Flag to enable 'Next Video Info Overlay' or undefined. + * @return {boolean} 'Next Video Info Overlay' state. + */ + enableNextVideoInfoOverlay(val) { if (val !== undefined) { return this.set('enableNextVideoInfoOverlay', val.toString()); } @@ -101,7 +138,12 @@ import events from 'events'; return val !== 'false'; } - export function enableThemeSongs(val) { + /** + * Get or set 'Theme Songs' state. + * @param {boolean|null} val - Flag to enable 'Theme Songs' or undefined. + * @return {boolean} 'Theme Songs' state. + */ + enableThemeSongs(val) { if (val !== undefined) { return this.set('enableThemeSongs', val.toString(), false); } @@ -110,7 +152,12 @@ import events from 'events'; return val !== 'false'; } - export function enableThemeVideos(val) { + /** + * Get or set 'Theme Videos' state. + * @param {boolean|null} val - Flag to enable 'Theme Videos' or undefined. + * @return {boolean} 'Theme Videos' state. + */ + enableThemeVideos(val) { if (val !== undefined) { return this.set('enableThemeVideos', val.toString(), false); } @@ -119,7 +166,12 @@ import events from 'events'; return val !== 'false'; } - export function enableFastFadein(val) { + /** + * Get or set 'Fast Fade-in' state. + * @param {boolean|null} val - Flag to enable 'Fast Fade-in' or undefined. + * @return {boolean} 'Fast Fade-in' state. + */ + enableFastFadein(val) { if (val !== undefined) { return this.set('fastFadein', val.toString(), false); } @@ -128,7 +180,12 @@ import events from 'events'; return val !== 'false'; } - export function enableBackdrops(val) { + /** + * Get or set 'Backdrops' state. + * @param {boolean|null} val - Flag to enable 'Backdrops' or undefined. + * @return {boolean} 'Backdrops' state. + */ + enableBackdrops(val) { if (val !== undefined) { return this.set('enableBackdrops', val.toString(), false); } @@ -137,7 +194,12 @@ import events from 'events'; return val !== 'false'; } - export function language(val) { + /** + * Get or set language. + * @param {string|null} val - Language. + * @return {string} Language. + */ + language(val) { if (val !== undefined) { return this.set('language', val.toString(), false); } @@ -145,7 +207,12 @@ import events from 'events'; return this.get('language', false); } - export function dateTimeLocale(val) { + /** + * Get or set datetime locale. + * @param {string|null} val - Datetime locale. + * @return {string} Datetime locale. + */ + dateTimeLocale(val) { if (val !== undefined) { return this.set('datetimelocale', val.toString(), false); } @@ -153,7 +220,12 @@ import events from 'events'; return this.get('datetimelocale', false); } - export function chromecastVersion(val) { + /** + * Get or set Chromecast version. + * @param {string|null} val - Chromecast version. + * @return {string} Chromecast version. + */ + chromecastVersion(val) { if (val !== undefined) { return this.set('chromecastVersion', val.toString()); } @@ -161,7 +233,12 @@ import events from 'events'; return this.get('chromecastVersion') || 'stable'; } - export function skipBackLength(val) { + /** + * Get or set amount of rewind. + * @param {number|null} val - Amount of rewind. + * @return {number} Amount of rewind. + */ + skipBackLength(val) { if (val !== undefined) { return this.set('skipBackLength', val.toString()); } @@ -169,7 +246,12 @@ import events from 'events'; return parseInt(this.get('skipBackLength') || '10000'); } - export function skipForwardLength(val) { + /** + * Get or set amount of fast forward. + * @param {number|null} val - Amount of fast forward. + * @return {number} Amount of fast forward. + */ + skipForwardLength(val) { if (val !== undefined) { return this.set('skipForwardLength', val.toString()); } @@ -177,7 +259,12 @@ import events from 'events'; return parseInt(this.get('skipForwardLength') || '30000'); } - export function dashboardTheme(val) { + /** + * Get or set theme for Dashboard. + * @param {string|null} val - Theme for Dashboard. + * @return {string} Theme for Dashboard. + */ + dashboardTheme(val) { if (val !== undefined) { return this.set('dashboardTheme', val); } @@ -185,7 +272,12 @@ import events from 'events'; return this.get('dashboardTheme'); } - export function skin(val) { + /** + * Get or set skin. + * @param {string|null} val - Skin. + * @return {string} Skin. + */ + skin(val) { if (val !== undefined) { return this.set('skin', val, false); } @@ -193,7 +285,12 @@ import events from 'events'; return this.get('skin', false); } - export function theme(val) { + /** + * Get or set main theme. + * @param {string|null} val - Main theme. + * @return {string} Main theme. + */ + theme(val) { if (val !== undefined) { return this.set('appTheme', val, false); } @@ -201,7 +298,12 @@ import events from 'events'; return this.get('appTheme', false); } - export function screensaver(val) { + /** + * Get or set screensaver. + * @param {string|null} val - Screensaver. + * @return {string} Screensaver. + */ + screensaver(val) { if (val !== undefined) { return this.set('screensaver', val, false); } @@ -209,7 +311,12 @@ import events from 'events'; return this.get('screensaver', false); } - export function libraryPageSize(val) { + /** + * Get or set library page size. + * @param {number|null} val - Library page size. + * @return {number} Library page size. + */ + libraryPageSize(val) { if (val !== undefined) { return this.set('libraryPageSize', parseInt(val, 10), false); } @@ -223,7 +330,12 @@ import events from 'events'; } } - export function soundEffects(val) { + /** + * Get or set sound effects. + * @param {string|null} val - Sound effects. + * @return {string} Sound effects. + */ + soundEffects(val) { if (val !== undefined) { return this.set('soundeffects', val, false); } @@ -231,7 +343,13 @@ import events from 'events'; return this.get('soundeffects', false); } - export function loadQuerySettings(key, query) { + /** + * Load query settings. + * @param {string} key - Query key. + * @param {Object} query - Query base. + * @return {Object} Query. + */ + loadQuerySettings(key, query) { var values = this.get(key); if (values) { values = JSON.parse(values); @@ -241,7 +359,12 @@ import events from 'events'; return query; } - export function saveQuerySettings(key, query) { + /** + * Save query settings. + * @param {string} key - Query key. + * @param {Object} query - Query. + */ + saveQuerySettings(key, query) { var values = {}; if (query.SortBy) { values.SortBy = query.SortBy; @@ -254,52 +377,74 @@ import events from 'events'; return this.set(key, JSON.stringify(values)); } - export function getSubtitleAppearanceSettings(key) { + /** + * Get subtitle appearance settings. + * @param {string|undefined} key - Settings key. + * @return {Object} Subtitle appearance settings. + */ + getSubtitleAppearanceSettings(key) { key = key || 'localplayersubtitleappearance3'; return JSON.parse(this.get(key, false) || '{}'); } - export function setSubtitleAppearanceSettings(value, key) { + /** + * Set subtitle appearance settings. + * @param {Object} value - Subtitle appearance settings. + * @param {string|undefined} key - Settings key. + */ + setSubtitleAppearanceSettings(value, key) { key = key || 'localplayersubtitleappearance3'; return this.set(key, JSON.stringify(value), false); } - export function setFilter(key, value) { + /** + * Set filter. + * @param {string} key - Filter key. + * @param {string} value - Filter value. + */ + setFilter(key, value) { return this.set(key, value, true); } - export function getFilter(key) { + /** + * Get filter. + * @param {string} key - Filter key. + * @return {string} Filter value. + */ + getFilter(key) { return this.get(key, true); } +} -/* eslint-enable indent */ -export default { - setUserInfo: setUserInfo, - getData: getData, - importFrom: importFrom, - set: set, - get: get, - serverConfig: serverConfig, - enableCinemaMode: enableCinemaMode, - enableNextVideoInfoOverlay: enableNextVideoInfoOverlay, - enableThemeSongs: enableThemeSongs, - enableThemeVideos: enableThemeVideos, - enableFastFadein: enableFastFadein, - enableBackdrops: enableBackdrops, - language: language, - dateTimeLocale: dateTimeLocale, - skipBackLength: skipBackLength, - skipForwardLength: skipForwardLength, - dashboardTheme: dashboardTheme, - skin: skin, - theme: theme, - screensaver: screensaver, - libraryPageSize: libraryPageSize, - soundEffects: soundEffects, - loadQuerySettings: loadQuerySettings, - saveQuerySettings: saveQuerySettings, - getSubtitleAppearanceSettings: getSubtitleAppearanceSettings, - setSubtitleAppearanceSettings: setSubtitleAppearanceSettings, - setFilter: setFilter, - getFilter: getFilter -}; +export const currentSettings = new UserSettings; + +// Wrappers for non-ES6 modules and backward compatibility +export const setUserInfo = currentSettings.setUserInfo.bind(currentSettings); +export const getData = currentSettings.getData.bind(currentSettings); +export const importFrom = currentSettings.importFrom.bind(currentSettings); +export const set = currentSettings.set.bind(currentSettings); +export const get = currentSettings.get.bind(currentSettings); +export const serverConfig = currentSettings.serverConfig.bind(currentSettings); +export const enableCinemaMode = currentSettings.enableCinemaMode.bind(currentSettings); +export const enableNextVideoInfoOverlay = currentSettings.enableNextVideoInfoOverlay.bind(currentSettings); +export const enableThemeSongs = currentSettings.enableThemeSongs.bind(currentSettings); +export const enableThemeVideos = currentSettings.enableThemeVideos.bind(currentSettings); +export const enableFastFadein = currentSettings.enableFastFadein.bind(currentSettings); +export const enableBackdrops = currentSettings.enableBackdrops.bind(currentSettings); +export const language = currentSettings.language.bind(currentSettings); +export const dateTimeLocale = currentSettings.dateTimeLocale.bind(currentSettings); +export const chromecastVersion = currentSettings.chromecastVersion.bind(currentSettings); +export const skipBackLength = currentSettings.skipBackLength.bind(currentSettings); +export const skipForwardLength = currentSettings.skipForwardLength.bind(currentSettings); +export const dashboardTheme = currentSettings.dashboardTheme.bind(currentSettings); +export const skin = currentSettings.skin.bind(currentSettings); +export const theme = currentSettings.theme.bind(currentSettings); +export const screensaver = currentSettings.screensaver.bind(currentSettings); +export const libraryPageSize = currentSettings.libraryPageSize.bind(currentSettings); +export const soundEffects = currentSettings.soundEffects.bind(currentSettings); +export const loadQuerySettings = currentSettings.loadQuerySettings.bind(currentSettings); +export const saveQuerySettings = currentSettings.saveQuerySettings.bind(currentSettings); +export const getSubtitleAppearanceSettings = currentSettings.getSubtitleAppearanceSettings.bind(currentSettings); +export const setSubtitleAppearanceSettings = currentSettings.setSubtitleAppearanceSettings.bind(currentSettings); +export const setFilter = currentSettings.setFilter.bind(currentSettings); +export const getFilter = currentSettings.getFilter.bind(currentSettings); From 1be2434ac3a9e65246570a20385294961a6bb216 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 28 May 2020 20:10:53 +0300 Subject: [PATCH 014/362] Fix code documentation --- src/scripts/settings/userSettings.js | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 9ead7ab70..2dffc8f0d 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -112,7 +112,7 @@ export class UserSettings { /** * Get or set 'Cinema Mode' state. - * @param {boolean|null} val - Flag to enable 'Cinema Mode' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Cinema Mode' or undefined. * @return {boolean} 'Cinema Mode' state. */ enableCinemaMode(val) { @@ -126,7 +126,7 @@ export class UserSettings { /** * Get or set 'Next Video Info Overlay' state. - * @param {boolean|null} val - Flag to enable 'Next Video Info Overlay' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Next Video Info Overlay' or undefined. * @return {boolean} 'Next Video Info Overlay' state. */ enableNextVideoInfoOverlay(val) { @@ -140,7 +140,7 @@ export class UserSettings { /** * Get or set 'Theme Songs' state. - * @param {boolean|null} val - Flag to enable 'Theme Songs' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Theme Songs' or undefined. * @return {boolean} 'Theme Songs' state. */ enableThemeSongs(val) { @@ -154,7 +154,7 @@ export class UserSettings { /** * Get or set 'Theme Videos' state. - * @param {boolean|null} val - Flag to enable 'Theme Videos' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Theme Videos' or undefined. * @return {boolean} 'Theme Videos' state. */ enableThemeVideos(val) { @@ -168,7 +168,7 @@ export class UserSettings { /** * Get or set 'Fast Fade-in' state. - * @param {boolean|null} val - Flag to enable 'Fast Fade-in' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Fast Fade-in' or undefined. * @return {boolean} 'Fast Fade-in' state. */ enableFastFadein(val) { @@ -182,7 +182,7 @@ export class UserSettings { /** * Get or set 'Backdrops' state. - * @param {boolean|null} val - Flag to enable 'Backdrops' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Backdrops' or undefined. * @return {boolean} 'Backdrops' state. */ enableBackdrops(val) { @@ -196,7 +196,7 @@ export class UserSettings { /** * Get or set 'Details Banner' state. - * @param {boolean|null} val - Flag to enable 'Details Banner' or undefined. + * @param {boolean|undefined} val - Flag to enable 'Details Banner' or undefined. * @return {boolean} 'Details Banner' state. */ detailsBanner(val) { @@ -210,7 +210,7 @@ export class UserSettings { /** * Get or set language. - * @param {string|null} val - Language. + * @param {string|undefined} val - Language. * @return {string} Language. */ language(val) { @@ -223,7 +223,7 @@ export class UserSettings { /** * Get or set datetime locale. - * @param {string|null} val - Datetime locale. + * @param {string|undefined} val - Datetime locale. * @return {string} Datetime locale. */ dateTimeLocale(val) { @@ -236,7 +236,7 @@ export class UserSettings { /** * Get or set Chromecast version. - * @param {string|null} val - Chromecast version. + * @param {string|undefined} val - Chromecast version. * @return {string} Chromecast version. */ chromecastVersion(val) { @@ -249,7 +249,7 @@ export class UserSettings { /** * Get or set amount of rewind. - * @param {number|null} val - Amount of rewind. + * @param {number|undefined} val - Amount of rewind. * @return {number} Amount of rewind. */ skipBackLength(val) { @@ -262,7 +262,7 @@ export class UserSettings { /** * Get or set amount of fast forward. - * @param {number|null} val - Amount of fast forward. + * @param {number|undefined} val - Amount of fast forward. * @return {number} Amount of fast forward. */ skipForwardLength(val) { @@ -275,7 +275,7 @@ export class UserSettings { /** * Get or set theme for Dashboard. - * @param {string|null} val - Theme for Dashboard. + * @param {string|undefined} val - Theme for Dashboard. * @return {string} Theme for Dashboard. */ dashboardTheme(val) { @@ -288,7 +288,7 @@ export class UserSettings { /** * Get or set skin. - * @param {string|null} val - Skin. + * @param {string|undefined} val - Skin. * @return {string} Skin. */ skin(val) { @@ -301,7 +301,7 @@ export class UserSettings { /** * Get or set main theme. - * @param {string|null} val - Main theme. + * @param {string|undefined} val - Main theme. * @return {string} Main theme. */ theme(val) { @@ -314,7 +314,7 @@ export class UserSettings { /** * Get or set screensaver. - * @param {string|null} val - Screensaver. + * @param {string|undefined} val - Screensaver. * @return {string} Screensaver. */ screensaver(val) { @@ -327,7 +327,7 @@ export class UserSettings { /** * Get or set library page size. - * @param {number|null} val - Library page size. + * @param {number|undefined} val - Library page size. * @return {number} Library page size. */ libraryPageSize(val) { @@ -346,7 +346,7 @@ export class UserSettings { /** * Get or set sound effects. - * @param {string|null} val - Sound effects. + * @param {string|undefined} val - Sound effects. * @return {string} Sound effects. */ soundEffects(val) { From f11d3c54a811c1d3adba605c52125ac3f475213f Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 4 Jun 2020 19:05:31 +0300 Subject: [PATCH 015/362] peoplecardbuilder --- package.json | 1 + .../cardbuilder/peoplecardbuilder.js | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 785878d20..a7ebd002e 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "src/components/actionSheet/actionSheet.js", "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", + "src/components/cardbuilder/peoplecardbuilder.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/cardbuilder/peoplecardbuilder.js b/src/components/cardbuilder/peoplecardbuilder.js index 5d34d29e6..3b9a26a70 100644 --- a/src/components/cardbuilder/peoplecardbuilder.js +++ b/src/components/cardbuilder/peoplecardbuilder.js @@ -1,7 +1,13 @@ -define(['cardBuilder'], function (cardBuilder) { - 'use strict'; +/* eslint-disable indent */ - function buildPeopleCards(items, options) { +/** + * Module for building cards from item data. + * @module components/cardBuilder/peoplecardbuilder + */ + +import cardBuilder from 'cardBuilder'; + + export function buildPeopleCards(items, options) { options = Object.assign(options || {}, { cardLayout: false, @@ -15,8 +21,8 @@ define(['cardBuilder'], function (cardBuilder) { cardBuilder.buildCards(items, options); } - return { - buildPeopleCards: buildPeopleCards - }; + /* eslint-enable indent */ -}); +export default { + buildPeopleCards: buildPeopleCards +}; From fe4cef5964266c4bd3d13b8aae063082f12480ba Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 4 Jun 2020 19:06:54 +0300 Subject: [PATCH 016/362] chaptercardbuilder --- package.json | 1 + .../cardbuilder/chaptercardbuilder.js | 87 +++++++++++-------- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index a7ebd002e..49cd22d9a 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "src/components/actionSheet/actionSheet.js", "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", + "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index eae60574b..c6ee9ba3c 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -1,13 +1,23 @@ -define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browser'], function (datetime, imageLoader, connectionManager, layoutManager, browser) { - 'use strict'; +/* eslint-disable indent */ - var enableFocusTransform = !browser.slow && !browser.edge; +/** + * Module for building cards from item data. + * @module components/cardBuilder/chaptercardbuilder + */ - function buildChapterCardsHtml(item, chapters, options) { +import datetime from 'datetime'; +import imageLoader from 'imageLoader'; +import connectionManager from 'connectionManager'; +import layoutManager from 'layoutManager'; +import browser from 'browser'; + + const enableFocusTransform = !browser.slow && !browser.edge; + + function buildChapterCardsHtml(item, chapters, options) { // TODO move card creation code to Card component - var className = 'card itemAction chapterCard'; + let className = 'card itemAction chapterCard'; if (layoutManager.tv) { className += ' show-focus'; @@ -17,12 +27,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse } } - var mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || []; - var videoStream = mediaStreams.filter(function (i) { - return i.Type === 'Video'; + const mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || []; + const videoStream = mediaStreams.filter(({Type}) => { + return Type === 'Video'; })[0] || {}; - var shape = (options.backdropShape || 'backdrop'); + let shape = (options.backdropShape || 'backdrop'); if (videoStream.Width && videoStream.Height) { @@ -31,24 +41,24 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse } } - className += ' ' + shape + 'Card'; + className += ` ${shape}Card`; if (options.block || options.rows) { className += ' block'; } - var html = ''; - var itemsInRow = 0; + let html = ''; + let itemsInRow = 0; - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); - for (var i = 0, length = chapters.length; i < length; i++) { + for (let i = 0, length = chapters.length; i < length; i++) { if (options.rows && itemsInRow === 0) { html += '
'; } - var chapter = chapters[i]; + const chapter = chapters[i]; html += buildChapterCard(item, apiClient, chapter, i, options, className, shape); itemsInRow++; @@ -62,50 +72,50 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse return html; } - function getImgUrl(item, chapter, index, maxWidth, apiClient) { + function getImgUrl({Id}, {ImageTag}, index, maxWidth, apiClient) { - if (chapter.ImageTag) { + if (ImageTag) { - return apiClient.getScaledImageUrl(item.Id, { + return apiClient.getScaledImageUrl(Id, { maxWidth: maxWidth * 2, - tag: chapter.ImageTag, + tag: ImageTag, type: 'Chapter', - index: index + index }); } return null; } - function buildChapterCard(item, apiClient, chapter, index, options, className, shape) { + function buildChapterCard(item, apiClient, chapter, index, {width, coverImage}, className, shape) { - var imgUrl = getImgUrl(item, chapter, index, options.width || 400, apiClient); + const imgUrl = getImgUrl(item, chapter, index, width || 400, apiClient); - var cardImageContainerClass = 'cardContent cardContent-shadow cardImageContainer chapterCardImageContainer'; - if (options.coverImage) { + let cardImageContainerClass = 'cardContent cardContent-shadow cardImageContainer chapterCardImageContainer'; + if (coverImage) { cardImageContainerClass += ' coveredImage'; } - var dataAttributes = ' data-action="play" data-isfolder="' + item.IsFolder + '" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-type="' + item.Type + '" data-mediatype="' + item.MediaType + '" data-positionticks="' + chapter.StartPositionTicks + '"'; - var cardImageContainer = imgUrl ? ('
') : ('
'); + const dataAttributes = ` data-action="play" data-isfolder="${item.IsFolder}" data-id="${item.Id}" data-serverid="${item.ServerId}" data-type="${item.Type}" data-mediatype="${item.MediaType}" data-positionticks="${chapter.StartPositionTicks}"`; + let cardImageContainer = imgUrl ? (`
`) : (`
`); if (!imgUrl) { cardImageContainer += ''; } - var nameHtml = ''; - nameHtml += '
' + chapter.Name + '
'; - nameHtml += '
' + datetime.getDisplayRunningTime(chapter.StartPositionTicks) + '
'; + let nameHtml = ''; + nameHtml += `
${chapter.Name}
`; + nameHtml += `
${datetime.getDisplayRunningTime(chapter.StartPositionTicks)}
`; - var cardBoxCssClass = 'cardBox'; - var cardScalableClass = 'cardScalable'; + const cardBoxCssClass = 'cardBox'; + const cardScalableClass = 'cardScalable'; - var html = '
'; + const html = `
`; return html; } - function buildChapterCards(item, chapters, options) { + export function buildChapterCards(item, chapters, options) { if (options.parentContainer) { // Abort if the container has been disposed @@ -121,15 +131,16 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse } } - var html = buildChapterCardsHtml(item, chapters, options); + const html = buildChapterCardsHtml(item, chapters, options); options.itemsContainer.innerHTML = html; imageLoader.lazyChildren(options.itemsContainer); } - return { - buildChapterCards: buildChapterCards - }; +/* eslint-enable indent */ + +export default { + buildChapterCards: buildChapterCards +}; -}); From 2cd9be932156dde379aab2bb816bcfe899a88e38 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 4 Jun 2020 20:32:39 +0300 Subject: [PATCH 017/362] accessSchedule --- package.json | 1 + .../accessSchedule/accessSchedule.js | 114 ++++++++++-------- 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 785878d20..7f6cf1124 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "overrides": [ { "test": [ + "src/components/accessSchedule/accessSchedule.js", "src/components/actionSheet/actionSheet.js", "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index 768e31059..ac4fbd34a 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -1,9 +1,20 @@ -define(['dialogHelper', 'datetime', 'globalize', 'emby-select', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, datetime, globalize) { - 'use strict'; +/* eslint-disable indent */ + +/** + * Module for controlling user parental control from. + * @module components/accessSchedule/accessSchedule + */ + +import dialogHelper from 'dialogHelper'; +import datetime from 'datetime'; +import globalize from 'globalize'; +import 'emby-select'; +import 'paper-icon-button-light'; +import 'formDialogStyle'; function getDisplayTime(hours) { - var minutes = 0; - var pct = hours % 1; + let minutes = 0; + const pct = hours % 1; if (pct) { minutes = parseInt(60 * pct); @@ -13,25 +24,25 @@ define(['dialogHelper', 'datetime', 'globalize', 'emby-select', 'paper-icon-butt } function populateHours(context) { - var html = ''; + let html = ''; - for (var i = 0; i < 24; i++) { - html += ''; + for (let i = 0; i < 24; i++) { + html += ``; } - html += ''; + html += ``; context.querySelector('#selectStart').innerHTML = html; context.querySelector('#selectEnd').innerHTML = html; } - function loadSchedule(context, schedule) { - context.querySelector('#selectDay').value = schedule.DayOfWeek || 'Sunday'; - context.querySelector('#selectStart').value = schedule.StartHour || 0; - context.querySelector('#selectEnd').value = schedule.EndHour || 0; + function loadSchedule(context, {DayOfWeek, StartHour, EndHour}) { + context.querySelector('#selectDay').value = DayOfWeek || 'Sunday'; + context.querySelector('#selectStart').value = StartHour || 0; + context.querySelector('#selectEnd').value = EndHour || 0; } function submitSchedule(context, options) { - var updatedSchedule = { + const updatedSchedule = { DayOfWeek: context.querySelector('#selectDay').value, StartHour: context.querySelector('#selectStart').value, EndHour: context.querySelector('#selectEnd').value @@ -46,44 +57,41 @@ define(['dialogHelper', 'datetime', 'globalize', 'emby-select', 'paper-icon-butt dialogHelper.close(context); } - return { - show: function (options) { - return new Promise(function (resolve, reject) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', 'components/accessSchedule/accessSchedule.template.html', true); - - xhr.onload = function (e) { - var template = this.response; - var dlg = dialogHelper.createDialog({ - removeOnClose: true, - size: 'small' - }); - dlg.classList.add('formDialog'); - var html = ''; - html += globalize.translateDocument(template); - dlg.innerHTML = html; - populateHours(dlg); - loadSchedule(dlg, options.schedule); - dialogHelper.open(dlg); - dlg.addEventListener('close', function () { - if (dlg.submitted) { - resolve(options.schedule); - } else { - reject(); - } - }); - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - dlg.querySelector('form').addEventListener('submit', function (event) { - submitSchedule(dlg, options); - event.preventDefault(); - return false; - }); - }; - - xhr.send(); + export function show(options) { + return new Promise((resolve, reject) => { + require(['text!./components/accessSchedule/accessSchedule.template.html'], template => { + const dlg = dialogHelper.createDialog({ + removeOnClose: true, + size: 'small' + }); + dlg.classList.add('formDialog'); + let html = ''; + html += globalize.translateDocument(template); + dlg.innerHTML = html; + populateHours(dlg); + loadSchedule(dlg, options.schedule); + dialogHelper.open(dlg); + dlg.addEventListener('close', () => { + if (dlg.submitted) { + resolve(options.schedule); + } else { + reject(); + } + }); + dlg.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dlg); + }); + dlg.querySelector('form').addEventListener('submit', event => { + submitSchedule(dlg, options); + event.preventDefault(); + return false; + }); }); - } - }; -}); + }); + } + +/* eslint-enable indent */ + +export default { + show: show +}; From 521b450fcd565be347945108f52655a5f006d07e Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 4 Jun 2020 22:13:51 +0300 Subject: [PATCH 018/362] Add TODO: remove require --- src/components/accessSchedule/accessSchedule.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index ac4fbd34a..166460a02 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -59,6 +59,7 @@ import 'formDialogStyle'; export function show(options) { return new Promise((resolve, reject) => { + // TODO: remove require require(['text!./components/accessSchedule/accessSchedule.template.html'], template => { const dlg = dialogHelper.createDialog({ removeOnClose: true, From 1c5d2a6959997e1f0eef9932d3e2d3b437fc6702 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 5 Jun 2020 16:04:18 +0200 Subject: [PATCH 019/362] Remove the 500 item limitation on photo playback --- src/components/playback/playbackmanager.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 88d4e0d59..73f07a05f 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1907,11 +1907,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla // Setting this to true may cause some incorrect sorting Recursive: false, SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: 'Photo,Video', - Limit: 500 - + MediaTypes: 'Photo,Video' }).then(function (result) { - var items = result.Items; var index = items.map(function (i) { From 514d4f68780b2af1c082e3c7a5339c73f3c56eb9 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:49:43 +0900 Subject: [PATCH 020/362] fix bottom padding on item details page for desktop view --- src/assets/css/librarybrowser.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 82e704f07..f0230bad0 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -597,6 +597,7 @@ .detailImageContainer { position: relative; margin-top: -25vh; + margin-bottom: 10vh; float: left; width: 25vw; z-index: 3; @@ -641,7 +642,8 @@ div.itemDetailGalleryLink.defaultCardBackground { } .itemDetailGalleryLink.defaultCardBackground { - height: 23vw; /* Dirty hack to get it to look somewhat square. Less than ideal. */ + /* Dirty hack to get it to look somewhat square. Less than ideal. */ + height: 23vw; } .itemDetailGalleryLink.defaultCardBackground > .material-icons { From eba23f41c6237add9135b36253449206d70eb834 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:52:54 +0900 Subject: [PATCH 021/362] fix title casing for six component files --- package.json | 8 ++++---- .../{packagemanager.js => packageManager.js} | 0 .../{syncplay => syncPlay}/groupSelectionMenu.js | 0 .../playbackPermissionManager.js | 0 .../{syncplay => syncPlay}/syncPlayManager.js | 2 +- .../{syncplay => syncPlay}/timeSyncManager.js | 2 +- .../viewsettings.js => viewSettings/viewSettings.js} | 2 +- .../viewSettings.template.html} | 0 src/scripts/site.js | 12 ++++++------ 9 files changed, 13 insertions(+), 13 deletions(-) rename src/components/{packagemanager.js => packageManager.js} (100%) rename src/components/{syncplay => syncPlay}/groupSelectionMenu.js (100%) rename src/components/{syncplay => syncPlay}/playbackPermissionManager.js (100%) rename src/components/{syncplay => syncPlay}/syncPlayManager.js (99%) rename src/components/{syncplay => syncPlay}/timeSyncManager.js (99%) rename src/components/{viewsettings/viewsettings.js => viewSettings/viewSettings.js} (98%) rename src/components/{viewsettings/viewsettings.template.html => viewSettings/viewSettings.template.html} (100%) diff --git a/package.json b/package.json index 785878d20..8e833df3d 100644 --- a/package.json +++ b/package.json @@ -100,10 +100,10 @@ "src/components/playmenu.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", - "src/components/syncplay/groupSelectionMenu.js", - "src/components/syncplay/playbackPermissionManager.js", - "src/components/syncplay/syncPlayManager.js", - "src/components/syncplay/timeSyncManager.js", + "src/components/syncPlay/groupSelectionMenu.js", + "src/components/syncPlay/playbackPermissionManager.js", + "src/components/syncPlay/syncPlayManager.js", + "src/components/syncPlay/timeSyncManager.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContent.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/components/packagemanager.js b/src/components/packageManager.js similarity index 100% rename from src/components/packagemanager.js rename to src/components/packageManager.js diff --git a/src/components/syncplay/groupSelectionMenu.js b/src/components/syncPlay/groupSelectionMenu.js similarity index 100% rename from src/components/syncplay/groupSelectionMenu.js rename to src/components/syncPlay/groupSelectionMenu.js diff --git a/src/components/syncplay/playbackPermissionManager.js b/src/components/syncPlay/playbackPermissionManager.js similarity index 100% rename from src/components/syncplay/playbackPermissionManager.js rename to src/components/syncPlay/playbackPermissionManager.js diff --git a/src/components/syncplay/syncPlayManager.js b/src/components/syncPlay/syncPlayManager.js similarity index 99% rename from src/components/syncplay/syncPlayManager.js rename to src/components/syncPlay/syncPlayManager.js index f04d1aeb8..6116884d7 100644 --- a/src/components/syncplay/syncPlayManager.js +++ b/src/components/syncPlay/syncPlayManager.js @@ -1,6 +1,6 @@ /** * Module that manages the SyncPlay feature. - * @module components/syncplay/syncPlayManager + * @module components/syncPlay/syncPlayManager */ import events from 'events'; diff --git a/src/components/syncplay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js similarity index 99% rename from src/components/syncplay/timeSyncManager.js rename to src/components/syncPlay/timeSyncManager.js index ca9293957..6c151b368 100644 --- a/src/components/syncplay/timeSyncManager.js +++ b/src/components/syncPlay/timeSyncManager.js @@ -1,6 +1,6 @@ /** * Module that manages time syncing with server. - * @module components/syncplay/timeSyncManager + * @module components/syncPlay/timeSyncManager */ import events from 'events'; diff --git a/src/components/viewsettings/viewsettings.js b/src/components/viewSettings/viewSettings.js similarity index 98% rename from src/components/viewsettings/viewsettings.js rename to src/components/viewSettings/viewSettings.js index 441c35157..087ba3e37 100644 --- a/src/components/viewsettings/viewsettings.js +++ b/src/components/viewSettings/viewSettings.js @@ -57,7 +57,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne return new Promise(function (resolve, reject) { - require(['text!./viewsettings.template.html'], function (template) { + require(['text!./viewSettings.template.html'], function (template) { var dialogOptions = { removeOnClose: true, diff --git a/src/components/viewsettings/viewsettings.template.html b/src/components/viewSettings/viewSettings.template.html similarity index 100% rename from src/components/viewsettings/viewsettings.template.html rename to src/components/viewSettings/viewSettings.template.html diff --git a/src/scripts/site.js b/src/scripts/site.js index e60efc757..c8f207961 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -653,7 +653,7 @@ var AppInfo = {}; playQueueManager: componentsPath + '/playback/playqueuemanager', nowPlayingHelper: componentsPath + '/playback/nowplayinghelper', pluginManager: componentsPath + '/pluginManager', - packageManager: componentsPath + '/packagemanager', + packageManager: componentsPath + '/packageManager', screensaverManager: componentsPath + '/screensavermanager', chromecastHelper: 'plugins/chromecastPlayer/chromecastHelpers' }; @@ -820,10 +820,10 @@ var AppInfo = {}; define('playbackSettings', [componentsPath + '/playbackSettings/playbackSettings'], returnFirstDependency); define('homescreenSettings', [componentsPath + '/homeScreenSettings/homeScreenSettings'], returnFirstDependency); define('playbackManager', [componentsPath + '/playback/playbackmanager'], getPlaybackManager); - define('timeSyncManager', [componentsPath + '/syncplay/timeSyncManager'], returnDefault); - define('groupSelectionMenu', [componentsPath + '/syncplay/groupSelectionMenu'], returnFirstDependency); - define('syncPlayManager', [componentsPath + '/syncplay/syncPlayManager'], returnDefault); - define('playbackPermissionManager', [componentsPath + '/syncplay/playbackPermissionManager'], returnDefault); + define('timeSyncManager', [componentsPath + '/syncPlay/timeSyncManager'], returnDefault); + define('groupSelectionMenu', [componentsPath + '/syncPlay/groupSelectionMenu'], returnFirstDependency); + define('syncPlayManager', [componentsPath + '/syncPlay/syncPlayManager'], returnDefault); + define('playbackPermissionManager', [componentsPath + '/syncPlay/playbackPermissionManager'], returnDefault); define('layoutManager', [componentsPath + '/layoutManager', 'apphost'], getLayoutManager); define('homeSections', [componentsPath + '/homesections/homesections'], returnFirstDependency); define('playMenu', [componentsPath + '/playmenu'], returnFirstDependency); @@ -847,7 +847,7 @@ var AppInfo = {}; define('userdataButtons', [componentsPath + '/userdatabuttons/userdatabuttons'], returnFirstDependency); define('listView', [componentsPath + '/listview/listview'], returnFirstDependency); define('indicators', [componentsPath + '/indicators/indicators'], returnFirstDependency); - define('viewSettings', [componentsPath + '/viewsettings/viewsettings'], returnFirstDependency); + define('viewSettings', [componentsPath + '/viewSettings/viewSettings'], returnFirstDependency); define('filterMenu', [componentsPath + '/filtermenu/filtermenu'], returnFirstDependency); define('sortMenu', [componentsPath + '/sortmenu/sortmenu'], returnFirstDependency); define('sanitizefilename', [componentsPath + '/sanitizeFilename'], returnFirstDependency); From 10aad889568ed4aea6f429dc940620466fbdfb25 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:53:47 +0900 Subject: [PATCH 022/362] fix table of contents class name --- src/plugins/bookPlayer/plugin.js | 5 +++-- .../bookPlayer/{tableOfContent.js => tableOfContents.js} | 5 +++-- src/plugins/photoPlayer/plugin.js | 7 ------- 3 files changed, 6 insertions(+), 11 deletions(-) rename src/plugins/bookPlayer/{tableOfContent.js => tableOfContents.js} (98%) diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index b655b038a..a9b784f5e 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -7,7 +7,7 @@ import 'css!./style'; import 'material-icons'; import 'paper-icon-button-light'; -import TableOfContent from './tableOfContent'; +import TableOfContents from './tableOfContents'; export class BookPlayer { constructor() { @@ -163,7 +163,7 @@ export class BookPlayer { openTableOfContents() { if (this._loaded) { - this._tocElement = new TableOfContent(this); + this._tocElement = new TableOfContents(this); } } @@ -271,6 +271,7 @@ export class BookPlayer { if (item.Path && (item.Path.endsWith('epub'))) { return true; } + return false; } } diff --git a/src/plugins/bookPlayer/tableOfContent.js b/src/plugins/bookPlayer/tableOfContents.js similarity index 98% rename from src/plugins/bookPlayer/tableOfContent.js rename to src/plugins/bookPlayer/tableOfContents.js index 6a35966b1..23e288aff 100644 --- a/src/plugins/bookPlayer/tableOfContent.js +++ b/src/plugins/bookPlayer/tableOfContents.js @@ -1,6 +1,6 @@ import dialogHelper from 'dialogHelper'; -export default class TableOfContent { +export default class TableOfContents { constructor(bookPlayer) { this._bookPlayer = bookPlayer; this._rendition = bookPlayer._rendition; @@ -59,6 +59,7 @@ export default class TableOfContent { autoFocus: false, removeOnClose: true }); + elem.id = 'dialogToc'; let tocHtml = '
'; @@ -72,6 +73,7 @@ export default class TableOfContent { tocHtml += `${chapter.label}`; tocHtml += ''; }); + tocHtml += ''; elem.innerHTML = tocHtml; @@ -84,7 +86,6 @@ export default class TableOfContent { this._elem = elem; this.bindEvents(); - dialogHelper.open(elem); } } diff --git a/src/plugins/photoPlayer/plugin.js b/src/plugins/photoPlayer/plugin.js index d8d4ee70e..d8e55fa67 100644 --- a/src/plugins/photoPlayer/plugin.js +++ b/src/plugins/photoPlayer/plugin.js @@ -9,17 +9,12 @@ export default class PhotoPlayer { } play(options) { - return new Promise(function (resolve, reject) { - import('slideshow').then(({default: slideshow}) => { - var index = options.startIndex || 0; var apiClient = connectionManager.currentApiClient(); - apiClient.getCurrentUser().then(function(result) { - var newSlideShow = new slideshow({ showTitle: false, cover: false, @@ -31,7 +26,6 @@ export default class PhotoPlayer { }); newSlideShow.show(); - resolve(); }); }); @@ -39,7 +33,6 @@ export default class PhotoPlayer { } canPlayMediaType(mediaType) { - return (mediaType || '').toLowerCase() === 'photo'; } } From 11528d1a939c5087a76e27444c5e4183bd7776e4 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:54:24 +0900 Subject: [PATCH 023/362] migrate legacy dashboard functions to main object --- src/legacy/dashboard.js | 24 ------------------------ src/scripts/site.js | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 25 deletions(-) delete mode 100644 src/legacy/dashboard.js diff --git a/src/legacy/dashboard.js b/src/legacy/dashboard.js deleted file mode 100644 index 08c5e8330..000000000 --- a/src/legacy/dashboard.js +++ /dev/null @@ -1,24 +0,0 @@ -Dashboard.confirm = function(message, title, callback) { - 'use strict'; - require(['confirm'], function(confirm) { - confirm(message, title).then(function() { - callback(!0); - }).catch(function() { - callback(!1); - }); - }); -}; - -Dashboard.showLoadingMsg = function() { - 'use strict'; - require(['loading'], function(loading) { - loading.show(); - }); -}; - -Dashboard.hideLoadingMsg = function() { - 'use strict'; - require(['loading'], function(loading) { - loading.hide(); - }); -}; diff --git a/src/scripts/site.js b/src/scripts/site.js index c8f207961..65ecfd1b0 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -228,6 +228,28 @@ var Dashboard = { } else { Dashboard.navigate('selectserver.html'); } + }, + hideLoadingMsg: function() { + 'use strict'; + require(['loading'], function(loading) { + loading.hide(); + }); + }, + showLoadingMsg: function() { + 'use strict'; + require(['loading'], function(loading) { + loading.show(); + }); + }, + confirm: function(message, title, callback) { + 'use strict'; + require(['confirm'], function(confirm) { + confirm(message, title).then(function() { + callback(!0); + }).catch(function() { + callback(!1); + }); + }); } }; @@ -737,7 +759,6 @@ var AppInfo = {}; // define legacy features // TODO delete the rest of these define('fnchecked', ['legacy/fnchecked'], returnFirstDependency); - define('legacyDashboard', ['legacy/dashboard'], returnFirstDependency); define('legacySelectMenu', ['legacy/selectmenu'], returnFirstDependency); // there are several objects that need to be instantiated From af128f1c58b5046f938a74128aed58b142e0f32f Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:55:31 +0900 Subject: [PATCH 024/362] add elements to indicate no items exist for certain pages --- src/controllers/movies/moviecollections.js | 7 ++++++- src/controllers/movies/moviegenres.js | 9 +++++++++ src/controllers/movies/movietrailers.js | 7 ++++++- src/controllers/shows/tvgenres.js | 9 +++++++++ src/strings/en-us.json | 3 ++- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index e9ae599b9..54d30c0c3 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -171,7 +171,12 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB } if (!result.Items.length) { - html = '

' + globalize.translate('MessageNoCollectionsAvailable') + '

'; + html = ''; + + html += '
'; + html += '

' + globalize.translate('MessageNothingHere') + '

'; + html += '

' + globalize.translate('MessageNoCollectionsAvailable') + '

'; + html += '
'; } var itemsContainer = tabContent.querySelector('.itemsContainer'); diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index e8e49ff9d..ab410c1bd 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -165,6 +165,15 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader html += '
'; } + if (!result.Items.length) { + html = ''; + + html += '
'; + html += '

' + globalize.translate('MessageNothingHere') + '

'; + html += '

' + globalize.translate('MessageNoGenresAvailable') + '

'; + html += '
'; + } + elem.innerHTML = html; lazyLoader.lazyChildren(elem, fillItemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 25d41d4fb..1a03c5f38 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -158,7 +158,12 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } if (!result.Items.length) { - html = '

' + globalize.translate('MessageNoTrailersFound') + '

'; + html = ''; + + html += '
'; + html += '

' + globalize.translate('MessageNothingHere') + '

'; + html += '

' + globalize.translate('MessageNoTrailersFound') + '

'; + html += '
'; } var itemsContainer = tabContent.querySelector('.itemsContainer'); diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index de38763e9..7d09307fc 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -161,6 +161,15 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader html += '
'; } + if (!result.Items.length) { + html = ''; + + html += '
'; + html += '

' + globalize.translate('MessageNothingHere') + '

'; + html += '

' + globalize.translate('MessageNoGenresAvailable') + '

'; + html += '
'; + } + elem.innerHTML = html; lazyLoader.lazyChildren(elem, fillItemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index f26ba16c8..99e5686ea 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1024,10 +1024,11 @@ "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", "MessageNoAvailablePlugins": "No available plugins.", "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", + "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", "MessageNoPluginsInstalled": "You have no plugins installed.", "MessageNoServersAvailable": "No servers have been found using the automatic server discovery.", - "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", + "MessageNoTrailersFound": "Install the trailers channel to enhance your movie experience by adding a library of internet trailers.", "MessageNothingHere": "Nothing here.", "MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.", "MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.", From c9ee1ccc661386a1627c52022e03443c4b14e931 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 15:57:15 +0900 Subject: [PATCH 025/362] use symlink for web config rather than a separate file --- .gitignore | 5 +---- src/config.json | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) create mode 120000 src/config.json diff --git a/.gitignore b/.gitignore index 9bccd32fb..36b843f02 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -# config -config.json - # npm dist web @@ -10,5 +7,5 @@ node_modules .idea .vscode -#log +# log yarn-error.log diff --git a/src/config.json b/src/config.json new file mode 120000 index 000000000..f1bd2db71 --- /dev/null +++ b/src/config.json @@ -0,0 +1 @@ +config.template.json \ No newline at end of file From 680e56277904c184a65b74087b25598a1ca62dca Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 17:04:16 +0900 Subject: [PATCH 026/362] add support for es6 controllers and migrate logs controller --- package.json | 1 + src/components/viewManager/viewManager.js | 4 ++-- src/controllers/dashboard/logs.js | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 785878d20..aa0f20790 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "src/components/syncplay/playbackPermissionManager.js", "src/components/syncplay/syncPlayManager.js", "src/components/syncplay/timeSyncManager.js", + "src/controllers/dashboard/logs.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContent.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index a8e514e06..4ceb3b949 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -22,9 +22,9 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi newView.initComplete = true; if (typeof options.controllerFactory === 'function') { - - // Use controller method var controller = new options.controllerFactory(newView, eventDetail.detail.params); + } else if (options.controllerFactory.default && typeof options.controllerFactory.default === 'function') { + var controller = new options.controllerFactory.default(newView, eventDetail.detail.params); } if (!options.controllerFactory || dispatchPageEvents) { diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index e0b000a13..bdb9e2537 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -1,6 +1,13 @@ -define(['datetime', 'loading', 'apphost', 'listViewStyle', 'emby-button', 'flexStyles'], function(datetime, loading, appHost) { - 'use strict'; - return function(view, params) { +import datetime from 'datetime'; +import loading from 'loading'; +import appHost from 'apphost'; +import 'emby-button'; +import 'listViewStyle'; +import 'flexStyles'; + +/* eslint-disable indent */ + + export default function(view, params) { view.addEventListener('viewbeforeshow', function() { loading.show(); var apiClient = ApiClient; @@ -29,5 +36,6 @@ define(['datetime', 'loading', 'apphost', 'listViewStyle', 'emby-button', 'flexS loading.hide(); }); }); - }; -}); + } + +/* eslint-enable indent */ From d5991348c22a048225dfef4045f8706bb44f3343 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Sat, 6 Jun 2020 19:02:08 +1000 Subject: [PATCH 027/362] Make book player restore location on resume --- src/plugins/bookPlayer/plugin.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index b655b038a..41c651ceb 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -238,11 +238,17 @@ export class BookPlayer { this.bindEvents(); - return this._rendition.book.locations.generate(1024).then(() => { + return this._rendition.book.locations.generate(1024).then(async () => { if (cancellationToken.shouldCancel) { return reject(); } + const percentageTicks = options.startPositionTicks / 10000000; + if (percentageTicks !== 0.0) { + const resumeLocation = book.locations.cfiFromPercentage(percentageTicks); + await rendition.display(resumeLocation); + } + this._loaded = true; epubElem.style.display = 'block'; rendition.on('relocated', (locations) => { From 1b4c178790151fb4b9a4bd80a76f3dcae58c1da5 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Wed, 15 Apr 2020 10:16:41 +0200 Subject: [PATCH 028/362] Migrated src/components/backdropscreensaver/plugin.js --- src/plugins/backdropScreensaver/plugin.js | 63 +++++++++++------------ 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index dc0a906dd..07b9d6d3b 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -1,36 +1,32 @@ -define(['connectionManager'], function (connectionManager) { +/* eslint-disable indent */ +import connectionManager from "connectionManager"; - return function () { - - var self = this; - - self.name = 'Backdrop ScreenSaver'; - self.type = 'screensaver'; - self.id = 'backdropscreensaver'; - self.supportsAnonymous = false; - - var currentSlideshow; - - self.show = function () { - - var query = { - ImageTypes: 'Backdrop', - EnableImageTypes: 'Backdrop', - IncludeItemTypes: 'Movie,Series,MusicArtist', - SortBy: 'Random', +class BackdropScreensaver { + constructor() { + this.name = "Backdrop ScreenSaver"; + this.type = "screensaver"; + this.id = "backdropscreensaver"; + this.supportsAnonymous = false; + } + show() { + const query = { + ImageTypes: "Backdrop", + EnableImageTypes: "Backdrop", + IncludeItemTypes: "Movie,Series,MusicArtist", + SortBy: "Random", Recursive: true, - Fields: 'Taglines', + Fields: "Taglines", ImageTypeLimit: 1, StartIndex: 0, Limit: 200 }; - var apiClient = connectionManager.currentApiClient(); + const apiClient = connectionManager.currentApiClient(); apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { if (result.Items.length) { - require(['slideshow'], function (slideshow) { + import("slideshow").then(slideshow => { var newSlideShow = new slideshow({ showTitle: true, @@ -39,18 +35,19 @@ define(['connectionManager'], function (connectionManager) { }); newSlideShow.show(); - currentSlideshow = newSlideShow; - }); + this.currentSlideshow = newSlideShow; + }).catch(console.error); } }); - }; + } - self.hide = function () { - - if (currentSlideshow) { - currentSlideshow.hide(); - currentSlideshow = null; + hide() { + if (this.currentSlideshow) { + this.currentSlideshow.hide(); + this.currentSlideshow = null; } - }; - }; -}); + } + } +/* eslint-enable indent */ + +export default BackdropScreensaver; From 3549bd5700d4dad210ec1c5da1098508eb122c1a Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Tue, 5 May 2020 23:32:08 +0200 Subject: [PATCH 029/362] Migrated filterdialog.js --- src/components/filterdialog/filterdialog.js | 490 +++++++++++--------- src/controllers/livetv/livetvchannels.js | 30 +- src/controllers/movies/movietrailers.js | 116 ++--- src/controllers/music/musicalbums.js | 124 ++--- src/controllers/music/musicartists.js | 82 ++-- src/controllers/music/songs.js | 78 ++-- src/controllers/shows/episodes.js | 104 ++--- src/controllers/shows/tvshows.js | 134 +++--- 8 files changed, 601 insertions(+), 557 deletions(-) diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index 1dfd04c67..fb0018106 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,49 +1,59 @@ -define(['dom', 'dialogHelper', 'globalize', 'connectionManager', 'events', 'browser', 'require', 'emby-checkbox', 'emby-collapse', 'css!./style'], function (dom, dialogHelper, globalize, connectionManager, events, browser, require) { - 'use strict'; +import dom from "dom"; +import dialogHelper from "dialogHelper"; +import globalize from "globalize"; +import connectionManager from "connectionManager"; +import events from "events"; +import "emby-checkbox"; +import "emby-collapse"; +import "css!./style.css"; +/* eslint-disable indent */ function renderOptions(context, selector, cssClass, items, isCheckedFn) { - var elem = context.querySelector(selector); + const elem = context.querySelector(selector); if (items.length) { - elem.classList.remove('hide'); + elem.classList.remove("hide"); } else { - elem.classList.add('hide'); + elem.classList.add("hide"); } - var html = ''; + let html = ""; html += '
'; html += items.map(function (filter) { - var itemHtml = ''; - var checkedHtml = isCheckedFn(filter) ? ' checked' : ''; - itemHtml += '"; return itemHtml; - }).join(''); - html += '
'; - elem.querySelector('.filterOptions').innerHTML = html; + }).join(""); + html += "
"; + elem.querySelector(".filterOptions").innerHTML = html; } function renderFilters(context, result, query) { - renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres, function (i) { - var delimeter = '|'; - return (delimeter + (query.Genres || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; + if (result.Tags) { + result.Tags.length = Math.min(result.Tags.length, 50); + } + renderOptions(context, ".genreFilters", "chkGenreFilter", result.Genres, function (i) { + const delimeter = "|"; + return (delimeter + (query.Genres || "") + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, '.officialRatingFilters', 'chkOfficialRatingFilter', result.OfficialRatings, function (i) { - var delimeter = '|'; - return (delimeter + (query.OfficialRatings || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, ".officialRatingFilters", "chkOfficialRatingFilter", result.OfficialRatings, function (i) { + const delimeter = "|"; + return (delimeter + (query.OfficialRatings || "") + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, '.tagFilters', 'chkTagFilter', result.Tags, function (i) { - var delimeter = '|'; - return (delimeter + (query.Tags || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, ".tagFilters", "chkTagFilter", result.Tags, function (i) { + const delimeter = "|"; + return (delimeter + (query.Tags || "") + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, '.yearFilters', 'chkYearFilter', result.Years, function (i) { - var delimeter = ','; - return (delimeter + (query.Years || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, ".yearFilters", "chkYearFilter", result.Years, function (i) { + const delimeter = ","; + return (delimeter + (query.Years || "") + delimeter).includes(delimeter + i + delimeter); }); } function loadDynamicFilters(context, apiClient, userId, itemQuery) { - return apiClient.getJSON(apiClient.getUrl('Items/Filters', { + return apiClient.getJSON(apiClient.getUrl("Items/Filters", { UserId: userId, ParentId: itemQuery.ParentId, IncludeItemTypes: itemQuery.IncludeItemTypes @@ -52,346 +62,380 @@ define(['dom', 'dialogHelper', 'globalize', 'connectionManager', 'events', 'brow }); } + /** + * @param context {HTMLDivElement} Dialog + * @param options {any} Options + */ function updateFilterControls(context, options) { - var elems; - var i; - var length; - var query = options.query; + const query = options.query; - if (options.mode == 'livetvchannels') { - context.querySelector('.chkFavorite').checked = query.IsFavorite == true; - context.querySelector('.chkLikes').checked = query.IsLiked == true; - context.querySelector('.chkDislikes').checked = query.IsDisliked == true; + if (options.mode === "livetvchannels") { + context.querySelector(".chkFavorite").checked = query.IsFavorite === true; + context.querySelector(".chkLikes").checked = query.IsLiked === true; + context.querySelector(".chkDislikes").checked = query.IsDisliked === true; } else { - elems = context.querySelectorAll('.chkStandardFilter'); - for (i = 0, length = elems.length; i < length; i++) { - var chkStandardFilter = elems[i]; - var filters = ',' + (query.Filters || ''); - var filterName = chkStandardFilter.getAttribute('data-filter'); - chkStandardFilter.checked = filters.indexOf(',' + filterName) != -1; + for (const elem of context.querySelectorAll(".chkStandardFilter")) { + const filters = "," + (query.Filters || ""); + const filterName = elem.getAttribute("data-filter"); + elem.checked = filters.includes("," + filterName); } } - elems = context.querySelectorAll('.chkVideoTypeFilter'); - for (i = 0, length = elems.length; i < length; i++) { - var chkVideoTypeFilter = elems[i]; - var filters = ',' + (query.VideoTypes || ''); - var filterName = chkVideoTypeFilter.getAttribute('data-filter'); - chkVideoTypeFilter.checked = filters.indexOf(',' + filterName) != -1; + for (const elem of context.querySelectorAll(".chkVideoTypeFilter")) { + const filters = "," + (query.VideoTypes || ""); + const filterName = elem.getAttribute("data-filter"); + elem.checked = filters.includes("," + filterName); } - context.querySelector('.chk3DFilter').checked = query.Is3D == true; - context.querySelector('.chkHDFilter').checked = query.IsHD == true; - context.querySelector('.chk4KFilter').checked = query.Is4K == true; - context.querySelector('.chkSDFilter').checked = query.IsHD == true; - context.querySelector('#chkSubtitle').checked = query.HasSubtitles == true; - context.querySelector('#chkTrailer').checked = query.HasTrailer == true; - context.querySelector('#chkThemeSong').checked = query.HasThemeSong == true; - context.querySelector('#chkThemeVideo').checked = query.HasThemeVideo == true; - context.querySelector('#chkSpecialFeature').checked = query.HasSpecialFeature == true; - context.querySelector('#chkSpecialEpisode').checked = query.ParentIndexNumber == 0; - context.querySelector('#chkMissingEpisode').checked = query.IsMissing == true; - context.querySelector('#chkFutureEpisode').checked = query.IsUnaired == true; - for (i = 0, length = elems.length; i < length; i++) { - var chkStatus = elems[i]; - var filters = ',' + (query.SeriesStatus || ''); - var filterName = chkStatus.getAttribute('data-filter'); - chkStatus.checked = filters.indexOf(',' + filterName) != -1; + context.querySelector(".chk3DFilter").checked = query.Is3D === true; + context.querySelector(".chkHDFilter").checked = query.IsHD === true; + context.querySelector(".chk4KFilter").checked = query.Is4K === true; + context.querySelector(".chkSDFilter").checked = query.IsHD === true; + context.querySelector("#chkSubtitle").checked = query.HasSubtitles === true; + context.querySelector("#chkTrailer").checked = query.HasTrailer === true; + context.querySelector("#chkThemeSong").checked = query.HasThemeSong === true; + context.querySelector("#chkThemeVideo").checked = query.HasThemeVideo === true; + context.querySelector("#chkSpecialFeature").checked = query.HasSpecialFeature === true; + context.querySelector("#chkSpecialEpisode").checked = query.ParentIndexNumber === 0; + context.querySelector("#chkMissingEpisode").checked = query.IsMissing === true; + context.querySelector("#chkFutureEpisode").checked = query.IsUnaired === true; + for (const elem of context.querySelectorAll(".chkStatus")) { + const filters = "," + (query.SeriesStatus || ""); + const filterName = elem.getAttribute("data-filter"); + elem.checked = filters.includes("," + filterName); } } + /** + * @param instance {FilterDialog} An instance of FilterDialog + */ function triggerChange(instance) { - events.trigger(instance, 'filterchange'); + events.trigger(instance, "filterchange"); } function setVisibility(context, options) { - if (options.mode == 'livetvchannels' || options.mode == 'albums' || options.mode == 'artists' || options.mode == 'albumartists' || options.mode == 'songs') { - hideByClass(context, 'videoStandard'); + if (options.mode === "livetvchannels" || options.mode === "albums" || options.mode === "artists" || options.mode === "albumartists" || options.mode === "songs") { + hideByClass(context, "videoStandard"); } if (enableDynamicFilters(options.mode)) { - context.querySelector('.genreFilters').classList.remove('hide'); - context.querySelector('.officialRatingFilters').classList.remove('hide'); - context.querySelector('.tagFilters').classList.remove('hide'); - context.querySelector('.yearFilters').classList.remove('hide'); + context.querySelector(".genreFilters").classList.remove("hide"); + context.querySelector(".officialRatingFilters").classList.remove("hide"); + context.querySelector(".tagFilters").classList.remove("hide"); + context.querySelector(".yearFilters").classList.remove("hide"); } - if (options.mode == 'movies' || options.mode == 'episodes') { - context.querySelector('.videoTypeFilters').classList.remove('hide'); + if (options.mode === "movies" || options.mode === "episodes") { + context.querySelector(".videoTypeFilters").classList.remove("hide"); } - if (options.mode == 'movies' || options.mode == 'series' || options.mode == 'episodes') { - context.querySelector('.features').classList.remove('hide'); + if (options.mode === "movies" || options.mode === "series" || options.mode === "episodes") { + context.querySelector(".features").classList.remove("hide"); } - if (options.mode == 'series') { - context.querySelector('.seriesStatus').classList.remove('hide'); + if (options.mode === "series") { + context.querySelector(".seriesStatus").classList.remove("hide"); } - if (options.mode == 'episodes') { - showByClass(context, 'episodeFilter'); + if (options.mode === "episodes") { + showByClass(context, "episodeFilter"); } } function showByClass(context, className) { - var elems = context.querySelectorAll('.' + className); + const elems = context.querySelectorAll("." + className); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].classList.remove('hide'); + let i = 0; + const length = elems.length; + for (; i < length; i++) { + elems[i].classList.remove("hide"); } } function hideByClass(context, className) { - var elems = context.querySelectorAll('.' + className); + const elems = context.querySelectorAll("." + className); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].classList.add('hide'); + let i = 0; + const length = elems.length; + for (; i < length; i++) { + elems[i].classList.add("hide"); } } function enableDynamicFilters(mode) { - return mode == 'movies' || mode == 'series' || mode == 'albums' || mode == 'albumartists' || mode == 'artists' || mode == 'songs' || mode == 'episodes'; + return mode === "movies" || mode === "series" || mode === "albums" || mode === "albumartists" || mode === "artists" || mode === "songs" || mode === "episodes"; } - return function (options) { - function onFavoriteChange() { - var query = options.query; - query.StartIndex = 0; - query.IsFavorite = !!this.checked || null; - triggerChange(self); + class FilterDialog { + constructor(options) { + /** + * @private + */ + this.options = options; } - function onStandardFilterChange() { - var query = options.query; - var filterName = this.getAttribute('data-filter'); - var filters = query.Filters || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + /** + * @private + */ + onFavoriteChange(elem) { + const query = this.options.query; + query.StartIndex = 0; + query.IsFavorite = !!elem.checked || null; + triggerChange(this); + } - if (this.checked) { - filters = filters ? filters + ',' + filterName : filterName; + /** + * @private + */ + onStandardFilterChange(elem) { + const query = this.options.query; + const filterName = elem.getAttribute("data-filter"); + let filters = query.Filters || ""; + filters = ("," + filters).replace("," + filterName, "").substring(1); + + if (elem.checked) { + filters = filters ? filters + "," + filterName : filterName; } query.StartIndex = 0; query.Filters = filters; - triggerChange(self); + triggerChange(this); } - function onVideoTypeFilterChange() { - var query = options.query; - var filterName = this.getAttribute('data-filter'); - var filters = query.VideoTypes || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + /** + * @private + */ + onVideoTypeFilterChange(elem) { + const query = this.options.query; + const filterName = elem.getAttribute("data-filter"); + let filters = query.VideoTypes || ""; + filters = ("," + filters).replace("," + filterName, "").substring(1); - if (this.checked) { - filters = filters ? filters + ',' + filterName : filterName; + if (elem.checked) { + filters = filters ? filters + "," + filterName : filterName; } query.StartIndex = 0; query.VideoTypes = filters; - triggerChange(self); + triggerChange(this); } - function onStatusChange() { - var query = options.query; - var filterName = this.getAttribute('data-filter'); - var filters = query.SeriesStatus || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + /** + * @private + */ + onStatusChange(elem) { + const query = this.options.query; + const filterName = elem.getAttribute("data-filter"); + let filters = query.SeriesStatus || ""; + filters = ("," + filters).replace("," + filterName, "").substring(1); - if (this.checked) { - filters = filters ? filters + ',' + filterName : filterName; + if (elem.checked) { + filters = filters ? filters + "," + filterName : filterName; } query.SeriesStatus = filters; query.StartIndex = 0; - triggerChange(self); + triggerChange(this); } - function bindEvents(context) { - var elems; - var i; - var length; - var query = options.query; + /** + * @param context {HTMLDivElement} The dialog + */ + bindEvents(context) { + const query = this.options.query; - if (options.mode == 'livetvchannels') { - elems = context.querySelectorAll('.chkFavorite'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('change', onFavoriteChange); + if (this.options.mode === "livetvchannels") { + for (const elem of context.querySelectorAll(".chkFavorite")) { + elem.addEventListener("change", () => this.onFavoriteChange(elem)); } - context.querySelector('.chkLikes').addEventListener('change', function () { + + const chkLikes = context.querySelector(".chkLikes"); + chkLikes.addEventListener("change", () => { query.StartIndex = 0; - query.IsLiked = this.checked ? true : null; - triggerChange(self); + query.IsLiked = chkLikes.checked ? true : null; + triggerChange(this); }); - context.querySelector('.chkDislikes').addEventListener('change', function () { + const chkDislikes = context.querySelector(".chkDislikes"); + chkDislikes.addEventListener("change", () => { query.StartIndex = 0; - query.IsDisliked = this.checked ? true : null; - triggerChange(self); + query.IsDisliked = chkDislikes.checked ? true : null; + triggerChange(this); }); } else { - elems = context.querySelectorAll('.chkStandardFilter'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('change', onStandardFilterChange); + for (const elem of context.querySelectorAll(".chkStandardFilter")) { + elem.addEventListener("change", () => this.onStandardFilterChange(elem)); } } - elems = context.querySelectorAll('.chkVideoTypeFilter'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('change', onVideoTypeFilterChange); + + for (const elem of context.querySelectorAll(".chkVideoTypeFilter")) { + elem.addEventListener("change", () => this.onVideoTypeFilterChange(elem)); } - context.querySelector('.chk3DFilter').addEventListener('change', function () { + const chk3DFilter = context.querySelector(".chk3DFilter"); + chk3DFilter.addEventListener("change", () => { query.StartIndex = 0; - query.Is3D = this.checked ? true : null; - triggerChange(self); + query.Is3D = chk3DFilter.checked ? true : null; + triggerChange(this); }); - context.querySelector('.chk4KFilter').addEventListener('change', function () { + const chk4KFilter = context.querySelector(".chk4KFilter"); + chk4KFilter.addEventListener("change", () => { query.StartIndex = 0; - query.Is4K = this.checked ? true : null; - triggerChange(self); + query.Is4K = chk4KFilter.checked ? true : null; + triggerChange(this); }); - context.querySelector('.chkHDFilter').addEventListener('change', function () { + const chkHDFilter = context.querySelector(".chkHDFilter"); + chkHDFilter.addEventListener("change", () => { query.StartIndex = 0; - query.IsHD = this.checked ? true : null; - triggerChange(self); + query.IsHD = chkHDFilter.checked ? true : null; + triggerChange(this); }); - context.querySelector('.chkSDFilter').addEventListener('change', function () { + const chkSDFilter = context.querySelector(".chkSDFilter"); + chkSDFilter.addEventListener("change", () => { query.StartIndex = 0; - query.IsHD = this.checked ? false : null; - triggerChange(self); + query.IsHD = chkSDFilter.checked ? false : null; + triggerChange(this); }); - elems = context.querySelectorAll('.chkStatus'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('change', onStatusChange); + for (const elem of context.querySelectorAll(".chkStatus")) { + elem.addEventListener("change", () => this.onStatusChange(elem)); } - context.querySelector('#chkTrailer').addEventListener('change', function () { + const chkTrailer = context.querySelector("#chkTrailer"); + chkTrailer.addEventListener("change", () => { query.StartIndex = 0; - query.HasTrailer = this.checked ? true : null; - triggerChange(self); + query.HasTrailer = chkTrailer.checked ? true : null; + triggerChange(this); }); - context.querySelector('#chkThemeSong').addEventListener('change', function () { + const chkThemeSong = context.querySelector("#chkThemeSong"); + chkThemeSong.addEventListener("change", () => { query.StartIndex = 0; - query.HasThemeSong = this.checked ? true : null; - triggerChange(self); + query.HasThemeSong = chkThemeSong.checked ? true : null; + triggerChange(this); }); - context.querySelector('#chkSpecialFeature').addEventListener('change', function () { + const chkSpecialFeature = context.querySelector("#chkSpecialFeature"); + chkSpecialFeature.addEventListener("change", () => { query.StartIndex = 0; - query.HasSpecialFeature = this.checked ? true : null; - triggerChange(self); + query.HasSpecialFeature = chkSpecialFeature.checked ? true : null; + triggerChange(this); }); - context.querySelector('#chkThemeVideo').addEventListener('change', function () { + const chkThemeVideo = context.querySelector("#chkThemeVideo"); + chkThemeVideo.addEventListener("change", () => { query.StartIndex = 0; - query.HasThemeVideo = this.checked ? true : null; - triggerChange(self); + query.HasThemeVideo = chkThemeVideo.checked ? true : null; + triggerChange(this); }); - context.querySelector('#chkMissingEpisode').addEventListener('change', function () { + const chkMissingEpisode = context.querySelector("#chkMissingEpisode"); + chkMissingEpisode.addEventListener("change", () => { query.StartIndex = 0; - query.IsMissing = this.checked ? true : false; - triggerChange(self); + query.IsMissing = !!chkMissingEpisode.checked; + triggerChange(this); }); - context.querySelector('#chkSpecialEpisode').addEventListener('change', function () { + const chkSpecialEpisode = context.querySelector("#chkSpecialEpisode"); + chkSpecialEpisode.addEventListener("change", () => { query.StartIndex = 0; - query.ParentIndexNumber = this.checked ? 0 : null; - triggerChange(self); + query.ParentIndexNumber = chkSpecialEpisode.checked ? 0 : null; + triggerChange(this); }); - context.querySelector('#chkFutureEpisode').addEventListener('change', function () { + const chkFutureEpisode = context.querySelector("#chkFutureEpisode"); + chkFutureEpisode.addEventListener("change", () => { query.StartIndex = 0; - if (this.checked) { + if (chkFutureEpisode.checked) { query.IsUnaired = true; query.IsVirtualUnaired = null; } else { query.IsUnaired = null; query.IsVirtualUnaired = false; } - triggerChange(self); + triggerChange(this); }); - context.querySelector('#chkSubtitle').addEventListener('change', function () { + const chkSubtitle = context.querySelector("#chkSubtitle"); + chkSubtitle.addEventListener("change", () => { query.StartIndex = 0; - query.HasSubtitles = this.checked ? true : null; - triggerChange(self); + query.HasSubtitles = chkSubtitle.checked ? true : null; + triggerChange(this); }); - context.addEventListener('change', function (e) { - var chkGenreFilter = dom.parentWithClass(e.target, 'chkGenreFilter'); + context.addEventListener("change", () => { + const chkGenreFilter = dom.parentWithClass(context, "chkGenreFilter"); if (chkGenreFilter) { - var filterName = chkGenreFilter.getAttribute('data-filter'); - var filters = query.Genres || ''; - var delimiter = '|'; - filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); + const filterName = chkGenreFilter.getAttribute("data-filter"); + let filters = query.Genres || ""; + const delimiter = "|"; + filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); if (chkGenreFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } query.StartIndex = 0; query.Genres = filters; - triggerChange(self); + triggerChange(this); return; } - var chkTagFilter = dom.parentWithClass(e.target, 'chkTagFilter'); + const chkTagFilter = dom.parentWithClass(context, "chkTagFilter"); if (chkTagFilter) { - var filterName = chkTagFilter.getAttribute('data-filter'); - var filters = query.Tags || ''; - var delimiter = '|'; - filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); + const filterName = chkTagFilter.getAttribute("data-filter"); + let filters = query.Tags || ""; + const delimiter = "|"; + filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); if (chkTagFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } query.StartIndex = 0; query.Tags = filters; - triggerChange(self); + triggerChange(this); return; } - var chkYearFilter = dom.parentWithClass(e.target, 'chkYearFilter'); + const chkYearFilter = dom.parentWithClass(context, "chkYearFilter"); if (chkYearFilter) { - var filterName = chkYearFilter.getAttribute('data-filter'); - var filters = query.Years || ''; - var delimiter = ','; - filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); + const filterName = chkYearFilter.getAttribute("data-filter"); + let filters = query.Years || ""; + const delimiter = ","; + filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); if (chkYearFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } query.StartIndex = 0; query.Years = filters; - triggerChange(self); + triggerChange(this); return; } - var chkOfficialRatingFilter = dom.parentWithClass(e.target, 'chkOfficialRatingFilter'); + const chkOfficialRatingFilter = dom.parentWithClass(context, "chkOfficialRatingFilter"); if (chkOfficialRatingFilter) { - var filterName = chkOfficialRatingFilter.getAttribute('data-filter'); - var filters = query.OfficialRatings || ''; - var delimiter = '|'; - filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); + const filterName = chkOfficialRatingFilter.getAttribute("data-filter"); + let filters = query.OfficialRatings || ""; + const delimiter = "|"; + filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); if (chkOfficialRatingFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } query.StartIndex = 0; query.OfficialRatings = filters; - triggerChange(self); - return; + triggerChange(this); } }); } - var self = this; - - self.show = function () { - return new Promise(function (resolve, reject) { - require(['text!./filterdialog.template.html'], function (template) { - var dlg = dialogHelper.createDialog({ + show() { + return import("text!./filterdialog.template.html").then((template) => { + return new Promise((resolve) => { + const dlg = dialogHelper.createDialog({ removeOnClose: true, modal: false }); - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('formDialog'); - dlg.classList.add('filterDialog'); + dlg.classList.add("ui-body-a"); + dlg.classList.add("background-theme-a"); + dlg.classList.add("formDialog"); + dlg.classList.add("filterDialog"); dlg.innerHTML = globalize.translateDocument(template); - setVisibility(dlg, options); + setVisibility(dlg, this.options); dialogHelper.open(dlg); - dlg.addEventListener('close', resolve); - updateFilterControls(dlg, options); - bindEvents(dlg); - if (enableDynamicFilters(options.mode)) { - dlg.classList.add('dynamicFilterDialog'); - var apiClient = connectionManager.getApiClient(options.serverId); - loadDynamicFilters(dlg, apiClient, apiClient.getCurrentUserId(), options.query); + dlg.addEventListener("close", resolve); + updateFilterControls(dlg, this.options); + this.bindEvents(dlg); + if (enableDynamicFilters(this.options.mode)) { + dlg.classList.add("dynamicFilterDialog"); + const apiClient = connectionManager.getApiClient(this.options.serverId); + loadDynamicFilters(dlg, apiClient, apiClient.getCurrentUserId(), this.options.query); } }); }); - }; - }; -}); + } + } + +/* eslint-enable indent */ + +export default FilterDialog; diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 7f22d3dd1..2701ad171 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,5 +1,5 @@ -define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { - 'use strict'; +define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "userSettings", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData() { @@ -7,7 +7,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us pageData = { query: { StartIndex: 0, - Fields: 'PrimaryImageAspectRatio' + Fields: "PrimaryImageAspectRatio" } }; } @@ -26,7 +26,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us function getChannelsHtml(channels) { return cardBuilder.getCardsHtml({ items: channels, - shape: 'square', + shape: "square", showTitle: true, lazy: true, cardLayout: true, @@ -60,7 +60,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us } var query = getQuery(); - context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ + context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -69,30 +69,30 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us filterButton: false }); var html = getChannelsHtml(result.Items); - var elem = context.querySelector('#items'); + var elem = context.querySelector("#items"); elem.innerHTML = html; imageLoader.lazyChildren(elem); var i; var length; var elems; - for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener("click", onNextPageClick); } - for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener("click", onPreviousPageClick); } } function showFilterMenu(context) { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: 'livetvchannels', + mode: "livetvchannels", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { reloadItems(context); }); filterDialog.show(); @@ -110,7 +110,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(view); }); }); @@ -119,7 +119,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us var pageData; var self = this; var isLoading = false; - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { showFilterMenu(tabContent); }); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 25d41d4fb..08842a6f1 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,5 +1,5 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { - 'use strict'; +define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' if (!pageData) { pageData = data[key] = { query: { - SortBy: 'SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'Trailer', + SortBy: "SortName", + SortOrder: "Ascending", + IncludeItemTypes: "Trailer", Recursive: true, - Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', + Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', + EnableImageTypes: "Primary,Backdrop,Banner,Thumb", StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: libraryBrowser.getSavedView(key) || "Poster" }; if (userSettings.libraryPageSize() > 0) { @@ -37,7 +37,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('trailers'); + context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers"); } return context.savedQueryKey; @@ -85,43 +85,43 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' var html; var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == 'Thumb') { + if (viewStyle == "Thumb") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", preferThumb: true, - context: 'movies', + context: "movies", overlayPlayButton: true }); - } else if (viewStyle == 'ThumbCard') { + } else if (viewStyle == "ThumbCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", preferThumb: true, - context: 'movies', + context: "movies", cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == 'Banner') { + } else if (viewStyle == "Banner") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'banner', + shape: "banner", preferBanner: true, - context: 'movies' + context: "movies" }); - } else if (viewStyle == 'List') { + } else if (viewStyle == "List") { html = listView.getListViewHtml({ items: result.Items, - context: 'movies', + context: "movies", sortBy: query.SortBy }); - } else if (viewStyle == 'PosterCard') { + } else if (viewStyle == "PosterCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'portrait', - context: 'movies', + shape: "portrait", + context: "movies", showTitle: true, showYear: true, cardLayout: true, @@ -130,8 +130,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'portrait', - context: 'movies', + shape: "portrait", + context: "movies", centerText: true, overlayPlayButton: true, showTitle: true, @@ -141,27 +141,27 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' var i; var length; - var elems = tabContent.querySelectorAll('.paging'); + var elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } if (!result.Items.length) { - html = '

' + globalize.translate('MessageNoTrailersFound') + '

'; + html = '

' + Globalize.translate("MessageNoTrailersFound") + "

"; } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); @@ -180,13 +180,13 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: 'movies', + mode: "movies", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { getQuery(tabContent).StartIndex = 0; reloadItems(); }); @@ -199,9 +199,9 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { + var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); + alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -210,39 +210,39 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: 'click' + valueChangeEvent: "click" }); - tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); - alphaPickerElement.classList.add('alphaPicker-fixed-right'); - itemsContainer.classList.add('padded-right-withalphapicker'); + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector(".btnSort").addEventListener("click", function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate('OptionNameSort'), - id: 'SortName' + name: Globalize.translate("OptionNameSort"), + id: "SortName" }, { - name: globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' + name: Globalize.translate("OptionImdbRating"), + id: "CommunityRating,SortName" }, { - name: globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' + name: Globalize.translate("OptionDateAdded"), + id: "DateCreated,SortName" }, { - name: globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' + name: Globalize.translate("OptionDatePlayed"), + id: "DatePlayed,SortName" }, { - name: globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' + name: Globalize.translate("OptionParentalRating"), + id: "OfficialRating,SortName" }, { - name: globalize.translate('OptionPlayCount'), - id: 'PlayCount,SortName' + name: Globalize.translate("OptionPlayCount"), + id: "PlayCount,SortName" }, { - name: globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' + name: Globalize.translate("OptionReleaseDate"), + id: "PremiereDate,SortName" }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index ecb51f9dc..2aaca4f2d 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,5 +1,5 @@ -define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { - 'use strict'; +define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { + "use strict"; return function (view, params, tabContent) { function playAll() { @@ -23,16 +23,16 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser if (!pageData) { pageData = { query: { - SortBy: 'SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'MusicAlbum', + SortBy: "SortName", + SortOrder: "Ascending", + IncludeItemTypes: "MusicAlbum", Recursive: true, - Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', + Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', + EnableImageTypes: "Primary,Backdrop,Banner,Thumb", StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: libraryBrowser.getSavedView(key) || "Poster" }; if (userSettings.libraryPageSize() > 0) { @@ -52,7 +52,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser function getSavedQueryKey() { if (!savedQueryKey) { - savedQueryKey = libraryBrowser.getSavedQueryKey('musicalbums'); + savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums"); } return savedQueryKey; @@ -60,17 +60,17 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - if ('List' == viewStyle) { - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); + if ("List" == viewStyle) { + itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove("vertical-wrap"); } else { - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add("vertical-wrap"); } - itemsContainer.innerHTML = ''; + itemsContainer.innerHTML = ""; } function reloadItems(page) { @@ -114,18 +114,18 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == 'List') { + if (viewStyle == "List") { html = listView.getListViewHtml({ items: result.Items, - context: 'music', + context: "music", sortBy: query.SortBy, addToListButton: true }); - } else if (viewStyle == 'PosterCard') { + } else if (viewStyle == "PosterCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'square', - context: 'music', + shape: "square", + context: "music", showTitle: true, coverImage: true, showParentTitle: true, @@ -135,8 +135,8 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'square', - context: 'music', + shape: "square", + context: "music", showTitle: true, showParentTitle: true, lazy: true, @@ -146,30 +146,30 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser } var i; var length; - var elems = tabContent.querySelectorAll('.paging'); + var elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -186,13 +186,13 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: 'albums', + mode: "albums", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { getQuery().StartIndex = 0; reloadItems(tabContent); }); @@ -205,10 +205,10 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { + alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; var query = getQuery(); query.NameStartsWithOrGreater = newValue; @@ -217,39 +217,39 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: 'click' + valueChangeEvent: "click" }); - tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); - alphaPickerElement.classList.add('alphaPicker-fixed-right'); - itemsContainer.classList.add('padded-right-withalphapicker'); + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector(".btnSort").addEventListener("click", function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate('OptionNameSort'), - id: 'SortName' + name: Globalize.translate("OptionNameSort"), + id: "SortName" }, { - name: globalize.translate('OptionAlbumArtist'), - id: 'AlbumArtist,SortName' + name: Globalize.translate("OptionAlbumArtist"), + id: "AlbumArtist,SortName" }, { - name: globalize.translate('OptionCommunityRating'), - id: 'CommunityRating,SortName' + name: Globalize.translate("OptionCommunityRating"), + id: "CommunityRating,SortName" }, { - name: globalize.translate('OptionCriticRating'), - id: 'CriticRating,SortName' + name: Globalize.translate("OptionCriticRating"), + id: "CriticRating,SortName" }, { - name: globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' + name: Globalize.translate("OptionDateAdded"), + id: "DateCreated,SortName" }, { - name: globalize.translate('OptionReleaseDate'), - id: 'ProductionYear,PremiereDate,SortName' + name: Globalize.translate("OptionReleaseDate"), + id: "ProductionYear,PremiereDate,SortName" }, { - name: globalize.translate('OptionRandom'), - id: 'Random,SortName' + name: Globalize.translate("OptionRandom"), + id: "Random,SortName" }], callback: function () { getQuery().StartIndex = 0; @@ -259,11 +259,11 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser button: e.target }); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); + var btnSelectView = tabContent.querySelector(".btnSelectView"); + btnSelectView.addEventListener("click", function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); }); - btnSelectView.addEventListener('layoutchange', function (e) { + btnSelectView.addEventListener("layoutchange", function (e) { var viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); @@ -271,8 +271,8 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser onViewStyleChange(); reloadItems(tabContent); }); - tabContent.querySelector('.btnPlayAll').addEventListener('click', playAll); - tabContent.querySelector('.btnShuffle').addEventListener('click', shuffle); + tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll); + tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle); } initPage(tabContent); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index bd9341be6..a3f05d381 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,5 +1,5 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { - 'use strict'; +define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData(context) { @@ -8,13 +8,13 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' if (!pageData) { var queryValues = { - SortBy: 'SortName', - SortOrder: 'Ascending', + SortBy: "SortName", + SortOrder: "Ascending", Recursive: true, - Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', + Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Banner,Thumb' + EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }; if (userSettings.libraryPageSize() > 0) { @@ -23,7 +23,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' pageData = data[key] = { query: queryValues, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: libraryBrowser.getSavedView(key) || "Poster" }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -46,17 +46,17 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - if ('List' == viewStyle) { - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); + if ("List" == viewStyle) { + itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove("vertical-wrap"); } else { - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add("vertical-wrap"); } - itemsContainer.innerHTML = ''; + itemsContainer.innerHTML = ""; } function reloadItems(page) { @@ -103,16 +103,16 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == 'List') { + if (viewStyle == "List") { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy }); - } else if (viewStyle == 'PosterCard') { + } else if (viewStyle == "PosterCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'square', - context: 'music', + shape: "square", + context: "music", showTitle: true, coverImage: true, cardLayout: true @@ -120,8 +120,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'square', - context: 'music', + shape: "square", + context: "music", showTitle: true, coverImage: true, lazy: true, @@ -131,30 +131,30 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } var i; var length; - var elems = tabContent.querySelectorAll('.paging'); + var elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -170,13 +170,13 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: self.mode, serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -189,10 +189,10 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { + alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -201,21 +201,21 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: 'click' + valueChangeEvent: "click" }); - tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); - alphaPickerElement.classList.add('alphaPicker-fixed-right'); - itemsContainer.classList.add('padded-right-withalphapicker'); + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); + var btnSelectView = tabContent.querySelector(".btnSelectView"); + btnSelectView.addEventListener("click", function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); }); - btnSelectView.addEventListener('layoutchange', function (e) { + btnSelectView.addEventListener("layoutchange", function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 8e50cd720..21743bc92 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,5 +1,5 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { - 'use strict'; +define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData(context) { @@ -9,14 +9,14 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS if (!pageData) { pageData = data[key] = { query: { - SortBy: 'Album,SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'Audio', + SortBy: "Album,SortName", + SortOrder: "Ascending", + IncludeItemTypes: "Audio", Recursive: true, - Fields: 'AudioInfo,ParentId', + Fields: "AudioInfo,ParentId", StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: 'Primary' + EnableImageTypes: "Primary" } }; @@ -37,7 +37,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('songs'); + context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs"); } return context.savedQueryKey; @@ -85,35 +85,35 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS }); var html = listView.getListViewHtml({ items: result.Items, - action: 'playallfromhere', + action: "playallfromhere", smallIcon: true, artist: true, addToListButton: true }); - var elems = tabContent.querySelectorAll('.paging'); + var elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -124,13 +124,13 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: 'songs', + mode: "songs", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -143,38 +143,38 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS }; function initPage(tabContent) { - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector(".btnSort").addEventListener("click", function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate('OptionTrackName'), - id: 'Name' + name: Globalize.translate("OptionTrackName"), + id: "Name" }, { - name: globalize.translate('OptionAlbum'), - id: 'Album,SortName' + name: Globalize.translate("OptionAlbum"), + id: "Album,SortName" }, { - name: globalize.translate('OptionAlbumArtist'), - id: 'AlbumArtist,Album,SortName' + name: Globalize.translate("OptionAlbumArtist"), + id: "AlbumArtist,Album,SortName" }, { - name: globalize.translate('OptionArtist'), - id: 'Artist,Album,SortName' + name: Globalize.translate("OptionArtist"), + id: "Artist,Album,SortName" }, { - name: globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' + name: Globalize.translate("OptionDateAdded"), + id: "DateCreated,SortName" }, { - name: globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' + name: Globalize.translate("OptionDatePlayed"), + id: "DatePlayed,SortName" }, { - name: globalize.translate('OptionPlayCount'), - id: 'PlayCount,SortName' + name: Globalize.translate("OptionPlayCount"), + id: "PlayCount,SortName" }, { - name: globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,AlbumArtist,Album,SortName' + name: Globalize.translate("OptionReleaseDate"), + id: "PremiereDate,AlbumArtist,Album,SortName" }, { - name: globalize.translate('OptionRuntime'), - id: 'Runtime,AlbumArtist,Album,SortName' + name: Globalize.translate("OptionRuntime"), + id: "Runtime,AlbumArtist,Album,SortName" }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index ca9a807cb..b27495293 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,5 +1,5 @@ -define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { - 'use strict'; +define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData(context) { @@ -9,17 +9,17 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB if (!pageData) { pageData = data[key] = { query: { - SortBy: 'SeriesSortName,SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'Episode', + SortBy: "SeriesSortName,SortName", + SortOrder: "Ascending", + IncludeItemTypes: "Episode", Recursive: true, - Fields: 'PrimaryImageAspectRatio,MediaSourceCount,UserData', + Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", IsMissing: false, ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Thumb', + EnableImageTypes: "Primary,Backdrop,Thumb", StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: libraryBrowser.getSavedView(key) || "Poster" }; if (userSettings.libraryPageSize() > 0) { @@ -39,7 +39,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('episodes'); + context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes"); } return context.savedQueryKey; @@ -47,17 +47,17 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - if ('List' == viewStyle) { - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); + if ("List" == viewStyle) { + itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove("vertical-wrap"); } else { - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add("vertical-wrap"); } - itemsContainer.innerHTML = ''; + itemsContainer.innerHTML = ""; } function reloadItems(page) { @@ -100,17 +100,17 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); - if (viewStyle == 'List') { + var itemsContainer = tabContent.querySelector(".itemsContainer"); + if (viewStyle == "List") { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy, showParentTitle: true }); - } else if (viewStyle == 'PosterCard') { + } else if (viewStyle == "PosterCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", showTitle: true, showParentTitle: true, scalable: true, @@ -119,7 +119,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", showTitle: true, showParentTitle: true, overlayText: false, @@ -132,19 +132,19 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB var length; var elems; - elems = tabContent.querySelectorAll('.paging'); + elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } itemsContainer.innerHTML = html; @@ -153,7 +153,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -164,13 +164,13 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: 'episodes', + mode: "episodes", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { reloadItems(tabContent); }); filterDialog.show(); @@ -182,35 +182,35 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB }; function initPage(tabContent) { - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector(".btnSort").addEventListener("click", function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate('OptionNameSort'), - id: 'SeriesSortName,SortName' + name: Globalize.translate("OptionNameSort"), + id: "SeriesSortName,SortName" }, { - name: globalize.translate('OptionTvdbRating'), - id: 'CommunityRating,SeriesSortName,SortName' + name: Globalize.translate("OptionTvdbRating"), + id: "CommunityRating,SeriesSortName,SortName" }, { - name: globalize.translate('OptionDateAdded'), - id: 'DateCreated,SeriesSortName,SortName' + name: Globalize.translate("OptionDateAdded"), + id: "DateCreated,SeriesSortName,SortName" }, { - name: globalize.translate('OptionPremiereDate'), - id: 'PremiereDate,SeriesSortName,SortName' + name: Globalize.translate("OptionPremiereDate"), + id: "PremiereDate,SeriesSortName,SortName" }, { - name: globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SeriesSortName,SortName' + name: Globalize.translate("OptionDatePlayed"), + id: "DatePlayed,SeriesSortName,SortName" }, { - name: globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SeriesSortName,SortName' + name: Globalize.translate("OptionParentalRating"), + id: "OfficialRating,SeriesSortName,SortName" }, { - name: globalize.translate('OptionPlayCount'), - id: 'PlayCount,SeriesSortName,SortName' + name: Globalize.translate("OptionPlayCount"), + id: "PlayCount,SeriesSortName,SortName" }, { - name: globalize.translate('OptionRuntime'), - id: 'Runtime,SeriesSortName,SortName' + name: Globalize.translate("OptionRuntime"), + id: "Runtime,SeriesSortName,SortName" }], callback: function () { reloadItems(tabContent); @@ -219,11 +219,11 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB button: e.target }); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); + var btnSelectView = tabContent.querySelector(".btnSelectView"); + btnSelectView.addEventListener("click", function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); }); - btnSelectView.addEventListener('layoutchange', function (e) { + btnSelectView.addEventListener("layoutchange", function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 753516f90..96aef86ca 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,5 +1,5 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) { - 'use strict'; +define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) { + "use strict"; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' if (!pageData) { pageData = data[key] = { query: { - SortBy: 'SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'Series', + SortBy: "SortName", + SortOrder: "Ascending", + IncludeItemTypes: "Series", Recursive: true, - Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', + Fields: "PrimaryImageAspectRatio,BasicSyncInfo", ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', + EnableImageTypes: "Primary,Backdrop,Banner,Thumb", StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: libraryBrowser.getSavedView(key) || "Poster" }; if (userSettings.libraryPageSize() > 0) { @@ -38,7 +38,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('series'); + context.savedQueryKey = libraryBrowser.getSavedQueryKey("series"); } return context.savedQueryKey; @@ -46,17 +46,17 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - if ('List' == viewStyle) { - itemsContainer.classList.add('vertical-list'); - itemsContainer.classList.remove('vertical-wrap'); + if ("List" == viewStyle) { + itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove("vertical-wrap"); } else { - itemsContainer.classList.remove('vertical-list'); - itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add("vertical-wrap"); } - itemsContainer.innerHTML = ''; + itemsContainer.innerHTML = ""; } function reloadItems(page) { @@ -100,45 +100,45 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == 'Thumb') { + if (viewStyle == "Thumb") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", preferThumb: true, - context: 'tvshows', + context: "tvshows", overlayMoreButton: true, showTitle: true, centerText: true }); - } else if (viewStyle == 'ThumbCard') { + } else if (viewStyle == "ThumbCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'backdrop', + shape: "backdrop", preferThumb: true, - context: 'tvshows', + context: "tvshows", cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == 'Banner') { + } else if (viewStyle == "Banner") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'banner', + shape: "banner", preferBanner: true, - context: 'tvshows' + context: "tvshows" }); - } else if (viewStyle == 'List') { + } else if (viewStyle == "List") { html = listView.getListViewHtml({ items: result.Items, - context: 'tvshows', + context: "tvshows", sortBy: query.SortBy }); - } else if (viewStyle == 'PosterCard') { + } else if (viewStyle == "PosterCard") { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'portrait', - context: 'tvshows', + shape: "portrait", + context: "tvshows", showTitle: true, showYear: true, centerText: true, @@ -147,8 +147,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'portrait', - context: 'tvshows', + shape: "portrait", + context: "tvshows", centerText: true, lazy: true, overlayMoreButton: true, @@ -158,30 +158,30 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } var i; var length; - var elems = tabContent.querySelectorAll('.paging'); + var elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); + elems = tabContent.querySelectorAll(".btnNextPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + elems[i].addEventListener("click", onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); + elems = tabContent.querySelectorAll(".btnPreviousPage"); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + elems[i].addEventListener("click", onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var itemsContainer = tabContent.querySelector(".itemsContainer"); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + require(["autoFocuser"], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -197,13 +197,13 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' var isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: 'series', + mode: "series", serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, "filterchange", function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -216,10 +216,10 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); - alphaPickerElement.addEventListener('alphavaluechanged', function (e) { + alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -228,36 +228,36 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: 'click' + valueChangeEvent: "click" }); - tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); - alphaPickerElement.classList.add('alphaPicker-fixed-right'); - itemsContainer.classList.add('padded-right-withalphapicker'); + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { + tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector(".btnSort").addEventListener("click", function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate('OptionNameSort'), - id: 'SortName' + name: Globalize.translate("OptionNameSort"), + id: "SortName" }, { - name: globalize.translate('OptionImdbRating'), - id: 'CommunityRating,SortName' + name: Globalize.translate("OptionImdbRating"), + id: "CommunityRating,SortName" }, { - name: globalize.translate('OptionDateAdded'), - id: 'DateCreated,SortName' + name: Globalize.translate("OptionDateAdded"), + id: "DateCreated,SortName" }, { - name: globalize.translate('OptionDatePlayed'), - id: 'DatePlayed,SortName' + name: Globalize.translate("OptionDatePlayed"), + id: "DatePlayed,SortName" }, { - name: globalize.translate('OptionParentalRating'), - id: 'OfficialRating,SortName' + name: Globalize.translate("OptionParentalRating"), + id: "OfficialRating,SortName" }, { - name: globalize.translate('OptionReleaseDate'), - id: 'PremiereDate,SortName' + name: Globalize.translate("OptionReleaseDate"), + id: "PremiereDate,SortName" }], callback: function () { getQuery(tabContent).StartIndex = 0; @@ -267,11 +267,11 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' button: e.target }); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); + var btnSelectView = tabContent.querySelector(".btnSelectView"); + btnSelectView.addEventListener("click", function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")); }); - btnSelectView.addEventListener('layoutchange', function (e) { + btnSelectView.addEventListener("layoutchange", function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); From bd003e6e8ac7d30739f471adfe476c2b61c36895 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Tue, 5 May 2020 23:51:00 +0200 Subject: [PATCH 030/362] Fixed lint --- src/components/filterdialog/filterdialog.js | 314 ++++++++++---------- src/controllers/livetv/livetvchannels.js | 30 +- src/controllers/movies/movietrailers.js | 116 ++++---- src/controllers/music/musicalbums.js | 124 ++++---- src/controllers/music/musicartists.js | 82 ++--- src/controllers/music/songs.js | 78 ++--- src/controllers/shows/episodes.js | 104 +++---- src/controllers/shows/tvshows.js | 134 ++++----- src/plugins/backdropScreensaver/plugin.js | 20 +- 9 files changed, 501 insertions(+), 501 deletions(-) diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index fb0018106..d0c1ee287 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,59 +1,59 @@ -import dom from "dom"; -import dialogHelper from "dialogHelper"; -import globalize from "globalize"; -import connectionManager from "connectionManager"; -import events from "events"; -import "emby-checkbox"; -import "emby-collapse"; -import "css!./style.css"; +import dom from 'dom'; +import dialogHelper from 'dialogHelper'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import events from 'events'; +import 'emby-checkbox'; +import 'emby-collapse'; +import 'css!./style.css'; /* eslint-disable indent */ function renderOptions(context, selector, cssClass, items, isCheckedFn) { const elem = context.querySelector(selector); if (items.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - let html = ""; + let html = ''; html += '
'; html += items.map(function (filter) { - let itemHtml = ""; - const checkedHtml = isCheckedFn(filter) ? " checked" : ""; - itemHtml += "'; return itemHtml; - }).join(""); - html += "
"; - elem.querySelector(".filterOptions").innerHTML = html; + }).join(''); + html += '
'; + elem.querySelector('.filterOptions').innerHTML = html; } function renderFilters(context, result, query) { if (result.Tags) { result.Tags.length = Math.min(result.Tags.length, 50); } - renderOptions(context, ".genreFilters", "chkGenreFilter", result.Genres, function (i) { - const delimeter = "|"; - return (delimeter + (query.Genres || "") + delimeter).includes(delimeter + i + delimeter); + renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres, function (i) { + const delimeter = '|'; + return (delimeter + (query.Genres || '') + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, ".officialRatingFilters", "chkOfficialRatingFilter", result.OfficialRatings, function (i) { - const delimeter = "|"; - return (delimeter + (query.OfficialRatings || "") + delimeter).includes(delimeter + i + delimeter); + renderOptions(context, '.officialRatingFilters', 'chkOfficialRatingFilter', result.OfficialRatings, function (i) { + const delimeter = '|'; + return (delimeter + (query.OfficialRatings || '') + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, ".tagFilters", "chkTagFilter", result.Tags, function (i) { - const delimeter = "|"; - return (delimeter + (query.Tags || "") + delimeter).includes(delimeter + i + delimeter); + renderOptions(context, '.tagFilters', 'chkTagFilter', result.Tags, function (i) { + const delimeter = '|'; + return (delimeter + (query.Tags || '') + delimeter).includes(delimeter + i + delimeter); }); - renderOptions(context, ".yearFilters", "chkYearFilter", result.Years, function (i) { - const delimeter = ","; - return (delimeter + (query.Years || "") + delimeter).includes(delimeter + i + delimeter); + renderOptions(context, '.yearFilters', 'chkYearFilter', result.Years, function (i) { + const delimeter = ','; + return (delimeter + (query.Years || '') + delimeter).includes(delimeter + i + delimeter); }); } function loadDynamicFilters(context, apiClient, userId, itemQuery) { - return apiClient.getJSON(apiClient.getUrl("Items/Filters", { + return apiClient.getJSON(apiClient.getUrl('Items/Filters', { UserId: userId, ParentId: itemQuery.ParentId, IncludeItemTypes: itemQuery.IncludeItemTypes @@ -69,39 +69,39 @@ import "css!./style.css"; function updateFilterControls(context, options) { const query = options.query; - if (options.mode === "livetvchannels") { - context.querySelector(".chkFavorite").checked = query.IsFavorite === true; - context.querySelector(".chkLikes").checked = query.IsLiked === true; - context.querySelector(".chkDislikes").checked = query.IsDisliked === true; + if (options.mode === 'livetvchannels') { + context.querySelector('.chkFavorite').checked = query.IsFavorite === true; + context.querySelector('.chkLikes').checked = query.IsLiked === true; + context.querySelector('.chkDislikes').checked = query.IsDisliked === true; } else { - for (const elem of context.querySelectorAll(".chkStandardFilter")) { - const filters = "," + (query.Filters || ""); - const filterName = elem.getAttribute("data-filter"); - elem.checked = filters.includes("," + filterName); + for (const elem of context.querySelectorAll('.chkStandardFilter')) { + const filters = ',' + (query.Filters || ''); + const filterName = elem.getAttribute('data-filter'); + elem.checked = filters.includes(',' + filterName); } } - for (const elem of context.querySelectorAll(".chkVideoTypeFilter")) { - const filters = "," + (query.VideoTypes || ""); - const filterName = elem.getAttribute("data-filter"); - elem.checked = filters.includes("," + filterName); + for (const elem of context.querySelectorAll('.chkVideoTypeFilter')) { + const filters = ',' + (query.VideoTypes || ''); + const filterName = elem.getAttribute('data-filter'); + elem.checked = filters.includes(',' + filterName); } - context.querySelector(".chk3DFilter").checked = query.Is3D === true; - context.querySelector(".chkHDFilter").checked = query.IsHD === true; - context.querySelector(".chk4KFilter").checked = query.Is4K === true; - context.querySelector(".chkSDFilter").checked = query.IsHD === true; - context.querySelector("#chkSubtitle").checked = query.HasSubtitles === true; - context.querySelector("#chkTrailer").checked = query.HasTrailer === true; - context.querySelector("#chkThemeSong").checked = query.HasThemeSong === true; - context.querySelector("#chkThemeVideo").checked = query.HasThemeVideo === true; - context.querySelector("#chkSpecialFeature").checked = query.HasSpecialFeature === true; - context.querySelector("#chkSpecialEpisode").checked = query.ParentIndexNumber === 0; - context.querySelector("#chkMissingEpisode").checked = query.IsMissing === true; - context.querySelector("#chkFutureEpisode").checked = query.IsUnaired === true; - for (const elem of context.querySelectorAll(".chkStatus")) { - const filters = "," + (query.SeriesStatus || ""); - const filterName = elem.getAttribute("data-filter"); - elem.checked = filters.includes("," + filterName); + context.querySelector('.chk3DFilter').checked = query.Is3D === true; + context.querySelector('.chkHDFilter').checked = query.IsHD === true; + context.querySelector('.chk4KFilter').checked = query.Is4K === true; + context.querySelector('.chkSDFilter').checked = query.IsHD === true; + context.querySelector('#chkSubtitle').checked = query.HasSubtitles === true; + context.querySelector('#chkTrailer').checked = query.HasTrailer === true; + context.querySelector('#chkThemeSong').checked = query.HasThemeSong === true; + context.querySelector('#chkThemeVideo').checked = query.HasThemeVideo === true; + context.querySelector('#chkSpecialFeature').checked = query.HasSpecialFeature === true; + context.querySelector('#chkSpecialEpisode').checked = query.ParentIndexNumber === 0; + context.querySelector('#chkMissingEpisode').checked = query.IsMissing === true; + context.querySelector('#chkFutureEpisode').checked = query.IsUnaired === true; + for (const elem of context.querySelectorAll('.chkStatus')) { + const filters = ',' + (query.SeriesStatus || ''); + const filterName = elem.getAttribute('data-filter'); + elem.checked = filters.includes(',' + filterName); } } @@ -109,60 +109,60 @@ import "css!./style.css"; * @param instance {FilterDialog} An instance of FilterDialog */ function triggerChange(instance) { - events.trigger(instance, "filterchange"); + events.trigger(instance, 'filterchange'); } function setVisibility(context, options) { - if (options.mode === "livetvchannels" || options.mode === "albums" || options.mode === "artists" || options.mode === "albumartists" || options.mode === "songs") { - hideByClass(context, "videoStandard"); + if (options.mode === 'livetvchannels' || options.mode === 'albums' || options.mode === 'artists' || options.mode === 'albumartists' || options.mode === 'songs') { + hideByClass(context, 'videoStandard'); } if (enableDynamicFilters(options.mode)) { - context.querySelector(".genreFilters").classList.remove("hide"); - context.querySelector(".officialRatingFilters").classList.remove("hide"); - context.querySelector(".tagFilters").classList.remove("hide"); - context.querySelector(".yearFilters").classList.remove("hide"); + context.querySelector('.genreFilters').classList.remove('hide'); + context.querySelector('.officialRatingFilters').classList.remove('hide'); + context.querySelector('.tagFilters').classList.remove('hide'); + context.querySelector('.yearFilters').classList.remove('hide'); } - if (options.mode === "movies" || options.mode === "episodes") { - context.querySelector(".videoTypeFilters").classList.remove("hide"); + if (options.mode === 'movies' || options.mode === 'episodes') { + context.querySelector('.videoTypeFilters').classList.remove('hide'); } - if (options.mode === "movies" || options.mode === "series" || options.mode === "episodes") { - context.querySelector(".features").classList.remove("hide"); + if (options.mode === 'movies' || options.mode === 'series' || options.mode === 'episodes') { + context.querySelector('.features').classList.remove('hide'); } - if (options.mode === "series") { - context.querySelector(".seriesStatus").classList.remove("hide"); + if (options.mode === 'series') { + context.querySelector('.seriesStatus').classList.remove('hide'); } - if (options.mode === "episodes") { - showByClass(context, "episodeFilter"); + if (options.mode === 'episodes') { + showByClass(context, 'episodeFilter'); } } function showByClass(context, className) { - const elems = context.querySelectorAll("." + className); + const elems = context.querySelectorAll('.' + className); let i = 0; const length = elems.length; for (; i < length; i++) { - elems[i].classList.remove("hide"); + elems[i].classList.remove('hide'); } } function hideByClass(context, className) { - const elems = context.querySelectorAll("." + className); + const elems = context.querySelectorAll('.' + className); let i = 0; const length = elems.length; for (; i < length; i++) { - elems[i].classList.add("hide"); + elems[i].classList.add('hide'); } } function enableDynamicFilters(mode) { - return mode === "movies" || mode === "series" || mode === "albums" || mode === "albumartists" || mode === "artists" || mode === "songs" || mode === "episodes"; + return mode === 'movies' || mode === 'series' || mode === 'albums' || mode === 'albumartists' || mode === 'artists' || mode === 'songs' || mode === 'episodes'; } class FilterDialog { @@ -188,12 +188,12 @@ import "css!./style.css"; */ onStandardFilterChange(elem) { const query = this.options.query; - const filterName = elem.getAttribute("data-filter"); - let filters = query.Filters || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + const filterName = elem.getAttribute('data-filter'); + let filters = query.Filters || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (elem.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.StartIndex = 0; @@ -206,12 +206,12 @@ import "css!./style.css"; */ onVideoTypeFilterChange(elem) { const query = this.options.query; - const filterName = elem.getAttribute("data-filter"); - let filters = query.VideoTypes || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + const filterName = elem.getAttribute('data-filter'); + let filters = query.VideoTypes || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (elem.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.StartIndex = 0; @@ -224,12 +224,12 @@ import "css!./style.css"; */ onStatusChange(elem) { const query = this.options.query; - const filterName = elem.getAttribute("data-filter"); - let filters = query.SeriesStatus || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + const filterName = elem.getAttribute('data-filter'); + let filters = query.SeriesStatus || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (elem.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.SeriesStatus = filters; @@ -243,97 +243,97 @@ import "css!./style.css"; bindEvents(context) { const query = this.options.query; - if (this.options.mode === "livetvchannels") { - for (const elem of context.querySelectorAll(".chkFavorite")) { - elem.addEventListener("change", () => this.onFavoriteChange(elem)); + if (this.options.mode === 'livetvchannels') { + for (const elem of context.querySelectorAll('.chkFavorite')) { + elem.addEventListener('change', () => this.onFavoriteChange(elem)); } - const chkLikes = context.querySelector(".chkLikes"); - chkLikes.addEventListener("change", () => { + const chkLikes = context.querySelector('.chkLikes'); + chkLikes.addEventListener('change', () => { query.StartIndex = 0; query.IsLiked = chkLikes.checked ? true : null; triggerChange(this); }); - const chkDislikes = context.querySelector(".chkDislikes"); - chkDislikes.addEventListener("change", () => { + const chkDislikes = context.querySelector('.chkDislikes'); + chkDislikes.addEventListener('change', () => { query.StartIndex = 0; query.IsDisliked = chkDislikes.checked ? true : null; triggerChange(this); }); } else { - for (const elem of context.querySelectorAll(".chkStandardFilter")) { - elem.addEventListener("change", () => this.onStandardFilterChange(elem)); + for (const elem of context.querySelectorAll('.chkStandardFilter')) { + elem.addEventListener('change', () => this.onStandardFilterChange(elem)); } } - for (const elem of context.querySelectorAll(".chkVideoTypeFilter")) { - elem.addEventListener("change", () => this.onVideoTypeFilterChange(elem)); + for (const elem of context.querySelectorAll('.chkVideoTypeFilter')) { + elem.addEventListener('change', () => this.onVideoTypeFilterChange(elem)); } - const chk3DFilter = context.querySelector(".chk3DFilter"); - chk3DFilter.addEventListener("change", () => { + const chk3DFilter = context.querySelector('.chk3DFilter'); + chk3DFilter.addEventListener('change', () => { query.StartIndex = 0; query.Is3D = chk3DFilter.checked ? true : null; triggerChange(this); }); - const chk4KFilter = context.querySelector(".chk4KFilter"); - chk4KFilter.addEventListener("change", () => { + const chk4KFilter = context.querySelector('.chk4KFilter'); + chk4KFilter.addEventListener('change', () => { query.StartIndex = 0; query.Is4K = chk4KFilter.checked ? true : null; triggerChange(this); }); - const chkHDFilter = context.querySelector(".chkHDFilter"); - chkHDFilter.addEventListener("change", () => { + const chkHDFilter = context.querySelector('.chkHDFilter'); + chkHDFilter.addEventListener('change', () => { query.StartIndex = 0; query.IsHD = chkHDFilter.checked ? true : null; triggerChange(this); }); - const chkSDFilter = context.querySelector(".chkSDFilter"); - chkSDFilter.addEventListener("change", () => { + const chkSDFilter = context.querySelector('.chkSDFilter'); + chkSDFilter.addEventListener('change', () => { query.StartIndex = 0; query.IsHD = chkSDFilter.checked ? false : null; triggerChange(this); }); - for (const elem of context.querySelectorAll(".chkStatus")) { - elem.addEventListener("change", () => this.onStatusChange(elem)); + for (const elem of context.querySelectorAll('.chkStatus')) { + elem.addEventListener('change', () => this.onStatusChange(elem)); } - const chkTrailer = context.querySelector("#chkTrailer"); - chkTrailer.addEventListener("change", () => { + const chkTrailer = context.querySelector('#chkTrailer'); + chkTrailer.addEventListener('change', () => { query.StartIndex = 0; query.HasTrailer = chkTrailer.checked ? true : null; triggerChange(this); }); - const chkThemeSong = context.querySelector("#chkThemeSong"); - chkThemeSong.addEventListener("change", () => { + const chkThemeSong = context.querySelector('#chkThemeSong'); + chkThemeSong.addEventListener('change', () => { query.StartIndex = 0; query.HasThemeSong = chkThemeSong.checked ? true : null; triggerChange(this); }); - const chkSpecialFeature = context.querySelector("#chkSpecialFeature"); - chkSpecialFeature.addEventListener("change", () => { + const chkSpecialFeature = context.querySelector('#chkSpecialFeature'); + chkSpecialFeature.addEventListener('change', () => { query.StartIndex = 0; query.HasSpecialFeature = chkSpecialFeature.checked ? true : null; triggerChange(this); }); - const chkThemeVideo = context.querySelector("#chkThemeVideo"); - chkThemeVideo.addEventListener("change", () => { + const chkThemeVideo = context.querySelector('#chkThemeVideo'); + chkThemeVideo.addEventListener('change', () => { query.StartIndex = 0; query.HasThemeVideo = chkThemeVideo.checked ? true : null; triggerChange(this); }); - const chkMissingEpisode = context.querySelector("#chkMissingEpisode"); - chkMissingEpisode.addEventListener("change", () => { + const chkMissingEpisode = context.querySelector('#chkMissingEpisode'); + chkMissingEpisode.addEventListener('change', () => { query.StartIndex = 0; query.IsMissing = !!chkMissingEpisode.checked; triggerChange(this); }); - const chkSpecialEpisode = context.querySelector("#chkSpecialEpisode"); - chkSpecialEpisode.addEventListener("change", () => { + const chkSpecialEpisode = context.querySelector('#chkSpecialEpisode'); + chkSpecialEpisode.addEventListener('change', () => { query.StartIndex = 0; query.ParentIndexNumber = chkSpecialEpisode.checked ? 0 : null; triggerChange(this); }); - const chkFutureEpisode = context.querySelector("#chkFutureEpisode"); - chkFutureEpisode.addEventListener("change", () => { + const chkFutureEpisode = context.querySelector('#chkFutureEpisode'); + chkFutureEpisode.addEventListener('change', () => { query.StartIndex = 0; if (chkFutureEpisode.checked) { query.IsUnaired = true; @@ -344,19 +344,19 @@ import "css!./style.css"; } triggerChange(this); }); - const chkSubtitle = context.querySelector("#chkSubtitle"); - chkSubtitle.addEventListener("change", () => { + const chkSubtitle = context.querySelector('#chkSubtitle'); + chkSubtitle.addEventListener('change', () => { query.StartIndex = 0; query.HasSubtitles = chkSubtitle.checked ? true : null; triggerChange(this); }); - context.addEventListener("change", () => { - const chkGenreFilter = dom.parentWithClass(context, "chkGenreFilter"); + context.addEventListener('change', () => { + const chkGenreFilter = dom.parentWithClass(context, 'chkGenreFilter'); if (chkGenreFilter) { - const filterName = chkGenreFilter.getAttribute("data-filter"); - let filters = query.Genres || ""; - const delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + const filterName = chkGenreFilter.getAttribute('data-filter'); + let filters = query.Genres || ''; + const delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkGenreFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -365,12 +365,12 @@ import "css!./style.css"; triggerChange(this); return; } - const chkTagFilter = dom.parentWithClass(context, "chkTagFilter"); + const chkTagFilter = dom.parentWithClass(context, 'chkTagFilter'); if (chkTagFilter) { - const filterName = chkTagFilter.getAttribute("data-filter"); - let filters = query.Tags || ""; - const delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + const filterName = chkTagFilter.getAttribute('data-filter'); + let filters = query.Tags || ''; + const delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkTagFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -379,12 +379,12 @@ import "css!./style.css"; triggerChange(this); return; } - const chkYearFilter = dom.parentWithClass(context, "chkYearFilter"); + const chkYearFilter = dom.parentWithClass(context, 'chkYearFilter'); if (chkYearFilter) { - const filterName = chkYearFilter.getAttribute("data-filter"); - let filters = query.Years || ""; - const delimiter = ","; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + const filterName = chkYearFilter.getAttribute('data-filter'); + let filters = query.Years || ''; + const delimiter = ','; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkYearFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -393,12 +393,12 @@ import "css!./style.css"; triggerChange(this); return; } - const chkOfficialRatingFilter = dom.parentWithClass(context, "chkOfficialRatingFilter"); + const chkOfficialRatingFilter = dom.parentWithClass(context, 'chkOfficialRatingFilter'); if (chkOfficialRatingFilter) { - const filterName = chkOfficialRatingFilter.getAttribute("data-filter"); - let filters = query.OfficialRatings || ""; - const delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + const filterName = chkOfficialRatingFilter.getAttribute('data-filter'); + let filters = query.OfficialRatings || ''; + const delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkOfficialRatingFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -410,24 +410,24 @@ import "css!./style.css"; } show() { - return import("text!./filterdialog.template.html").then((template) => { + return import('text!./filterdialog.template.html').then((template) => { return new Promise((resolve) => { const dlg = dialogHelper.createDialog({ removeOnClose: true, modal: false }); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("formDialog"); - dlg.classList.add("filterDialog"); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); + dlg.classList.add('filterDialog'); dlg.innerHTML = globalize.translateDocument(template); setVisibility(dlg, this.options); dialogHelper.open(dlg); - dlg.addEventListener("close", resolve); + dlg.addEventListener('close', resolve); updateFilterControls(dlg, this.options); this.bindEvents(dlg); if (enableDynamicFilters(this.options.mode)) { - dlg.classList.add("dynamicFilterDialog"); + dlg.classList.add('dynamicFilterDialog'); const apiClient = connectionManager.getApiClient(this.options.serverId); loadDynamicFilters(dlg, apiClient, apiClient.getCurrentUserId(), this.options.query); } diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 2701ad171..62906d9d2 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,5 +1,5 @@ -define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "userSettings", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { - "use strict"; +define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -7,7 +7,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us pageData = { query: { StartIndex: 0, - Fields: "PrimaryImageAspectRatio" + Fields: 'PrimaryImageAspectRatio' } }; } @@ -26,7 +26,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us function getChannelsHtml(channels) { return cardBuilder.getCardsHtml({ items: channels, - shape: "square", + shape: 'square', showTitle: true, lazy: true, cardLayout: true, @@ -60,7 +60,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us } var query = getQuery(); - context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({ + context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -69,30 +69,30 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us filterButton: false }); var html = getChannelsHtml(result.Items); - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); var i; var length; var elems; - for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onNextPageClick); } - for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onPreviousPageClick); } } function showFilterMenu(context) { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: "livetvchannels", + mode: 'livetvchannels', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { reloadItems(context); }); filterDialog.show(); @@ -110,7 +110,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); }); @@ -119,7 +119,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us var pageData; var self = this; var isLoading = false; - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { showFilterMenu(tabContent); }); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 08842a6f1..af4d2c3c9 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Trailer", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Trailer', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -37,7 +37,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('trailers'); } return context.savedQueryKey; @@ -85,43 +85,43 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var html; var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', overlayPlayButton: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "movies" + context: 'movies' }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "movies", + context: 'movies', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', showTitle: true, showYear: true, cardLayout: true, @@ -130,8 +130,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', centerText: true, overlayPlayButton: true, showTitle: true, @@ -141,27 +141,27 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } if (!result.Items.length) { - html = '

' + Globalize.translate("MessageNoTrailersFound") + "

"; + html = '

' + Globalize.translate('MessageNoTrailersFound') + '

'; } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); @@ -180,13 +180,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "movies", + mode: 'movies', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(); }); @@ -199,9 +199,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -210,39 +210,39 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate("OptionNameSort"), - id: "SortName" + name: Globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: Globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName" + name: Globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName' }, { - name: Globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: Globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: Globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: Globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: Globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName" + name: Globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName' }, { - name: Globalize.translate("OptionPlayCount"), - id: "PlayCount,SortName" + name: Globalize.translate('OptionPlayCount'), + id: 'PlayCount,SortName' }, { - name: Globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName" + name: Globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 2aaca4f2d..2361892c4 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,5 +1,5 @@ -define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { - "use strict"; +define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { + 'use strict'; return function (view, params, tabContent) { function playAll() { @@ -23,16 +23,16 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser if (!pageData) { pageData = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "MusicAlbum", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'MusicAlbum', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -52,7 +52,7 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function getSavedQueryKey() { if (!savedQueryKey) { - savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums"); + savedQueryKey = libraryBrowser.getSavedQueryKey('musicalbums'); } return savedQueryKey; @@ -60,17 +60,17 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -114,18 +114,18 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "List") { + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "music", + context: 'music', sortBy: query.SortBy, addToListButton: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, showParentTitle: true, @@ -135,8 +135,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, showParentTitle: true, lazy: true, @@ -146,30 +146,30 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -186,13 +186,13 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: "albums", + mode: 'albums', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery().StartIndex = 0; reloadItems(tabContent); }); @@ -205,10 +205,10 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(); query.NameStartsWithOrGreater = newValue; @@ -217,39 +217,39 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate("OptionNameSort"), - id: "SortName" + name: Globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: Globalize.translate("OptionAlbumArtist"), - id: "AlbumArtist,SortName" + name: Globalize.translate('OptionAlbumArtist'), + id: 'AlbumArtist,SortName' }, { - name: Globalize.translate("OptionCommunityRating"), - id: "CommunityRating,SortName" + name: Globalize.translate('OptionCommunityRating'), + id: 'CommunityRating,SortName' }, { - name: Globalize.translate("OptionCriticRating"), - id: "CriticRating,SortName" + name: Globalize.translate('OptionCriticRating'), + id: 'CriticRating,SortName' }, { - name: Globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: Globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: Globalize.translate("OptionReleaseDate"), - id: "ProductionYear,PremiereDate,SortName" + name: Globalize.translate('OptionReleaseDate'), + id: 'ProductionYear,PremiereDate,SortName' }, { - name: Globalize.translate("OptionRandom"), - id: "Random,SortName" + name: Globalize.translate('OptionRandom'), + id: 'Random,SortName' }], callback: function () { getQuery().StartIndex = 0; @@ -259,11 +259,11 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); @@ -271,8 +271,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser onViewStyleChange(); reloadItems(tabContent); }); - tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll); - tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle); + tabContent.querySelector('.btnPlayAll').addEventListener('click', playAll); + tabContent.querySelector('.btnShuffle').addEventListener('click', shuffle); } initPage(tabContent); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index a3f05d381..7a889ff8b 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -8,13 +8,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { var queryValues = { - SortBy: "SortName", - SortOrder: "Ascending", + SortBy: 'SortName', + SortOrder: 'Ascending', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb' }; if (userSettings.libraryPageSize() > 0) { @@ -23,7 +23,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " pageData = data[key] = { query: queryValues, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -46,17 +46,17 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -103,16 +103,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "List") { + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, cardLayout: true @@ -120,8 +120,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, lazy: true, @@ -131,30 +131,30 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -170,13 +170,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: self.mode, serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -189,10 +189,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -201,21 +201,21 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 21743bc92..60c4f18d2 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,5 +1,5 @@ -define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) { - "use strict"; +define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,14 +9,14 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS if (!pageData) { pageData = data[key] = { query: { - SortBy: "Album,SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Audio", + SortBy: 'Album,SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Audio', Recursive: true, - Fields: "AudioInfo,ParentId", + Fields: 'AudioInfo,ParentId', StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: "Primary" + EnableImageTypes: 'Primary' } }; @@ -37,7 +37,7 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('songs'); } return context.savedQueryKey; @@ -85,35 +85,35 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS }); var html = listView.getListViewHtml({ items: result.Items, - action: "playallfromhere", + action: 'playallfromhere', smallIcon: true, artist: true, addToListButton: true }); - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -124,13 +124,13 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "songs", + mode: 'songs', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -143,38 +143,38 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS }; function initPage(tabContent) { - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate("OptionTrackName"), - id: "Name" + name: Globalize.translate('OptionTrackName'), + id: 'Name' }, { - name: Globalize.translate("OptionAlbum"), - id: "Album,SortName" + name: Globalize.translate('OptionAlbum'), + id: 'Album,SortName' }, { - name: Globalize.translate("OptionAlbumArtist"), - id: "AlbumArtist,Album,SortName" + name: Globalize.translate('OptionAlbumArtist'), + id: 'AlbumArtist,Album,SortName' }, { - name: Globalize.translate("OptionArtist"), - id: "Artist,Album,SortName" + name: Globalize.translate('OptionArtist'), + id: 'Artist,Album,SortName' }, { - name: Globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: Globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: Globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: Globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: Globalize.translate("OptionPlayCount"), - id: "PlayCount,SortName" + name: Globalize.translate('OptionPlayCount'), + id: 'PlayCount,SortName' }, { - name: Globalize.translate("OptionReleaseDate"), - id: "PremiereDate,AlbumArtist,Album,SortName" + name: Globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,AlbumArtist,Album,SortName' }, { - name: Globalize.translate("OptionRuntime"), - id: "Runtime,AlbumArtist,Album,SortName" + name: Globalize.translate('OptionRuntime'), + id: 'Runtime,AlbumArtist,Album,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index b27495293..f9e43739a 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,5 +1,5 @@ -define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) { - "use strict"; +define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,17 +9,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB if (!pageData) { pageData = data[key] = { query: { - SortBy: "SeriesSortName,SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Episode", + SortBy: 'SeriesSortName,SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Episode', Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,UserData', IsMissing: false, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -39,7 +39,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('episodes'); } return context.savedQueryKey; @@ -47,17 +47,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -100,17 +100,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - if (viewStyle == "List") { + var itemsContainer = tabContent.querySelector('.itemsContainer'); + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy, showParentTitle: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, showParentTitle: true, scalable: true, @@ -119,7 +119,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, showParentTitle: true, overlayText: false, @@ -132,19 +132,19 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB var length; var elems; - elems = tabContent.querySelectorAll(".paging"); + elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } itemsContainer.innerHTML = html; @@ -153,7 +153,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -164,13 +164,13 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "episodes", + mode: 'episodes', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { reloadItems(tabContent); }); filterDialog.show(); @@ -182,35 +182,35 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB }; function initPage(tabContent) { - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate("OptionNameSort"), - id: "SeriesSortName,SortName" + name: Globalize.translate('OptionNameSort'), + id: 'SeriesSortName,SortName' }, { - name: Globalize.translate("OptionTvdbRating"), - id: "CommunityRating,SeriesSortName,SortName" + name: Globalize.translate('OptionTvdbRating'), + id: 'CommunityRating,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionDateAdded"), - id: "DateCreated,SeriesSortName,SortName" + name: Globalize.translate('OptionDateAdded'), + id: 'DateCreated,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionPremiereDate"), - id: "PremiereDate,SeriesSortName,SortName" + name: Globalize.translate('OptionPremiereDate'), + id: 'PremiereDate,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SeriesSortName,SortName" + name: Globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionParentalRating"), - id: "OfficialRating,SeriesSortName,SortName" + name: Globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionPlayCount"), - id: "PlayCount,SeriesSortName,SortName" + name: Globalize.translate('OptionPlayCount'), + id: 'PlayCount,SeriesSortName,SortName' }, { - name: Globalize.translate("OptionRuntime"), - id: "Runtime,SeriesSortName,SortName" + name: Globalize.translate('OptionRuntime'), + id: 'Runtime,SeriesSortName,SortName' }], callback: function () { reloadItems(tabContent); @@ -219,11 +219,11 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 96aef86ca..4d368eb37 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Series', Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -38,7 +38,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("series"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('series'); } return context.savedQueryKey; @@ -46,17 +46,17 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -100,45 +100,45 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "tvshows", + context: 'tvshows', overlayMoreButton: true, showTitle: true, centerText: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "tvshows", + context: 'tvshows', cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "tvshows" + context: 'tvshows' }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "tvshows", + context: 'tvshows', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "tvshows", + shape: 'portrait', + context: 'tvshows', showTitle: true, showYear: true, centerText: true, @@ -147,8 +147,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "tvshows", + shape: 'portrait', + context: 'tvshows', centerText: true, lazy: true, overlayMoreButton: true, @@ -158,30 +158,30 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -197,13 +197,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function ({default: filterDialogFactory}) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "series", + mode: 'series', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -216,10 +216,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -228,36 +228,36 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate("OptionNameSort"), - id: "SortName" + name: Globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: Globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName" + name: Globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName' }, { - name: Globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: Globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: Globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: Globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: Globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName" + name: Globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName' }, { - name: Globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName" + name: Globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; @@ -267,11 +267,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 07b9d6d3b..3e432c057 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -1,21 +1,21 @@ /* eslint-disable indent */ -import connectionManager from "connectionManager"; +import connectionManager from 'connectionManager'; class BackdropScreensaver { constructor() { - this.name = "Backdrop ScreenSaver"; - this.type = "screensaver"; - this.id = "backdropscreensaver"; + this.name = 'Backdrop ScreenSaver'; + this.type = 'screensaver'; + this.id = 'backdropscreensaver'; this.supportsAnonymous = false; } show() { const query = { - ImageTypes: "Backdrop", - EnableImageTypes: "Backdrop", - IncludeItemTypes: "Movie,Series,MusicArtist", - SortBy: "Random", + ImageTypes: 'Backdrop', + EnableImageTypes: 'Backdrop', + IncludeItemTypes: 'Movie,Series,MusicArtist', + SortBy: 'Random', Recursive: true, - Fields: "Taglines", + Fields: 'Taglines', ImageTypeLimit: 1, StartIndex: 0, Limit: 200 @@ -26,7 +26,7 @@ class BackdropScreensaver { if (result.Items.length) { - import("slideshow").then(slideshow => { + import('slideshow').then(slideshow => { var newSlideShow = new slideshow({ showTitle: true, From 60e670fcf7aaab5929ee66b0e306f0e17b365ed3 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Tue, 5 May 2020 23:56:43 +0200 Subject: [PATCH 031/362] Fixed globalize --- src/controllers/movies/movietrailers.js | 18 +++++++++--------- src/controllers/music/musicalbums.js | 16 ++++++++-------- src/controllers/music/songs.js | 20 ++++++++++---------- src/controllers/shows/episodes.js | 18 +++++++++--------- src/controllers/shows/tvshows.js | 14 +++++++------- 5 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index af4d2c3c9..99152275b 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -158,7 +158,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } if (!result.Items.length) { - html = '

' + Globalize.translate('MessageNoTrailersFound') + '

'; + html = '

' + globalize.translate('MessageNoTrailersFound') + '

'; } var itemsContainer = tabContent.querySelector('.itemsContainer'); @@ -223,25 +223,25 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate('OptionNameSort'), + name: globalize.translate('OptionNameSort'), id: 'SortName' }, { - name: Globalize.translate('OptionImdbRating'), + name: globalize.translate('OptionImdbRating'), id: 'CommunityRating,SortName' }, { - name: Globalize.translate('OptionDateAdded'), + name: globalize.translate('OptionDateAdded'), id: 'DateCreated,SortName' }, { - name: Globalize.translate('OptionDatePlayed'), + name: globalize.translate('OptionDatePlayed'), id: 'DatePlayed,SortName' }, { - name: Globalize.translate('OptionParentalRating'), + name: globalize.translate('OptionParentalRating'), id: 'OfficialRating,SortName' }, { - name: Globalize.translate('OptionPlayCount'), + name: globalize.translate('OptionPlayCount'), id: 'PlayCount,SortName' }, { - name: Globalize.translate('OptionReleaseDate'), + name: globalize.translate('OptionReleaseDate'), id: 'PremiereDate,SortName' }], callback: function () { diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 2361892c4..645daf4ad 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) { +define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -230,25 +230,25 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate('OptionNameSort'), + name: globalize.translate('OptionNameSort'), id: 'SortName' }, { - name: Globalize.translate('OptionAlbumArtist'), + name: globalize.translate('OptionAlbumArtist'), id: 'AlbumArtist,SortName' }, { - name: Globalize.translate('OptionCommunityRating'), + name: globalize.translate('OptionCommunityRating'), id: 'CommunityRating,SortName' }, { - name: Globalize.translate('OptionCriticRating'), + name: globalize.translate('OptionCriticRating'), id: 'CriticRating,SortName' }, { - name: Globalize.translate('OptionDateAdded'), + name: globalize.translate('OptionDateAdded'), id: 'DateCreated,SortName' }, { - name: Globalize.translate('OptionReleaseDate'), + name: globalize.translate('OptionReleaseDate'), id: 'ProductionYear,PremiereDate,SortName' }, { - name: Globalize.translate('OptionRandom'), + name: globalize.translate('OptionRandom'), id: 'Random,SortName' }], callback: function () { diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 60c4f18d2..aa63ec51f 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,4 +1,4 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) { +define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -149,31 +149,31 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate('OptionTrackName'), + name: globalize.translate('OptionTrackName'), id: 'Name' }, { - name: Globalize.translate('OptionAlbum'), + name: globalize.translate('OptionAlbum'), id: 'Album,SortName' }, { - name: Globalize.translate('OptionAlbumArtist'), + name: globalize.translate('OptionAlbumArtist'), id: 'AlbumArtist,Album,SortName' }, { - name: Globalize.translate('OptionArtist'), + name: globalize.translate('OptionArtist'), id: 'Artist,Album,SortName' }, { - name: Globalize.translate('OptionDateAdded'), + name: globalize.translate('OptionDateAdded'), id: 'DateCreated,SortName' }, { - name: Globalize.translate('OptionDatePlayed'), + name: globalize.translate('OptionDatePlayed'), id: 'DatePlayed,SortName' }, { - name: Globalize.translate('OptionPlayCount'), + name: globalize.translate('OptionPlayCount'), id: 'PlayCount,SortName' }, { - name: Globalize.translate('OptionReleaseDate'), + name: globalize.translate('OptionReleaseDate'), id: 'PremiereDate,AlbumArtist,Album,SortName' }, { - name: Globalize.translate('OptionRuntime'), + name: globalize.translate('OptionRuntime'), id: 'Runtime,AlbumArtist,Album,SortName' }], callback: function () { diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index f9e43739a..eeede2066 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,4 +1,4 @@ -define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) { +define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -188,28 +188,28 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate('OptionNameSort'), + name: globalize.translate('OptionNameSort'), id: 'SeriesSortName,SortName' }, { - name: Globalize.translate('OptionTvdbRating'), + name: globalize.translate('OptionTvdbRating'), id: 'CommunityRating,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionDateAdded'), + name: globalize.translate('OptionDateAdded'), id: 'DateCreated,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionPremiereDate'), + name: globalize.translate('OptionPremiereDate'), id: 'PremiereDate,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionDatePlayed'), + name: globalize.translate('OptionDatePlayed'), id: 'DatePlayed,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionParentalRating'), + name: globalize.translate('OptionParentalRating'), id: 'OfficialRating,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionPlayCount'), + name: globalize.translate('OptionPlayCount'), id: 'PlayCount,SeriesSortName,SortName' }, { - name: Globalize.translate('OptionRuntime'), + name: globalize.translate('OptionRuntime'), id: 'Runtime,SeriesSortName,SortName' }], callback: function () { diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 4d368eb37..0bd5e4b52 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) { +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -241,22 +241,22 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: Globalize.translate('OptionNameSort'), + name: globalize.translate('OptionNameSort'), id: 'SortName' }, { - name: Globalize.translate('OptionImdbRating'), + name: globalize.translate('OptionImdbRating'), id: 'CommunityRating,SortName' }, { - name: Globalize.translate('OptionDateAdded'), + name: globalize.translate('OptionDateAdded'), id: 'DateCreated,SortName' }, { - name: Globalize.translate('OptionDatePlayed'), + name: globalize.translate('OptionDatePlayed'), id: 'DatePlayed,SortName' }, { - name: Globalize.translate('OptionParentalRating'), + name: globalize.translate('OptionParentalRating'), id: 'OfficialRating,SortName' }, { - name: Globalize.translate('OptionReleaseDate'), + name: globalize.translate('OptionReleaseDate'), id: 'PremiereDate,SortName' }], callback: function () { From 8c433afd6bce846d2320903b7b663ec3bda324c4 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Wed, 6 May 2020 00:03:42 +0200 Subject: [PATCH 032/362] Migrated src/components/fetchhelper.js --- src/components/fetchhelper.js | 59 +++++++++++++---------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index 08fe803ec..8bbee347f 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -1,21 +1,19 @@ -define([], function () { - 'use strict'; +/* eslint-disable indent */ + export function getFetchPromise(request) { - function getFetchPromise(request) { - - var headers = request.headers || {}; + const headers = request.headers || {}; if (request.dataType === 'json') { headers.accept = 'application/json'; } - var fetchRequest = { + const fetchRequest = { headers: headers, method: request.type, credentials: 'same-origin' }; - var contentType = request.contentType; + let contentType = request.contentType; if (request.data) { @@ -33,12 +31,12 @@ define([], function () { headers['Content-Type'] = contentType; } - var url = request.url; + let url = request.url; if (request.query) { - var paramString = paramsToString(request.query); + const paramString = paramsToString(request.query); if (paramString) { - url += '?' + paramString; + url += `?${paramString}`; } } @@ -51,11 +49,11 @@ define([], function () { function fetchWithTimeout(url, options, timeoutMs) { - console.debug('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url); + console.debug(`fetchWithTimeout: timeoutMs: ${timeoutMs}, url: ${url}`); return new Promise(function (resolve, reject) { - var timeout = setTimeout(reject, timeoutMs); + const timeout = setTimeout(reject, timeoutMs); options = options || {}; options.credentials = 'same-origin'; @@ -63,50 +61,41 @@ define([], function () { fetch(url, options).then(function (response) { clearTimeout(timeout); - console.debug('fetchWithTimeout: succeeded connecting to url: ' + url); + console.debug(`fetchWithTimeout: succeeded connecting to url: ${url}`); resolve(response); }, function (error) { clearTimeout(timeout); - console.debug('fetchWithTimeout: timed out connecting to url: ' + url); + console.debug(`fetchWithTimeout: timed out connecting to url: ${url}`); - reject(); + reject(error); }); }); } function paramsToString(params) { - - var values = []; - - for (var key in params) { - - var value = params[key]; - - if (value !== null && value !== undefined && value !== '') { - values.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - } - } - return values.join('&'); + return Object.keys(params) + .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) + .join('&'); } - function ajax(request) { + export function ajax(request) { if (!request) { throw new Error('Request cannot be null'); } request.headers = request.headers || {}; - console.debug('requesting url: ' + request.url); + console.debug(`requesting url: ${request.url}`); return getFetchPromise(request).then(function (response) { - console.debug('response status: ' + response.status + ', url: ' + request.url); + console.debug(`response status: ${response.status}, url: ${request.url}`); if (response.status < 400) { if (request.dataType === 'json' || request.headers.accept === 'application/json') { return response.json(); - } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().indexOf('text/') === 0) { + } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().includes('text/')) { return response.text(); } else { return response; @@ -115,12 +104,8 @@ define([], function () { return Promise.reject(response); } }, function (err) { - console.error('request failed to url: ' + request.url); + console.error(`request failed to url: ${request.url}`); throw err; }); } - return { - getFetchPromise: getFetchPromise, - ajax: ajax - }; -}); +/* eslint-enable indent */ From 6be76e5c31470f61d9f8c2bc45d2ee78a97ffa68 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Wed, 6 May 2020 00:16:59 +0200 Subject: [PATCH 033/362] Fixed some errors --- package.json | 3 +++ src/components/filterdialog/filterdialog.js | 2 +- src/controllers/movies/movies.js | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2d1ddae97..9c1f3ad5f 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,9 @@ "src/scripts/filesystem.js", "src/scripts/imagehelper.js", "src/scripts/inputManager.js", + "src/components/backdropscreensaver/plugin.js", + "src/components/filterdialog/filterdialog.js", + "src/components/fetchhelper.js", "src/scripts/keyboardNavigation.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index d0c1ee287..e52645b97 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -410,7 +410,7 @@ import 'css!./style.css'; } show() { - return import('text!./filterdialog.template.html').then((template) => { + return import('text!./filterdialog.template.html').then(({default: template}) => { return new Promise((resolve) => { const dlg = dialogHelper.createDialog({ removeOnClose: true, diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 89bcc215e..c22b52c47 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -270,7 +270,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', query = userSettings.loadQuerySettings(savedQueryKey, query); self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { var filterDialog = new filterDialogFactory({ query: query, mode: 'movies', From 587b537cd676574aff4e7b2933d7fc55409c279f Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Fri, 8 May 2020 11:48:34 +0200 Subject: [PATCH 034/362] Modernized some loops and converted more string additions to template strings --- src/components/filterdialog/filterdialog.js | 46 +++++++++------------ 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index e52645b97..7151d21d5 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -19,10 +19,10 @@ import 'css!./style.css'; html += '
'; html += items.map(function (filter) { let itemHtml = ''; - const checkedHtml = isCheckedFn(filter) ? ' checked' : ''; + const checkedHtml = isCheckedFn(filter) ? 'checked' : ''; itemHtml += ''; return itemHtml; }).join(''); @@ -75,16 +75,16 @@ import 'css!./style.css'; context.querySelector('.chkDislikes').checked = query.IsDisliked === true; } else { for (const elem of context.querySelectorAll('.chkStandardFilter')) { - const filters = ',' + (query.Filters || ''); + const filters = `,${query.Filters || ''}`; const filterName = elem.getAttribute('data-filter'); - elem.checked = filters.includes(',' + filterName); + elem.checked = filters.includes(`,${filterName}`); } } for (const elem of context.querySelectorAll('.chkVideoTypeFilter')) { - const filters = ',' + (query.VideoTypes || ''); + const filters = `,${query.VideoTypes || ''}`; const filterName = elem.getAttribute('data-filter'); - elem.checked = filters.includes(',' + filterName); + elem.checked = filters.includes(`,${filterName}`); } context.querySelector('.chk3DFilter').checked = query.Is3D === true; context.querySelector('.chkHDFilter').checked = query.IsHD === true; @@ -99,9 +99,9 @@ import 'css!./style.css'; context.querySelector('#chkMissingEpisode').checked = query.IsMissing === true; context.querySelector('#chkFutureEpisode').checked = query.IsUnaired === true; for (const elem of context.querySelectorAll('.chkStatus')) { - const filters = ',' + (query.SeriesStatus || ''); + const filters = `,${query.SeriesStatus || ''}`; const filterName = elem.getAttribute('data-filter'); - elem.checked = filters.includes(',' + filterName); + elem.checked = filters.includes(`,${filterName}`); } } @@ -142,22 +142,14 @@ import 'css!./style.css'; } function showByClass(context, className) { - const elems = context.querySelectorAll('.' + className); - - let i = 0; - const length = elems.length; - for (; i < length; i++) { - elems[i].classList.remove('hide'); + for (const elem of context.querySelectorAll(`.${className}`)) { + elem.classList.remove('hide'); } } function hideByClass(context, className) { - const elems = context.querySelectorAll('.' + className); - - let i = 0; - const length = elems.length; - for (; i < length; i++) { - elems[i].classList.add('hide'); + for (const elem of context.querySelectorAll(`.${className}`)) { + elem.classList.add('hide'); } } @@ -190,10 +182,10 @@ import 'css!./style.css'; const query = this.options.query; const filterName = elem.getAttribute('data-filter'); let filters = query.Filters || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + filters = (`,${filters}`).replace(`,${filterName}`, '').substring(1); if (elem.checked) { - filters = filters ? filters + ',' + filterName : filterName; + filters = filters ? `${filters},${filterName}` : filterName; } query.StartIndex = 0; @@ -208,10 +200,10 @@ import 'css!./style.css'; const query = this.options.query; const filterName = elem.getAttribute('data-filter'); let filters = query.VideoTypes || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + filters = (`,${filters}`).replace(`,${filterName}`, '').substring(1); if (elem.checked) { - filters = filters ? filters + ',' + filterName : filterName; + filters = filters ? `${filters},${filterName}` : filterName; } query.StartIndex = 0; @@ -226,10 +218,10 @@ import 'css!./style.css'; const query = this.options.query; const filterName = elem.getAttribute('data-filter'); let filters = query.SeriesStatus || ''; - filters = (',' + filters).replace(',' + filterName, '').substring(1); + filters = (`,${filters}`).replace(`,${filterName}`, '').substring(1); if (elem.checked) { - filters = filters ? filters + ',' + filterName : filterName; + filters = filters ? `${filters},${filterName}` : filterName; } query.SeriesStatus = filters; From 6d14ad0a7654b04b902c1e01311a89c02107c40d Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Tue, 26 May 2020 23:59:58 +0200 Subject: [PATCH 035/362] Fixed review comments --- src/components/fetchhelper.js | 3 ++- src/components/filterdialog/filterdialog.js | 10 +++++----- src/plugins/backdropScreensaver/plugin.js | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index 8bbee347f..3bc24a891 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -77,6 +77,7 @@ function paramsToString(params) { return Object.keys(params) + .filter((k) => !!params[k]) .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) .join('&'); } @@ -95,7 +96,7 @@ if (response.status < 400) { if (request.dataType === 'json' || request.headers.accept === 'application/json') { return response.json(); - } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().includes('text/')) { + } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().startsWith('text/')) { return response.text(); } else { return response; diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index 7151d21d5..041fa82e7 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -342,8 +342,8 @@ import 'css!./style.css'; query.HasSubtitles = chkSubtitle.checked ? true : null; triggerChange(this); }); - context.addEventListener('change', () => { - const chkGenreFilter = dom.parentWithClass(context, 'chkGenreFilter'); + context.addEventListener('change', (e) => { + const chkGenreFilter = dom.parentWithClass(e.target, 'chkGenreFilter'); if (chkGenreFilter) { const filterName = chkGenreFilter.getAttribute('data-filter'); let filters = query.Genres || ''; @@ -357,7 +357,7 @@ import 'css!./style.css'; triggerChange(this); return; } - const chkTagFilter = dom.parentWithClass(context, 'chkTagFilter'); + const chkTagFilter = dom.parentWithClass(e.target, 'chkTagFilter'); if (chkTagFilter) { const filterName = chkTagFilter.getAttribute('data-filter'); let filters = query.Tags || ''; @@ -371,7 +371,7 @@ import 'css!./style.css'; triggerChange(this); return; } - const chkYearFilter = dom.parentWithClass(context, 'chkYearFilter'); + const chkYearFilter = dom.parentWithClass(e.target, 'chkYearFilter'); if (chkYearFilter) { const filterName = chkYearFilter.getAttribute('data-filter'); let filters = query.Years || ''; @@ -385,7 +385,7 @@ import 'css!./style.css'; triggerChange(this); return; } - const chkOfficialRatingFilter = dom.parentWithClass(context, 'chkOfficialRatingFilter'); + const chkOfficialRatingFilter = dom.parentWithClass(e.target, 'chkOfficialRatingFilter'); if (chkOfficialRatingFilter) { const filterName = chkOfficialRatingFilter.getAttribute('data-filter'); let filters = query.OfficialRatings || ''; diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 3e432c057..acaefa76d 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -22,7 +22,7 @@ class BackdropScreensaver { }; const apiClient = connectionManager.currentApiClient(); - apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { + apiClient.getItems(apiClient.getCurrentUserId(), query).then((result) => { if (result.Items.length) { From 57a0cd7713f870c159f1bf5c96e79b54d6d165a3 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Thu, 28 May 2020 22:44:56 +0200 Subject: [PATCH 036/362] Fixed bad file path Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c1f3ad5f..60ba409ab 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "src/scripts/filesystem.js", "src/scripts/imagehelper.js", "src/scripts/inputManager.js", - "src/components/backdropscreensaver/plugin.js", + "src/components/backdropScreensaver/plugin.js", "src/components/filterdialog/filterdialog.js", "src/components/fetchhelper.js", "src/scripts/keyboardNavigation.js", From d36a8994fb068f94485841ea8b6361cfe1fa86d3 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Thu, 28 May 2020 23:06:36 +0200 Subject: [PATCH 037/362] Fixed review comments --- .eslintrc.js | 1 + src/components/fetchhelper.js | 11 ++++++++--- src/plugins/backdropScreensaver/plugin.js | 5 ++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 27b5c2a23..ab53f0f03 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -132,6 +132,7 @@ module.exports = { 'Object.getOwnPropertyDescriptor', 'Object.getPrototypeOf', 'Object.keys', + 'Object.entries', 'Object.getOwnPropertyNames', 'Function.name', 'Function.hasInstance', diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index 3bc24a891..11c5697dc 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -75,10 +75,15 @@ }); } + /** + * @param params {Record} + * @returns {string} Query string + */ function paramsToString(params) { - return Object.keys(params) - .filter((k) => !!params[k]) - .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) + return Object.entries(params) + // eslint-disable-next-line no-unused-vars + .filter(([_, v]) => v !== null && v !== undefined) + .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&'); } diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index acaefa76d..88bfa1f4b 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -26,9 +26,8 @@ class BackdropScreensaver { if (result.Items.length) { - import('slideshow').then(slideshow => { - - var newSlideShow = new slideshow({ + import('slideshow').then(({default: Slideshow}) => { + const newSlideShow = new Slideshow({ showTitle: true, cover: true, items: result.Items From e4e42bfee00e2e9314c506d1ac335815152033ad Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Sat, 6 Jun 2020 11:27:54 +0200 Subject: [PATCH 038/362] Check for empty argument in querystring --- src/components/fetchhelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index 11c5697dc..f626abefe 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -82,7 +82,7 @@ function paramsToString(params) { return Object.entries(params) // eslint-disable-next-line no-unused-vars - .filter(([_, v]) => v !== null && v !== undefined) + .filter(([_, v]) => v !== null && v !== undefined && v !== '') .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&'); } From 523f060e9924680773f9392ef8da19ac601de738 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 6 Jun 2020 18:34:45 +0900 Subject: [PATCH 039/362] fix issue with certain controllers during page load --- src/components/viewManager/viewManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 4ceb3b949..e37c87123 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -23,7 +23,7 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi if (typeof options.controllerFactory === 'function') { var controller = new options.controllerFactory(newView, eventDetail.detail.params); - } else if (options.controllerFactory.default && typeof options.controllerFactory.default === 'function') { + } else if (options.controllerFactory && typeof options.controllerFactory.default === 'function') { var controller = new options.controllerFactory.default(newView, eventDetail.detail.params); } From e8062cccd37c4ffa01be184ba785166d1dcdad7e Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Sat, 6 Jun 2020 11:52:58 +0200 Subject: [PATCH 040/362] Fixed backdropScreensaver path Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60ba409ab..de9fa24e8 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "src/scripts/filesystem.js", "src/scripts/imagehelper.js", "src/scripts/inputManager.js", - "src/components/backdropScreensaver/plugin.js", + "src/plugins/backdropScreensaver/plugin.js", "src/components/filterdialog/filterdialog.js", "src/components/fetchhelper.js", "src/scripts/keyboardNavigation.js", From 7b0fbc7c7ad5f007322822dbf05bce8550102982 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 6 Jun 2020 18:53:05 +0200 Subject: [PATCH 041/362] Fix MP3 audio in video support --- src/scripts/browserDeviceProfile.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index a550b6919..0b76c4342 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -333,8 +333,9 @@ define(['browser'], function (browser) { var videoAudioCodecs = []; var hlsVideoAudioCodecs = []; - var supportsMp3VideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/, ''); + var supportsMp3VideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp3"').replace(/no/, ''); // Not sure how to test for this var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s; From 49491d013e950afd576ce0987fd6cd9df26fe565 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 6 Jun 2020 19:16:48 +0200 Subject: [PATCH 042/362] Remove references to Orsay and Chromecast in browserDeviceProfile --- src/scripts/browserDeviceProfile.js | 153 +++++++--------------------- 1 file changed, 37 insertions(+), 116 deletions(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 0b76c4342..a63f39ba9 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -6,18 +6,10 @@ define(['browser'], function (browser) { } function canPlayH265(videoTestElement, options) { - if (browser.tizen || browser.orsay || browser.xboxOne || browser.web0s || options.supportsHevc) { + if (browser.tizen || browser.xboxOne || browser.web0s || options.supportsHevc) { return true; } - var userAgent = navigator.userAgent.toLowerCase(); - if (browser.chromecast) { - var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; - if (isChromecastUltra) { - return true; - } - } - if (browser.ps4) { return false; } @@ -31,7 +23,7 @@ define(['browser'], function (browser) { var _supportsTextTracks; function supportsTextTracks() { - if (browser.tizen || browser.orsay) { + if (browser.tizen) { return true; } @@ -53,7 +45,7 @@ define(['browser'], function (browser) { } function canPlayNativeHls() { - if (browser.tizen || browser.orsay) { + if (browser.tizen) { return true; } @@ -72,7 +64,7 @@ define(['browser'], function (browser) { } function supportsAc3(videoTestElement) { - if (browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s) { + if (browser.edgeUwp || browser.tizen || browser.web0s) { return true; } @@ -80,7 +72,7 @@ define(['browser'], function (browser) { } function supportsEac3(videoTestElement) { - if (browser.tizen || browser.orsay || browser.web0s) { + if (browser.tizen || browser.web0s) { return true; } @@ -88,7 +80,7 @@ define(['browser'], function (browser) { } function supportsAc3InHls(videoTestElement) { - if (browser.tizen || browser.orsay || browser.web0s) { + if (browser.tizen || browser.web0s) { return true; } @@ -104,11 +96,11 @@ define(['browser'], function (browser) { var typeString; if (format === 'flac') { - if (browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp) { + if (browser.tizen || browser.web0s || browser.edgeUwp) { return true; } } else if (format === 'wma') { - if (browser.tizen || browser.orsay || browser.edgeUwp) { + if (browser.tizen || browser.edgeUwp) { return true; } } else if (format === 'asf') { @@ -143,7 +135,7 @@ define(['browser'], function (browser) { } function testCanPlayMkv(videoTestElement) { - if (browser.tizen || browser.orsay || browser.web0s) { + if (browser.tizen || browser.web0s) { return true; } @@ -152,23 +144,6 @@ define(['browser'], function (browser) { return true; } - // Unfortunately there's no real way to detect mkv support - if (browser.chrome) { - // Not supported on opera tv - if (browser.operaTv) { - return false; - } - - var userAgent = navigator.userAgent.toLowerCase(); - - // Filter out browsers based on chromium that don't support mkv - if (userAgent.indexOf('vivaldi') !== -1 || userAgent.indexOf('opera') !== -1) { - return false; - } - - return true; - } - if (browser.edgeUwp) { return true; } @@ -177,15 +152,15 @@ define(['browser'], function (browser) { } function testCanPlayTs() { - return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + return browser.tizen || browser.web0s || browser.edgeUwp; } function supportsMpeg2Video() { - return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + return browser.tizen || browser.web0s || browser.edgeUwp; } function supportsVc1() { - return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + return browser.tizen || browser.web0s || browser.edgeUwp; } function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) { @@ -195,11 +170,11 @@ define(['browser'], function (browser) { switch (container) { case 'asf': - supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.edgeUwp; videoAudioCodecs = []; break; case 'avi': - supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.edgeUwp; // New Samsung TV don't support XviD/DivX // Explicitly add supported codecs to make other codecs be transcoded if (browser.tizenVersion >= 4) { @@ -212,24 +187,24 @@ define(['browser'], function (browser) { break; case 'mpg': case 'mpeg': - supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.edgeUwp; break; case 'flv': - supported = browser.tizen || browser.orsay; + supported = browser.tizen; break; case '3gp': case 'mts': case 'trp': case 'vob': case 'vro': - supported = browser.tizen || browser.orsay; + supported = browser.tizen; break; case 'mov': - supported = browser.tizen || browser.orsay || browser.web0s || browser.chrome || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.chrome || browser.edgeUwp; videoCodecs.push('h264'); break; case 'm2ts': - supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.edgeUwp; videoCodecs.push('h264'); if (supportsVc1()) { videoCodecs.push('vc1'); @@ -239,7 +214,7 @@ define(['browser'], function (browser) { } break; case 'wmv': - supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + supported = browser.tizen || browser.web0s || browser.edgeUwp; videoAudioCodecs = []; break; case 'ts': @@ -274,21 +249,6 @@ define(['browser'], function (browser) { } function getGlobalMaxVideoBitrate() { - var userAgent = navigator.userAgent.toLowerCase(); - if (browser.chromecast) { - var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; - if (isChromecastUltra) { - return null; - } - - // This is a hack to try and detect chromecast on vizio - if (self.screen && self.screen.width >= 3800) { - return null; - } - - return 30000000; - } - var isTizenFhd = false; if (browser.tizen) { try { @@ -338,7 +298,7 @@ define(['browser'], function (browser) { || videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp3"').replace(/no/, ''); // Not sure how to test for this - var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s; + var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.web0s; var maxVideoWidth = browser.xboxOne ? (self.screen ? self.screen.width : null) : @@ -350,11 +310,6 @@ define(['browser'], function (browser) { var canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, ''); - if (canPlayAacVideoAudio && browser.chromecast && physicalAudioChannels <= 2) { - // prioritize this first - videoAudioCodecs.push('aac'); - } - // Only put mp3 first if mkv support is there // Otherwise with HLS and mp3 audio we're seeing some browsers // safari is lying @@ -377,11 +332,6 @@ define(['browser'], function (browser) { } } - if (canPlayAacVideoAudio && browser.chromecast && videoAudioCodecs.indexOf('aac') === -1) { - // prioritize this first - videoAudioCodecs.push('aac'); - } - if (supportsMp3VideoAudio) { videoAudioCodecs.push('mp3'); @@ -416,7 +366,7 @@ define(['browser'], function (browser) { videoAudioCodecs.push('mp2'); } - var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts; + var supportsDts = browser.tizen || browser.web0s || options.supportsDts; // DTS audio not supported in 2018 models (Tizen 4.0) if (browser.tizenVersion >= 4) { @@ -428,7 +378,7 @@ define(['browser'], function (browser) { videoAudioCodecs.push('dts'); } - if (browser.tizen || browser.orsay || browser.web0s) { + if (browser.tizen || browser.web0s) { videoAudioCodecs.push('pcm_s16le'); videoAudioCodecs.push('pcm_s24le'); } @@ -437,7 +387,7 @@ define(['browser'], function (browser) { videoAudioCodecs.push('truehd'); } - if (browser.tizen || browser.orsay) { + if (browser.tizen) { videoAudioCodecs.push('aac_latm'); } @@ -485,7 +435,7 @@ define(['browser'], function (browser) { mp4VideoCodecs.push('vc1'); } - if (browser.tizen || browser.orsay) { + if (browser.tizen) { mp4VideoCodecs.push('msmpeg4v2'); } @@ -497,7 +447,7 @@ define(['browser'], function (browser) { mp4VideoCodecs.push('vp9'); } - if (canPlayVp8 || browser.tizen || browser.orsay) { + if (canPlayVp8 || browser.tizen) { videoAudioCodecs.push('vorbis'); } @@ -629,7 +579,7 @@ define(['browser'], function (browser) { }); }); - if (canPlayMkv && !browser.tizen && !browser.orsay && options.enableMkvProgressive !== false) { + if (canPlayMkv && !browser.tizen && options.enableMkvProgressive !== false) { profile.TranscodingProfiles.push({ Container: 'mkv', Type: 'Video', @@ -694,7 +644,7 @@ define(['browser'], function (browser) { profile.CodecProfiles = []; - var supportsSecondaryAudio = browser.tizen || browser.orsay || videoTestElement.audioTracks; + var supportsSecondaryAudio = browser.tizen || videoTestElement.audioTracks; var aacCodecProfileConditions = []; @@ -717,15 +667,6 @@ define(['browser'], function (browser) { }); } - if (browser.chromecast) { - aacCodecProfileConditions.push({ - Condition: 'LessThanEqual', - Property: 'AudioChannels', - Value: '2', - IsRequired: true - }); - } - if (aacCodecProfileConditions.length) { profile.CodecProfiles.push({ Type: 'VideoAudio', @@ -751,7 +692,7 @@ define(['browser'], function (browser) { var maxH264Level = 42; var h264Profiles = 'high|main|baseline|constrained baseline'; - if (browser.tizen || browser.orsay || browser.web0s || + if (browser.tizen || browser.web0s || videoTestElement.canPlayType('video/mp4; codecs="avc1.640833"').replace(/no/, '')) { maxH264Level = 51; } @@ -761,7 +702,7 @@ define(['browser'], function (browser) { maxH264Level = 52; } - if (browser.tizen || browser.orsay || + if (browser.tizen || videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { // These tests are passing in safari, but playback is failing @@ -795,20 +736,13 @@ define(['browser'], function (browser) { ] }); - if (!browser.edgeUwp && !browser.tizen && !browser.orsay && !browser.web0s) { - //profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ - // Condition: 'NotEquals', - // Property: 'IsAVC', - // Value: 'false', - // IsRequired: false - //}); - - //profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ - // Condition: 'NotEquals', - // Property: 'IsInterlaced', - // Value: 'true', - // IsRequired: false - //}); + if (!browser.edgeUwp && !browser.tizen && !browser.web0s) { + profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + Condition: 'NotEquals', + Property: 'IsInterlaced', + Value: 'true', + IsRequired: false + }); } if (maxVideoWidth) { @@ -859,19 +793,6 @@ define(['browser'], function (browser) { }); } - if (browser.chromecast) { - profile.CodecProfiles.push({ - Type: 'Audio', - Codec: 'flac', - Conditions: [ - { - Condition: 'LessThanEqual', - Property: 'AudioSampleRate', - Value: '96000' - }] - }); - } - // Subtitle profiles // External vtt or burn in profile.SubtitleProfiles = []; From b3cc6ad1d111d7883e9bcbe6bff01ccb75e98553 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Sat, 6 Jun 2020 16:09:25 -0600 Subject: [PATCH 043/362] Fix plugin display without config page --- src/controllers/dashboard/plugins/installed.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 5ca739f71..87e9428cc 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -50,7 +50,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' html += ''; html += '
'; html += "
"; - html += configPage.DisplayName || plugin.Name; + html += configPage && configPage.DisplayName ? configPage.DisplayName : plugin.Name; html += '
'; html += "
"; html += plugin.Version; From a4055494404658516959782a4dfe68b1571ad0fc Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Sun, 7 Jun 2020 15:31:09 +1000 Subject: [PATCH 044/362] Remove '0 mins' label from book item details page --- src/components/mediainfo/mediainfo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index c569a7c78..7de11c42f 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -273,7 +273,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } } - if (item.RunTimeTicks && item.Type !== 'Series' && item.Type !== 'Program' && !showFolderRuntime && options.runtime !== false) { + if (item.RunTimeTicks && item.Type !== 'Series' && item.Type !== 'Program' && item.Type !== 'Book' && !showFolderRuntime && options.runtime !== false) { if (item.Type === 'Audio') { From dcef70d3c92831f6e39c7590fdae8c9f717fa3a9 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 4 Jun 2020 20:41:26 +0200 Subject: [PATCH 045/362] Fix baseUrl for web config file --- src/scripts/settings/webSettings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index d999724af..64989b4fc 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -2,7 +2,7 @@ let data; function getConfig() { if (data) return Promise.resolve(data); - return fetch('/config.json?nocache=' + new Date().getUTCMilliseconds()).then(response => { + return fetch('config.json?nocache=' + new Date().getUTCMilliseconds()).then(response => { data = response.json(); return data; }).catch(error => { @@ -12,7 +12,7 @@ function getConfig() { } function getDefaultConfig() { - return fetch('/config.template.json').then(function (response) { + return fetch('config.template.json').then(function (response) { data = response.json(); return data; }); From e98898fca0a534e4a173047ef192765ae23324c9 Mon Sep 17 00:00:00 2001 From: crobibero Date: Sun, 7 Jun 2020 17:14:01 -0600 Subject: [PATCH 046/362] Fix all jQuery checked. --- src/controllers/dashboard/dlna/profile.js | 32 ++++----- src/controllers/dashboard/dlna/settings.js | 8 +-- .../dashboard/notifications/notification.js | 4 +- src/controllers/dashboard/users/useredit.js | 72 +++++++++---------- .../dashboard/users/userlibraryaccess.js | 10 +-- src/controllers/dashboard/users/usernew.js | 8 +-- 6 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js index 81eb099f5..54ef75a6d 100644 --- a/src/controllers/dashboard/dlna/profile.js +++ b/src/controllers/dashboard/dlna/profile.js @@ -23,8 +23,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in $('.chkMediaType', page).each(function () { this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')); }); - $('#chkEnableAlbumArtInDidl', page).checked = profile.EnableAlbumArtInDidl; - $('#chkEnableSingleImageLimit', page).checked = profile.EnableSingleAlbumArtLimit; + $('#chkEnableAlbumArtInDidl', page).prop('checked', profile.EnableAlbumArtInDidl); + $('#chkEnableSingleImageLimit', page).prop('checked', profile.EnableSingleAlbumArtLimit); renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); var idInfo = profile.Identification || {}; renderIdentificationHeaders(page, idInfo.Headers || []); @@ -51,11 +51,11 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in $('#txtAlbumArtMaxHeight', page).val(profile.MaxAlbumArtHeight || ''); $('#txtIconMaxWidth', page).val(profile.MaxIconWidth || ''); $('#txtIconMaxHeight', page).val(profile.MaxIconHeight || ''); - $('#chkIgnoreTranscodeByteRangeRequests', page).checked = profile.IgnoreTranscodeByteRangeRequests; + $('#chkIgnoreTranscodeByteRangeRequests', page).prop('checked', profile.IgnoreTranscodeByteRangeRequests); $('#txtMaxAllowedBitrate', page).val(profile.MaxStreamingBitrate || ''); $('#txtMusicStreamingTranscodingBitrate', page).val(profile.MusicStreamingTranscodingBitrate || ''); - $('#chkRequiresPlainFolders', page).checked = profile.RequiresPlainFolders; - $('#chkRequiresPlainVideoItems', page).checked = profile.RequiresPlainVideoItems; + $('#chkRequiresPlainFolders', page).prop('checked', profile.RequiresPlainFolders); + $('#chkRequiresPlainVideoItems', page).prop('checked', profile.RequiresPlainVideoItems); $('#txtProtocolInfo', page).val(profile.ProtocolInfo || ''); $('#txtXDlnaCap', page).val(profile.XDlnaCap || ''); $('#txtXDlnaDoc', page).val(profile.XDlnaDoc || ''); @@ -357,9 +357,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in $('#txtTranscodingAudioCodec', popup).val(transcodingProfile.AudioCodec || ''); $('#txtTranscodingVideoCodec', popup).val(transcodingProfile.VideoCodec || ''); $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); - $('#chkEnableMpegtsM2TsMode', popup).checked = transcodingProfile.EnableMpegtsM2TsMode || false; - $('#chkEstimateContentLength', popup).checked = transcodingProfile.EstimateContentLength || false; - $('#chkReportByteRangeRequests', popup).checked = 'Bytes' == transcodingProfile.TranscodeSeekInfo; + $('#chkEnableMpegtsM2TsMode', popup).prop('checked', transcodingProfile.EnableMpegtsM2TsMode || false); + $('#chkEstimateContentLength', popup).prop('checked', transcodingProfile.EstimateContentLength || false); + $('#chkReportByteRangeRequests', popup).prop('checked', 'Bytes' == transcodingProfile.TranscodeSeekInfo); $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } @@ -376,9 +376,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in currentSubProfile.VideoCodec = $('#txtTranscodingVideoCodec', page).val(); currentSubProfile.Protocol = $('#selectTranscodingProtocol', page).val(); currentSubProfile.Context = 'Streaming'; - currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).checked; - currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).checked; - currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).checked ? 'Bytes' : 'Auto'; + currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).is(':checked'); + currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).is(':checked'); + currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).is(':checked') ? 'Bytes' : 'Auto'; if (isSubProfileNew) { currentProfile.TranscodingProfiles.push(currentSubProfile); @@ -647,8 +647,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in function updateProfile(page, profile) { profile.Name = $('#txtName', page).val(); - profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).checked; - profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).checked; + profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).is(':checked'); + profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).is(':checked'); profile.SupportedMediaTypes = $('.chkMediaType:checked', page).get().map(function (c) { return c.getAttribute('data-value'); }).join(','); @@ -675,9 +675,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-in profile.MaxAlbumArtHeight = $('#txtAlbumArtMaxHeight', page).val(); profile.MaxIconWidth = $('#txtIconMaxWidth', page).val(); profile.MaxIconHeight = $('#txtIconMaxHeight', page).val(); - profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).checked; - profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).checked; - profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked; + profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).is(':checked'); + profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).is(':checked'); + profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).is(':checked'); profile.MaxStreamingBitrate = $('#txtMaxAllowedBitrate', page).val(); profile.MusicStreamingTranscodingBitrate = $('#txtMusicStreamingTranscodingBitrate', page).val(); profile.ProtocolInfo = $('#txtProtocolInfo', page).val(); diff --git a/src/controllers/dashboard/dlna/settings.js b/src/controllers/dashboard/dlna/settings.js index da254c0bd..5bbfea5d4 100644 --- a/src/controllers/dashboard/dlna/settings.js +++ b/src/controllers/dashboard/dlna/settings.js @@ -5,8 +5,8 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, page.querySelector('#chkEnablePlayTo').checked = config.EnablePlayTo; page.querySelector('#chkEnableDlnaDebugLogging').checked = config.EnableDebugLog; $('#txtClientDiscoveryInterval', page).val(config.ClientDiscoveryIntervalSeconds); - $('#chkEnableServer', page).checked = config.EnableServer; - $('#chkBlastAliveMessages', page).checked = config.BlastAliveMessages; + $('#chkEnableServer', page).prop('checked', config.EnableServer); + $('#chkBlastAliveMessages', page).prop('checked', config.BlastAliveMessages); $('#txtBlastInterval', page).val(config.BlastAliveMessageIntervalSeconds); var usersHtml = users.map(function (u) { return ''; @@ -22,8 +22,8 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, config.EnablePlayTo = form.querySelector('#chkEnablePlayTo').checked; config.EnableDebugLog = form.querySelector('#chkEnableDlnaDebugLogging').checked; config.ClientDiscoveryIntervalSeconds = $('#txtClientDiscoveryInterval', form).val(); - config.EnableServer = $('#chkEnableServer', form).checked; - config.BlastAliveMessages = $('#chkBlastAliveMessages', form).checked; + config.EnableServer = $('#chkEnableServer', form).is(':checked'); + config.BlastAliveMessages = $('#chkBlastAliveMessages', form).is(':checked'); config.BlastAliveMessageIntervalSeconds = $('#txtBlastInterval', form).val(); config.DefaultUserId = $('#selectUser', form).val(); ApiClient.updateNamedConfiguration('dlna', config).then(Dashboard.processServerConfigurationUpdateResult); diff --git a/src/controllers/dashboard/notifications/notification.js b/src/controllers/dashboard/notifications/notification.js index 370fc6a36..af9301c13 100644 --- a/src/controllers/dashboard/notifications/notification.js +++ b/src/controllers/dashboard/notifications/notification.js @@ -50,7 +50,7 @@ define(['jQuery', 'emby-checkbox'], function ($) { 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).checked = notificationConfig.Enabled || false; + $('#chkEnabled', page).prop('checked', notificationConfig.Enabled || false); $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); }); } @@ -73,7 +73,7 @@ define(['jQuery', 'emby-checkbox'], function ($) { notificationOptions.Options.push(notificationConfig); } - notificationConfig.Enabled = $('#chkEnabled', page).checked; + notificationConfig.Enabled = $('#chkEnabled', page).is(':checked'); notificationConfig.SendToUserMode = $('#selectUsers', page).val(); notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { return !c.checked; diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js index c71c81d9e..af187412d 100644 --- a/src/controllers/dashboard/users/useredit.js +++ b/src/controllers/dashboard/users/useredit.js @@ -27,7 +27,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, } $('.deleteAccess', page).html(html).trigger('create'); - $('#chkEnableDeleteAllFolders', page).checked = user.Policy.EnableContentDeletion; + $('#chkEnableDeleteAllFolders', page).prop('checked', user.Policy.EnableContentDeletion); }); } @@ -85,23 +85,23 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu.setTitle(user.Name); page.querySelector('.username').innerHTML = user.Name; $('#txtUserName', page).val(user.Name); - $('#chkIsAdmin', page).checked = user.Policy.IsAdministrator; - $('#chkDisabled', page).checked = user.Policy.IsDisabled; - $('#chkIsHidden', page).checked = user.Policy.IsHidden; - $('#chkRemoteControlSharedDevices', page).checked = user.Policy.EnableSharedDeviceControl; - $('#chkEnableRemoteControlOtherUsers', page).checked = user.Policy.EnableRemoteControlOfOtherUsers; - $('#chkEnableDownloading', page).checked = user.Policy.EnableContentDownloading; - $('#chkManageLiveTv', page).checked = user.Policy.EnableLiveTvManagement; - $('#chkEnableLiveTvAccess', page).checked = user.Policy.EnableLiveTvAccess; - $('#chkEnableMediaPlayback', page).checked = user.Policy.EnableMediaPlayback; - $('#chkEnableAudioPlaybackTranscoding', page).checked = user.Policy.EnableAudioPlaybackTranscoding; - $('#chkEnableVideoPlaybackTranscoding', page).checked = user.Policy.EnableVideoPlaybackTranscoding; - $('#chkEnableVideoPlaybackRemuxing', page).checked = user.Policy.EnablePlaybackRemuxing; - $('#chkForceRemoteSourceTranscoding', page).checked = user.Policy.ForceRemoteSourceTranscoding; - $('#chkRemoteAccess', page).checked = null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess; - $('#chkEnableSyncTranscoding', page).checked = user.Policy.EnableSyncTranscoding; - $('#chkEnableConversion', page).checked = user.Policy.EnableMediaConversion || false; - $('#chkEnableSharing', page).checked = user.Policy.EnablePublicSharing; + $('#chkIsAdmin', page).prop('checked', user.Policy.IsAdministrator); + $('#chkDisabled', page).prop('checked', user.Policy.IsDisabled); + $('#chkIsHidden', page).prop('checked', user.Policy.IsHidden); + $('#chkRemoteControlSharedDevices', page).prop('checked', user.Policy.EnableSharedDeviceControl); + $('#chkEnableRemoteControlOtherUsers', page).prop('checked', user.Policy.EnableRemoteControlOfOtherUsers); + $('#chkEnableDownloading', page).prop('checked', user.Policy.EnableContentDownloading); + $('#chkManageLiveTv', page).prop('checked', user.Policy.EnableLiveTvManagement); + $('#chkEnableLiveTvAccess', page).prop('checked', user.Policy.EnableLiveTvAccess); + $('#chkEnableMediaPlayback', page).prop('checked', user.Policy.EnableMediaPlayback); + $('#chkEnableAudioPlaybackTranscoding', page).prop('checked', user.Policy.EnableAudioPlaybackTranscoding); + $('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding); + $('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing); + $('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding); + $('#chkRemoteAccess', page).prop('checked', null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); + $('#chkEnableSyncTranscoding', page).prop('checked', user.Policy.EnableSyncTranscoding); + $('#chkEnableConversion', page).prop('checked', user.Policy.EnableMediaConversion || false); + $('#chkEnableSharing', page).prop('checked', user.Policy.EnablePublicSharing); $('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ''); $('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0'); $('#selectSyncPlayAccess').val(user.Policy.SyncPlayAccess); @@ -119,28 +119,28 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, function saveUser(user, page) { user.Name = $('#txtUserName', page).val(); - user.Policy.IsAdministrator = $('#chkIsAdmin', page).checked; - user.Policy.IsHidden = $('#chkIsHidden', page).checked; - user.Policy.IsDisabled = $('#chkDisabled', page).checked; - user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).checked; - user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).checked; - user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).checked; - user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).checked; - user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).checked; - user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).checked; - user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).checked; - user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).checked; - user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).checked; - user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).checked; - user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).checked; - user.Policy.EnableMediaConversion = $('#chkEnableConversion', page).checked; - user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).checked; - user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).checked; + user.Policy.IsAdministrator = $('#chkIsAdmin', page).is(':checked'); + user.Policy.IsHidden = $('#chkIsHidden', page).is(':checked'); + user.Policy.IsDisabled = $('#chkDisabled', page).is(':checked'); + user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).is(':checked'); + user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).is(':checked'); + user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).is(':checked'); + user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).is(':checked'); + user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).is(':checked'); + user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).is(':checked'); + user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).is(':checked'); + user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).is(':checked'); + user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).is(':checked'); + user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).is(':checked'); + user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).is(':checked'); + user.Policy.EnableMediaConversion = $('#chkEnableConversion', page).is(':checked'); + user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).is(':checked'); + user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).is(':checked'); user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0')); user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0'); user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; - user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).checked; + user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).is(':checked'); user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) { return c.checked; }).map(function (c) { diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js index 1fdb6cb59..5ea24e3da 100644 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ b/src/controllers/dashboard/users/userlibraryaccess.js @@ -47,7 +47,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, $('.channelAccessContainer', page).hide(); } - $('#chkEnableAllChannels', page).checked = user.Policy.EnableAllChannels; + $('#chkEnableAllChannels', page).prop('checked', user.Policy.EnableAllChannels); } function loadDevices(page, user, devices) { @@ -63,7 +63,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, html += '
'; $('.deviceAccess', page).show().html(html); - $('#chkEnableAllDevices', page).checked = user.Policy.EnableAllDevices; + $('#chkEnableAllDevices', page).prop('checked', user.Policy.EnableAllDevices); if (user.Policy.IsAdministrator) { page.querySelector('.deviceAccessContainer').classList.add('hide'); @@ -90,19 +90,19 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, } function saveUser(user, page) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked; + user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked; + user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); - user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).checked; + user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).is(':checked'); user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) { return c.checked; }).map(function (c) { diff --git a/src/controllers/dashboard/users/usernew.js b/src/controllers/dashboard/users/usernew.js index 1e4e2bbee..ef4cd74f8 100644 --- a/src/controllers/dashboard/users/usernew.js +++ b/src/controllers/dashboard/users/usernew.js @@ -13,7 +13,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox'], function ($, loading html += '
'; $('.folderAccess', page).html(html).trigger('create'); - $('#chkEnableAllFolders', page).checked = false; + $('#chkEnableAllFolders', page).prop('checked', false); } function loadChannels(page, channels) { @@ -35,7 +35,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox'], function ($, loading $('.channelAccessContainer', page).hide(); } - $('#chkEnableAllChannels', page).checked = false; + $('#chkEnableAllChannels', page).prop('checked', false); } function loadUser(page) { @@ -58,7 +58,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox'], function ($, loading user.Name = $('#txtUsername', page).val(); user.Password = $('#txtPassword', page).val(); ApiClient.createUser(user).then(function (user) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked; + user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); user.Policy.EnabledFolders = []; if (!user.Policy.EnableAllFolders) { @@ -69,7 +69,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox'], function ($, loading }); } - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked; + user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); user.Policy.EnabledChannels = []; if (!user.Policy.EnableAllChannels) { From a8eb4f1cd665971d6dc560efcd6859a2e31cbba1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:25:03 +0000 Subject: [PATCH 047/362] Bump gulp-cli from 2.2.1 to 2.3.0 Bumps [gulp-cli](https://github.com/gulpjs/gulp-cli) from 2.2.1 to 2.3.0. - [Release notes](https://github.com/gulpjs/gulp-cli/releases) - [Commits](https://github.com/gulpjs/gulp-cli/compare/v2.2.1...v2.3.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..4620a717e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "file-loader": "^6.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", - "gulp-cli": "^2.2.1", + "gulp-cli": "^2.3.0", "gulp-concat": "^2.6.1", "gulp-htmlmin": "^5.0.1", "gulp-if": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..d25e19b0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5022,10 +5022,10 @@ gulp-babel@^8.0.0: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-cli@^2.2.0, gulp-cli@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.1.tgz#376e427661b7996430a89d71c15df75defa3360a" - integrity sha512-yEMxrXqY8mJFlaauFQxNrCpzWJThu0sH1sqlToaTOT063Hub9s/Nt2C+GSLe6feQ/IMWrHvGOOsyES7CQc9O+A== +gulp-cli@^2.2.0, gulp-cli@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== dependencies: ansi-colors "^1.0.1" archy "^1.0.0" @@ -5035,7 +5035,7 @@ gulp-cli@^2.2.0, gulp-cli@^2.2.1: copy-props "^2.0.1" fancy-log "^1.3.2" gulplog "^1.0.0" - interpret "^1.1.0" + interpret "^1.4.0" isobject "^3.0.1" liftoff "^3.1.0" matchdep "^2.0.0" @@ -5043,7 +5043,7 @@ gulp-cli@^2.2.0, gulp-cli@^2.2.1: pretty-hrtime "^1.0.0" replace-homedir "^1.0.0" semver-greatest-satisfied-range "^1.1.0" - v8flags "^3.0.1" + v8flags "^3.2.0" yargs "^7.1.0" gulp-concat@^2.6.1: @@ -5749,10 +5749,10 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" -interpret@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== intersection-observer@^0.10.0: version "0.10.0" @@ -11678,10 +11678,10 @@ v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8flags@^3.0.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" - integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== dependencies: homedir-polyfill "^1.0.1" From e14818214dba00a5e8e0e0f5e3772cc77653c228 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:26:25 +0000 Subject: [PATCH 048/362] Bump jellyfin-apiclient from 1.2.1 to 1.2.2 Bumps [jellyfin-apiclient](https://github.com/jellyfin/jellyfin-apiclient-javascript) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/jellyfin/jellyfin-apiclient-javascript/releases) - [Commits](https://github.com/jellyfin/jellyfin-apiclient-javascript/compare/v1.2.1...v1.2.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..7c8c5c89a 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "hls.js": "^0.13.1", "howler": "^2.2.0", "intersection-observer": "^0.10.0", - "jellyfin-apiclient": "^1.2.0", + "jellyfin-apiclient": "^1.2.2", "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.5.1", "jstree": "^3.3.7", diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..7554dfc03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6233,10 +6233,10 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jellyfin-apiclient@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.2.1.tgz#1da577f7e22c37be8ec23c139b9ddab2c36da5a2" - integrity sha512-5aNtUq7YsoDPZ0LL6cq55HDnSTVfECfw05hbPFxNsFlUogEiHwaoIz+ahWRO13OUFQJuiu8f3fy16glcGzrBIQ== +jellyfin-apiclient@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.2.2.tgz#64f058320603df02d926f4c1b929b42c6acc4527" + integrity sha512-UwC56orm4darWlnNQJ1nbKo+W8ywlheJSJC6d9zm06CslYtOc/Dkv9kz2PadQEh+6EiBsB0hAZCc7FJ9ahOoGQ== "jellyfin-noto@https://github.com/jellyfin/jellyfin-noto": version "1.0.3" From c11d025c974e087a445fe74f5f58b0a6a8950f10 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:27:00 +0000 Subject: [PATCH 049/362] Bump stylelint from 13.5.0 to 13.6.0 Bumps [stylelint](https://github.com/stylelint/stylelint) from 13.5.0 to 13.6.0. - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/master/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/13.5.0...13.6.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 64 ++++++++++++++++++++++++++-------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..7793d40f0 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "style-loader": "^1.1.3", - "stylelint": "^13.5.0", + "stylelint": "^13.6.0", "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..e6a33f7a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1606,7 +1606,7 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.7.6, autoprefixer@^9.8.0: +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.0: version "9.8.0" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== @@ -4874,10 +4874,10 @@ globby@^10.0.0, globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" - integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -5557,10 +5557,10 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.0.4, ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== imagemin-gifsicle@^7.0.0: version "7.0.0" @@ -8856,12 +8856,12 @@ postcss-sass@^0.4.4: gonzales-pe "^4.3.0" postcss "^7.0.21" -postcss-scss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" - integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== +postcss-scss@^2.0.0, postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== dependencies: - postcss "^7.0.0" + postcss "^7.0.6" postcss-selector-matches@^4.0.0: version "4.0.0" @@ -8984,10 +8984,10 @@ postcss@^5.0.0, postcss@^5.0.18: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: - version "7.0.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2" - integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -10739,14 +10739,14 @@ stylelint-order@^4.0.0: postcss "^7.0.26" postcss-sorting "^5.0.1" -stylelint@^13.5.0: - version "13.5.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.5.0.tgz#9edbf90c8c02c47fd0c4818376e3799145f22cab" - integrity sha512-+Jy7ieKAWKTf2tmcAE7jgScxH39Urb87i0bjK/enScFaGWWaFn4kAPwepGOSk2b7CLUDVt/O6kwA0x0p/V7moQ== +stylelint@^13.6.0: + version "13.6.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.0.tgz#3528bc402a71f2af2a3de32fa4e9f1c24e49666d" + integrity sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw== dependencies: "@stylelint/postcss-css-in-js" "^0.37.1" "@stylelint/postcss-markdown" "^0.36.1" - autoprefixer "^9.7.6" + autoprefixer "^9.8.0" balanced-match "^1.0.0" chalk "^4.0.0" cosmiconfig "^6.0.0" @@ -10755,10 +10755,10 @@ stylelint@^13.5.0: file-entry-cache "^5.0.1" get-stdin "^8.0.0" global-modules "^2.0.0" - globby "^11.0.0" + globby "^11.0.1" globjoin "^0.1.4" html-tags "^3.1.0" - ignore "^5.1.4" + ignore "^5.1.8" import-lazy "^4.0.0" imurmurhash "^0.1.4" known-css-properties "^0.19.0" @@ -10769,7 +10769,7 @@ stylelint@^13.5.0: meow "^7.0.1" micromatch "^4.0.2" normalize-selector "^0.2.0" - postcss "^7.0.30" + postcss "^7.0.32" postcss-html "^0.36.0" postcss-less "^3.1.4" postcss-media-query-parser "^0.2.3" @@ -10777,7 +10777,7 @@ stylelint@^13.5.0: postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^4.0.2" postcss-sass "^0.4.4" - postcss-scss "^2.0.0" + postcss-scss "^2.1.1" postcss-selector-parser "^6.0.2" postcss-syntax "^0.36.2" postcss-value-parser "^4.1.0" @@ -10790,7 +10790,7 @@ stylelint@^13.5.0: sugarss "^2.0.0" svg-tags "^1.0.0" table "^5.4.6" - v8-compile-cache "^2.1.0" + v8-compile-cache "^2.1.1" write-file-atomic "^3.0.3" stylelint@^9.1, stylelint@^9.10.1: @@ -11673,10 +11673,10 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== v8flags@^3.0.1: version "3.1.3" From ff0429a3511388549e0b4fd02413722e82f7ce67 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:28:17 +0000 Subject: [PATCH 050/362] Bump eslint-plugin-import from 2.20.2 to 2.21.1 Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.20.2 to 2.21.1. - [Release notes](https://github.com/benmosher/eslint-plugin-import/releases) - [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.20.2...v2.21.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 48 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..557c5c197 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "eslint": "^6.8.0", "eslint-plugin-compat": "^3.5.1", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.20.2", + "eslint-plugin-import": "^2.21.1", "eslint-plugin-promise": "^4.2.1", "file-loader": "^6.0.0", "gulp": "^4.0.2", diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..3a8967f71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -911,6 +911,11 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/jszip@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@types/jszip/-/jszip-3.4.1.tgz#e7a4059486e494c949ef750933d009684227846f" @@ -1427,7 +1432,7 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-includes@^3.0.3: +array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== @@ -1487,7 +1492,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.1: +array.prototype.flat@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== @@ -3843,7 +3848,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-import-resolver-node@^0.3.2: +eslint-import-resolver-node@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== @@ -3851,7 +3856,7 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.13.1" -eslint-module-utils@^2.4.1: +eslint-module-utils@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== @@ -3880,23 +3885,24 @@ eslint-plugin-eslint-comments@^3.2.0: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-import@^2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" - integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== +eslint-plugin-import@^2.21.1: + version "2.21.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.1.tgz#3398318e5e4abbd23395c4964ce61538705154c8" + integrity sha512-qYOOsgUv63vHof7BqbzuD+Ud34bXHxFJxntuAC1ZappFZXYbRIek3aJ7jc9i2dHDGDyZ/0zlO0cpioES265Lsw== dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" - object.values "^1.1.0" + object.values "^1.1.1" read-pkg-up "^2.0.0" - resolve "^1.12.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" eslint-plugin-promise@^4.2.1: version "4.2.1" @@ -7659,7 +7665,7 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -9683,7 +9689,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.4.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -11224,6 +11230,16 @@ trough@^1.0.0: dependencies: glob "^7.1.2" +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@^1.10.0, tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" From 49b8b452b3797f4c0144be717036ed06fa66170c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:29:47 +0000 Subject: [PATCH 051/362] Bump swiper from 5.4.1 to 5.4.2 Bumps [swiper](https://github.com/nolimits4web/Swiper) from 5.4.1 to 5.4.2. - [Release notes](https://github.com/nolimits4web/Swiper/releases) - [Changelog](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md) - [Commits](https://github.com/nolimits4web/Swiper/compare/v5.4.1...v5.4.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..4f6a4add8 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "screenfull": "^5.0.2", "shaka-player": "^2.5.12", "sortablejs": "^1.10.2", - "swiper": "^5.4.1", + "swiper": "^5.4.2", "webcomponents.js": "^0.7.24", "whatwg-fetch": "^3.0.0" }, diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..27c2ea585 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10918,10 +10918,10 @@ svgo@^1.0.0, svgo@^1.3.2: unquote "~1.1.1" util.promisify "~1.0.0" -swiper@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.4.1.tgz#6731e000e97f8b6560c11b141ebaf559063af565" - integrity sha512-l2EiWe7uOXB2EBMVLtJqn51FW22wF9e24WETT+S+tuFNvSDq1gadc/hyGGsAMqFGKJKIO6q6cqk7ToVaOI+onw== +swiper@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.4.2.tgz#ed4cf60ea7100edac2703e406ae4ae2c43d33e7c" + integrity sha512-c6E5kDC3xAhnhdV0omIkDKLr+qNxzMfTO3Nw/T4xNAwSMoJwPvgsRoVzDBEUQbkWqwomHsvcjPMn12VQ6IHDTQ== dependencies: dom7 "^2.1.5" ssr-window "^2.0.0" From ec1cae11d4203be7e39a701623ded0c5840db898 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:30:51 +0000 Subject: [PATCH 052/362] Bump query-string from 6.12.1 to 6.13.0 Bumps [query-string](https://github.com/sindresorhus/query-string) from 6.12.1 to 6.13.0. - [Release notes](https://github.com/sindresorhus/query-string/releases) - [Commits](https://github.com/sindresorhus/query-string/compare/v6.12.1...v6.13.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index de9fa24e8..9fc077fa4 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", "page": "^1.11.6", - "query-string": "^6.11.1", + "query-string": "^6.13.0", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.0.2", "shaka-player": "^2.5.12", diff --git a/yarn.lock b/yarn.lock index 0e2c7a0c0..6d639aeb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9147,10 +9147,10 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.11.1: - version "6.12.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" - integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== +query-string@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.0.tgz#8d875f66581c854d7480ac79478abb847de742f6" + integrity sha512-KJe8p8EUcixhPCp4cJoTYVfmgKHjnAB/Pq3fiqlmyNHvpHnOL5U4YE7iI2PYivGHp4HFocWz300906BAQX0H7g== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" From ab4260b7dda6d002c575e09f91e76bc0b216af9a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 12:10:12 +0000 Subject: [PATCH 053/362] Bump stylelint-order from 4.0.0 to 4.1.0 Bumps [stylelint-order](https://github.com/hudochenkov/stylelint-order) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/hudochenkov/stylelint-order/releases) - [Changelog](https://github.com/hudochenkov/stylelint-order/blob/master/CHANGELOG.md) - [Commits](https://github.com/hudochenkov/stylelint-order/compare/4.0.0...4.1.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index fd84432e8..d298dc83e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "stylelint": "^13.6.0", "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", - "stylelint-order": "^4.0.0", + "stylelint-order": "^4.1.0", "webpack": "^4.41.5", "webpack-merge": "^4.2.2", "webpack-stream": "^5.2.1" diff --git a/yarn.lock b/yarn.lock index 2d612ead6..a162b311f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8990,7 +8990,7 @@ postcss@^5.0.0, postcss@^5.0.18: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -10736,13 +10736,13 @@ stylelint-order@^2.2.1: postcss "^7.0.2" postcss-sorting "^4.1.0" -stylelint-order@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.0.0.tgz#2a945c2198caac3ff44687d7c8582c81d044b556" - integrity sha512-bXV0v+jfB0+JKsqIn3mLglg1Dj2QCYkFHNfL1c+rVMEmruZmW5LUqT/ARBERfBm8SFtCuXpEdatidw/3IkcoiA== +stylelint-order@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6" + integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw== dependencies: lodash "^4.17.15" - postcss "^7.0.26" + postcss "^7.0.31" postcss-sorting "^5.0.1" stylelint@^13.6.0: From 18df3cf6bd0a148f3cf0b21b83bcdec669d55b3c Mon Sep 17 00:00:00 2001 From: artiume Date: Mon, 25 May 2020 19:21:55 -0400 Subject: [PATCH 054/362] Add videotoolbox --- src/encodingsettings.html | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 6b21df403..f06a0fe1a 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -19,6 +19,7 @@ +
${LabelHardwareAccelerationTypeHelp} @@ -35,31 +36,31 @@

${LabelEnableHardwareDecodingFor}

From cc9883d973ab9a877732a59ac181a3d6aed91a1b Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 10:37:28 -0400 Subject: [PATCH 055/362] Update encodingsettings.html --- src/encodingsettings.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/encodingsettings.html b/src/encodingsettings.html index f06a0fe1a..5245e3179 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -43,6 +43,10 @@ HEVC +
From 99c49a944df51fd3bfb0bdd1cf8f904c69caf034 Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 10:42:58 -0400 Subject: [PATCH 056/362] Split 10bit decoder --- src/controllers/dashboard/encodingsettings.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index c9b41a75e..0f54f9d70 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -5,7 +5,8 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')); }); - page.querySelector('#chkDecodingColorDepth10').checked = config.EnableDecodingColorDepth10; + page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc; + page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9; page.querySelector('#chkHardwareEncoding').checked = config.EnableHardwareEncoding; $('#selectVideoDecoder', page).val(config.HardwareAccelerationType); $('#selectThreadCount', page).val(config.EncodingThreadCount); @@ -68,8 +69,8 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo }), function (c) { return c.getAttribute('data-codec'); }); - config.EnableDecodingColorDepth10 = form.querySelector('#chkDecodingColorDepth10').checked; - + config.EnableDecodingColorDepth10Hevc = form.querySelector('#chkDecodingColorDepth10Hevc').checked; + config.EnableDecodingColorDepth10Vp9 = form.querySelector('#chkDecodingColorDepth10Vp9').checked; config.EnableHardwareEncoding = form.querySelector('#chkHardwareEncoding').checked; ApiClient.updateNamedConfiguration('encoding', config).then(function () { updateEncoder(form); From dbeb67a9cc9cf3af6e8963f3038009922283898e Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 10:44:19 -0400 Subject: [PATCH 057/362] Update encodingsettings.html --- src/encodingsettings.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 5245e3179..826bc2157 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -74,14 +74,6 @@
-
- -
${EnableDecodingColorDepth10Help}
-
-
From 212c093dab3561707beabba163bc4059161bce7e Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 12:34:05 -0400 Subject: [PATCH 060/362] Update en-us.json --- src/strings/en-us.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 102d7d65b..cbcd248bf 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1550,8 +1550,6 @@ "OnApplicationStartup": "On application startup", "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", "EnableBlurhash": "Enable blurred placeholders for images", - "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder" - "EnableDecodingColorDepth10": "Enable 10-Bit hardware decoding", - "EnableDecodingColorDepth10Help" : "Enable 10-Bit hardware decoding on supported hardware. Only works for HEVC and VP9 formats. Turn this off if you experience playback issues." } From dbe4020ba5e06b91dc85a7a9b302ceb8f17315e1 Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 14:06:02 -0400 Subject: [PATCH 061/362] Update encodingsettings.js --- src/controllers/dashboard/encodingsettings.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 65f4e4401..0f54f9d70 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -5,6 +5,8 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')); }); + page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc; + page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9; page.querySelector('#chkHardwareEncoding').checked = config.EnableHardwareEncoding; $('#selectVideoDecoder', page).val(config.HardwareAccelerationType); $('#selectThreadCount', page).val(config.EncodingThreadCount); @@ -67,6 +69,8 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo }), function (c) { return c.getAttribute('data-codec'); }); + config.EnableDecodingColorDepth10Hevc = form.querySelector('#chkDecodingColorDepth10Hevc').checked; + config.EnableDecodingColorDepth10Vp9 = form.querySelector('#chkDecodingColorDepth10Vp9').checked; config.EnableHardwareEncoding = form.querySelector('#chkHardwareEncoding').checked; ApiClient.updateNamedConfiguration('encoding', config).then(function () { updateEncoder(form); From d424ed669bf5397e1969f1da40e7a9968d5eed10 Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 14:08:44 -0400 Subject: [PATCH 062/362] Update encodingsettings.html --- src/encodingsettings.html | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/encodingsettings.html b/src/encodingsettings.html index f63dd93e8..f5b7b0e1c 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -43,10 +43,6 @@ HEVC - -
+
+ + +
${EnableDecodingColorDepth10Help}
+
+
-
${EnableDecodingColorDepth10Help}
From f0af15707c449a9c5987147165714e9e3fc106de Mon Sep 17 00:00:00 2001 From: artiume Date: Fri, 29 May 2020 16:11:25 -0400 Subject: [PATCH 065/362] Update encodingsettings.html --- src/encodingsettings.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/encodingsettings.html b/src/encodingsettings.html index e3866a7e7..858375b14 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -66,11 +66,13 @@
-
+
+
+