Files
mediawiki-extensions-Univer…/resources/js/ext.uls.preferences.js
Fomafix c329f1473d Use spaces inside of brackets in JavaScript
* For consistency
* For MediaWiki coding conventions

Change-Id: I625a8ce0119b1490073f048e1b8ad4e90762d6e2
2016-02-15 13:31:45 +00:00

176 lines
4.2 KiB
JavaScript

/**
* ULS preferences system for MediaWiki.
* Local storage for anonymous users, preferences for logged in users.
*
* Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
* Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
* contributors. See CREDITS for a list.
*
* UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
* have to do anything special to choose one license or the other and you don't
* have to notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @file
* @ingroup Extensions
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $, mw ) {
'use strict';
var ULSPreferences;
/**
* Wrapper for localStorage, falls back to cookie
* when localStorage not supported by browser.
*/
function preferenceStore() {
// If value is detected, set new or modify store
return {
/*
* Set the value to the given key
* @param {string} key
* @param {Object} value value to be set
*/
set: function ( key, value ) {
// Convert object values to JSON
if ( typeof value === 'object' ) {
value = JSON.stringify( value );
}
// Set the store
try {
localStorage.setItem( key, value );
} catch ( e ) { // Use cookie
$.cookie( key, value, { path: '/' } );
}
},
/*
* Returns the value of the given key
* @param {string} key
* @retun {Object} value of the key
*/
get: function ( key ) {
var data;
// No value supplied, return value
try {
data = localStorage.getItem( key );
if ( !data ) {
// Try to restore the old preferences, if any, if possible.
try {
data = JSON.parse( localStorage.getItem( 'jStorage' ) )[ 'uls-preferences' ];
// And try to remove it.
localStorage.removeItem( 'jStorage' );
} catch ( e ) {
// Don't bother about it.
}
}
} catch ( e ) { // Use cookie
data = $.cookie( key );
}
// Try to parse JSON
try {
data = JSON.parse( data );
} catch ( e ) {
data = data;
}
return data;
}
};
}
ULSPreferences = function () {
this.preferenceName = 'uls-preferences';
this.username = mw.user.getName();
this.isAnon = mw.user.isAnon();
this.preferences = null;
this.init();
};
ULSPreferences.prototype = {
/**
* Initialize
*/
init: function () {
if ( this.isAnon ) {
this.preferences = preferenceStore().get( this.preferenceName );
} else {
var options = mw.user.options.get( this.preferenceName );
if ( !options ) {
options = '{}';
}
// Try to parse JSON
try {
this.preferences = JSON.parse( options );
} catch ( e ) {
this.preferences = {};
}
}
this.preferences = this.preferences || {};
},
/**
* Set the preference
*
* @param {String} key
* @param value
*/
set: function ( key, value ) {
this.preferences[ key ] = value;
},
/**
* Get a preference value for the given preference name
*
* @param key
*/
get: function ( key ) {
return this.preferences[ key ];
},
/**
* Save the preferences
*
* @param callback
*/
save: function ( callback ) {
var ulsPreferences = this;
callback = callback || $.noop;
if ( this.isAnon ) {
// Anonymous user. Save preferences in local storage
preferenceStore().set( this.preferenceName, this.preferences );
callback.call( this, true );
} else {
// Logged in user. Use MW APIs to change preferences
new mw.Api().postWithToken( 'options', {
action: 'options',
optionname: ulsPreferences.preferenceName,
optionvalue: JSON.stringify( ulsPreferences.preferences )
} ).done( function () {
callback.call( this, true );
} ).fail( function () {
callback.call( this, false );
} );
}
}
};
mw.uls = mw.uls || {};
mw.uls.preferences = function () {
var data = $( 'body' ).data( 'preferences' );
if ( !data ) {
$( 'body' ).data( 'preferences', ( data = new ULSPreferences() ) );
}
return data;
};
}( jQuery, mediaWiki ) );