1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Fix ability to change settings of another user

This commit is contained in:
Dmitry Lyzo 2020-05-27 16:14:24 +03:00
parent 2290266634
commit e6287429e0
5 changed files with 232 additions and 75 deletions

View file

@ -1,6 +1,9 @@
define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySettings, userSettings, autoFocuser) { define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySettings, userSettings, autoFocuser) {
'use strict'; 'use strict';
// Shortcuts
const UserSettings = userSettings.UserSettings;
return function (view, params) { return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
if (hasChanges) { if (hasChanges) {
@ -11,7 +14,7 @@ define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySett
var settingsInstance; var settingsInstance;
var hasChanges; var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId(); 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 () { view.addEventListener('viewshow', function () {
window.addEventListener('beforeunload', onBeforeUnload); window.addEventListener('beforeunload', onBeforeUnload);

View file

@ -1,6 +1,9 @@
define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) { define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) {
'use strict'; 'use strict';
// Shortcuts
const UserSettings = userSettings.UserSettings;
return function (view, params) { return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
if (hasChanges) { if (hasChanges) {
@ -11,7 +14,7 @@ define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'au
var homescreenSettingsInstance; var homescreenSettingsInstance;
var hasChanges; var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId(); 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 () { view.addEventListener('viewshow', function () {
window.addEventListener('beforeunload', onBeforeUnload); window.addEventListener('beforeunload', onBeforeUnload);

View file

@ -1,6 +1,9 @@
define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) { define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) {
'use strict'; 'use strict';
// Shortcuts
const UserSettings = userSettings.UserSettings;
return function (view, params) { return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
if (hasChanges) { if (hasChanges) {
@ -11,7 +14,7 @@ define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'auto
var settingsInstance; var settingsInstance;
var hasChanges; var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId(); 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 () { view.addEventListener('viewshow', function () {
window.addEventListener('beforeunload', onBeforeUnload); window.addEventListener('beforeunload', onBeforeUnload);

View file

@ -1,6 +1,9 @@
define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSettings, userSettings, autoFocuser) { define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSettings, userSettings, autoFocuser) {
'use strict'; 'use strict';
// Shortcuts
const UserSettings = userSettings.UserSettings;
return function (view, params) { return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
if (hasChanges) { if (hasChanges) {
@ -11,7 +14,7 @@ define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSe
var subtitleSettingsInstance; var subtitleSettingsInstance;
var hasChanges; var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId(); 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 () { view.addEventListener('viewshow', function () {
window.addEventListener('beforeunload', onBeforeUnload); window.addEventListener('beforeunload', onBeforeUnload);

View file

@ -1,23 +1,30 @@
/* eslint-disable indent */
import appSettings from 'appSettings'; import appSettings from 'appSettings';
import events from 'events'; import events from 'events';
function onSaveTimeout() { function onSaveTimeout() {
var self = this; var self = this;
self.saveTimeout = null; self.saveTimeout = null;
self.currentApiClient.updateDisplayPreferences('usersettings', self.displayPrefs, self.currentUserId, 'emby'); self.currentApiClient.updateDisplayPreferences('usersettings', self.displayPrefs, self.currentUserId, 'emby');
}
function saveServerPreferences(instance) {
if (instance.saveTimeout) {
clearTimeout(instance.saveTimeout);
} }
function saveServerPreferences(instance) { instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50);
if (instance.saveTimeout) { }
clearTimeout(instance.saveTimeout);
}
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) { if (this.saveTimeout) {
clearTimeout(this.saveTimeout); clearTimeout(this.saveTimeout);
} }
@ -38,15 +45,24 @@ import events from 'events';
}); });
} }
export function getData() { // FIXME: Seems unused
getData() {
return this.displayPrefs; return this.displayPrefs;
} }
export function importFrom(instance) { // FIXME: Seems unused
importFrom(instance) {
this.displayPrefs = instance.getData(); 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 userId = this.currentUserId;
var currentValue = this.get(name, enableOnServer); var currentValue = this.get(name, enableOnServer);
var result = appSettings.set(name, value, userId); var result = appSettings.set(name, value, userId);
@ -63,7 +79,13 @@ import events from 'events';
return result; 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; var userId = this.currentUserId;
if (enableOnServer !== false && this.displayPrefs) { if (enableOnServer !== false && this.displayPrefs) {
return this.displayPrefs.CustomPrefs[name]; return this.displayPrefs.CustomPrefs[name];
@ -72,7 +94,12 @@ import events from 'events';
return appSettings.get(name, userId); 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; var apiClient = this.currentApiClient;
if (config) { if (config) {
return apiClient.updateUserConfiguration(this.currentUserId, 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) { if (val !== undefined) {
return this.set('enableCinemaMode', val.toString(), false); return this.set('enableCinemaMode', val.toString(), false);
} }
@ -92,7 +124,12 @@ import events from 'events';
return val !== 'false'; 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) { if (val !== undefined) {
return this.set('enableNextVideoInfoOverlay', val.toString()); return this.set('enableNextVideoInfoOverlay', val.toString());
} }
@ -101,7 +138,12 @@ import events from 'events';
return val !== 'false'; 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) { if (val !== undefined) {
return this.set('enableThemeSongs', val.toString(), false); return this.set('enableThemeSongs', val.toString(), false);
} }
@ -110,7 +152,12 @@ import events from 'events';
return val !== 'false'; 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) { if (val !== undefined) {
return this.set('enableThemeVideos', val.toString(), false); return this.set('enableThemeVideos', val.toString(), false);
} }
@ -119,7 +166,12 @@ import events from 'events';
return val !== 'false'; 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) { if (val !== undefined) {
return this.set('fastFadein', val.toString(), false); return this.set('fastFadein', val.toString(), false);
} }
@ -128,7 +180,12 @@ import events from 'events';
return val !== 'false'; 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) { if (val !== undefined) {
return this.set('enableBackdrops', val.toString(), false); return this.set('enableBackdrops', val.toString(), false);
} }
@ -137,7 +194,12 @@ import events from 'events';
return val !== 'false'; return val !== 'false';
} }
export function language(val) { /**
* Get or set language.
* @param {string|null} val - Language.
* @return {string} Language.
*/
language(val) {
if (val !== undefined) { if (val !== undefined) {
return this.set('language', val.toString(), false); return this.set('language', val.toString(), false);
} }
@ -145,7 +207,12 @@ import events from 'events';
return this.get('language', false); 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) { if (val !== undefined) {
return this.set('datetimelocale', val.toString(), false); return this.set('datetimelocale', val.toString(), false);
} }
@ -153,7 +220,12 @@ import events from 'events';
return this.get('datetimelocale', false); 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) { if (val !== undefined) {
return this.set('chromecastVersion', val.toString()); return this.set('chromecastVersion', val.toString());
} }
@ -161,7 +233,12 @@ import events from 'events';
return this.get('chromecastVersion') || 'stable'; 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) { if (val !== undefined) {
return this.set('skipBackLength', val.toString()); return this.set('skipBackLength', val.toString());
} }
@ -169,7 +246,12 @@ import events from 'events';
return parseInt(this.get('skipBackLength') || '10000'); 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) { if (val !== undefined) {
return this.set('skipForwardLength', val.toString()); return this.set('skipForwardLength', val.toString());
} }
@ -177,7 +259,12 @@ import events from 'events';
return parseInt(this.get('skipForwardLength') || '30000'); 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) { if (val !== undefined) {
return this.set('dashboardTheme', val); return this.set('dashboardTheme', val);
} }
@ -185,7 +272,12 @@ import events from 'events';
return this.get('dashboardTheme'); 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) { if (val !== undefined) {
return this.set('skin', val, false); return this.set('skin', val, false);
} }
@ -193,7 +285,12 @@ import events from 'events';
return this.get('skin', false); 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) { if (val !== undefined) {
return this.set('appTheme', val, false); return this.set('appTheme', val, false);
} }
@ -201,7 +298,12 @@ import events from 'events';
return this.get('appTheme', false); 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) { if (val !== undefined) {
return this.set('screensaver', val, false); return this.set('screensaver', val, false);
} }
@ -209,7 +311,12 @@ import events from 'events';
return this.get('screensaver', false); 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) { if (val !== undefined) {
return this.set('libraryPageSize', parseInt(val, 10), false); 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) { if (val !== undefined) {
return this.set('soundeffects', val, false); return this.set('soundeffects', val, false);
} }
@ -231,7 +343,13 @@ import events from 'events';
return this.get('soundeffects', false); 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); var values = this.get(key);
if (values) { if (values) {
values = JSON.parse(values); values = JSON.parse(values);
@ -241,7 +359,12 @@ import events from 'events';
return query; return query;
} }
export function saveQuerySettings(key, query) { /**
* Save query settings.
* @param {string} key - Query key.
* @param {Object} query - Query.
*/
saveQuerySettings(key, query) {
var values = {}; var values = {};
if (query.SortBy) { if (query.SortBy) {
values.SortBy = query.SortBy; values.SortBy = query.SortBy;
@ -254,52 +377,74 @@ import events from 'events';
return this.set(key, JSON.stringify(values)); 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'; key = key || 'localplayersubtitleappearance3';
return JSON.parse(this.get(key, false) || '{}'); 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'; key = key || 'localplayersubtitleappearance3';
return this.set(key, JSON.stringify(value), false); 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); 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); return this.get(key, true);
} }
}
/* eslint-enable indent */ export const currentSettings = new UserSettings;
export default {
setUserInfo: setUserInfo, // Wrappers for non-ES6 modules and backward compatibility
getData: getData, export const setUserInfo = currentSettings.setUserInfo.bind(currentSettings);
importFrom: importFrom, export const getData = currentSettings.getData.bind(currentSettings);
set: set, export const importFrom = currentSettings.importFrom.bind(currentSettings);
get: get, export const set = currentSettings.set.bind(currentSettings);
serverConfig: serverConfig, export const get = currentSettings.get.bind(currentSettings);
enableCinemaMode: enableCinemaMode, export const serverConfig = currentSettings.serverConfig.bind(currentSettings);
enableNextVideoInfoOverlay: enableNextVideoInfoOverlay, export const enableCinemaMode = currentSettings.enableCinemaMode.bind(currentSettings);
enableThemeSongs: enableThemeSongs, export const enableNextVideoInfoOverlay = currentSettings.enableNextVideoInfoOverlay.bind(currentSettings);
enableThemeVideos: enableThemeVideos, export const enableThemeSongs = currentSettings.enableThemeSongs.bind(currentSettings);
enableFastFadein: enableFastFadein, export const enableThemeVideos = currentSettings.enableThemeVideos.bind(currentSettings);
enableBackdrops: enableBackdrops, export const enableFastFadein = currentSettings.enableFastFadein.bind(currentSettings);
language: language, export const enableBackdrops = currentSettings.enableBackdrops.bind(currentSettings);
dateTimeLocale: dateTimeLocale, export const language = currentSettings.language.bind(currentSettings);
skipBackLength: skipBackLength, export const dateTimeLocale = currentSettings.dateTimeLocale.bind(currentSettings);
skipForwardLength: skipForwardLength, export const chromecastVersion = currentSettings.chromecastVersion.bind(currentSettings);
dashboardTheme: dashboardTheme, export const skipBackLength = currentSettings.skipBackLength.bind(currentSettings);
skin: skin, export const skipForwardLength = currentSettings.skipForwardLength.bind(currentSettings);
theme: theme, export const dashboardTheme = currentSettings.dashboardTheme.bind(currentSettings);
screensaver: screensaver, export const skin = currentSettings.skin.bind(currentSettings);
libraryPageSize: libraryPageSize, export const theme = currentSettings.theme.bind(currentSettings);
soundEffects: soundEffects, export const screensaver = currentSettings.screensaver.bind(currentSettings);
loadQuerySettings: loadQuerySettings, export const libraryPageSize = currentSettings.libraryPageSize.bind(currentSettings);
saveQuerySettings: saveQuerySettings, export const soundEffects = currentSettings.soundEffects.bind(currentSettings);
getSubtitleAppearanceSettings: getSubtitleAppearanceSettings, export const loadQuerySettings = currentSettings.loadQuerySettings.bind(currentSettings);
setSubtitleAppearanceSettings: setSubtitleAppearanceSettings, export const saveQuerySettings = currentSettings.saveQuerySettings.bind(currentSettings);
setFilter: setFilter, export const getSubtitleAppearanceSettings = currentSettings.getSubtitleAppearanceSettings.bind(currentSettings);
getFilter: getFilter export const setSubtitleAppearanceSettings = currentSettings.setSubtitleAppearanceSettings.bind(currentSettings);
}; export const setFilter = currentSettings.setFilter.bind(currentSettings);
export const getFilter = currentSettings.getFilter.bind(currentSettings);