Mooeypoo has uploaded a new change for review.

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

Change subject: Add param order drag/drop widget to TemplateData dialog
......................................................................

Add param order drag/drop widget to TemplateData dialog

Make sure the parameter order is editable with the drag/drop widget.

Change-Id: I35079907b2ed9f5ecdcd438dd69ed9892ce3e428
---
M .jshintrc
M TemplateData.php
M modules/ext.templateDataGenerator.data.js
M modules/ext.templateDataGenerator.ui.tdDialog.js
A modules/widgets/ext.templateDataGenerator.dragDropItemWidget.js
A modules/widgets/ext.templateDataGenerator.dragDropWidget.js
6 files changed, 215 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TemplateData 
refs/changes/62/182962/1

diff --git a/.jshintrc b/.jshintrc
index 20eaae9..dccd4af 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -29,6 +29,8 @@
                "TemplateDataOptionWidget": true,
                "TemplateDataOptionImportWidget": true,
                "TemplateDataLanguageSearchWidget": true,
-               "TemplateDataLanguageResultWidget": true
+               "TemplateDataLanguageResultWidget": true,
+               "TemplateDataDragDropItemWidget": true,
+               "TemplateDataDragDropWidget": true
        }
 }
diff --git a/TemplateData.php b/TemplateData.php
index 6f9b178..35e80de 100644
--- a/TemplateData.php
+++ b/TemplateData.php
@@ -94,6 +94,8 @@
                
'modules/widgets/ext.templateDataGenerator.optionImportWidget.js',
                
'modules/widgets/ext.templateDataGenerator.languageResultWidget.js',
                
'modules/widgets/ext.templateDataGenerator.languageSearchWidget.js',
+               
'modules/widgets/ext.templateDataGenerator.dragDropItemWidget.js',
+               'modules/widgets/ext.templateDataGenerator.dragDropWidget.js',
                'modules/ext.templateDataGenerator.ui.tdDialog.js',
        ),
        'dependencies' => array(
diff --git a/modules/ext.templateDataGenerator.data.js 
b/modules/ext.templateDataGenerator.data.js
index fe9367d..72aadc8 100644
--- a/modules/ext.templateDataGenerator.data.js
+++ b/modules/ext.templateDataGenerator.data.js
@@ -17,6 +17,7 @@
                this.params = {};
                this.description = {};
                this.paramOrder = [];
+               this.paramOrderChanged = false;
                this.paramIdentifierCounter = 0;
                this.setPageSubLevel( !!config.isPageSubLevel );
                this.setFullPageName( config.fullPageName || '' );
@@ -263,8 +264,6 @@
                        // Get parameter list from the template source code
                        this.getParametersFromTemplateSource( tdString ).done( 
$.proxy( function ( params ) {
                                this.sourceCodeParameters = params;
-                               this.setTemplateDescription( 
original.description );
-                               this.setTemplateParamOrder( original.paramOrder 
);
 
                                // Mark existing parameters in the model
                                if ( original.params ) {
@@ -272,6 +271,12 @@
                                                this.addParam( param, 
original.params[param] );
                                        }
                                }
+                               this.setTemplateDescription( 
original.description );
+                               // Override the param order if it exists in the 
templatedata string
+                               if ( original.paramOrder && 
original.paramOrder.length > 0 ) {
+                                       this.setTemplateParamOrder( 
original.paramOrder );
+                               }
+
                                deferred.resolve();
                        }, this ) );
                } else {
@@ -544,6 +549,9 @@
                        }
                }
 
+               // Add to paramOrder
+               this.addKeyTemplateParamOrder( key );
+
                // Trigger the add parameter event
                this.emit( 'add-param', key, this.params[key] );
                return true;
@@ -623,6 +631,7 @@
        /**
         * Set template param order array.
         * @param {string[]} orderArray Parameter key array in order
+        * @fires change-paramOrder
         */
        TemplateDataModel.prototype.setTemplateParamOrder = function ( 
orderArray ) {
                orderArray = orderArray || [];
@@ -633,6 +642,43 @@
        };
 
        /**
+        * Add a key to the end of the paramOrder
+        * @param {string} key New key the add into the paramOrder
+        * @fires add-paramOrder
+        */
+       TemplateDataModel.prototype.addKeyTemplateParamOrder = function ( key ) 
{
+               if ( $.inArray( key, this.paramOrder ) === -1 ) {
+                       this.paramOrder.push( key );
+                       this.emit( 'add-paramOrder', key );
+               }
+       };
+
+       TemplateDataModel.prototype.reorderParamOrderKey = function ( key, 
newIndex ) {
+               var keyIndex = this.paramOrder.indexOf( key );
+               // Move the parameter
+               this.paramOrder.splice(
+                       newIndex,
+                       0,
+                       this.paramOrder.splice( keyIndex, 1 )[0]
+               );
+
+               // Emit event
+               this.emit( 'change-paramOrder', this.paramOrder );
+       };
+
+       /**
+        * Add a key to the end of the paramOrder
+        * @param {string} key New key the add into the paramOrder
+        */
+       TemplateDataModel.prototype.removeKeyTemplateParamOrder = function ( 
key ) {
+               var keyPos = $.inArray( key, this.paramOrder );
+               if ( keyPos > -1 ) {
+                       this.paramOrder.splice( keyPos, 1 );
+                       this.emit( 'change-paramOrder', this.paramOrder );
+               }
+       };
+
+       /**
         * Retrieve the template paramOrder array
         * @return {string[]} orderArray Parameter keys in order
         */
diff --git a/modules/ext.templateDataGenerator.ui.tdDialog.js 
b/modules/ext.templateDataGenerator.ui.tdDialog.js
index babc8ef..7f73e1a 100644
--- a/modules/ext.templateDataGenerator.ui.tdDialog.js
+++ b/modules/ext.templateDataGenerator.ui.tdDialog.js
@@ -61,7 +61,8 @@
         */
        TemplateDataDialog.prototype.initialize = function () {
                var templateParamsFieldset, languageFieldset,
-                       addParamFieldlayout, languageFieldLayout;
+                       addParamFieldlayout, languageFieldLayout,
+                       paramOrderFieldset;
 
                // Parent method
                TemplateDataDialog.super.prototype.initialize.call( this );
@@ -124,6 +125,17 @@
                        items: [ languageFieldLayout, this.languagePanelButton ]
                } );
 
+               // ParamOrder
+               this.paramOrderWidget = new TemplateDataDragDropWidget( {
+                       $: this.$,
+                       orientation: 'horizontal'
+               } );
+               paramOrderFieldset = new OO.ui.FieldsetLayout( {
+                       $: this.$,
+                       label: mw.msg( 
'templatedata-modal-title-templateparams' ),
+                       items: [ this.paramOrderWidget ]
+               } );
+
                this.descriptionInput = new OO.ui.TextInputWidget( {
                        $: this.$,
                        multiline: true,
@@ -153,6 +165,7 @@
                                this.paramListNoticeLabel.$element,
                                languageFieldset.$element,
                                this.templateDescriptionFieldset.$element,
+                               paramOrderFieldset.$element,
                                templateParamsFieldset.$element
                        );
                this.paramEditNoticeLabel = new OO.ui.LabelWidget( { $: this.$ 
} );
@@ -196,6 +209,7 @@
                this.newLanguageSearchWidget.connect( this, { select: 
'newLanguageSearchWidgetSelect' } );
                this.addParamButton.connect( this, { click: 
'onAddParamButtonClick' } );
                this.descriptionInput.connect( this, { change: 
'onDescriptionInputChange' } );
+               this.paramOrderWidget.connect( this, { reorder: 
'onParamOrderWidgetReorder' } );
                this.languagePanelButton.connect( this, { click: 
'onLanguagePanelButton' } );
                this.languageDropdownWidget.getMenu().connect( this, { choose: 
'onLanguageDropdownWidgetChoose' } );
                this.paramSelectWidget.connect( this, { choose: 
'onParamSelectWidgetChoose' } );
@@ -208,6 +222,47 @@
         */
        TemplateDataDialog.prototype.onModelChangeDescription = function ( 
description ) {
                this.descriptionInput.setValue( description );
+       };
+
+       /**
+        * Respond to change of paramOrder from the model
+        * @param {string[]} paramOrderArray The array of keys in order
+        */
+       TemplateDataDialog.prototype.onModelChangeParamOrder = function ( 
paramOrderArray ) {
+               var i,
+                       items = [];
+
+               this.paramOrderWidget.clearItems();
+               for ( i = 0; i < paramOrderArray.length; i++ ) {
+                       items.push(
+                               new TemplateDataDragDropItemWidget( {
+                                       $: this.$,
+                                       data: paramOrderArray[i],
+                                       label: paramOrderArray[i]
+                               } )
+                       );
+               }
+               this.paramOrderWidget.addItems( items );
+
+               // Refresh the parameter widget
+               this.repopulateParamSelectWidget();
+       };
+
+       /**
+        * Respond to an addition of a key to the model paramOrder
+        * @param {string} key Added key
+        */
+       TemplateDataDialog.prototype.onModelAddKeyParamOrder = function ( key ) 
{
+               var dragItem = new TemplateDataDragDropItemWidget( {
+                       $: this.$,
+                       data: key,
+                       label: key
+               } );
+               this.paramOrderWidget.addItems( [ dragItem ] );
+       };
+
+       TemplateDataDialog.prototype.onParamOrderWidgetReorder = function ( 
item, newIndex ) {
+               this.model.reorderParamOrderKey( item.getData(), newIndex );
        };
 
        /**
@@ -389,16 +444,18 @@
         * Empty and repopulate the parameter select widget.
         */
        TemplateDataDialog.prototype.repopulateParamSelectWidget = function () {
-               var paramKey,
+               var i, paramKey,
                        missingParams = this.model.getMissingParams(),
-                       paramList = this.model.getParams();
+                       paramList = this.model.getParams(),
+                       paramOrder = this.model.getTemplateParamOrder();
 
                this.paramSelectWidget.clearItems();
+
                // Update all param descriptions in the param select widget
-               this.paramSelectWidget.clearItems();
-               for ( paramKey in paramList ) {
-                       if ( !paramList[paramKey].deleted ) {
-                               this.addParamToSelectWidget( paramKey );
+               for ( i in paramOrder ) {
+                       paramKey = paramList[paramOrder[i]];
+                       if ( paramKey && !paramKey.deleted ) {
+                               this.addParamToSelectWidget( paramOrder[i] );
                        }
                }
 
@@ -666,7 +723,9 @@
 
                                // Events
                                this.model.connect( this, {
-                                       'change-description': 
'onModelChangeDescription'
+                                       'change-description': 
'onModelChangeDescription',
+                                       'change-paramOrder': 
'onModelChangeParamOrder',
+                                       'add-paramOrder': 
'onModelAddKeyParamOrder'
                                } );
 
                                // Load the model according to the string
diff --git a/modules/widgets/ext.templateDataGenerator.dragDropItemWidget.js 
b/modules/widgets/ext.templateDataGenerator.dragDropItemWidget.js
new file mode 100644
index 0000000..612e6f0
--- /dev/null
+++ b/modules/widgets/ext.templateDataGenerator.dragDropItemWidget.js
@@ -0,0 +1,30 @@
+/**
+ * Generic option widget for use with OO.ui.SelectWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ * @mixins OO.ui.DraggableElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ */
+TemplateDataDragDropItemWidget = function TemplateDataDragDropItemWidget( 
config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       TemplateDataDragDropItemWidget.super.call( this, $.extend( {}, { icon: 
'parameter' }, config ) );
+
+       // Mixin constructors
+       OO.ui.DraggableElement.call( this, config );
+
+       // Initialization
+       this.$element
+               .addClass( 'tdg-TemplateDataDragDropItemWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( TemplateDataDragDropItemWidget, OO.ui.DecoratedOptionWidget );
+OO.mixinClass( TemplateDataDragDropItemWidget, OO.ui.DraggableElement );
diff --git a/modules/widgets/ext.templateDataGenerator.dragDropWidget.js 
b/modules/widgets/ext.templateDataGenerator.dragDropWidget.js
new file mode 100644
index 0000000..c48af7f
--- /dev/null
+++ b/modules/widgets/ext.templateDataGenerator.dragDropWidget.js
@@ -0,0 +1,65 @@
+/**
+ * Drag and drop widget for TemplateData dialog
+ *
+ * Use together with TemplateDataDragDropItemWidget.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.DraggableGroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.OptionWidget[]} [items] Options to add
+ */
+TemplateDataDragDropWidget = function TemplateDataDragDropWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       TemplateDataDragDropWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.DraggableGroupElement.call( this, $.extend( {}, config, { $group: 
this.$element } ) );
+
+       // Initialization
+       this.$element.addClass( 'tdg-TemplateDataDragDropWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( TemplateDataDragDropWidget, OO.ui.Widget );
+OO.mixinClass( TemplateDataDragDropWidget, OO.ui.DraggableGroupElement );
+
+/**
+ * Get an array of keys based on the current items, in order
+ * @return {string[]} Array of keys
+ */
+TemplateDataDragDropWidget.prototype.getKeyArray = function () {
+       var i, len,
+               arr = [];
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               arr.push( this.items[i].getData() );
+       }
+
+       return arr;
+};
+
+/**
+ * Reorder the key into its new index. Find the item first, then add
+ * it back in its new place.
+ * @param {string} key Unique key
+ * @param {[type]} newIndex New index
+ */
+TemplateDataDragDropWidget.prototype.reorderKey = function ( key, newIndex ) {
+       var i, len, item;
+
+       // Get the item that belongs to this key
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               if ( this.items[i].getData() === key ) {
+                       item = this.items[i];
+               }
+       }
+
+       this.addItems( [ item ], newIndex );
+};

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I35079907b2ed9f5ecdcd438dd69ed9892ce3e428
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/TemplateData
Gerrit-Branch: master
Gerrit-Owner: Mooeypoo <[email protected]>

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

Reply via email to