diff --git a/tinymce-single/blocks.js b/tinymce-single/blocks.js index 94d4fb78321b49..b7518884cad5b7 100644 --- a/tinymce-single/blocks.js +++ b/tinymce-single/blocks.js @@ -41,24 +41,44 @@ return _controls; }, getSelectedBlocks: function() { - - }, - getSelectedBlock: function( editor ) { var editor = window.tinyMCE.activeEditor; - var node = editor.selection.getNode(); + var selection = window.getSelection(); + var startNode = editor.selection.getStart(); + var endNode = editor.selection.getEnd(); var rootNode = editor.getBody(); + var blocks = []; - if ( node === rootNode ) { - return rootNode.firstChild; + while ( startNode.parentNode !== rootNode ) { + startNode = startNode.parentNode; } - while ( node.parentNode ) { - if ( node.parentNode === rootNode ) { - return node; + while ( endNode.parentNode !== rootNode ) { + endNode = endNode.parentNode; + } + + if ( startNode.compareDocumentPosition( endNode ) & Node.DOCUMENT_POSITION_FOLLOWING ) { + while ( startNode ) { + blocks.push( startNode ); + + if ( startNode === endNode ) { + break; + } + + startNode = startNode.nextSibling; } + } else { + blocks.push( startNode ); + } - node = node.parentNode; + // Handle tripple click selection. + if ( ! selection.isCollapsed && selection.focusOffset === 0 && selection.focusNode === endNode ) { + blocks.pop(); } + + return blocks; + }, + getSelectedBlock: function() { + return wp.blocks.getSelectedBlocks()[0]; } }; } )( window.wp = window.wp || {} ); diff --git a/tinymce-single/tinymce/block.js b/tinymce-single/tinymce/block.js index 2577c776eedbe0..65952956bac63e 100644 --- a/tinymce-single/tinymce/block.js +++ b/tinymce-single/tinymce/block.js @@ -1,6 +1,7 @@ ( function( tinymce, wp, _ ) { tinymce.PluginManager.add( 'block', function( editor ) { var getSelectedBlock = wp.blocks.getSelectedBlock; + var getSelectedBlocks = wp.blocks.getSelectedBlocks; // Global controls @@ -124,7 +125,7 @@ } function moveBlockUp() { - $blocks = getBlockSelection(); + $blocks = editor.$( getSelectedBlocks() ); $first = $blocks.first(); $last = $blocks.last(); $prev = $first.prev(); @@ -142,7 +143,7 @@ } function moveBlockDown() { - $blocks = getBlockSelection(); + $blocks = editor.$( getSelectedBlocks() ); $first = $blocks.first(); $last = $blocks.last(); $next = $last.next(); @@ -573,22 +574,6 @@ insert = false; } ); - function getBlockSelection() { - var startNode = editor.selection.getStart(); - var endNode = editor.selection.getEnd(); - var rootNode = editor.getBody(); - - var $start = editor.$( editor.dom.getParent( startNode, function( element ) { - return element.parentNode === rootNode; - } ) ); - - var $end = editor.$( editor.dom.getParent( endNode, function( element ) { - return element.parentNode === rootNode; - } ) ); - - return $start.add( $start.nextUntil( $end ) ).add( $end ); - } - editor.on( 'selectionChange nodeChange', function( event ) { var selection = window.getSelection(); var isCollapsed = selection.isCollapsed; @@ -618,17 +603,19 @@ UI.insert.reposition( { isEmpty: isEmpty } ); } else { if ( isBlockUIVisible ) { - var selectedBlocks = getBlockSelection(); + var selectedBlocks = getSelectedBlocks(); if ( selectedBlocks.length === 1 ) { showBlockUI(); + UI.insert.reposition(); } else { hideBlockUI(); UI.navigation.reposition(); + UI.insert.hide(); } - var startRect = selectedBlocks.first()[0].getBoundingClientRect(); - var endRect = selectedBlocks.last()[0].getBoundingClientRect(); + var startRect = selectedBlocks[0].getBoundingClientRect(); + var endRect = selectedBlocks[ selectedBlocks.length - 1 ].getBoundingClientRect(); DOM.setStyles( UI.outline, { display: 'block', @@ -638,8 +625,6 @@ height: endRect.bottom - startRect.top + 'px', width: Math.max( startRect.width, endRect.width ) + 'px' } ); - - UI.insert.reposition(); } else { hideBlockUI(); UI.insert.hide();