jenkins-bot has submitted this change and it was merged.

Change subject: Refactor CreateArticleDialog and translation
......................................................................


Refactor CreateArticleDialog and translation

CreateArticleTranslationDialog will be used when content translation is
available.

Change-Id: Ib0c8694d63151779f61a1904213625489e447106
---
M extension.json
M includes/AboutTopicRenderer.php
M 
modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js
M 
modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js
M 
modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js
5 files changed, 240 insertions(+), 160 deletions(-)

Approvals:
  Thiemo Mättig (WMDE): Looks good to me, approved
  jenkins-bot: Verified



diff --git a/extension.json b/extension.json
index fec0fad..06eba6a 100644
--- a/extension.json
+++ b/extension.json
@@ -25,6 +25,7 @@
                        "position": "bottom",
                        "scripts": [
                                
"ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js",
+                               
"ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js",
                                
"ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js"
                        ],
                        "styles": 
"ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.css",
@@ -39,17 +40,9 @@
                                
"articleplaceholder-abouttopic-create-article-submit-button",
                                
"articleplaceholder-abouttopic-create-article-label",
                                
"articleplaceholder-abouttopic-create-article-mandatory",
+                               
"articleplaceholder-abouttopic-translate-article-button",
+                               
"articleplaceholder-abouttopic-translate-article-label",
                                "cancel"
-                       ]
-               },
-               "ext.articleplaceholder.translateArticle": {
-                       "position": "bottom",
-                       "scripts": 
"ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js",
-                       "dependencies": [
-                               "ext.articleplaceholder.createArticle"
-                       ],
-                       "messages": [
-                               
"articleplaceholder-abouttopic-translate-article-label"
                        ]
                },
                "ext.articleplaceholder.defaultDisplay": {
diff --git a/includes/AboutTopicRenderer.php b/includes/AboutTopicRenderer.php
index 8806923..a11c81b 100644
--- a/includes/AboutTopicRenderer.php
+++ b/includes/AboutTopicRenderer.php
@@ -137,13 +137,7 @@
                // TODO: Button should be hidden if the only sitelink links to 
the current wiki.
                // $wikibaseClient->getSettings()->getSetting( 'siteGlobalID' ) 
should be injected here!
                if ( ExtensionRegistry::getInstance()->isLoaded( 
'ContentTranslation' ) && $siteLinks ) {
-                       $output->addModules( 
'ext.articleplaceholder.translateArticle' );
-                       $contents .= new OOUI\ButtonWidget( [
-                               'id' => 'translate-article-button',
-                               'infusable' => true,
-                               'label' => wfMessage( 
'articleplaceholder-abouttopic-translate-article-button' )->text(),
-                               'target' => 'blank'
-                       ] );
+                       $output->addJsConfigVars( 'apContentTranslation', true 
);
                }
 
                $output->addHTML( Html::rawElement(
diff --git 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js
 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js
index a4a960f..65cdea2 100644
--- 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js
+++ 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticle.js
@@ -1,6 +1,7 @@
 /**
  * @licence GNU GPL v2+
  * @author Florian Schmidt
+ * @author Jonas M. Kress
  */
 
 ( function ( $, mw, OO, module ) {
@@ -13,10 +14,15 @@
                CreateArticleDialog.super.call( this, {
                        size: 'medium'
                } ); // jshint:ignore
+               this.createContentLayout();
        }
 
        OO.inheritClass( CreateArticleDialog, OO.ui.ProcessDialog );
 
+       /**
+        * @property {string}
+        * @protected
+        */
        CreateArticleDialog.static.title =
                mw.msg( 'articleplaceholder-abouttopic-create-article-title' );
 
@@ -32,30 +38,160 @@
                }
        ];
 
-       // Customize the initialize() function: This is where to add content to 
the dialog body and set up event handlers.
+       /**
+        * @property {OO.ui.Layout}
+        * @protected
+        */
+       CreateArticleDialog.prototype.dialogContentLayout = null;
+
+       /**
+        * @property {OO.ui.TextInputWidget}
+        * @protected
+        */
+       CreateArticleDialog.prototype.titleInput = null;
+
+       /**
+        * @override
+        */
        CreateArticleDialog.prototype.initialize = function () {
                CreateArticleDialog.parent.prototype.initialize.call( this ); 
// jshint:ignore
+               this.createContentElements();
                this.$body.append( this.dialogContent );
        };
 
-       CreateArticleDialog.prototype.setContent = function ( dialogContent ) {
-               this.dialogContent = dialogContent;
-       };
-
+       /**
+        * @override
+        */
        CreateArticleDialog.prototype.getActionProcess = function ( action ) {
                var self = this;
 
                if ( action ) {
                        return new OO.ui.Process( function () {
-                               return self.onSubmit();
+                               return self.process();
                        }, this );
                }
 
                return 
CreateArticleDialog.parent.prototype.getActionProcess.call( this, action );
        };
 
+       /**
+        * @private
+        */
+       CreateArticleDialog.prototype.process = function () {
+               var self = this,
+                       deferred = $.Deferred();
+
+               $.when(
+                       this.onValidate(),
+                       this.onSubmit()
+               ).done( function () {
+                       self.close();
+                       deferred.resolve();
+               } ).fail( function ( message ) {
+                       deferred.reject( new OO.ui.Error( message ) );
+               } );
+
+               return deferred.promise();
+       };
+
+       /**
+        * @protected
+        */
+       CreateArticleDialog.prototype.createContentElements = function () {
+               this.addElement( this.createTitleInput().$element );
+       };
+
+       /**
+        * @protected
+        */
+       CreateArticleDialog.prototype.addElement = function ( $element, index ) 
{
+               var item = new OO.ui.PanelLayout( {
+                       $content: $element,
+                       padded: true
+               } );
+
+               this.dialogContentLayout.addItems( [ item ], index );
+       };
+
+       /**
+        * @protected
+        */
+       CreateArticleDialog.prototype.createContentLayout = function () {
+               this.dialogContentLayout = new OO.ui.StackLayout( {
+                       continuous: true
+               } );
+
+               this.dialogContent = this.dialogContentLayout.$element;
+       };
+
+       /**
+        * @protected
+        * @return {OO.ui.TextInputWidget}
+        */
+       CreateArticleDialog.prototype.createTitleInput = function () {
+               var self = this;
+
+               this.titleInput = new OO.ui.TextInputWidget( {
+                       value: mw.config.get( 'apLabel' ),
+                       label: mw.msg( 
'articleplaceholder-abouttopic-create-article-label' ),
+                       multiline: false,
+                       required: true,
+                       autosize: true
+               } );
+
+               this.titleInput.on( 'enter', function () {
+                       self.executeAction( 'save' );
+               } );
+
+               return this.titleInput;
+       };
+
+       /**
+        * @protected
+        * @return {jQuery.Promise}
+        */
+       CreateArticleDialog.prototype.onValidate = function () {
+               if ( this.titleInput.getValue().trim() === '' ) {
+                       return $.Deferred().reject(
+                               mw.msg( 
'articleplaceholder-abouttopic-create-article-mandatory' )
+                       ).promise();
+               }
+
+               return $.Deferred().resolve().promise();
+       };
+
+       /**
+        * @protected
+        * @return {jQuery.Promise}
+        */
        CreateArticleDialog.prototype.onSubmit = function () {
-               return true;
+               var title = this.titleInput.getValue(),
+                       deferred = $.Deferred();
+
+               new mw.Api().get( {
+                       formatversion: 2,
+                       action: 'query',
+                       titles: title
+               } ).done( function ( data ) {
+                       var query = data.query;
+
+                       if ( !query || !query.pages ) {
+                               deferred.reject();
+                               return;
+                       }
+
+                       if ( query.pages[ 0 ].missing ) {
+                               title = mw.Title.newFromUserInput( title, 0 );
+                               document.location.href = mw.config.get( 
'wgServer' ) + title.getUrl( {
+                                       action: 'edit'
+                               } );
+                               deferred.resolve();
+                       } else {
+                               deferred.reject( mw.msg( 
'articleplaceholder-abouttopic-article-exists-error' ) );
+                       }
+               } );
+
+               return deferred;
        };
 
        module.exports.CreateArticleDialog = CreateArticleDialog;
diff --git 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js
 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js
index 5e965fc..bd8f55d 100644
--- 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js
+++ 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.createArticleTranslation.js
@@ -4,86 +4,112 @@
  * @author Jonas M. Kress
  */
 
-( function ( $, mw, OO ) {
+( function ( $, mw, OO, module ) {
        'use strict';
 
-       var windowManager,
-               dialog,
-               languageInput,
-               titleInput,
-               CreateArticleDialog = mw.loader.require( 
'ext.articleplaceholder.createArticle' ).CreateArticleDialog;
+       var CreateArticleDialog = module.exports.CreateArticleDialog;
 
-       function onSubmit() {
-               if ( titleInput.getValue().trim() === '' ) {
-                       return $.Deferred().reject(
-                               new OO.ui.Error( mw.msg( 
'articleplaceholder-abouttopic-create-article-mandatory' ) )
-                       ).promise();
+       /**
+        * @class
+        */
+       function CreateArticleTranslationDialog() {
+               CreateArticleTranslationDialog.super.call( this ); // 
jshint:ignore
+       }
+       OO.inheritClass( CreateArticleTranslationDialog, CreateArticleDialog );
+
+       /**
+        * @property {OO.ui.DropdownInputWidget}
+        * @protected
+        */
+       CreateArticleTranslationDialog.prototype.languageInput = null;
+
+       /**
+        * @property {OO.ui.CheckboxInputWidget}
+        * @protected
+        */
+       CreateArticleTranslationDialog.prototype.translateCheckbox = null;
+
+       /**
+        * @override
+        * @return {jQuery.Promise}
+        */
+       CreateArticleTranslationDialog.prototype.onSubmit = function () {
+               var self = this,
+                       deferred = $.Deferred();
+
+               if ( !this.translateCheckbox.isSelected() ) {
+                       return 
CreateArticleTranslationDialog.super.prototype.onSubmit.apply( this );
                }
+
+               mw.track( 
'counter.MediaWiki.wikibase.articleplaceholder.button.translate-article' );
 
                mw.loader.using( 'ext.cx.sitemapper' ).then( function () {
                        document.location.href = 
mw.cx.SiteMapper.prototype.getCXUrl(
-                               mw.config.get( 'apPageNames' )[ 
languageInput.getValue() ],
-                               titleInput.getValue(),
-                               languageInput.getValue(),
+                               mw.config.get( 'apPageNames' )[ 
self.languageInput.getValue() ],
+                               self.titleInput.getValue(),
+                               self.languageInput.getValue(),
                                mw.config.get( 'wgContentLanguage' )
                        );
+
+                       deferred.resolve();
                } );
 
-               // To not leave the dialog in a stale, unusable state.
-               dialog.close();
-               return $.Deferred();
-       }
+               return deferred.promise();
+       };
 
-       function createDialogContent() {
-               titleInput = new OO.ui.TextInputWidget( {
-                       value: mw.config.get( 'apLabel' ),
-                       label: mw.msg( 
'articleplaceholder-abouttopic-create-article-label' ),
-                       multiline: false,
-                       required: true,
-                       autosize: true
-               } );
-
-               languageInput = new OO.ui.DropdownInputWidget( {
+       /**
+        * @protected
+        * @return {OO.ui.DropdownInputWidget}
+        */
+       CreateArticleTranslationDialog.prototype.createLanguageInput = function 
() {
+               this.languageInput = new OO.ui.DropdownInputWidget( {
                        text: mw.msg( 
'articleplaceholder-abouttopic-translate-article-label' ),
                        options: mw.config.get( 'apLanguages' ),
-                       required: true
+                       disabled: true
                } );
 
-               return new OO.ui.StackLayout( {
-                       items: [
-                                       new OO.ui.PanelLayout( {
-                                               $content: 
languageInput.$element,
-                                               padded: true
-                                       } ), new OO.ui.PanelLayout( {
-                                               $content: titleInput.$element,
-                                               padded: true
-                                       } )
-                       ],
-                       continuous: true
+               return this.languageInput;
+       };
+
+       /**
+        * @protected
+        * @return {OO.ui.CheckboxInputWidget}
+        */
+       CreateArticleTranslationDialog.prototype.createTranslateCheckbox = 
function () {
+               var self = this;
+
+               this.translateCheckbox = new OO.ui.CheckboxInputWidget()
+               .on( 'change', function ( selected ) {
+                       self.languageInput.setDisabled( !selected );
                } );
-       }
 
-       function createDialog() {
-               dialog = new CreateArticleDialog();
+               return this.translateCheckbox;
+       };
 
-               dialog.setContent( createDialogContent().$element );
-               dialog.onSubmit = onSubmit;
+       /**
+        * @protected
+        * @return {jQuery}
+        */
+       CreateArticleTranslationDialog.prototype.createTranslateSection = 
function () {
+               var msg = mw.msg( 
'articleplaceholder-abouttopic-translate-article-button' );
 
-               windowManager = new OO.ui.WindowManager();
+               return $( '<div>' ).append(
+                       new OO.ui.FieldLayout(
+                               this.createTranslateCheckbox(),
+                               { label: msg, align: 'inline' }
+                       ).$element,
+                       this.createLanguageInput().$element
+               );
+       };
 
-               $( 'body' ).append( windowManager.$element );
-               windowManager.addWindows( [ dialog ] );
-       }
+       /**
+        * @protected
+        */
+       CreateArticleTranslationDialog.prototype.createContentElements = 
function () {
+               this.addElement( this.createTranslateSection() );
+               this.addElement( this.createTitleInput().$element );
+       };
 
-       function onWikipageContent() {
-               createDialog();
+       module.exports.CreateArticleTranslationDialog = 
CreateArticleTranslationDialog;
 
-               OO.ui.infuse( 'translate-article-button' ).on( 'click', 
function () {
-                       mw.track( 
'counter.MediaWiki.wikibase.articleplaceholder.button.translate-article' );
-                       windowManager.openWindow( dialog );
-               } );
-       }
-
-       mw.hook( 'wikipage.content' ).add( onWikipageContent );
-
-} )( jQuery, mediaWiki, OO );
+} )( jQuery, mediaWiki, OO, module );
diff --git 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js
 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js
index cfb574d..4ea6b57 100644
--- 
a/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js
+++ 
b/modules/ext.articleplaceholder.createArticle/ext.articleplaceholder.newArticle.js
@@ -1,5 +1,6 @@
 /**
  * @licence GNU GPL v2+
+ *
  * @author Lucie-Aimée Kaffee
  * @author Florian Schmidt
  */
@@ -7,87 +8,17 @@
 ( function ( $, mw, OO, module ) {
        'use strict';
 
-       var titleInput,
-               CreateArticleDialog = module.exports.CreateArticleDialog;
-
-       /**
-        * @return {jQuery.Promise}
-        */
-       function onSubmit() {
-               var titleRaw = titleInput.getValue(),
-                       api = new mw.Api(),
-                       deferred = $.Deferred();
-
-               if ( titleRaw.trim() === '' ) {
-                       return deferred.reject( new OO.ui.Error(
-                               mw.msg( 
'articleplaceholder-abouttopic-create-article-mandatory' )
-                       ) ).promise();
-               }
-
-               api.get( {
-                       formatversion: 2,
-                       action: 'query',
-                       titles: titleRaw
-               } ).done( function ( data ) {
-                       var query = data.query,
-                               title;
-
-                       if ( titleRaw !== titleInput.getValue() || !query || 
!query.pages ) {
-                               deferred.reject();
-                               return;
-                       }
-
-                       if ( query.pages[ 0 ].missing ) {
-                               title = mw.Title.newFromUserInput( titleRaw, 0 
);
-                               document.location.href = mw.config.get( 
'wgServer' ) + title.getUrl( { action: 'edit' } );
-                               deferred.resolve();
-                       } else {
-                               deferred.reject( new OO.ui.Error(
-                                       mw.msg( 
'articleplaceholder-abouttopic-article-exists-error' )
-                               ) );
-                       }
-               } );
-
-               return deferred.promise();
-       }
-
        function onWikipageContent() {
-               var dialog,
-                       windowManager,
-                       button,
-                       dialogContent;
-
-               titleInput = new OO.ui.TextInputWidget( {
-                       value: mw.config.get( 'apLabel' ),
-                       label: mw.msg( 
'articleplaceholder-abouttopic-create-article-label' ),
-                       multiline: false,
-                       required: true,
-                       autosize: true
-               } );
-
-               dialogContent = new OO.ui.PanelLayout( { $: $, padded: true, 
expanded: false } );
-               dialogContent.$element.append( titleInput.$element );
-
-               titleInput.on( 'change', function () {
-                       $( '#mw-article-placeholder-error' ).empty();
-               } );
-
-               dialog = new CreateArticleDialog();
-               dialog.setContent( dialogContent.$element );
-               dialog.onSubmit = onSubmit;
-
-               titleInput.on( 'enter', function () {
-                       dialog.executeAction( 'save' );
-               } );
-
-               windowManager = new OO.ui.WindowManager();
+               var CreateArticleDialog = mw.config.get( 'apContentTranslation' 
) ?
+                                       
module.exports.CreateArticleTranslationDialog :
+                                       module.exports.CreateArticleDialog,
+                       windowManager = new OO.ui.WindowManager(),
+                       dialog =  new CreateArticleDialog();
 
                $( 'body' ).append( windowManager.$element );
-               // Add the window to the window manager using the addWindows() 
method.
                windowManager.addWindows( [ dialog ] );
 
-               button = OO.ui.infuse( 'new-article-button' );
-               button.on( 'click', function () {
+               OO.ui.infuse( 'new-article-button' ).on( 'click', function () {
                        mw.track( 
'counter.MediaWiki.wikibase.articleplaceholder.button.create-article' );
                        windowManager.openWindow( dialog );
                } );

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib0c8694d63151779f61a1904213625489e447106
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/ArticlePlaceholder
Gerrit-Branch: master
Gerrit-Owner: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Hoo man <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to