Esanders has uploaded a new change for review.

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

Change subject: Basic support for inline types (link & data)
......................................................................

Basic support for inline types (link & data)

Won't support converting between block & inline types
but that will be addressed later.

Change-Id: Iac761931622f40ed7cc06103fb54e99099461ff1
---
M extension.json
M i18n/en.json
M i18n/qqq.json
A modules/ve-maps/ve.ce.MWInlineMapsNode.js
M modules/ve-maps/ve.ce.MWMapsNode.js
A modules/ve-maps/ve.dm.MWInlineMapsNode.js
M modules/ve-maps/ve.dm.MWMapsNode.js
M modules/ve-maps/ve.ui.MWMapsDialog.js
M modules/ve-maps/ve.ui.MWMapsTool.js
9 files changed, 214 insertions(+), 56 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Kartographer 
refs/changes/65/268065/1

diff --git a/extension.json b/extension.json
index 1af4969..c4fb22c 100644
--- a/extension.json
+++ b/extension.json
@@ -50,6 +50,8 @@
                },
                "ext.kartographer.visualEditor": {
                        "scripts": [
+                               "modules/ve-maps/ve.dm.MWInlineMapsNode.js",
+                               "modules/ve-maps/ve.ce.MWInlineMapsNode.js",
                                "modules/ve-maps/ve.dm.MWMapsNode.js",
                                "modules/ve-maps/ve.ce.MWMapsNode.js",
                                "modules/ve-maps/ve.ui.MWMapsDialog.js",
@@ -62,6 +64,7 @@
                                "visualeditor-mwmapsdialog-geojson",
                                "visualeditor-mwmapsdialog-mode",
                                "visualeditor-mwmapsdialog-mode-data",
+                               "visualeditor-mwmapsdialog-mode-link",
                                "visualeditor-mwmapsdialog-mode-interactive",
                                "visualeditor-mwmapsdialog-mode-static",
                                "visualeditor-mwmapsdialog-size",
diff --git a/i18n/en.json b/i18n/en.json
index d03293b..ea54648 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -18,6 +18,7 @@
        "visualeditor-mwmapsdialog-mode": "Mode",
        "visualeditor-mwmapsdialog-mode-data": "Data",
        "visualeditor-mwmapsdialog-mode-interactive": "Interactive",
+       "visualeditor-mwmapsdialog-mode-link": "Link",
        "visualeditor-mwmapsdialog-mode-static": "Static",
        "visualeditor-mwmapsdialog-size": "Size",
        "visualeditor-mwmapsdialog-title": "Map"
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 191022c..39aeca5 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -19,6 +19,7 @@
        "visualeditor-mwmapsdialog-mode": "Label for map rendering 
mode\n{{Identical|Mode}}",
        "visualeditor-mwmapsdialog-mode-data": "Label for data-only map 
rendering\n{{Identical|Data}}",
        "visualeditor-mwmapsdialog-mode-interactive": "Label for interactive 
map rendering\n{{Identical|Interactive}}",
+       "visualeditor-mwmapsdialog-mode-link": "Label for link map rendering",
        "visualeditor-mwmapsdialog-mode-static": "Label for static map 
rendering\n{{Identical|Static}}",
        "visualeditor-mwmapsdialog-size": "Label for map 
size\n{{Identical|Size}}",
        "visualeditor-mwmapsdialog-title": "Title of the map 
dialog\n{{Identical|Map}}"
diff --git a/modules/ve-maps/ve.ce.MWInlineMapsNode.js 
b/modules/ve-maps/ve.ce.MWInlineMapsNode.js
new file mode 100644
index 0000000..dcc9154
--- /dev/null
+++ b/modules/ve-maps/ve.ce.MWInlineMapsNode.js
@@ -0,0 +1,46 @@
+/*!
+ * VisualEditor ContentEditable MWInlineMapsNode class.
+ *
+ * @copyright 2011-2015 VisualEditor Team and others; see 
http://ve.mit-license.org
+ */
+
+/**
+ * ContentEditable paragraph node.
+ *
+ * @class
+ * @extends ve.ce.MWInlineExtensionNode
+ *
+ * @constructor
+ * @param {ve.dm.MWInlineMapsNode} model Model to observe
+ * @param {Object} [config] Configuration options
+ */
+ve.ce.MWInlineMapsNode = function VeCeMWInlineMaps( model, config ) {
+       config = config || {};
+
+       // Parent constructor
+       ve.ce.MWInlineMapsNode.super.apply( this, arguments );
+
+       // Ensure we have the styles to render the map node
+       mw.loader.using( 'ext.kartographer' );
+
+       // DOM changes
+       this.$element.addClass( 've-ce-mwInlineMapsNode' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( ve.ce.MWInlineMapsNode, ve.ce.MWInlineExtensionNode );
+
+/* Static Properties */
+
+ve.ce.MWInlineMapsNode.static.name = 'mwInlineMaps';
+
+ve.ce.MWInlineMapsNode.static.tagName = 'span';
+
+ve.ce.MWInlineMapsNode.static.primaryCommandName = 'mwMaps';
+
+ve.ce.MWInlineMapsNode.static.iconWhenInvisible = 'map';
+
+/* Registration */
+
+ve.ce.nodeFactory.register( ve.ce.MWInlineMapsNode );
diff --git a/modules/ve-maps/ve.ce.MWMapsNode.js 
b/modules/ve-maps/ve.ce.MWMapsNode.js
index 3f4ae97..9b1fa94 100644
--- a/modules/ve-maps/ve.ce.MWMapsNode.js
+++ b/modules/ve-maps/ve.ce.MWMapsNode.js
@@ -1,5 +1,5 @@
 /*!
- * VisualEditor ContentEditable MWMaps class.
+ * VisualEditor ContentEditable MWMapsNode class.
  *
  * @copyright 2011-2015 VisualEditor Team and others; see 
http://ve.mit-license.org
  */
@@ -8,7 +8,7 @@
  * ContentEditable paragraph node.
  *
  * @class
- * @extends ve.ce.LeafNode
+ * @extends ve.ce.MWBlockExtensionNode
  * @mixins ve.ce.ResizableNode
  *
  * @constructor
diff --git a/modules/ve-maps/ve.dm.MWInlineMapsNode.js 
b/modules/ve-maps/ve.dm.MWInlineMapsNode.js
new file mode 100644
index 0000000..002c953
--- /dev/null
+++ b/modules/ve-maps/ve.dm.MWInlineMapsNode.js
@@ -0,0 +1,45 @@
+/*!
+ * VisualEditor DataModel MWInlineMapsNode class.
+ *
+ * @copyright 2011-2015 VisualEditor Team and others; see 
http://ve.mit-license.org
+ */
+
+/**
+ * DataModel MW Maps node.
+ *
+ * @class
+ * @extends ve.dm.MWInlineExtensionNode
+ *
+ * @constructor
+ * @param {Object} [element] Reference to element in linear model
+ * @param {ve.dm.Node[]} [children]
+ */
+ve.dm.MWInlineMapsNode = function VeDmMWInlineMaps() {
+       // Parent constructor
+       ve.dm.MWInlineMapsNode.super.apply( this, arguments );
+};
+
+/* Inheritance */
+
+OO.inheritClass( ve.dm.MWInlineMapsNode, ve.dm.MWInlineExtensionNode );
+
+/* Static Properties */
+
+ve.dm.MWInlineMapsNode.static.name = 'mwInlineMaps';
+
+ve.dm.MWInlineMapsNode.static.extensionName = 'maps';
+
+/* Static methods */
+
+ve.dm.MWInlineMapsNode.static.toDataElement = function () {
+       var dataElement = 
ve.dm.MWInlineMapsNode.super.static.toDataElement.apply( this, arguments );
+
+       dataElement.attributes.width = +dataElement.attributes.mw.attrs.width;
+       dataElement.attributes.height = +dataElement.attributes.mw.attrs.height;
+
+       return dataElement;
+};
+
+/* Registration */
+
+ve.dm.modelRegistry.register( ve.dm.MWInlineMapsNode );
diff --git a/modules/ve-maps/ve.dm.MWMapsNode.js 
b/modules/ve-maps/ve.dm.MWMapsNode.js
index cceda2d..e17a8c8 100644
--- a/modules/ve-maps/ve.dm.MWMapsNode.js
+++ b/modules/ve-maps/ve.dm.MWMapsNode.js
@@ -1,5 +1,5 @@
 /*!
- * VisualEditor DataModel MWMaps class.
+ * VisualEditor DataModel MWMapsNode class.
  *
  * @copyright 2011-2015 VisualEditor Team and others; see 
http://ve.mit-license.org
  */
@@ -35,6 +35,8 @@
 
 ve.dm.MWMapsNode.static.extensionName = 'maps';
 
+ve.dm.MWMapsNode.static.matchTagNames = [ 'div' ];
+
 /* Static methods */
 
 ve.dm.MWMapsNode.static.toDataElement = function () {
diff --git a/modules/ve-maps/ve.ui.MWMapsDialog.js 
b/modules/ve-maps/ve.ui.MWMapsDialog.js
index c70a5b9..fbc4022 100644
--- a/modules/ve-maps/ve.ui.MWMapsDialog.js
+++ b/modules/ve-maps/ve.ui.MWMapsDialog.js
@@ -35,13 +35,13 @@
 
 ve.ui.MWMapsDialog.static.allowedEmpty = true;
 
-ve.ui.MWMapsDialog.static.modelClasses = [ ve.dm.MWMapsNode ];
+ve.ui.MWMapsDialog.static.modelClasses = [ ve.dm.MWMapsNode, 
ve.dm.MWInlineMapsNode ];
 
 /**
  * @inheritdoc
  */
 ve.ui.MWMapsDialog.prototype.initialize = function () {
-       var panel, dimensionsField, modeField, geoJsonField;
+       var panel, modeField, geoJsonField;
 
        // Parent method
        ve.ui.MWMapsDialog.super.prototype.initialize.call( this );
@@ -51,14 +51,12 @@
        this.map = null;
        this.scalable = null;
 
-       this.dimensions = new ve.ui.DimensionsWidget().connect( this, {
-               widthChange: 'onDimensionsChange',
-               heightChange: 'onDimensionsChange'
-       } );
+       this.dimensions = new ve.ui.DimensionsWidget();
 
        this.modeSelect = new OO.ui.ButtonSelectWidget().addItems( [
                new OO.ui.ButtonOptionWidget( { data: 'interactive', label: 
ve.msg( 'visualeditor-mwmapsdialog-mode-interactive' ) } ),
                new OO.ui.ButtonOptionWidget( { data: 'static', label: ve.msg( 
'visualeditor-mwmapsdialog-mode-static' ) } ),
+               new OO.ui.ButtonOptionWidget( { data: 'link', label: ve.msg( 
'visualeditor-mwmapsdialog-mode-link' ) } ),
                new OO.ui.ButtonOptionWidget( { data: 'data', label: ve.msg( 
'visualeditor-mwmapsdialog-mode-data' ) } )
        ] );
 
@@ -72,14 +70,20 @@
                .toggleLineNumbers( false )
                .setRTL( false );
 
-       this.input.on( 'resize', this.updateSize.bind( this ) );
+       // Events
+       this.input.connect( this, { resize: 'updateSize' } );
+       this.dimensions.connect( this, {
+               widthChange: 'onDimensionsChange',
+               heightChange: 'onDimensionsChange'
+       } );
+       this.modeSelect.connect( this, { select: 'onModeSelectSelect' } );
 
        panel = new OO.ui.PanelLayout( {
                padded: true,
                expanded: false
        } );
 
-       dimensionsField = new OO.ui.FieldLayout( this.dimensions, {
+       this.dimensionsField = new OO.ui.FieldLayout( this.dimensions, {
                align: 'right',
                label: ve.msg( 'visualeditor-mwmapsdialog-size' )
        } );
@@ -94,10 +98,15 @@
                label: ve.msg( 'visualeditor-mwmapsdialog-geojson' )
        } );
 
-       panel.$element.append( dimensionsField.$element, modeField.$element, 
this.$mapContainer, geoJsonField.$element );
+       panel.$element.append( this.dimensionsField.$element, 
modeField.$element, this.$mapContainer, geoJsonField.$element );
        this.$body.append( panel.$element );
 };
 
+/**
+ * Handle change events on the dimensions widget
+ *
+ * @param {string} newValue
+ */
 ve.ui.MWMapsDialog.prototype.onDimensionsChange = function () {
        var dimensions, center;
 
@@ -120,6 +129,24 @@
 };
 
 /**
+ * Handle select events on the mode select widget
+ *
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+ve.ui.MWMapsDialog.prototype.onModeSelectSelect = function ( item ) {
+       var mode = item && item.getData();
+
+       this.dimensionsField.toggle( mode !== 'data' );
+       this.$mapContainer.toggleClass( 'oo-ui-element-hidden', mode === 'data' 
);
+
+       this.updateSize();
+
+       if ( mode !== 'data' ) {
+               this.setupMap();
+       }
+};
+
+/**
  * @inheritdoc ve.ui.MWExtensionWindow
  */
 ve.ui.MWMapsDialog.prototype.updateMwData = function ( mwData ) {
@@ -129,21 +156,28 @@
                        this.dimensions.getDimensions()
                );
 
-       if ( this.map ) {
-               center = this.map.getCenter();
-               latitude = center.lat;
-               longitude = center.lng;
-               zoom = this.map.getZoom();
+       if ( mode !== 'data' ) {
+               if ( this.map ) {
+                       center = this.map.getCenter();
+                       latitude = center.lat;
+                       longitude = center.lng;
+                       zoom = this.map.getZoom();
+               } else {
+                       // Map not loaded in insert, can't insert
+                       return;
+               }
+               mwData.attrs.latitude = latitude.toString();
+               mwData.attrs.longitude = longitude.toString();
+               mwData.attrs.zoom = zoom.toString();
+               mwData.attrs.width = dimensions.width.toString();
+               mwData.attrs.height = dimensions.height.toString();
        } else {
-               // Map not loaded in insert, can't insert
-               return;
+               delete mwData.attrs.latitude;
+               delete mwData.attrs.longitude;
+               delete mwData.attrs.zoom;
+               delete mwData.attrs.width;
+               delete mwData.attrs.height;
        }
-
-       mwData.attrs.latitude = latitude.toString();
-       mwData.attrs.longitude = longitude.toString();
-       mwData.attrs.width = dimensions.width.toString();
-       mwData.attrs.height = dimensions.height.toString();
-       mwData.attrs.zoom = zoom.toString();
 
        mwData.attrs.mode = mode;
 };
@@ -154,10 +188,12 @@
 ve.ui.MWMapsDialog.prototype.getReadyProcess = function ( data ) {
        return ve.ui.MWMapsDialog.super.prototype.getReadyProcess.call( this, 
data )
                .next( function () {
-                       var dialog = this;
-                       return mw.loader.using( 'ext.kartographer.live' ).then( 
function () {
-                               dialog.setupMap();
-                       } );
+                       var attributes = this.selectedNode && 
this.selectedNode.getAttribute( 'mw' ).attrs,
+                               mode = attributes && attributes.mode || 
'interactive';
+
+                       if ( mode !== 'data' ) {
+                               this.setupMap();
+                       }
                }, this );
 };
 
@@ -169,15 +205,29 @@
        return ve.ui.MWMapsDialog.super.prototype.getSetupProcess.call( this, 
data )
                .next( function () {
                        var attributes = this.selectedNode && 
this.selectedNode.getAttribute( 'mw' ).attrs,
-                               mode = attributes && attributes.mode || 
'interactive';
+                               mode = attributes && attributes.mode || 
'interactive',
+                               isInline = this.selectedNode instanceof 
ve.dm.MWInlineMapsNode;
 
                        this.modeSelect.selectItemByData( mode );
 
                        this.actions.setMode( this.selectedNode ? 'edit' : 
'insert' );
 
-                       this.scalable = this.selectedNode ?
-                               this.selectedNode.getScalable() :
-                               ve.dm.MWMapsNode.static.createScalable( { 
width: 400, height: 300 } );
+                       if ( this.selectedNode instanceof ve.dm.MWMapsNode ) {
+                               this.scalable = this.selectedNode.getScalable();
+                       } else if ( this.selectedNode && mode === 'link' ) {
+                               this.scalable = 
ve.dm.MWMapsNode.static.createScalable( {
+                                       width: this.selectedNode.getAttribute( 
'width' ),
+                                       height: this.selectedNode.getAttribute( 
'height' )
+                               } );
+                       } else {
+                               this.scalable = 
ve.dm.MWMapsNode.static.createScalable( { width: 400, height: 300 } );
+                       }
+
+                       // TODO: Support block/inline conversion
+                       this.modeSelect.getItemFromData( 'interactive' 
).toggle( !isInline );
+                       this.modeSelect.getItemFromData( 'static' ).toggle( 
!isInline );
+                       this.modeSelect.getItemFromData( 'link' ).toggle( 
isInline );
+                       this.modeSelect.getItemFromData( 'data' ).toggle( 
isInline );
 
                        this.dimensions.setDimensions( 
this.scalable.getCurrentDimensions() );
                }, this );
@@ -185,35 +235,45 @@
 
 /**
  * Setup the map control
+ *
+ * @return {jQuery.Promise} Promise which resolves when the map is setup
  */
 ve.ui.MWMapsDialog.prototype.setupMap = function () {
-       var latitude, longitude, zoom, geoJson,
-               mwData = this.selectedNode && this.selectedNode.getAttribute( 
'mw' ),
-               mwAttrs = mwData && mwData.attrs;
+       var dialog = this;
 
-       if ( mwAttrs && mwAttrs.zoom ) {
-               latitude = +mwAttrs.latitude;
-               longitude = +mwAttrs.longitude;
-               zoom = +mwAttrs.zoom;
-       } else {
-               latitude = 0;
-               longitude = 0;
-               zoom = 2;
+       if ( this.map ) {
+               return $.Deferred().resolve().promise();
        }
 
-       try {
-               geoJson = mwData && JSON.parse( mwData.body.extsrc );
-       } catch ( e ) {}
+       return mw.loader.using( 'ext.kartographer.live' ).then( function () {
+               var latitude, longitude, zoom, geoJson,
+                       mwData = dialog.selectedNode && 
dialog.selectedNode.getAttribute( 'mw' ),
+                       mwAttrs = mwData && mwData.attrs;
 
-       this.map = mw.kartographer.createMap( this.$map[ 0 ], {
-               latitude: latitude,
-               longitude: longitude,
-               zoom: zoom,
-               // TODO: Support style editing
-               geoJson: geoJson
+               if ( mwAttrs && mwAttrs.zoom ) {
+                       latitude = +mwAttrs.latitude;
+                       longitude = +mwAttrs.longitude;
+                       zoom = +mwAttrs.zoom;
+               } else {
+                       latitude = 0;
+                       longitude = 0;
+                       zoom = 2;
+               }
+
+               try {
+                       geoJson = mwData && JSON.parse( mwData.body.extsrc );
+               } catch ( e ) {}
+
+               dialog.map = mw.kartographer.createMap( dialog.$map[ 0 ], {
+                       latitude: latitude,
+                       longitude: longitude,
+                       zoom: zoom,
+                       // TODO: Support style editing
+                       geoJson: geoJson
+               } );
+
+               dialog.onDimensionsChange();
        } );
-
-       this.onDimensionsChange();
 };
 
 /**
diff --git a/modules/ve-maps/ve.ui.MWMapsTool.js 
b/modules/ve-maps/ve.ui.MWMapsTool.js
index e189c52..a13fceb 100644
--- a/modules/ve-maps/ve.ui.MWMapsTool.js
+++ b/modules/ve-maps/ve.ui.MWMapsTool.js
@@ -28,7 +28,7 @@
 ve.ui.MWMapsDialogTool.static.group = 'object';
 ve.ui.MWMapsDialogTool.static.icon = 'map';
 ve.ui.MWMapsDialogTool.static.title = OO.ui.deferMsg( 
'visualeditor-mwmapsdialog-title' );
-ve.ui.MWMapsDialogTool.static.modelClasses = [ ve.dm.MWMapsNode ];
+ve.ui.MWMapsDialogTool.static.modelClasses = [ ve.dm.MWMapsNode, 
ve.dm.MWInlineMapsNode ];
 ve.ui.MWMapsDialogTool.static.commandName = 'mwMaps';
 
 /* Registration */

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iac761931622f40ed7cc06103fb54e99099461ff1
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Kartographer
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

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

Reply via email to