Browse Source

Handle the cut event in an extensible way.

Maciej Gołaszewski 5 years ago
parent
commit
333fb146b2

+ 30 - 6
packages/ckeditor5-table/src/tableclipboard.js

@@ -53,6 +53,7 @@ export default class TableClipboard extends Plugin {
 
 		this.listenTo( viewDocument, 'copy', ( evt, data ) => this._onCopy( evt, data ) );
 		this.listenTo( viewDocument, 'cut', ( evt, data ) => this._onCut( evt, data ) );
+		this.listenTo( viewDocument, 'clipboardOutput', ( evt, data ) => this._onClipboardOutput( evt, data ) );
 	}
 
 	/**
@@ -72,7 +73,7 @@ export default class TableClipboard extends Plugin {
 		data.preventDefault();
 		evt.stop();
 
-		this._copySelectedCellsToClipboard( tableSelection.getSelectionAsFragment(), data );
+		this._copySelectedCellsToClipboard( tableSelection.getSelectionAsFragment(), data, evt.name );
 	}
 
 	/**
@@ -92,23 +93,46 @@ export default class TableClipboard extends Plugin {
 		data.preventDefault();
 		evt.stop();
 
-		this._copySelectedCellsToClipboard( tableSelection.getSelectionAsFragment(), data );
+		this._copySelectedCellsToClipboard( tableSelection.getSelectionAsFragment(), data, evt.name );
 		clearTableCellsContents( this.editor.model, tableSelection.getSelectedTableCells() );
 	}
 
 	/**
+	 * Overrides default Clipboard plugin "clipboardOutput" handler. The table contents clearing is on in {@link #_onCut} handler.
+	 *
+	 * @param {module:utils/eventinfo~EventInfo} evt An object containing information about the handled event.
+	 * @param {Object} data Clipboard event data.
+	 * @private
+	 */
+	_onClipboardOutput( evt, data ) {
+		if ( !this._tableSelection.hasMultiCellSelection && data.method !== 'cut' ) {
+			return;
+		}
+
+		evt.stop();
+
+		data.dataTransfer.setData( 'text/html', new HtmlDataProcessor().toData( data.content ) );
+		data.dataTransfer.setData( 'text/plain', viewToPlainText( data.content ) );
+	}
+
+	/**
 	 * Handles clipboard output the same way as Clipboard plugin would.
 	 *
 	 * @private
 	 * @param {Array.<module:engine/model/element~Element>} selectedTableCells
 	 * @param {module:clipboard/clipboard~ClipboardOutputEventData} data Event data.
+	 * @param {String} method Copy/cut method.
 	 */
-	_copySelectedCellsToClipboard( selectedTableCells, data ) {
+	_copySelectedCellsToClipboard( selectedTableCells, data, method ) {
 		const dataController = this.editor.data;
+		const viewDocument = this.editor.editing.view.document;
 
-		const content = dataController.toView( selectedTableCells );
+		const content = dataController.toView( this._tableSelection.getSelectionAsFragment() );
 
-		data.dataTransfer.setData( 'text/html', new HtmlDataProcessor().toData( content ) );
-		data.dataTransfer.setData( 'text/plain', viewToPlainText( content ) );
+		viewDocument.fire( 'clipboardOutput', {
+			dataTransfer: data.dataTransfer,
+			content,
+			method
+		} );
 	}
 }

+ 10 - 7
packages/ckeditor5-table/tests/tableclipboard.js

@@ -13,7 +13,7 @@ import Clipboard from '@ckeditor/ckeditor5-clipboard/src/clipboard';
 import TableClipboard from '../src/tableclipboard';
 import { assertEqualMarkup } from '@ckeditor/ckeditor5-utils/tests/_utils/utils';
 
-describe( 'table clipboard', () => {
+describe.only( 'table clipboard', () => {
 	let editor, model, modelRoot, tableSelection, viewDocument;
 
 	beforeEach( async () => {
@@ -39,7 +39,7 @@ describe( 'table clipboard', () => {
 
 	describe( 'Clipboard integration', () => {
 		describe( 'copy', () => {
-			it( 'should to nothing for normal selection in table', () => {
+			it( 'should do nothing for normal selection in table', () => {
 				const dataTransferMock = createDataTransfer();
 				const spy = sinon.spy();
 
@@ -261,18 +261,21 @@ describe( 'table clipboard', () => {
 		} );
 
 		describe( 'cut', () => {
-			it( 'is not disabled normal selection over a table', () => {
-				const dataTransferMock = createDataTransfer();
-				const spy = sinon.spy();
+			it( 'should not block clipboardOutput if no multi-cell selection', () => {
+				setModelData( model, modelTable( [
+					[ '[00]', '01', '02' ],
+					[ '10', '11', '12' ],
+					[ '20', '21', '22' ]
+				] ) );
 
-				viewDocument.on( 'clipboardOutput', spy );
+				const dataTransferMock = createDataTransfer();
 
 				viewDocument.fire( 'cut', {
 					dataTransfer: dataTransferMock,
 					preventDefault: sinon.spy()
 				} );
 
-				sinon.assert.calledOnce( spy );
+				expect( dataTransferMock.getData( 'text/html' ) ).to.equal( '00' );
 			} );
 
 			it( 'is clears selected table cells', () => {