浏览代码

Fix: Change where the table cell is consumed in downcast converters.

Maciej Gołaszewski 7 年之前
父节点
当前提交
5d48a30dc0

+ 7 - 4
packages/ckeditor5-table/src/converters/downcast.js

@@ -38,7 +38,7 @@ export function downcastInsertTable() {
 		const tableWalker = new TableWalker( table );
 
 		for ( const tableWalkerValue of tableWalker ) {
-			const { row } = tableWalkerValue;
+			const { row, cell } = tableWalkerValue;
 
 			const tableSection = getOrCreateTableSection( getSectionName( tableWalkerValue ), tableElement, conversionApi, tableSections );
 			const tableRow = table.getChild( row );
@@ -46,6 +46,9 @@ export function downcastInsertTable() {
 			// Check if row was converted
 			const trElement = getOrCreateTr( tableRow, row, tableSection, conversionApi );
 
+			// Consume table cell - it will be always consumed as we convert whole table at once.
+			conversionApi.consumable.consume( cell, 'insert' );
+
 			createViewTableCellElement( tableWalkerValue, ViewPosition.createAt( trElement, 'end' ), conversionApi );
 		}
 
@@ -83,6 +86,9 @@ export function downcastInsertRow() {
 			const tableSection = getOrCreateTableSection( getSectionName( tableWalkerValue ), tableElement, conversionApi );
 			const trElement = getOrCreateTr( tableRow, row, tableSection, conversionApi );
 
+			// Consume table cell - it will be always consumed as we convert whole row at once.
+			conversionApi.consumable.consume( tableWalkerValue.cell, 'insert' );
+
 			createViewTableCellElement( tableWalkerValue, ViewPosition.createAt( trElement, 'end' ), conversionApi );
 		}
 	}, { priority: 'normal' } );
@@ -238,9 +244,6 @@ function createViewTableCellElement( tableWalkerValue, insertPosition, conversio
 
 	const cellElementName = getCellElementName( tableWalkerValue );
 
-	// Will always consume since we're converting <tableRow> element from a parent <table>.
-	conversionApi.consumable.consume( tableCell, 'insert' );
-
 	const cellElement = conversionApi.writer.createContainerElement( cellElementName );
 
 	conversionApi.mapper.bindElements( tableCell, cellElement );

+ 37 - 0
packages/ckeditor5-table/tests/converters/downcast.js

@@ -280,6 +280,43 @@ describe( 'downcast converters', () => {
 			] ) );
 		} );
 
+		it( 'should properly consume already added rows', () => {
+			setModelData( model, modelTable( [
+				[ '11', '12' ]
+			] ) );
+
+			const table = root.getChild( 0 );
+
+			model.change( writer => {
+				const row = writer.createElement( 'tableRow' );
+
+				writer.insert( row, table, 1 );
+
+				writer.insertElement( 'tableCell', row, 'end' );
+				writer.insertElement( 'tableCell', row, 'end' );
+			} );
+
+			expect( getViewData( viewDocument, { withoutSelection: true } ) ).to.equal( viewTable( [
+				[ '11', '12' ],
+				[ '', '' ]
+			] ) );
+
+			model.change( writer => {
+				const row = writer.createElement( 'tableRow' );
+
+				writer.insert( row, table, 2 );
+
+				writer.insertElement( 'tableCell', row, 'end' );
+				writer.insertElement( 'tableCell', row, 'end' );
+			} );
+
+			expect( getViewData( viewDocument, { withoutSelection: true } ) ).to.equal( viewTable( [
+				[ '11', '12' ],
+				[ '', '' ],
+				[ '', '' ]
+			] ) );
+		} );
+
 		it( 'should insert row on proper index', () => {
 			setModelData( model, modelTable( [
 				[ '11', '12' ],