Santhosh has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/227940

Change subject: Corrections for draft restore based on permanent ids
......................................................................

Corrections for draft restore based on permanent ids

* The translation column may not be ready when draft module initilize
  this.$translation because draft module is loaded in parallel with source.
  This can cause, incorrect draft restore. Fixed that.

* Update the data-source attributes correctly in draft restore
  Icc5dff9ba5cf79c599021f2a633024a257b397fb missed to update the data-source
  attributes when sections are restored. This causes progress calculation
  going wrong.

* Updated the tests accordingly

Change-Id: I6406e43cbfef1c83f6f0de7b6fe9874a20f43d60
---
M modules/draft/ext.cx.draft.js
M tests/qunit/draft/ext.cx.draft.test.js
2 files changed, 52 insertions(+), 29 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ContentTranslation 
refs/changes/40/227940/1

diff --git a/modules/draft/ext.cx.draft.js b/modules/draft/ext.cx.draft.js
index 9424f13..f5881fd 100644
--- a/modules/draft/ext.cx.draft.js
+++ b/modules/draft/ext.cx.draft.js
@@ -19,8 +19,8 @@
                this.draftId = draftId;
                this.$draft = null;
                this.disabled = false;
-               this.$source = $( '.cx-column--source .cx-column__content' );
-               this.$translation = $( '.cx-column--translation 
.cx-column__content' );
+               this.$source = null;
+               this.$translation = null;
                this.init();
                this.listen();
        }
@@ -44,6 +44,9 @@
        ContentTranslationDraft.prototype.getContent = function () {
                var $content;
 
+               if ( !this.$translation.length ) {
+                       this.$translation = $( '.cx-column--translation 
.cx-column__content' );
+               }
                $content = this.$translation.clone();
                // Remove placeholder sections
                $content.find( '.placeholder' ).remove();
@@ -169,11 +172,11 @@
         * @param {jQuery} $section Add it before/after this section.
         * @param {string} afterOrBefore Whether the orphan to be added after 
or before $section.
         */
-       function addOrphanTranslation( $translation, $section, afterOrBefore ) {
+       ContentTranslationDraft.prototype.addOrphanTranslation = function ( 
$translation, $section, afterOrBefore ) {
                // Add a dummy source section
                var $dummySourceSection = $( '<' + $translation.prop( 'tagName' 
) + '>' )
                        .css( 'height', 1 ) // Non-zero height to avoid it 
ignored by keepAlignment plugin.
-                       .prop( 'id', $translation.data( 'source' ) );
+                       .attr( 'id', $translation.data( 'source' ) );
 
                if ( afterOrBefore === 'after' ) {
                        $( '#' + $section.data( 'source' ) ).after( 
$dummySourceSection );
@@ -184,26 +187,39 @@
                }
                // Annotate the section to indicate it was restored from draft
                // so that certain adaptations can be skipped.
-               $translation.attr( 'data-cx-draft', true ).keepAlignment();
+               $translation.attr( {
+                       'data-cx-draft': true,
+                       'data-source': $dummySourceSection.prop( 'id' )
+               } ).keepAlignment();
                mw.hook( 'mw.cx.translation.postMT' ).fire( $translation );
-       }
+       };
 
        /**
         * Restore this draft to the appropriate placeholders
         */
        ContentTranslationDraft.prototype.restore = function () {
-               var i, j, $draftSection, sectionId, $section,
+               var i, j, $draftSection, sectionId, $section, $sourceSection,
                        $placeholderSection, orphans = [],
                        $lastPlaceholder;
 
+               // We cannot populate this early because this ext.cx.draft 
modules may be loaded before
+               // source and target is ready.
+               if ( !this.$source.length ) {
+                       this.$source = $( '.cx-column--source 
.cx-column__content' );
+               }
+               if ( !this.$translation.length ) {
+                       this.$translation = $( '.cx-column--translation 
.cx-column__content' );
+               }
                for ( i = 0; i < this.$draft.length; i++ ) {
                        $draftSection = $( this.$draft[ i ] );
                        sectionId = $draftSection.prop( 'id' );
                        $placeholderSection = this.$translation.find( '#' + 
sectionId );
+                       $sourceSection = this.$source.find( '#' + 
$placeholderSection.data( 'source' ) );
                        if ( !$placeholderSection.length ) {
                                // Support old sections with sequential 
idendifiers
+                               $sourceSection = this.$source.find( 
'[data-seqid="' + $draftSection.data( 'source' ) + '"]' );
                                $placeholderSection = this.$translation.find( 
'#cx' +
-                                       this.$source.find( '[data-seqid="' + 
$draftSection.data( 'source' ) + '"]' ).prop( 'id' )
+                                       $sourceSection.prop( 'id' )
                                );
                                sectionId = $placeholderSection.prop( 'id' );
                                if ( sectionId ) {
@@ -223,12 +239,15 @@
                        $section = this.$translation.find( '#' + sectionId );
                        // Annotate the section to indicate it was restored 
from draft
                        // so that certain adaptations can be skipped.
-                       $section.attr( 'data-cx-draft', true ).keepAlignment();
+                       $section.attr( {
+                               'data-cx-draft': true,
+                               'data-source': $sourceSection.prop( 'id' )
+                       } ).keepAlignment();
                        mw.hook( 'mw.cx.translation.postMT' ).fire( $section );
                        // We have a matching source and target section. Get 
all orphan backlog added.
                        // We add them before this section.
                        for ( j = 0; j < orphans.length; j++ ) {
-                               addOrphanTranslation( orphans[ j ], $section );
+                               this.addOrphanTranslation( orphans[ j ], 
$section );
                        }
                        // Clear the orphans array
                        orphans = [];
@@ -242,13 +261,17 @@
                                $placeholderSection = this.$translation.find( 
'.placeholder:first' );
                                if ( $placeholderSection && 
$placeholderSection.length ) {
                                        sectionId = orphans[ j ].prop( 'id' );
+                                       $sourceSection = this.$source.find( '#' 
+ $placeholderSection.data( 'source' ) );
                                        $placeholderSection.replaceWith( 
orphans[ j ] );
                                        $section = this.$translation.find( '#' 
+ sectionId );
-                                       $section.attr( 'data-cx-draft', true 
).keepAlignment();
+                                       $section.attr( {
+                                               'data-cx-draft': true,
+                                               'data-source': 
$sourceSection.prop( 'id' )
+                                       } ).keepAlignment();
                                        mw.hook( 'mw.cx.translation.postMT' 
).fire( $section );
                                } else {
                                        // We ran out of placeholders. Add 
orphan sections to end.
-                                       addOrphanTranslation( orphans[ j ], 
$section, 'after' );
+                                       this.addOrphanTranslation( orphans[ j 
], $section, 'after' );
                                }
                        }
                } else {
@@ -256,7 +279,7 @@
                        $lastPlaceholder = this.$translation.find( 
'.placeholder:last' );
                        for ( j = 0; j < orphans.length; j++ ) {
                                // Add it after the last placeholder
-                               addOrphanTranslation( orphans[ j ], 
$lastPlaceholder, 'after' );
+                               this.addOrphanTranslation( orphans[ j ], 
$lastPlaceholder, 'after' );
                        }
                }
 
diff --git a/tests/qunit/draft/ext.cx.draft.test.js 
b/tests/qunit/draft/ext.cx.draft.test.js
index 5cc6f46..a471d02 100644
--- a/tests/qunit/draft/ext.cx.draft.test.js
+++ b/tests/qunit/draft/ext.cx.draft.test.js
@@ -10,51 +10,51 @@
        var tests = [ {
                        description: 'All ids of source and draft match 
perfectly',
                        source: '<div><p id="mw1">Paragraph 1</p></div>',
-                       placeholders: '<div><div id="cxmw1" 
class="placeholder"></div></div>',
+                       placeholders: '<div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div></div>',
                        draft: '<p id="cxmw1">PARAGRAPH 1</p>',
-                       translation: '<p id="cxmw1" 
data-cx-draft="true">PARAGRAPH 1</p>'
+                       translation: '<p id="cxmw1" data-cx-draft="true" 
data-source="mw1">PARAGRAPH 1</p>'
                },
                {
                        description: 'All ids of source and draft match 
perfectly, Restoring old draft using sequence ids',
                        source: '<div><p id="mw1" data-seqid="1">Paragraph 
1</p></div>',
                        placeholders: '<div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div></div>',
                        draft: '<p id="cx1" data-source="1">PARAGRAPH 1</p>',
-                       translation: '<p id="cxmw1" data-source="1" 
data-cx-draft="true">PARAGRAPH 1</p>'
+                       translation: '<p id="cxmw1" data-source="mw1" 
data-cx-draft="true">PARAGRAPH 1</p>'
                },
                {
                        description: 'Source section replaced by new section. 
Insert the draft above the placeholder for next match',
                        source: '<div><p id="mw2">Paragraph 2</p><p 
id="mw3">Paragraph 3</p></div>',
-                       placeholders: '<div><div id="cxmw2" 
class="placeholder"></div><div id="cxmw3" class="placeholder"></div></div>',
-                       draft: '<p id="cxmw1">PARAGRAPH 1</p><p 
id="cxmw3">PARAGRAPH 3</p>',
-                       translation: '<div id="cxmw2" 
class="placeholder"></div><p id="cxmw1" data-cx-draft="true">PARAGRAPH 1</p><p 
id="cxmw3" data-cx-draft="true">PARAGRAPH 3</p>'
+                       placeholders: '<div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><div id="cxmw3" data-source="mw3" 
class="placeholder"></div></div>',
+                       draft: '<p id="cxmw1" data-source="mw1">PARAGRAPH 
1</p><p id="cxmw3">PARAGRAPH 3</p>',
+                       translation: '<div id="cxmw2" data-source="mw2" 
class="placeholder"></div><p id="cxmw1" data-source="mw1" 
data-cx-draft="true">PARAGRAPH 1</p><p id="cxmw3" data-cx-draft="true" 
data-source="mw3">PARAGRAPH 3</p>'
                },
                {
                        description: 'Source section has new sections above and 
below. Place the draft in correct position',
                        source: '<div><p id="mw1">Paragraph 1</p><div><p 
id="mw2">Paragraph 2</p><p id="mw3">Paragraph 3</p></div>',
-                       placeholders: '<div><div id="cxmw1" 
class="placeholder"></div><div id="cxmw2" class="placeholder"></div><div 
id="cxmw3" class="placeholder"></div></div>',
+                       placeholders: '<div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><div id="cxmw3" data-source="mw3" 
class="placeholder"></div></div>',
                        draft: '<p id="cxmw2">PARAGRAPH 2</p>',
-                       translation: '<div id="cxmw1" 
class="placeholder"></div><p id="cxmw2" data-cx-draft="true">PARAGRAPH 
2</p><div id="cxmw3" class="placeholder"></div>'
+                       translation: '<div id="cxmw1" data-source="mw1" 
class="placeholder"></div><p id="cxmw2" data-cx-draft="true" 
data-source="mw2">PARAGRAPH 2</p><div id="cxmw3" data-source="mw3" 
class="placeholder"></div>'
                },
                {
                        description: 'Source section has new order of sections. 
Place the draft in correct position',
                        source: '<div><p id="mw3">Paragraph 3</p><div><p 
id="mw2">Paragraph 2</p><p id="mw1">Paragraph 1</p></div>',
-                       placeholders: '<div><div id="cxmw3" 
class="placeholder"></div><div id="cxmw2" class="placeholder"></div><div 
id="cxmw1" class="placeholder"></div></div>',
+                       placeholders: '<div><div id="cxmw3" data-source="mw3" 
class="placeholder"></div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div></div>',
                        draft: '<p id="cxmw1">PARAGRAPH 1</p>',
-                       translation: '<div id="cxmw3" 
class="placeholder"></div><div id="cxmw2" class="placeholder"></div><p 
id="cxmw1" data-cx-draft="true">PARAGRAPH 1</p>'
+                       translation: '<div id="cxmw3" data-source="mw3" 
class="placeholder"></div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><p id="cxmw1" data-cx-draft="true" 
data-source="mw1">PARAGRAPH 1</p>'
                },
                {
                        description: 'Source article changed completely. Place 
the draft in linear order from the beginning of placeholders',
                        source: '<div><p id="mw1">Paragraph 1</p><div><p 
id="mw2">Paragraph 2</p><p id="mw3">Paragraph 3</p></div>',
-                       placeholders: '<div><div id="cxmw1" 
class="placeholder"></div><div id="cxmw2" class="placeholder"></div><div 
id="cxmw3" class="placeholder"></div></div>',
-                       draft: '<p id="cxmw4">PARAGRAPH 4</p><p 
id="cxmw5">PARAGRAPH 5</p>',
-                       translation: '<p id="cxmw4" 
data-cx-draft="true">PARAGRAPH 4</p><p id="cxmw5" 
data-cx-draft="true">PARAGRAPH 5</p><div id="cxmw3" class="placeholder"></div>'
+                       placeholders: '<div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><div id="cxmw3" data-source="mw3" 
class="placeholder"></div></div>',
+                       draft: '<p id="cxmw4" data-source="mw4">PARAGRAPH 
4</p><p id="cxmw5" data-source="mw5">PARAGRAPH 5</p>',
+                       translation: '<p id="cxmw4" data-source="mw1" 
data-cx-draft="true">PARAGRAPH 4</p><p id="cxmw5" data-source="mw2" 
data-cx-draft="true">PARAGRAPH 5</p><div id="cxmw3" data-source="mw3" 
class="placeholder"></div>'
                },
                {
                        description: 'Source article changed completely. More 
draft sections than source sections. Place the draft in linear order from the 
beginning of placeholders. Rest of them below the source article.',
                        source: '<div><p id="mw1">Paragraph 1</p><div><p 
id="mw2">Paragraph 2</p><p id="mw3">Paragraph 3</p></div>',
-                       placeholders: '<div><div id="cxmw1" 
class="placeholder"></div><div id="cxmw2" class="placeholder"></div><div 
id="cxmw3" class="placeholder"></div></div>',
-                       draft: '<p id="cxmw4">PARAGRAPH 4</p><p 
id="cxmw5">PARAGRAPH 5</p><p id="cxmw6">PARAGRAPH 6</p><p id="cxmw7">PARAGRAPH 
7</p>',
-                       translation: '<p id="cxmw4" 
data-cx-draft="true">PARAGRAPH 4</p><p id="cxmw5" 
data-cx-draft="true">PARAGRAPH 5</p><p id="cxmw6" 
data-cx-draft="true">PARAGRAPH 6</p><p id="cxmw7" 
data-cx-draft="true">PARAGRAPH 7</p>'
+                       placeholders: '<div><div id="cxmw1" data-source="mw1" 
class="placeholder"></div><div id="cxmw2" data-source="mw2" 
class="placeholder"></div><div id="cxmw3" data-source="mw3" 
class="placeholder"></div></div>',
+                       draft: '<p id="cxmw4">PARAGRAPH 4</p><p 
id="cxmw5">PARAGRAPH 5</p><p id="cxmw6">PARAGRAPH 6</p><p id="cxmw7" 
data-source="mw7">PARAGRAPH 7</p>',
+                       translation: '<p id="cxmw4" data-cx-draft="true" 
data-source="mw1">PARAGRAPH 4</p><p id="cxmw5" data-cx-draft="true" 
data-source="mw2">PARAGRAPH 5</p><p id="cxmw6" data-cx-draft="true" 
data-source="mw3">PARAGRAPH 6</p><p id="cxmw7" data-source="mw7" 
data-cx-draft="true">PARAGRAPH 7</p>'
                }
        ];
 

-- 
To view, visit https://gerrit.wikimedia.org/r/227940
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6406e43cbfef1c83f6f0de7b6fe9874a20f43d60
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ContentTranslation
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to