|
@@ -11,6 +11,7 @@ import Command from '@ckeditor/ckeditor5-core/src/command';
|
|
|
import Position from '@ckeditor/ckeditor5-engine/src/model/position';
|
|
import Position from '@ckeditor/ckeditor5-engine/src/model/position';
|
|
|
import Range from '@ckeditor/ckeditor5-engine/src/model/range';
|
|
import Range from '@ckeditor/ckeditor5-engine/src/model/range';
|
|
|
import TableWalker from '../tablewalker';
|
|
import TableWalker from '../tablewalker';
|
|
|
|
|
+import { updateNumericAttribute } from './utils';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* The merge cell command.
|
|
* The merge cell command.
|
|
@@ -92,6 +93,10 @@ export default class MergeCellCommand extends Command {
|
|
|
const cellToExpand = isMergeNext ? tableCell : cellToMerge;
|
|
const cellToExpand = isMergeNext ? tableCell : cellToMerge;
|
|
|
const cellToRemove = isMergeNext ? cellToMerge : tableCell;
|
|
const cellToRemove = isMergeNext ? cellToMerge : tableCell;
|
|
|
|
|
|
|
|
|
|
+ // Cache the parent of cell to remove for later check.
|
|
|
|
|
+ const removedTableCellRow = cellToRemove.parent;
|
|
|
|
|
+
|
|
|
|
|
+ // Remove table cell and merge it contents with merged cell.
|
|
|
writer.move( Range.createIn( cellToRemove ), Position.createAt( cellToExpand, 'end' ) );
|
|
writer.move( Range.createIn( cellToRemove ), Position.createAt( cellToExpand, 'end' ) );
|
|
|
writer.remove( cellToRemove );
|
|
writer.remove( cellToRemove );
|
|
|
|
|
|
|
@@ -99,9 +104,14 @@ export default class MergeCellCommand extends Command {
|
|
|
const cellSpan = parseInt( tableCell.getAttribute( spanAttribute ) || 1 );
|
|
const cellSpan = parseInt( tableCell.getAttribute( spanAttribute ) || 1 );
|
|
|
const cellToMergeSpan = parseInt( cellToMerge.getAttribute( spanAttribute ) || 1 );
|
|
const cellToMergeSpan = parseInt( cellToMerge.getAttribute( spanAttribute ) || 1 );
|
|
|
|
|
|
|
|
|
|
+ // Update table cell span attribute and merge set selection on merged contents.
|
|
|
writer.setAttribute( spanAttribute, cellSpan + cellToMergeSpan, cellToExpand );
|
|
writer.setAttribute( spanAttribute, cellSpan + cellToMergeSpan, cellToExpand );
|
|
|
-
|
|
|
|
|
writer.setSelection( Range.createIn( cellToExpand ) );
|
|
writer.setSelection( Range.createIn( cellToExpand ) );
|
|
|
|
|
+
|
|
|
|
|
+ // Remove empty row after merging.
|
|
|
|
|
+ if ( !removedTableCellRow.childCount ) {
|
|
|
|
|
+ removeEmptyRow( removedTableCellRow, writer );
|
|
|
|
|
+ }
|
|
|
} );
|
|
} );
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -195,3 +205,23 @@ function getVerticalCell( tableCell, direction ) {
|
|
|
|
|
|
|
|
return cellToMergeData && cellToMergeData.cell;
|
|
return cellToMergeData && cellToMergeData.cell;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// Properly removes empty row from a table. Will update `rowspan` attribute of cells that overlaps removed row.
|
|
|
|
|
+//
|
|
|
|
|
+// @param {module:engine/model/element~Element} removedTableCellRow
|
|
|
|
|
+// @param {module:engine/model/writer~Writer} writer
|
|
|
|
|
+function removeEmptyRow( removedTableCellRow, writer ) {
|
|
|
|
|
+ const table = removedTableCellRow.parent;
|
|
|
|
|
+
|
|
|
|
|
+ const removedRowIndex = table.getChildIndex( removedTableCellRow );
|
|
|
|
|
+
|
|
|
|
|
+ for ( const { cell, row, rowspan } of new TableWalker( table, { endRow: removedRowIndex } ) ) {
|
|
|
|
|
+ const overlapsRemovedRow = row + rowspan - 1 >= removedRowIndex;
|
|
|
|
|
+
|
|
|
|
|
+ if ( overlapsRemovedRow ) {
|
|
|
|
|
+ updateNumericAttribute( 'rowspan', rowspan - 1, cell, writer );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ writer.remove( removedTableCellRow );
|
|
|
|
|
+}
|