瀏覽代碼

Update the logic to not allow merging spanned cells.

Maciej Gołaszewski 6 年之前
父節點
當前提交
eba4f2a516

+ 4 - 2
packages/ckeditor5-table/src/commands/mergecellcommand.js

@@ -171,9 +171,11 @@ function getHorizontalCell( tableCell, direction, tableUtils ) {
 	const { column: rightCellColumn } = tableUtils.getCellLocation( cellOnRight );
 
 	const leftCellSpan = parseInt( cellOnLeft.getAttribute( 'colspan' ) || 1 );
+	const rightCellSpan = parseInt( cellOnRight.getAttribute( 'colspan' ) || 1 );
 
-	const isMergeWithBodyCell = direction == 'right' && rightCellColumn === headingColumns;
-	const isMergeWithHeadCell = direction == 'left' && leftCellColumn === ( headingColumns - 1 );
+	// We cannot merge cells if the result will extend over heading section.
+	const isMergeWithBodyCell = direction == 'right' && ( rightCellColumn + rightCellSpan > headingColumns );
+	const isMergeWithHeadCell = direction == 'left' && ( leftCellColumn + leftCellSpan > headingColumns - 1 );
 
 	if ( headingColumns && ( isMergeWithBodyCell || isMergeWithHeadCell ) ) {
 		return;

+ 41 - 1
packages/ckeditor5-table/tests/commands/mergecellcommand.js

@@ -96,11 +96,43 @@ describe( 'MergeCellCommand', () => {
 
 			it( 'should be false if mergeable cell is in other table section then current cell', () => {
 				setData( model, modelTable( [
-					[ '00[]', '01' ],
+					[ '00[]', '01' ]
 				], { headingColumns: 1 } ) );
 
 				expect( command.isEnabled ).to.be.false;
 			} );
+
+			it( 'should be false if merged cell would cross heading section (mergeable cell with colspan)', () => {
+				setData( model, modelTable( [
+					[ '00[]', { colspan: 2, contents: '01' }, '02', '03' ]
+				], { headingColumns: 2 } ) );
+
+				expect( command.isEnabled ).to.be.false;
+			} );
+
+			it( 'should be true if merged cell would not cross heading section (mergeable cell with colspan)', () => {
+				setData( model, modelTable( [
+					[ '00[]', { colspan: 2, contents: '01' }, '02', '03' ]
+				], { headingColumns: 3 } ) );
+
+				expect( command.isEnabled ).to.be.true;
+			} );
+
+			it( 'should be false if merged cell would cross heading section (current cell with colspan)', () => {
+				setData( model, modelTable( [
+					[ { colspan: 2, contents: '00[]' }, '01', '02', '03' ]
+				], { headingColumns: 2 } ) );
+
+				expect( command.isEnabled ).to.be.false;
+			} );
+
+			it( 'should be true if merged cell would not cross heading section (current cell with colspan)', () => {
+				setData( model, modelTable( [
+					[ { colspan: 2, contents: '00[]' }, '01', '02', '03' ]
+				], { headingColumns: 3 } ) );
+
+				expect( command.isEnabled ).to.be.true;
+			} );
 		} );
 
 		describe( 'value', () => {
@@ -289,6 +321,14 @@ describe( 'MergeCellCommand', () => {
 
 				expect( command.isEnabled ).to.be.false;
 			} );
+
+			it( 'should be false if merged cell would cross heading section (mergeable cell with colspan)', () => {
+				setData( model, modelTable( [
+					[ { colspan: 2, contents: '00' }, '02[]', '03' ]
+				], { headingColumns: 2 } ) );
+
+				expect( command.isEnabled ).to.be.false;
+			} );
 		} );
 
 		describe( 'value', () => {