Santhosh has uploaded a new change for review.
https://gerrit.wikimedia.org/r/75096
Change subject: Refactor language settings
......................................................................
Refactor language settings
* Refactored the cancel button handler code to cancel method in
display settings and input settings.
* When user do changes in multiple modules and click cancel button/close
language settings later, cancel the changes in all modules. See bug 50564
* The apply button was always active in input methods module. fixed the
logic for that
* Renamed the enableApplyButton method to markDirty in both modules.
* Introduced isDirty attribute to the modules for optimizing the cancel
method. ie to avoid unnecessary restore actions.
* More minor cleanup and documentation.
Bug: 50564
Change-Id: I71f527bfb7dd7f6724e4365371ac3e4fc0723ed6
---
M resources/js/ext.uls.displaysettings.js
M resources/js/ext.uls.inputsettings.js
M resources/js/ext.uls.languagesettings.js
3 files changed, 108 insertions(+), 52 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UniversalLanguageSelector
refs/changes/96/75096/1
diff --git a/resources/js/ext.uls.displaysettings.js
b/resources/js/ext.uls.displaysettings.js
index fdc9cd1..5cf0cd7 100644
--- a/resources/js/ext.uls.displaysettings.js
+++ b/resources/js/ext.uls.displaysettings.js
@@ -119,6 +119,8 @@
this.i18n();
this.$webfonts.refresh();
this.listen();
+ this.dirty = false;
+ this.savedRegistry = $.extend( true, {},
mw.webfonts.preferences );
},
/**
@@ -196,7 +198,7 @@
function buttonHandler( button ) {
return function () {
- displaySettings.enableApplyButton();
+ displaySettings.markDirty();
displaySettings.uiLanguage =
button.data( 'language' ) || displaySettings.uiLanguage;
$( 'div.uls-ui-languages button.button'
).removeClass( 'down' );
button.addClass( 'down' );
@@ -291,7 +293,7 @@
}
},
onSelect: function ( langCode ) {
- displaySettings.enableApplyButton();
+ displaySettings.markDirty();
displaySettings.uiLanguage = langCode;
displaySettings.$parent.show();
displaySettings.prepareUIFonts();
@@ -446,11 +448,16 @@
},
/**
- * Enable the apply button.
+ * Mark dirty, there are unsaved changes. Enable the apply
button.
* Useful in many places when something changes.
*/
- enableApplyButton: function () {
+ markDirty: function () {
+ this.dirty = true;
this.$template.find( '#uls-displaysettings-apply'
).removeAttr( 'disabled' );
+ },
+
+ disableApplyButton: function () {
+ this.$template.find( '#uls-displaysettings-apply'
).prop( 'disabled', true );
},
/**
@@ -460,8 +467,6 @@
var displaySettings = this,
$contentFontSelector = this.$template.find(
'#content-font-selector' ),
$uiFontSelector = this.$template.find(
'#ui-font-selector' ),
- oldUIFont = $uiFontSelector.find(
'option:selected' ).val(),
- oldContentFont = $contentFontSelector.find(
'option:selected' ).val(),
$tabButtons = displaySettings.$template.find(
'.uls-display-settings-tab-switcher button' );
// TODO all these repeated selectors can be placed in
object constructor.
@@ -471,30 +476,14 @@
} );
displaySettings.$template.find(
'button.uls-display-settings-cancel' ).on( 'click', function () {
- mw.webfonts.preferences.setFont(
displaySettings.contentLanguage, oldContentFont );
- mw.webfonts.preferences.setFont(
displaySettings.uiLanguage, oldUIFont );
-
- if ( displaySettings.$webfonts ) {
- displaySettings.$webfonts.refresh();
- }
-
- displaySettings.$template.find(
'div.uls-ui-languages button.button' ).each( function () {
- var $button = $( this );
-
- if ( $button.attr( 'lang' ) ===
displaySettings.contentLanguage ) {
- $button.addClass( 'down' );
- } else {
- $button.removeClass( 'down' );
- }
- } );
+ displaySettings.cancel();
displaySettings.prepareUIFonts();
displaySettings.prepareContentFonts();
displaySettings.close();
} );
$uiFontSelector.on( 'change', function () {
- displaySettings.enableApplyButton();
- oldUIFont = mw.webfonts.preferences.getFont(
displaySettings.uiLanguage );
+ displaySettings.markDirty();
mw.webfonts.preferences.setFont(
displaySettings.uiLanguage,
$( this ).find( 'option:selected'
).val()
);
@@ -502,8 +491,7 @@
} );
$contentFontSelector.on( 'change', function () {
- displaySettings.enableApplyButton();
- oldContentFont =
mw.webfonts.preferences.getFont( displaySettings.contentLanguage );
+ displaySettings.markDirty();
mw.webfonts.preferences.setFont(
displaySettings.contentLanguage,
$( this ).find( 'option:selected'
).val()
);
@@ -585,6 +573,46 @@
mw.webfonts.preferences.save( function ( result ) {
// closure for not losing the scope
displaySettings.onSave( result );
+ displaySettings.dirty = false;
+ // Update the back-up preferences for the case
of canceling
+ displaySettings.savedRegistry = $.extend( true,
{}, mw.webfonts.preferences );
+ } );
+ },
+
+ /**
+ * Cancel the changes done by user for display settings
+ */
+ cancel: function () {
+ var displaySettings = this;
+
+ if ( !displaySettings.dirty ) {
+ // Nothing changed
+ return;
+ }
+
+ // Reload preferences
+ mw.webfonts.preferences = $.extend( true, {},
displaySettings.savedRegistry );
+ if ( displaySettings.$webfonts ) {
+ displaySettings.$webfonts.refresh();
+ }
+
+ // Clear the dirty bit
+ displaySettings.dirty = false;
+ displaySettings.disableApplyButton();
+
+ // Restore content and UI language
+ displaySettings.uiLanguage =
displaySettings.getUILanguage();
+ displaySettings.contentLanguage =
displaySettings.getContentLanguage();
+
+ // Restore the visual state of selected language button
+ displaySettings.$template.find( 'div.uls-ui-languages
button.button' ).each( function () {
+ var $button = $( this );
+
+ if ( $button.attr( 'lang' ) ===
displaySettings.uiLanguage ) {
+ $button.addClass( 'down' );
+ } else {
+ $button.removeClass( 'down' );
+ }
} );
}
};
diff --git a/resources/js/ext.uls.inputsettings.js
b/resources/js/ext.uls.inputsettings.js
index 5a1a90e..ae0cc72 100644
--- a/resources/js/ext.uls.inputsettings.js
+++ b/resources/js/ext.uls.inputsettings.js
@@ -75,6 +75,7 @@
this.contentLanguage = this.getContentLanguage();
this.$imes = null;
this.$parent = $parent;
+ this.dirty = false;
this.savedRegistry = $.extend( true, {},
$.ime.preferences.registry );
}
@@ -109,10 +110,11 @@
},
/**
- * Enable the apply button.
+ * Mark dirty, there are unsaved changes. Enable the apply
button.
* Useful in many places when something changes.
*/
- enableApplyButton: function () {
+ markDirty: function () {
+ this.dirty = true;
this.$template.find( 'button.uls-input-settings-apply'
).prop( 'disabled', false );
},
@@ -279,8 +281,10 @@
return function () {
var language = button.data( 'language'
);
- inputSettings.enableApplyButton();
- $.ime.preferences.setLanguage( language
);
+ if ( language !==
$.ime.preferences.getLanguage() ) {
+ inputSettings.markDirty();
+ $.ime.preferences.setLanguage(
language );
+ }
// Mark the button selected
$( '.uls-ui-languages .button'
).removeClass( 'down' );
button.addClass( 'down' );
@@ -375,7 +379,7 @@
}
},
onSelect: function ( langCode ) {
- inputSettings.enableApplyButton();
+ inputSettings.markDirty();
$.ime.preferences.setLanguage( langCode
);
inputSettings.$parent.show();
inputSettings.prepareLanguages();
@@ -447,32 +451,20 @@
} );
inputSettings.$template.find(
'button.uls-input-settings-cancel' ).on( 'click', function () {
- inputSettings.disableApplyButton();
-
- inputSettings.close();
-
- // Reload preferences
- $.ime.preferences.registry = $.extend( true,
{}, inputSettings.savedRegistry );
-
- // Restore the state of IME
- if ( $.ime.preferences.isEnabled() ) {
- mw.ime.setup();
- } else {
- mw.ime.disable();
- }
-
+ inputSettings.cancel();
// Redraw the panel according to the state
inputSettings.render();
+ inputSettings.close();
} );
$imeListContainer.on( 'change',
'input:radio[name=ime]:checked', function () {
- inputSettings.enableApplyButton();
+ inputSettings.markDirty();
$.ime.preferences.setIM( $( this ).val() );
} );
inputSettings.$template.find(
'button.uls-input-toggle-button' )
.on( 'click', function () {
- inputSettings.enableApplyButton();
+ inputSettings.markDirty();
if ( $.ime.preferences.isEnabled() ) {
inputSettings.disableInputTools();
@@ -540,10 +532,31 @@
$.ime.preferences.save( function ( result ) {
// closure for not losing the scope
inputSettings.onSave( result );
+ inputSettings.dirty = false;
+ // Update the back-up preferences for the case
of canceling
+ inputSettings.savedRegistry = $.extend( true,
{}, $.ime.preferences.registry );
} );
+ },
- // Update the back-up preferences for the case of
canceling
- this.savedRegistry = $.extend( true, {},
$.ime.preferences.registry );
+ /**
+ * Cancel the changes done by user for input settings
+ */
+ cancel: function () {
+ if ( !this.dirty ) {
+ return;
+ }
+ this.dirty = false;
+ this.disableApplyButton();
+
+ // Reload preferences
+ $.ime.preferences.registry = $.extend( true, {},
this.savedRegistry );
+
+ // Restore the state of IME
+ if ( $.ime.preferences.isEnabled() ) {
+ mw.ime.setup();
+ } else {
+ mw.ime.disable();
+ }
}
};
diff --git a/resources/js/ext.uls.languagesettings.js
b/resources/js/ext.uls.languagesettings.js
index 8ef3d49..5c1848a 100644
--- a/resources/js/ext.uls.languagesettings.js
+++ b/resources/js/ext.uls.languagesettings.js
@@ -49,6 +49,7 @@
this.initialized = false;
this.left = this.options.left;
this.top = this.options.top;
+ this.modules = {},
this.$settingsPanel = this.$window.find(
'#languagesettings-settings-panel' );
this.init();
this.listen();
@@ -69,11 +70,11 @@
.on( 'click', $.proxy( this.close, this ) );
// Hide the window when clicked outside
- $( 'html' ).click( $.proxy( this.close, this ) );
+ $( 'html' ).click( $.proxy( this.hide, this ) );
// ... but when clicked on window do not hide.
- this.$window.on( 'click', function () {
- return false;
+ this.$window.on( 'click', function ( event ) {
+ event.stopPropagation();
} );
},
@@ -141,6 +142,7 @@
module.render();
$settingsLink.addClass( 'active' );
}
+ this.modules[moduleName] = module;
},
position: function () {
@@ -204,11 +206,24 @@
* call onClose if defined from the previous context.
*/
close: function () {
+ if ( !this.shown ) {
+ return;
+ }
+
this.hide();
+ // optional callback
if ( this.options.onClose ) {
this.options.onClose();
}
+
+ // We are closing language settings. That also means we
are cancelling
+ // any changes the user did, but not saved, in all
registered modules.
+ $.each( this.modules, function( id, module ) {
+ // Modules should make sure to return early if
no changes were made
+ // They can use some kind of 'dirty bits' to
implement this.
+ module.cancel();
+ } );
},
click: function ( e ) {
--
To view, visit https://gerrit.wikimedia.org/r/75096
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I71f527bfb7dd7f6724e4365371ac3e4fc0723ed6
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UniversalLanguageSelector
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits