diff --git a/.ci/azure-pipelines.yml b/.ci/azure-pipelines.yml index 9c231e1391..95bb416d2a 100644 --- a/.ci/azure-pipelines.yml +++ b/.ci/azure-pipelines.yml @@ -2,8 +2,7 @@ trigger: batch: true branches: include: - - master - - release-* + - '*' tags: include: - '*' @@ -13,12 +12,9 @@ pr: - '*' jobs: - - job: build + - job: Build displayName: 'Build' - pool: - vmImage: 'ubuntu-latest' - strategy: matrix: Development: @@ -27,7 +23,9 @@ jobs: BuildConfiguration: production Standalone: BuildConfiguration: standalone - maxParallel: 3 + + pool: + vmImage: 'ubuntu-latest' steps: - task: NodeTool@0 @@ -63,16 +61,14 @@ jobs: - script: 'mv dist jellyfin-web' displayName: 'Rename Directory' - condition: succeeded() - task: PublishPipelineArtifact@1 displayName: 'Publish Release' - condition: succeeded() inputs: targetPath: '$(Build.SourcesDirectory)/jellyfin-web' artifactName: 'jellyfin-web-$(BuildConfiguration)' - - job: lint + - job: Lint displayName: 'Lint' pool: diff --git a/package.json b/package.json index b112d0be60..fe84f7693d 100644 --- a/package.json +++ b/package.json @@ -89,9 +89,12 @@ "src/components/filedownloader.js", "src/components/filesystem.js", "src/components/input/keyboardnavigation.js", + "src/components/scrollManager.js", "src/components/sanatizefilename.js", "src/scripts/settings/webSettings.js", - "src/components/scrollManager.js", + "src/scripts/settings/appSettings.js", + "src/scripts/settings/userSettings.js", + "src/scripts/imagehelper.js", "src/scripts/dfnshelper.js" ], "plugins": [ diff --git a/src/controllers/user/display.js b/src/controllers/user/display.js index f348f28750..28d39b7fde 100644 --- a/src/controllers/user/display.js +++ b/src/controllers/user/display.js @@ -1,4 +1,4 @@ -define(["displaySettings", "userSettingsBuilder", "userSettings", "autoFocuser"], function (DisplaySettings, userSettingsBuilder, currentUserSettings, autoFocuser) { +define(["displaySettings", "userSettings", "autoFocuser"], function (DisplaySettings, userSettings, autoFocuser) { "use strict"; return function (view, params) { @@ -11,7 +11,7 @@ define(["displaySettings", "userSettingsBuilder", "userSettings", "autoFocuser"] var settingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); view.addEventListener("viewshow", function () { window.addEventListener("beforeunload", onBeforeUnload); @@ -22,7 +22,7 @@ define(["displaySettings", "userSettingsBuilder", "userSettings", "autoFocuser"] serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".settingsContainer"), - userSettings: userSettings, + userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, autoFocus: autoFocuser.isEnabled() diff --git a/src/controllers/user/home.js b/src/controllers/user/home.js index 7f12efc7fb..dccf6e5060 100644 --- a/src/controllers/user/home.js +++ b/src/controllers/user/home.js @@ -1,4 +1,4 @@ -define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings, autoFocuser) { +define(["homescreenSettings", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) { "use strict"; return function (view, params) { @@ -11,7 +11,7 @@ define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loadin var homescreenSettingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); view.addEventListener("viewshow", function () { window.addEventListener("beforeunload", onBeforeUnload); @@ -22,7 +22,7 @@ define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loadin serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".homeScreenSettingsContainer"), - userSettings: userSettings, + userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, autoFocus: autoFocuser.isEnabled() diff --git a/src/controllers/user/playback.js b/src/controllers/user/playback.js index 3def9d1931..8f48e0264b 100644 --- a/src/controllers/user/playback.js +++ b/src/controllers/user/playback.js @@ -1,4 +1,4 @@ -define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings, autoFocuser) { +define(["playbackSettings", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) { "use strict"; return function (view, params) { @@ -11,7 +11,7 @@ define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading" var settingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); view.addEventListener("viewshow", function () { window.addEventListener("beforeunload", onBeforeUnload); @@ -22,7 +22,7 @@ define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading" serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".settingsContainer"), - userSettings: userSettings, + userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, autoFocus: autoFocuser.isEnabled() diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index 1f1102194e..e2b98dc2dd 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -1,4 +1,4 @@ -define(["subtitleSettings", "userSettingsBuilder", "userSettings", "autoFocuser"], function (SubtitleSettings, userSettingsBuilder, currentUserSettings, autoFocuser) { +define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSettings, userSettings, autoFocuser) { "use strict"; return function (view, params) { @@ -11,7 +11,7 @@ define(["subtitleSettings", "userSettingsBuilder", "userSettings", "autoFocuser" var subtitleSettingsInstance; var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); - var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder(); + var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); view.addEventListener("viewshow", function () { window.addEventListener("beforeunload", onBeforeUnload); @@ -22,7 +22,7 @@ define(["subtitleSettings", "userSettingsBuilder", "userSettings", "autoFocuser" serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".settingsContainer"), - userSettings: userSettings, + userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, autoFocus: autoFocuser.isEnabled() diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index a8c4702698..790862b223 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -1,7 +1,8 @@ -define(["browser"], function (browser) { - "use strict"; +/* eslint-disable indent */ - function getDeviceIcon(device) { +import browser from 'browser'; + + export function getDeviceIcon(device) { var baseUrl = "assets/img/devices/"; switch (device.AppName || device.Client) { case "Samsung Smart TV": @@ -42,7 +43,7 @@ define(["browser"], function (browser) { } } - function getLibraryIcon(library) { + export function getLibraryIcon(library) { switch (library) { case "movies": return "video_library"; @@ -71,8 +72,9 @@ define(["browser"], function (browser) { } } - return { - getDeviceIcon: getDeviceIcon, - getLibraryIcon: getLibraryIcon - }; -}); +/* eslint-enable indent */ + +export default { + getDeviceIcon: getDeviceIcon, + getLibraryIcon: getLibraryIcon +}; diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index 30fcf62e94..03ceb346a2 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -1,5 +1,7 @@ -define(['appStorage', 'events'], function (appStorage, events) { - 'use strict'; +/* eslint-disable indent */ + +import appStorage from 'appStorage'; +import events from 'events'; function getKey(name, userId) { if (userId) { @@ -9,26 +11,23 @@ define(['appStorage', 'events'], function (appStorage, events) { return name; } - function AppSettings() { - } - - AppSettings.prototype.enableAutoLogin = function (val) { + export function enableAutoLogin(val) { if (val != null) { this.set('enableAutoLogin', val.toString()); } return this.get('enableAutoLogin') !== 'false'; - }; + } - AppSettings.prototype.enableSystemExternalPlayers = function (val) { + export function enableSystemExternalPlayers(val) { if (val !== null) { this.set('enableSystemExternalPlayers', val.toString()); } return this.get('enableSystemExternalPlayers') === 'true'; - }; + } - AppSettings.prototype.enableAutomaticBitrateDetection = function (isInNetwork, mediaType, val) { + export function enableAutomaticBitrateDetection(isInNetwork, mediaType, val) { var key = 'enableautobitratebitrate-' + mediaType + '-' + isInNetwork; if (val != null) { if (isInNetwork && mediaType === 'Audio') { @@ -43,9 +42,9 @@ define(['appStorage', 'events'], function (appStorage, events) { } else { return this.get(key) !== 'false'; } - }; + } - AppSettings.prototype.maxStreamingBitrate = function (isInNetwork, mediaType, val) { + export function maxStreamingBitrate(isInNetwork, mediaType, val) { var key = 'maxbitrate-' + mediaType + '-' + isInNetwork; if (val != null) { if (isInNetwork && mediaType === 'Audio') { @@ -61,43 +60,43 @@ define(['appStorage', 'events'], function (appStorage, events) { } else { return parseInt(this.get(key) || '0') || 1500000; } - }; + } - AppSettings.prototype.maxStaticMusicBitrate = function (val) { + export function maxStaticMusicBitrate(val) { if (val !== undefined) { this.set('maxStaticMusicBitrate', val); } var defaultValue = 320000; return parseInt(this.get('maxStaticMusicBitrate') || defaultValue.toString()) || defaultValue; - }; + } - AppSettings.prototype.maxChromecastBitrate = function (val) { + export function maxChromecastBitrate(val) { if (val != null) { this.set('chromecastBitrate1', val); } val = this.get('chromecastBitrate1'); return val ? parseInt(val) : null; - }; + } - AppSettings.prototype.syncOnlyOnWifi = function (val) { + export function syncOnlyOnWifi(val) { if (val != null) { this.set('syncOnlyOnWifi', val.toString()); } return this.get('syncOnlyOnWifi') !== 'false'; - }; + } - AppSettings.prototype.syncPath = function (val) { + export function syncPath(val) { if (val != null) { this.set('syncPath', val); } return this.get('syncPath'); - }; + } - AppSettings.prototype.cameraUploadServers = function (val) { + export function cameraUploadServers(val) { if (val != null) { this.set('cameraUploadServers', val.join(',')); } @@ -108,28 +107,42 @@ define(['appStorage', 'events'], function (appStorage, events) { } return []; - }; + } - AppSettings.prototype.runAtStartup = function (val) { + export function runAtStartup(val) { if (val != null) { this.set('runatstartup', val.toString()); } return this.get('runatstartup') === 'true'; - }; + } - AppSettings.prototype.set = function (name, value, userId) { + export function set(name, value, userId) { var currentValue = this.get(name, userId); appStorage.setItem(getKey(name, userId), value); if (currentValue !== value) { events.trigger(this, 'change', [name]); } - }; + } - AppSettings.prototype.get = function (name, userId) { + export function get(name, userId) { return appStorage.getItem(getKey(name, userId)); - }; + } - return new AppSettings(); -}); +/* eslint-enable indent */ + +export default { + enableAutoLogin: enableAutoLogin, + enableSystemExternalPlayers: enableSystemExternalPlayers, + enableAutomaticBitrateDetection: enableAutomaticBitrateDetection, + maxStreamingBitrate: maxStreamingBitrate, + maxStaticMusicBitrate: maxStaticMusicBitrate, + maxChromecastBitrate: maxChromecastBitrate, + syncOnlyOnWifi: syncOnlyOnWifi, + syncPath: syncPath, + cameraUploadServers: cameraUploadServers, + runAtStartup: runAtStartup, + set: set, + get: get +}; diff --git a/src/scripts/settings/userSettingsBuilder.js b/src/scripts/settings/userSettings.js similarity index 72% rename from src/scripts/settings/userSettingsBuilder.js rename to src/scripts/settings/userSettings.js index 1a35434c6d..9f9606dfb8 100644 --- a/src/scripts/settings/userSettingsBuilder.js +++ b/src/scripts/settings/userSettings.js @@ -1,5 +1,7 @@ -define(['appSettings', 'events'], function (appSettings, events) { - 'use strict'; +/* eslint-disable indent */ + +import appSettings from 'appSettings'; +import events from 'events'; function onSaveTimeout() { var self = this; @@ -15,10 +17,7 @@ define(['appSettings', 'events'], function (appSettings, events) { instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50); } - function UserSettings() { - } - - UserSettings.prototype.setUserInfo = function (userId, apiClient) { + export function setUserInfo(userId, apiClient) { if (this.saveTimeout) { clearTimeout(this.saveTimeout); } @@ -37,17 +36,17 @@ define(['appSettings', 'events'], function (appSettings, events) { result.CustomPrefs = result.CustomPrefs || {}; self.displayPrefs = result; }); - }; + } - UserSettings.prototype.getData = function () { + export function getData() { return this.displayPrefs; - }; + } - UserSettings.prototype.importFrom = function (instance) { + export function importFrom(instance) { this.displayPrefs = instance.getData(); - }; + } - UserSettings.prototype.set = function (name, value, enableOnServer) { + export function set(name, value, enableOnServer) { var userId = this.currentUserId; var currentValue = this.get(name, enableOnServer); var result = appSettings.set(name, value, userId); @@ -62,18 +61,18 @@ define(['appSettings', 'events'], function (appSettings, events) { } return result; - }; + } - UserSettings.prototype.get = function (name, enableOnServer) { + export function get(name, enableOnServer) { var userId = this.currentUserId; if (enableOnServer !== false && this.displayPrefs) { return this.displayPrefs.CustomPrefs[name]; } return appSettings.get(name, userId); - }; + } - UserSettings.prototype.serverConfig = function (config) { + export function serverConfig(config) { var apiClient = this.currentApiClient; if (config) { return apiClient.updateUserConfiguration(this.currentUserId, config); @@ -82,135 +81,135 @@ define(['appSettings', 'events'], function (appSettings, events) { return apiClient.getUser(this.currentUserId).then(function (user) { return user.Configuration; }); - }; + } - UserSettings.prototype.enableCinemaMode = function (val) { + export function enableCinemaMode(val) { if (val != null) { return this.set('enableCinemaMode', val.toString(), false); } val = this.get('enableCinemaMode', false); return val !== 'false'; - }; + } - UserSettings.prototype.enableNextVideoInfoOverlay = function (val) { + export function enableNextVideoInfoOverlay(val) { if (val != null) { return this.set('enableNextVideoInfoOverlay', val.toString()); } val = this.get('enableNextVideoInfoOverlay', false); return val !== 'false'; - }; + } - UserSettings.prototype.enableThemeSongs = function (val) { + export function enableThemeSongs(val) { if (val != null) { return this.set('enableThemeSongs', val.toString(), false); } val = this.get('enableThemeSongs', false); return val !== 'false'; - }; + } - UserSettings.prototype.enableThemeVideos = function (val) { + export function enableThemeVideos(val) { if (val != null) { return this.set('enableThemeVideos', val.toString(), false); } val = this.get('enableThemeVideos', false); return val !== 'false'; - }; + } - UserSettings.prototype.enableFastFadein = function (val) { + export function enableFastFadein(val) { if (val != null) { return this.set('fastFadein', val.toString(), false); } val = this.get('fastFadein', false); return val !== 'false'; - }; + } - UserSettings.prototype.enableBackdrops = function (val) { + export function enableBackdrops(val) { if (val != null) { return this.set('enableBackdrops', val.toString(), false); } val = this.get('enableBackdrops', false); return val !== 'false'; - }; + } - UserSettings.prototype.language = function (val) { + export function language(val) { if (val != null) { return this.set('language', val.toString(), false); } return this.get('language', false); - }; + } - UserSettings.prototype.dateTimeLocale = function (val) { + export function dateTimeLocale(val) { if (val != null) { return this.set('datetimelocale', val.toString(), false); } return this.get('datetimelocale', false); - }; + } - UserSettings.prototype.skipBackLength = function (val) { + export function skipBackLength(val) { if (val != null) { return this.set('skipBackLength', val.toString()); } return parseInt(this.get('skipBackLength') || '10000'); - }; + } - UserSettings.prototype.skipForwardLength = function (val) { + export function skipForwardLength(val) { if (val != null) { return this.set('skipForwardLength', val.toString()); } return parseInt(this.get('skipForwardLength') || '30000'); - }; + } - UserSettings.prototype.dashboardTheme = function (val) { + export function dashboardTheme(val) { if (val != null) { return this.set('dashboardTheme', val); } return this.get('dashboardTheme'); - }; + } - UserSettings.prototype.skin = function (val) { + export function skin(val) { if (val != null) { return this.set('skin', val, false); } return this.get('skin', false); - }; + } - UserSettings.prototype.theme = function (val) { + export function theme(val) { if (val != null) { return this.set('appTheme', val, false); } return this.get('appTheme', false); - }; + } - UserSettings.prototype.screensaver = function (val) { + export function screensaver(val) { if (val != null) { return this.set('screensaver', val, false); } return this.get('screensaver', false); - }; + } - UserSettings.prototype.soundEffects = function (val) { + export function soundEffects(val) { if (val != null) { return this.set('soundeffects', val, false); } return this.get('soundeffects', false); - }; + } - UserSettings.prototype.loadQuerySettings = function (key, query) { + export function loadQuerySettings(key, query) { var values = this.get(key); if (values) { values = JSON.parse(values); @@ -218,9 +217,9 @@ define(['appSettings', 'events'], function (appSettings, events) { } return query; - }; + } - UserSettings.prototype.saveQuerySettings = function (key, query) { + export function saveQuerySettings(key, query) { var values = {}; if (query.SortBy) { values.SortBy = query.SortBy; @@ -231,25 +230,24 @@ define(['appSettings', 'events'], function (appSettings, events) { } return this.set(key, JSON.stringify(values)); - }; + } - UserSettings.prototype.getSubtitleAppearanceSettings = function (key) { + export function getSubtitleAppearanceSettings(key) { key = key || 'localplayersubtitleappearance3'; return JSON.parse(this.get(key, false) || '{}'); - }; + } - UserSettings.prototype.setSubtitleAppearanceSettings = function (value, key) { + export function setSubtitleAppearanceSettings(value, key) { key = key || 'localplayersubtitleappearance3'; return this.set(key, JSON.stringify(value), false); - }; + } - UserSettings.prototype.setFilter = function (key, value) { + export function setFilter(key, value) { return this.set(key, value, true); - }; + } - UserSettings.prototype.getFilter = function (key) { + export function getFilter(key) { return this.get(key, true); - }; + } - return UserSettings; -}); +/* eslint-enable indent */ diff --git a/src/scripts/site.js b/src/scripts/site.js index fa67d48ff4..3b992eaf2b 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -775,10 +775,7 @@ var AppInfo = {}; define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency); define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency); - define("userSettingsBuilder", [scriptsPath + "/settings/userSettingsBuilder"], returnFirstDependency); - define("userSettings", ["userSettingsBuilder"], function(userSettingsBuilder) { - return new userSettingsBuilder(); - }); + define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency); define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency); define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency); diff --git a/src/scripts/wizardagreement.js b/src/scripts/wizardagreement.js deleted file mode 100644 index 148b0ef39a..0000000000 --- a/src/scripts/wizardagreement.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["dom", "emby-button"], function (dom) { - "use strict"; - - function onSubmit(e) { - if (dom.parentWithClass(this, "page").querySelector(".chkAccept").checked) { - Dashboard.navigate("wizardfinish.html"); - } else { - Dashboard.alert({ - message: Globalize.translate("MessagePleaseAcceptTermsOfServiceBeforeContinuing"), - title: "" - }); - } - - e.preventDefault(); - return false; - } - - return function (view, params) { - view.querySelector(".wizardAgreementForm").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", function () { - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); - }); - view.addEventListener("viewhide", function () { - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); - }); - }; -});