diff --git a/packages/ckeditor5-table/src/commands/insertcolumncommand.js b/packages/ckeditor5-table/src/commands/insertcolumncommand.js index 3690c6c1fae..ab27c7cdbb8 100644 --- a/packages/ckeditor5-table/src/commands/insertcolumncommand.js +++ b/packages/ckeditor5-table/src/commands/insertcolumncommand.js @@ -9,6 +9,7 @@ import Command from '@ckeditor/ckeditor5-core/src/command'; import { findAncestor } from './utils'; +import { getColumnIndexes, getSelectionAffectedTableCells } from '../utils'; /** * The insert column command. @@ -72,13 +73,11 @@ export default class InsertColumnCommand extends Command { const tableUtils = editor.plugins.get( 'TableUtils' ); const insertBefore = this.order === 'left'; - const referencePosition = insertBefore ? selection.getFirstPosition() : selection.getLastPosition(); - const referenceRange = insertBefore ? selection.getFirstRange() : selection.getLastRange(); + const affectedTableCells = getSelectionAffectedTableCells( selection ); + const columnIndexes = getColumnIndexes( affectedTableCells ); - const tableCell = referenceRange.getContainedElement() || findAncestor( 'tableCell', referencePosition ); - const table = tableCell.parent.parent; - - const { column } = tableUtils.getCellLocation( tableCell ); + const column = insertBefore ? columnIndexes.first : columnIndexes.last; + const table = findAncestor( 'table', affectedTableCells[ 0 ] ); tableUtils.insertColumns( table, { columns: 1, at: insertBefore ? column : column + 1 } ); } diff --git a/packages/ckeditor5-table/src/commands/insertrowcommand.js b/packages/ckeditor5-table/src/commands/insertrowcommand.js index ebdd839c827..623ece4da5f 100644 --- a/packages/ckeditor5-table/src/commands/insertrowcommand.js +++ b/packages/ckeditor5-table/src/commands/insertrowcommand.js @@ -9,6 +9,7 @@ import Command from '@ckeditor/ckeditor5-core/src/command'; import { findAncestor } from './utils'; +import { getRowIndexes, getSelectionAffectedTableCells } from '../utils'; /** * The insert row command. @@ -71,15 +72,12 @@ export default class InsertRowCommand extends Command { const tableUtils = editor.plugins.get( 'TableUtils' ); const insertAbove = this.order === 'above'; - const referencePosition = insertAbove ? selection.getFirstPosition() : selection.getLastPosition(); - const referenceRange = insertAbove ? selection.getFirstRange() : selection.getLastRange(); + const affectedTableCells = getSelectionAffectedTableCells( selection ); + const rowIndexes = getRowIndexes( affectedTableCells ); - const tableCell = referenceRange.getContainedElement() || findAncestor( 'tableCell', referencePosition ); - const tableRow = tableCell.parent; - const table = tableRow.parent; + const row = insertAbove ? rowIndexes.first : rowIndexes.last; + const table = findAncestor( 'table', affectedTableCells[ 0 ] ); - const row = table.getChildIndex( tableRow ); - - tableUtils.insertRows( table, { rows: 1, at: this.order === 'below' ? row + 1 : row } ); + tableUtils.insertRows( table, { rows: 1, at: insertAbove ? row : row + 1 } ); } } diff --git a/packages/ckeditor5-table/tests/commands/insertcolumncommand.js b/packages/ckeditor5-table/tests/commands/insertcolumncommand.js index 717828b22ad..179dd8f767b 100644 --- a/packages/ckeditor5-table/tests/commands/insertcolumncommand.js +++ b/packages/ckeditor5-table/tests/commands/insertcolumncommand.js @@ -4,6 +4,7 @@ */ import ModelTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/modeltesteditor'; +import HorizontalLineEditing from '@ckeditor/ckeditor5-horizontal-line/src/horizontallineediting'; import { getData, setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model'; import InsertColumnCommand from '../../src/commands/insertcolumncommand'; @@ -18,7 +19,7 @@ describe( 'InsertColumnCommand', () => { beforeEach( () => { return ModelTestEditor .create( { - plugins: [ TableUtils, TableSelection ] + plugins: [ TableUtils, TableSelection, HorizontalLineEditing ] } ) .then( newEditor => { editor = newEditor; @@ -181,6 +182,22 @@ describe( 'InsertColumnCommand', () => { [ { colspan: 5, contents: '31' }, { colspan: 2, contents: '34' } ] ], { headingColumns: 5 } ) ); } ); + + it( 'should insert a column when a widget in the table cell is selected', () => { + setData( model, modelTable( [ + [ '11', '12' ], + [ '21', '22' ], + [ '31', '[]' ] + ] ) ); + + command.execute(); + + assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [ + [ '11', '12', '' ], + [ '21', '22', '' ], + [ '31', '', '' ] + ] ) ); + } ); } ); } ); diff --git a/packages/ckeditor5-table/tests/commands/insertrowcommand.js b/packages/ckeditor5-table/tests/commands/insertrowcommand.js index 1f20ff4b920..721ed9e461f 100644 --- a/packages/ckeditor5-table/tests/commands/insertrowcommand.js +++ b/packages/ckeditor5-table/tests/commands/insertrowcommand.js @@ -4,6 +4,7 @@ */ import ModelTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/modeltesteditor'; +import HorizontalLineEditing from '@ckeditor/ckeditor5-horizontal-line/src/horizontallineediting'; import { getData, setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model'; import InsertRowCommand from '../../src/commands/insertrowcommand'; @@ -18,7 +19,7 @@ describe( 'InsertRowCommand', () => { beforeEach( () => { return ModelTestEditor .create( { - plugins: [ TableUtils, TableSelection ] + plugins: [ TableUtils, TableSelection, HorizontalLineEditing ] } ) .then( newEditor => { editor = newEditor; @@ -214,6 +215,23 @@ describe( 'InsertRowCommand', () => { [ 0, 0 ] ] ); } ); + + it( 'should insert a row when a widget in the table cell is selected', () => { + setData( model, modelTable( [ + [ '11', '12' ], + [ '21', '22' ], + [ '31', '[]' ] + ] ) ); + + command.execute(); + + assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [ + [ '11', '12' ], + [ '21', '22' ], + [ '31', '' ], + [ '', '' ] + ] ) ); + } ); } ); } );