8
0
Просмотр исходного кода

Fixed inserting image if one is already selected.

Szymon Kupś 8 лет назад
Родитель
Сommit
8ca032b524

+ 23 - 3
packages/ckeditor5-upload/src/imageuploadcommand.js

@@ -6,6 +6,7 @@
 import ModelDocumentFragment from '@ckeditor/ckeditor5-engine/src/model/documentfragment';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
+import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
 import ModelSelection from '@ckeditor/ckeditor5-engine/src/model/selection';
 import FileRepository from './filerepository';
 import { isImageType } from './utils';
@@ -35,6 +36,7 @@ export default class ImageUploadCommand extends Command {
 		const doc = editor.document;
 		const batch = options.batch || doc.batch();
 		const file = options.file;
+		const selection = doc.selection;
 		const fileRepository = editor.plugins.get( FileRepository );
 
 		if ( !isImageType( file ) ) {
@@ -42,13 +44,31 @@ export default class ImageUploadCommand extends Command {
 		}
 
 		doc.enqueueChanges( () => {
+			let insertPosition;
+			const firstBlock = doc.selection.getSelectedBlocks().next().value;
+
+			if ( firstBlock ) {
+				// If first block is found - insert image before it.
+				insertPosition = ModelPosition.createBefore( firstBlock );
+			} else {
+				// If element placed in root is selected - insert after it.
+				const selectedElement = selection.getSelectedElement();
+
+				if ( selectedElement && selectedElement.parent.is( 'rootElement' ) ) {
+					insertPosition = ModelPosition.createAfter( selectedElement );
+				}
+			}
+
+			// No position to insert.
+			if ( !insertPosition ) {
+				return;
+			}
+
 			const imageElement = new ModelElement( 'image', {
 				uploadId: fileRepository.createLoader( file ).id
 			} );
 			const documentFragment = new ModelDocumentFragment( [ imageElement ] );
-
-			const firstBlock = doc.selection.getSelectedBlocks().next().value;
-			const range = ModelRange.createFromParentsAndOffsets( firstBlock, 0, firstBlock, 0 );
+			const range = new ModelRange( insertPosition );
 			const insertSelection = new ModelSelection();
 			insertSelection.setRanges( [ range ] );
 

+ 27 - 1
packages/ckeditor5-upload/tests/imageuploadcommand.js

@@ -10,6 +10,7 @@ import { createNativeFileMock, AdapterMock } from './_utils/mocks';
 import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import Image from '@ckeditor/ckeditor5-image/src/image/imageengine';
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
+import buildModelConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildmodelconverter';
 
 describe( 'ImageUploadCommand', () => {
 	let editor, command, adapterMock, document, fileRepository;
@@ -40,13 +41,38 @@ describe( 'ImageUploadCommand', () => {
 		it( 'should insert image', () => {
 			const file = createNativeFileMock();
 			setModelData( document, '<paragraph>foo[]</paragraph>' );
+
 			command._doExecute( { file } );
 
 			const id = fileRepository.getLoader( file ).id;
-
 			expect( getModelData( document ) ).to.equal( `<image uploadId="${ id }"></image><paragraph>foo[]</paragraph>` );
 		} );
 
+		it( 'should insert image after other image', () => {
+			const file = createNativeFileMock();
+			setModelData( document, '[<image src="image.png"></image>]' );
+
+			command._doExecute( { file } );
+
+			const id = fileRepository.getLoader( file ).id;
+			expect( getModelData( document ) ).to.equal( `[<image src="image.png"></image>]<image uploadId="${ id }"></image>` );
+		} );
+
+		it( 'should not insert image when proper insert position cannot be found', () => {
+			const file = createNativeFileMock();
+			document.schema.registerItem( 'other' );
+			document.schema.allow( { name: 'other', inside: '$root' } );
+			buildModelConverter().for( editor.editing.modelToView )
+				.fromElement( 'other' )
+				.toElement( 'span' );
+
+			setModelData( document, '<other>[]</other>' );
+
+			command._doExecute( { file } );
+
+			expect( getModelData( document ) ).to.equal( '<other>[]</other>' );
+		} );
+
 		it( 'should not insert non-image', () => {
 			const file = createNativeFileMock();
 			file.type = 'audio/mpeg3';