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