Skip to content
This repository has been archived by the owner on Jun 26, 2020. It is now read-only.

Commit

Permalink
Fix: Contextual toolbar should re–position correctly on window scroll…
Browse files Browse the repository at this point in the history
…. Closes #227.
  • Loading branch information
oleq committed May 16, 2017
1 parent 4e2ee36 commit 7d3977d
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
22 changes: 13 additions & 9 deletions src/toolbar/contextual/contextualtoolbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,16 +217,20 @@ export default class ContextualToolbar extends Plugin {
// Get direction of the selection.
const isBackward = editingView.selection.isBackward;

// getBoundingClientRect() makes no sense when the selection spans across number
// of lines of text. Using getClientRects() allows us to browse micro–ranges
// that would normally make up the bounding client rect.
const rangeRects = editingView.domConverter.viewRangeToDom( editingView.selection.getFirstRange() ).getClientRects();

// Select the proper range rect depending on the direction of the selection.
const rangeRect = isBackward ? rangeRects.item( 0 ) : rangeRects.item( rangeRects.length - 1 );

return {
target: rangeRect,
// Because the target for BalloonPanelView is a Rect (not DOMRange), it's geometry will stay fixed
// as the window scrolls. To let the BalloonPanelView follow such Rect, is must be continuously
// computed and hence, the target is defined as a function instead of a static value.
// https://github.com/ckeditor/ckeditor5-ui/issues/195
target: () => {
// getBoundingClientRect() makes no sense when the selection spans across number
// of lines of text. Using getClientRects() allows us to browse micro–ranges
// that would normally make up the bounding client rect.
const rangeRects = editingView.domConverter.viewRangeToDom( editingView.selection.getFirstRange() ).getClientRects();

// Select the proper range rect depending on the direction of the selection.
return isBackward ? rangeRects.item( 0 ) : rangeRects.item( rangeRects.length - 1 );
},
positions: isBackward ?
[ defaultPositions.northWestArrowSouth, defaultPositions.southWestArrowNorth ] :
[ defaultPositions.southEastArrowNorth, defaultPositions.northEastArrowSouth ]
Expand Down
6 changes: 3 additions & 3 deletions tests/toolbar/contextual/contextualtoolbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ describe( 'ContextualToolbar', () => {
editor.editing.view.isFocused = true;
} );

it( 'should return promise', () => {
it( 'should return a promise', () => {
setData( editor.document, '<paragraph>b[a]r</paragraph>' );

const returned = contextualToolbar._showPanel();
Expand All @@ -160,7 +160,7 @@ describe( 'ContextualToolbar', () => {
view: contextualToolbar.toolbarView,
balloonClassName: 'ck-toolbar-container ck-editor-toolbar-container',
position: {
target: forwardSelectionRect,
target: sinon.match( value => value() == backwardSelectionRect ) ,
positions: [ defaultPositions.southEastArrowNorth, defaultPositions.northEastArrowSouth ]
}
} );
Expand All @@ -178,7 +178,7 @@ describe( 'ContextualToolbar', () => {
view: contextualToolbar.toolbarView,
balloonClassName: 'ck-toolbar-container ck-editor-toolbar-container',
position: {
target: backwardSelectionRect,
target: sinon.match( value => value() == forwardSelectionRect ),
positions: [ defaultPositions.northWestArrowSouth, defaultPositions.southWestArrowNorth ]
}
} );
Expand Down

0 comments on commit 7d3977d

Please sign in to comment.