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

Reply via email to