Esanders has uploaded a new change for review.

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

Change subject: Support editing of caption nodes
......................................................................

Support editing of caption nodes

As ce is set to false on the table (as required by Firefox)
override ce back to try on captions and hide focus styling.

Make sure click events get through by never using preventDefault.

Bonus: refactor out event.target to tableCellNode lookup into
getCellNodeFromTarget.

Change-Id: Ie2e0472b473fd8befbd80fbe70bee51577c39ae7
---
M src/ce/nodes/ve.ce.TableCaptionNode.js
M src/ce/nodes/ve.ce.TableNode.js
M src/ce/styles/nodes/ve.ce.TableNode.css
3 files changed, 50 insertions(+), 18 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/43/170043/1

diff --git a/src/ce/nodes/ve.ce.TableCaptionNode.js 
b/src/ce/nodes/ve.ce.TableCaptionNode.js
index 036a252..5b65742 100644
--- a/src/ce/nodes/ve.ce.TableCaptionNode.js
+++ b/src/ce/nodes/ve.ce.TableCaptionNode.js
@@ -28,6 +28,21 @@
 
 ve.ce.TableCaptionNode.static.tagName = 'caption';
 
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.ce.TableCaptionNode.prototype.onSetup = function () {
+       // Parent method
+       ve.ce.TableCaptionNode.super.prototype.onSetup.call( this );
+
+       // DOM changes
+       this.$element
+               .addClass( 've-ce-tableCaptionNode' )
+               .prop( 'contentEditable', 'true' );
+};
+
 /* Registration */
 
 ve.ce.nodeFactory.register( ve.ce.TableCaptionNode );
diff --git a/src/ce/nodes/ve.ce.TableNode.js b/src/ce/nodes/ve.ce.TableNode.js
index aa4bda4..a904fa4 100644
--- a/src/ce/nodes/ve.ce.TableNode.js
+++ b/src/ce/nodes/ve.ce.TableNode.js
@@ -107,9 +107,7 @@
  * @param {jQuery.Event} e Double click event
  */
 ve.ce.TableNode.prototype.onTableDblClick = function ( e ) {
-       var tableNode = $( e.target ).closest( 'table' ).data( 'view' );
-       if ( tableNode !== this ) {
-               // Nested table, ignore event
+       if ( !this.getCellNodeFromTarget( e.target ) ) {
                return;
        }
        if ( this.surface.getModel().getSelection() instanceof 
ve.dm.TableSelection ) {
@@ -123,25 +121,18 @@
  * @param {jQuery.Event} e Mouse down or touch start event
  */
 ve.ce.TableNode.prototype.onTableMouseDown = function ( e ) {
-       var cellNode, startCell, endCell, selection, newSelection, tableNode;
+       var cellNode, startCell, endCell, selection, newSelection;
 
        if ( e.type === 'touchstart' && e.originalEvent.touches.length > 1 ) {
                // Ignore multi-touch
                return;
        }
 
-       tableNode = $( e.target ).closest( 'table' ).data( 'view' );
-
-       if ( tableNode !== this ) {
-               // Nested table, ignore event
-               return;
-       }
-
-       cellNode = $( e.target ).closest( 'td, th' ).data( 'view' );
+       cellNode = this.getCellNodeFromTarget( e.target );
        if ( !cellNode ) {
-               e.preventDefault();
                return;
        }
+
        endCell = this.getModel().getMatrix().lookupCell( cellNode.getModel() );
        if ( !endCell ) {
                e.preventDefault();
@@ -176,12 +167,30 @@
 };
 
 /**
+ * Get the table and cell node from an event target
+ *
+ * @param {HTMLElement} target Element target to find nearest cell node to
+ * @return {ve.ce.TableCellNode|null} Table cell node, or null if none found
+ */
+ve.ce.TableNode.prototype.getCellNodeFromTarget = function ( target ) {
+       var $target = $( target ),
+               $table = $target.closest( 'table' );
+
+       // Nested table, ignore
+       if ( !this.$element.is( $table ) ) {
+               return null;
+       }
+
+       return $target.closest( 'td, th' ).data( 'view' );
+};
+
+/**
  * Handle mouse/touch move events
  *
  * @param {jQuery.Event} e Mouse/touch move event
  */
 ve.ce.TableNode.prototype.onTableMouseMove = function ( e ) {
-       var cell, selection, touch, target, node;
+       var cell, selection, touch, target, cellNode;
 
        // 'touchmove' doesn't give a correct e.target, so calculate it from 
coordinates
        if ( e.type === 'touchmove' ) {
@@ -195,12 +204,12 @@
                target = e.target;
        }
 
-       node = $( target ).closest( 'td, th' ).data( 'view' );
-       if ( !node ) {
+       cellNode = this.getCellNodeFromTarget( target );
+       if ( !cellNode ) {
                return;
        }
 
-       cell = this.getModel().matrix.lookupCell( node.getModel() );
+       cell = this.getModel().matrix.lookupCell( cellNode.getModel() );
        if ( !cell ) {
                return;
        }
@@ -278,7 +287,7 @@
        var active = (
                        this.editingFragment !== null &&
                        selection instanceof ve.dm.LinearSelection &&
-                       this.getModel().getOuterRange().containsRange( 
selection.getRange() )
+                       
this.editingFragment.getSelection().getRanges()[0].containsRange( 
selection.getRange() )
                ) ||
                (
                        selection instanceof ve.dm.TableSelection &&
diff --git a/src/ce/styles/nodes/ve.ce.TableNode.css 
b/src/ce/styles/nodes/ve.ce.TableNode.css
index 2d10e1c..caebbc8 100644
--- a/src/ce/styles/nodes/ve.ce.TableNode.css
+++ b/src/ce/styles/nodes/ve.ce.TableNode.css
@@ -10,6 +10,14 @@
        cursor: default;
 }
 
+.ve-ce-tableCaptionNode:focus {
+       outline: none;
+}
+
+.ve-ce-tableCaptionNode {
+       cursor: text;
+}
+
 .ve-ce-tableNodeOverlay {
        position: absolute;
        pointer-events: none;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie2e0472b473fd8befbd80fbe70bee51577c39ae7
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
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