jenkins-bot has submitted this change and it was merged.
Change subject: Fix text change detection in IE
......................................................................
Fix text change detection in IE
Introduce textchange event that get triggered when something changed
on input fields.
Refactor translation textarea construction. Set the value before
starting listening to events. Listen events only with one listener.
Set the two dirty flags together for consistency.
This eliminates the "You have unchanged saves" popup appearing in IE
even when there were no changes.
This fixes the case when it was impossible to get rid of unsaved
status for messages which have no existing status.
Bug: 47019
Bug: 46266
Change-Id: Ib5a7fecdf3cc42c7f5463bb03cae2326e1a3afbc
---
M Resources.php
M resources/js/ext.translate.editor.js
M resources/js/ext.translate.messagetable.js
A resources/js/jquery.textchange.js
4 files changed, 78 insertions(+), 31 deletions(-)
Approvals:
Amire80: Looks good to me, approved
jenkins-bot: Verified
diff --git a/Resources.php b/Resources.php
index 2b124d4..f88a772 100644
--- a/Resources.php
+++ b/Resources.php
@@ -52,6 +52,7 @@
'mediawiki.jqueryMsg',
'jquery.makeCollapsible',
'jquery.tipsy',
+ 'jquery.textchange',
),
'messages' => array(
'tux-status-translated',
@@ -144,6 +145,7 @@
'mediawiki.jqueryMsg',
'ext.translate.parsers',
'ext.translate.loader',
+ 'jquery.textchange',
),
'messages' => array(
'translate-messagereview-submit',
@@ -354,3 +356,7 @@
$wgResourceModules['jquery.autoresize'] = array(
'scripts' => 'resources/js/jquery.autoresize.js',
) + $resourcePaths;
+
+$wgResourceModules['jquery.textchange'] = array(
+ 'scripts' => 'resources/js/jquery.textchange.js',
+) + $resourcePaths;
diff --git a/resources/js/ext.translate.editor.js
b/resources/js/ext.translate.editor.js
index 3962067..e28c72c 100644
--- a/resources/js/ext.translate.editor.js
+++ b/resources/js/ext.translate.editor.js
@@ -375,47 +375,49 @@
lang: $messageList.data(
'targetlangcode' ),
dir: $messageList.data( 'targetlangdir'
)
} )
- .on( 'input propertychange', function () {
- var $this = $( this );
-
- if ( originalTranslation !== null ) {
- $discardChangesButton
- .removeClass( 'hide' );
- }
-
- translateEditor.dirty = true;
- mw.translate.dirty = true;
- // Expand the text area height as
content grows
- while ( $this.outerHeight() <
- this.scrollHeight +
- parseFloat( $this.css(
'borderTopWidth' ) ) +
- parseFloat( $this.css(
'borderBottomWidth' ) )
- ) {
- $this.height( $this.height() +
parseFloat( $this.css( 'fontSize' ) ) );
- }
- } );
+ .val( this.message.translation || '' );
if ( mw.translate.isPlaceholderSupported( $textArea ) )
{
$textArea.prop( 'placeholder', mw.msg(
'tux-editor-placeholder' ) );
}
- $textArea.on( 'input propertychange', function () {
+ $textArea.on( 'textchange', function () {
var $textArea = $( this ),
$saveButton =
translateEditor.$editor.find( '.tux-editor-save-button' ),
$pasteSourceButton =
translateEditor.$editor.find( '.tux-editor-paste-original-button' ),
- translationMessage =
translateEditor.message.translation || '';
+ original =
translateEditor.message.translation || '',
+ current = $textArea.val() || '';
- // Avoid Unsaved marking when translated message
- // is not changed in content.
- if ( translationMessage === $textArea.val() ) {
+ if ( original !== '' ) {
+ $discardChangesButton.removeClass(
'hide' );
+ }
+
+ // Expand the text area height as content grows
+ while ( $textArea.outerHeight() <
+ this.scrollHeight +
+ parseFloat( $textArea.css(
'borderTopWidth' ) ) +
+ parseFloat( $textArea.css(
'borderBottomWidth' ) )
+ ) {
+ $textArea.height( $textArea.height() +
parseFloat( $textArea.css( 'fontSize' ) ) );
+ }
+
+ /* Avoid Unsaved marking when translated
message is not changed in content.
+ * - translateEditor.dirty: internal book
keeping
+ * - mw.translate.dirty: "you have unchanged
edits" warning
+ */
+ if ( original === current ) {
translateEditor.dirty = false;
+ mw.translate.dirty = false;
+ translateEditor.markUnunsaved();
+ } else {
+ translateEditor.dirty = true;
mw.translate.dirty = true;
}
$saveButton.text( mw.msg(
'tux-editor-save-button-label' ) );
// When there is content in the editor enable
the button.
// But do not enable when some saving is not
finished yet.
- if ( $.trim( $textArea.val() ) &&
!translateEditor.saving ) {
+ if ( $.trim( current ) &&
!translateEditor.saving ) {
$pasteSourceButton.addClass( 'hide' );
$saveButton.prop( 'disabled', false );
} else {
@@ -427,10 +429,6 @@
translateEditor.validateTranslation();
}, 500 );
} );
-
- if ( this.message.translation ) {
- $textArea.val( this.message.translation );
- }
$warningsBlock = $( '<div>' )
.addClass( 'tux-warnings-block' )
@@ -670,7 +668,7 @@
} );
$messageDescTextarea = $( '<textarea>' )
- .on( 'input propertychange', function
() {
+ .on( 'textchange', function () {
$messageDescSaveButton.prop(
'disabled', false );
} );
diff --git a/resources/js/ext.translate.messagetable.js
b/resources/js/ext.translate.messagetable.js
index f2efeff..68fa517 100644
--- a/resources/js/ext.translate.messagetable.js
+++ b/resources/js/ext.translate.messagetable.js
@@ -88,7 +88,7 @@
$filterInput.prop( 'placeholder', mw.msg(
'tux-message-filter-placeholder' ) );
}
- $filterInput.on( 'input propertychange', function () {
+ $filterInput.on( 'textchange', function () {
delay( function () {
messageTable.search( $filterInput.val()
);
}, 300 );
diff --git a/resources/js/jquery.textchange.js
b/resources/js/jquery.textchange.js
new file mode 100644
index 0000000..6fdeec8
--- /dev/null
+++ b/resources/js/jquery.textchange.js
@@ -0,0 +1,43 @@
+/*
+ * Trigger a textchange event on text change in input fields.
+ * And make it cross browser compatible
+ * @author Santhosh Thottingal, 2013
+ * @see https://gist.github.com/mkelly12/424774
+ */
+( function ( $ ) {
+ 'use strict';
+
+ $.event.special.textchange = {
+
+ setup: function () {
+ $( this )
+ .data( 'lastValue', $( this ).val() )
+ .on( 'keyup.textchange',
$.event.special.textchange.handler )
+ .on( 'cut.textchange paste.textchange
input.textchange', $.event.special.textchange.delayedHandler );
+ },
+
+ teardown: function () {
+ $( this ).unbind( '.textchange' );
+ },
+
+ handler: function () {
+ $.event.special.textchange.triggerIfChanged( $( this )
);
+ },
+
+ delayedHandler: function () {
+ var element = $( this );
+ setTimeout( function () {
+ $.event.special.textchange.triggerIfChanged(
element );
+ }, 25 );
+ },
+
+ triggerIfChanged: function ( element ) {
+ var current = element.val();
+ if ( current !== element.data( 'lastValue' ) ) {
+ element.trigger( 'textchange', [ element.data(
'lastValue' ) ] );
+ element.data( 'lastValue', current );
+ }
+ }
+ };
+
+} )( jQuery );
--
To view, visit https://gerrit.wikimedia.org/r/58287
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ib5a7fecdf3cc42c7f5463bb03cae2326e1a3afbc
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>
Gerrit-Reviewer: Amire80 <[email protected]>
Gerrit-Reviewer: Nikerabbit <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits