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