| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639 |
- /**
- * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
- import ModelTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/modeltesteditor';
- import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
- import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
- import { getData, setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
- import { assertEqualMarkup } from '@ckeditor/ckeditor5-utils/tests/_utils/utils';
- import TableEditing from '../src/tableediting';
- import { modelTable } from './_utils/utils';
- import TableUtils from '../src/tableutils';
- describe( 'TableUtils', () => {
- let editor, model, root, tableUtils;
- testUtils.createSinonSandbox();
- beforeEach( () => {
- return ModelTestEditor.create( {
- plugins: [ Paragraph, TableEditing, TableUtils ]
- } ).then( newEditor => {
- editor = newEditor;
- model = editor.model;
- root = model.document.getRoot( 'main' );
- tableUtils = editor.plugins.get( TableUtils );
- } );
- } );
- afterEach( () => {
- return editor.destroy();
- } );
- describe( '#pluginName', () => {
- it( 'should provide plugin name', () => {
- expect( TableUtils.pluginName ).to.equal( 'TableUtils' );
- } );
- } );
- describe( 'getCellLocation()', () => {
- it( 'should return proper table cell location', () => {
- setData( model, modelTable( [
- [ { rowspan: 2, colspan: 2, contents: '00[]' }, '02' ],
- [ '12' ]
- ] ) );
- expect( tableUtils.getCellLocation( root.getNodeByPath( [ 0, 0, 0 ] ) ) ).to.deep.equal( { row: 0, column: 0 } );
- expect( tableUtils.getCellLocation( root.getNodeByPath( [ 0, 0, 1 ] ) ) ).to.deep.equal( { row: 0, column: 2 } );
- expect( tableUtils.getCellLocation( root.getNodeByPath( [ 0, 1, 0 ] ) ) ).to.deep.equal( { row: 1, column: 2 } );
- } );
- } );
- describe( 'insertRows()', () => {
- it( 'should be decorated', () => {
- const spy = sinon.spy();
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.on( 'insertRows', spy );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12' ],
- [ '', '' ],
- [ '21', '22' ]
- ] ) );
- expect( spy.calledOnce ).to.be.true;
- } );
- it( 'should insert row in given table at given index', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12' ],
- [ '', '' ],
- [ '21', '22' ]
- ] ) );
- } );
- it( 'should insert row in given table at default index', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ) );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '', '' ],
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- } );
- it( 'should update table heading rows attribute when inserting row in headings section', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ],
- [ '31', '32' ]
- ], { headingRows: 2 } ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12' ],
- [ '', '' ],
- [ '21', '22' ],
- [ '31', '32' ]
- ], { headingRows: 3 } ) );
- } );
- it( 'should not update table heading rows attribute when inserting row after headings section', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ],
- [ '31', '32' ]
- ], { headingRows: 2 } ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ],
- [ '', '' ],
- [ '31', '32' ]
- ], { headingRows: 2 } ) );
- } );
- it( 'should expand rowspan of a cell that overlaps inserted rows', () => {
- // +----+----+----+----+
- // | 00 | 02 | 03 |
- // +----+----+----+----+ <-- heading rows
- // | 10 | 12 | 13 |
- // + +----+----+
- // | | 22 | 23 |
- // +----+----+----+----+
- // ^-- heading columns
- setData( model, modelTable( [
- [ { contents: '00', colspan: 2 }, '02', '03' ],
- [ { contents: '10[]', colspan: 2, rowspan: 2 }, '12', '13' ],
- [ '22', '23' ]
- ], { headingColumns: 3, headingRows: 1 } ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2, rows: 3 } );
- // +----+----+----+----+
- // | 00 | 02 | 03 |
- // +----+----+----+----+ <-- heading rows
- // | 10 | 12 | 13 |
- // + +----+----+
- // | | | |
- // + +----+----+
- // | | | |
- // + +----+----+
- // | | | |
- // + +----+----+
- // | | 22 | 23 |
- // +----+----+----+----+
- // ^-- heading columns
- assertEqualMarkup( getData( model ), modelTable( [
- [ { contents: '00', colspan: 2 }, '02', '03' ],
- [ { contents: '10[]', colspan: 2, rowspan: 5 }, '12', '13' ],
- [ '', '' ],
- [ '', '' ],
- [ '', '' ],
- [ '22', '23' ]
- ], { headingColumns: 3, headingRows: 1 } ) );
- } );
- it( 'should not expand rowspan of a cell that does not overlaps inserted rows', () => {
- // +----+----+----+
- // | 00 | 01 | 02 |
- // + +----+----+
- // | | 11 | 12 |
- // +----+----+----+ <-- heading rows
- // | 20 | 21 | 22 |
- // +----+----+----+
- setData( model, modelTable( [
- [ { contents: '00', rowspan: 2 }, '01', '02' ],
- [ '11[]', '12' ],
- [ '20', '21', '22' ]
- ], { headingRows: 2 } ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2, rows: 3 } );
- // +----+----+----+
- // | 00 | 01 | 02 |
- // + +----+----+
- // | | 11 | 12 |
- // +----+----+----+ <-- heading rows
- // | | | |
- // +----+----+----+
- // | | | |
- // +----+----+----+
- // | | | |
- // +----+----+----+
- // | 20 | 21 | 22 |
- // +----+----+----+
- assertEqualMarkup( getData( model ), modelTable( [
- [ { contents: '00', rowspan: 2 }, '01', '02' ],
- [ '11[]', '12' ],
- [ '', '', '' ],
- [ '', '', '' ],
- [ '', '', '' ],
- [ '20', '21', '22' ]
- ], { headingRows: 2 } ) );
- } );
- it( 'should properly calculate columns if next row has colspans', () => {
- // +----+----+----+
- // | 00 | 01 | 02 |
- // + +----+----+
- // | | 11 | 12 |
- // +----+----+----+ <-- heading rows
- // | 20 |
- // +----+----+----+
- setData( model, modelTable( [
- [ { contents: '00', rowspan: 2 }, '01', '02' ],
- [ '11[]', '12' ],
- [ { contents: '20', colspan: 3 } ]
- ], { headingRows: 2 } ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2, rows: 3 } );
- // +----+----+----+
- // | 00 | 01 | 02 |
- // + +----+----+
- // | | 11 | 12 |
- // +----+----+----+ <-- heading rows
- // | | | |
- // +----+----+----+
- // | | | |
- // +----+----+----+
- // | | | |
- // +----+----+----+
- // | 20 |
- // +----+----+----+
- assertEqualMarkup( getData( model ), modelTable( [
- [ { contents: '00', rowspan: 2 }, '01', '02' ],
- [ '11[]', '12' ],
- [ '', '', '' ],
- [ '', '', '' ],
- [ '', '', '' ],
- [ { contents: '20', colspan: 3 } ]
- ], { headingRows: 2 } ) );
- } );
- it( 'should insert rows at the end of a table', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2, rows: 3 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ],
- [ '', '' ],
- [ '', '' ],
- [ '', '' ]
- ] ) );
- } );
- describe( 'with copyStructureFrom enabled', () => {
- beforeEach( () => {
- // +----+----+----+----+----+----+
- // | 00 | 01 | 03 | 04 | 05 |
- // +----+ + +----+----+
- // | 10 | | | 14 |
- // +----+----+----+----+----+----+
- setData( model, modelTable( [
- [ '00', { contents: '01', colspan: 2, rowspan: 2 }, { contents: '03', rowspan: 2 }, '04', '05' ],
- [ '10', { contents: '14', colspan: 2 } ]
- ] ) );
- } );
- it( 'should copy structure from the first row', () => {
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 0, rows: 1, copyStructureFromAbove: false } );
- // +----+----+----+----+----+----+
- // | | | | | |
- // +----+----+----+----+----+----+
- // | 00 | 01 | 03 | 04 | 05 |
- // +----+ + +----+----+
- // | 10 | | | 14 |
- // +----+----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '', { contents: '', colspan: 2 }, '', '', '' ],
- [ '00', { contents: '01', colspan: 2, rowspan: 2 }, { contents: '03', rowspan: 2 }, '04', '05' ],
- [ '10', { contents: '14', colspan: 2 } ]
- ] ) );
- } );
- it( 'should copy structure from the first row and properly handle row-spanned cells', () => {
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 1, rows: 1, copyStructureFromAbove: true } );
- // +----+----+----+----+----+----+
- // | 00 | 01 | 03 | 04 | 05 |
- // +----+ + +----+----+
- // | | | | | |
- // +----+ + +----+----+
- // | 10 | | | 14 |
- // +----+----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', { contents: '01', colspan: 2, rowspan: 3 }, { contents: '03', rowspan: 3 }, '04', '05' ],
- [ '', '', '' ],
- [ '10', { contents: '14', colspan: 2 } ]
- ] ) );
- } );
- it( 'should copy structure from the last row', () => {
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 2, rows: 1, copyStructureFromAbove: true } );
- // +----+----+----+----+----+----+
- // | 00 | 01 | 03 | 04 | 05 |
- // +----+ + +----+----+
- // | 10 | | | 14 |
- // +----+----+----+----+----+----+
- // | | | | |
- // +----+----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', { contents: '01', colspan: 2, rowspan: 2 }, { contents: '03', rowspan: 2 }, '04', '05' ],
- [ '10', { contents: '14', colspan: 2 } ],
- [ '', { contents: '', colspan: 2 }, '', { contents: '', colspan: 2 } ]
- ] ) );
- } );
- it( 'should copy structure from the last row and properly handle row-spanned cells', () => {
- tableUtils.insertRows( root.getNodeByPath( [ 0 ] ), { at: 1, rows: 1, copyStructureFromAbove: false } );
- // +----+----+----+----+----+----+
- // | 00 | 01 | 03 | 04 | 05 |
- // +----+ + +----+----+
- // | | | | |
- // +----+ + +----+----+
- // | 10 | | | 14 |
- // +----+----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', { contents: '01', colspan: 2, rowspan: 3 }, { contents: '03', rowspan: 3 }, '04', '05' ],
- [ '', { contents: '', colspan: 2 } ],
- [ '10', { contents: '14', colspan: 2 } ]
- ] ) );
- } );
- } );
- } );
- describe( 'insertColumns()', () => {
- it( 'should be decorated', () => {
- const spy = sinon.spy();
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.on( 'insertColumns', spy );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '', '12' ],
- [ '21', '', '22' ]
- ] ) );
- expect( spy.calledOnce ).to.be.true;
- } );
- it( 'should insert column in given table at given index', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '', '12' ],
- [ '21', '', '22' ]
- ] ) );
- } );
- it( 'should insert column in given table with default values', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ) );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '', '11[]', '12' ],
- [ '', '21', '22' ]
- ] ) );
- } );
- it( 'should insert column in given table at default index', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ) );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '', '11[]', '12' ],
- [ '', '21', '22' ]
- ] ) );
- } );
- it( 'should insert columns at the end of a row', () => {
- setData( model, modelTable( [
- [ '00[]', '01' ],
- [ { colspan: 2, contents: '10' } ],
- [ '20', { rowspan: 2, contents: '21' } ],
- [ '30' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 2, columns: 2 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00[]', '01', '', '' ],
- [ { colspan: 2, contents: '10' }, '', '' ],
- [ '20', { rowspan: 2, contents: '21' }, '', '' ],
- [ '30', '', '' ]
- ] ) );
- } );
- it( 'should insert columns at the beginning of a row', () => {
- setData( model, modelTable( [
- [ '00[]', '01' ],
- [ { colspan: 2, contents: '10' } ],
- [ '20', { rowspan: 2, contents: '21' } ],
- [ { rowspan: 2, contents: '30' } ],
- [ '41' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 0, columns: 2 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '', '', '00[]', '01' ],
- [ '', '', { colspan: 2, contents: '10' } ],
- [ '', '', '20', { rowspan: 2, contents: '21' } ],
- [ '', '', { rowspan: 2, contents: '30' } ],
- [ '', '', '41' ]
- ] ) );
- } );
- it( 'should properly insert column at beginning of row-col-spanned cell', () => {
- setData( model, modelTable( [
- [ '11', '12', '13' ],
- [ '21', { colspan: 2, rowspan: 2, contents: '22[]' } ],
- [ '31' ],
- [ '41', '42', '43' ]
- ] ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11', '', '12', '13' ],
- [ '21', '', { colspan: 2, rowspan: 2, contents: '22[]' } ],
- [ '31', '' ],
- [ '41', '', '42', '43' ]
- ] ) );
- } );
- it( 'should update table heading columns attribute when inserting column in headings section', () => {
- setData( model, modelTable( [
- [ '11[]', '12' ],
- [ '21', '22' ],
- [ '31', '32' ]
- ], { headingColumns: 2 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '', '12' ],
- [ '21', '', '22' ],
- [ '31', '', '32' ]
- ], { headingColumns: 3 } ) );
- } );
- it( 'should not update table heading columns attribute when inserting column after headings section', () => {
- setData( model, modelTable( [
- [ '11[]', '12', '13' ],
- [ '21', '22', '23' ],
- [ '31', '32', '33' ]
- ], { headingColumns: 2 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 2 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '11[]', '12', '', '13' ],
- [ '21', '22', '', '23' ],
- [ '31', '32', '', '33' ]
- ], { headingColumns: 2 } ) );
- } );
- it( 'should expand spanned columns', () => {
- setData( model, modelTable( [
- [ '00[]', '01' ],
- [ { colspan: 2, contents: '10' } ],
- [ '20', '21' ]
- ], { headingColumns: 2 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00[]', '', '01' ],
- [ { colspan: 3, contents: '10' } ],
- [ '20', '', '21' ]
- ], { headingColumns: 3 } ) );
- } );
- it( 'should skip wide spanned columns', () => {
- // +----+----+----+----+----+----+
- // | 00 | 01 | 02 | 03 | 04 | 05 |
- // +----+----+----+----+----+----+
- // | 10 | 11 | 12 | 14 | 15 |
- // +----+----+----+----+----+----+
- // | 20 | 24 |
- // +----+----+----+----+----+----+
- // ^-- heading columns
- setData( model, modelTable( [
- [ '00', '01[]', '02', '03', '04', '05' ],
- [ '10', '11', { contents: '12', colspan: 2 }, '14', '15' ],
- [ { contents: '20', colspan: 4 }, { contents: '24', colspan: 2 } ]
- ], { headingColumns: 4 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 2, columns: 2 } );
- // +----+----+----+----+----+----+----+----+
- // | 00 | 01 | | | 02 | 03 | 04 | 05 |
- // +----+----+----+----+----+----+----+----+
- // | 10 | 11 | | | 12 | 14 | 15 |
- // +----+----+----+----+----+----+----+----+
- // | 20 | 24 |
- // +----+----+----+----+----+----+----+----+
- // ^-- heading columns
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01[]', '', '', '02', '03', '04', '05' ],
- [ '10', '11', '', '', { contents: '12', colspan: 2 }, '14', '15' ],
- [ { contents: '20', colspan: 6 }, { contents: '24', colspan: 2 } ]
- ], { headingColumns: 6 } ) );
- } );
- it( 'should skip row & column spanned cells', () => {
- // +----+----+----+
- // | 00 | 02 |
- // + +----+
- // | | 12 |
- // +----+----+----+
- // | 20 | 21 | 22 |
- // +----+----+----+
- setData( model, modelTable( [
- [ { colspan: 2, rowspan: 2, contents: '00[]' }, '02' ],
- [ '12' ],
- [ '20', '21', '22' ]
- ], { headingColumns: 2 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 2 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { colspan: 4, rowspan: 2, contents: '00[]' }, '02' ],
- [ '12' ],
- [ '20', '', '', '21', '22' ]
- ], { headingColumns: 4 } ) );
- } );
- it( 'should properly insert column while table has row-spanned cells', () => {
- setData( model, modelTable( [
- [ { rowspan: 4, contents: '00[]' }, { rowspan: 2, contents: '01' }, '02' ],
- [ '12' ],
- [ { rowspan: 2, contents: '21' }, '22' ],
- [ '32' ]
- ], { headingColumns: 2 } ) );
- tableUtils.insertColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 1 } );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { rowspan: 4, contents: '00[]' }, '', { rowspan: 2, contents: '01' }, '02' ],
- [ '', '12' ],
- [ '', { rowspan: 2, contents: '21' }, '22' ],
- [ '', '32' ]
- ], { headingColumns: 3 } ) );
- } );
- } );
- describe( 'splitCellVertically()', () => {
- it( 'should split table cell to given table cells number', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '[]11', '12' ],
- [ '20', { colspan: 2, contents: '21' } ],
- [ { colspan: 2, contents: '30' }, '32' ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 1 ] ), 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', { colspan: 3, contents: '01' }, '02' ],
- [ '10', '[]11', '', '', '12' ],
- [ '20', { colspan: 4, contents: '21' } ],
- [ { colspan: 4, contents: '30' }, '32' ]
- ] ) );
- } );
- it( 'should split table cell for two table cells as a default', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '[]11', '12' ],
- [ '20', { colspan: 2, contents: '21' } ],
- [ { colspan: 2, contents: '30' }, '32' ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 1 ] ) );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', { colspan: 2, contents: '01' }, '02' ],
- [ '10', '[]11', '', '12' ],
- [ '20', { colspan: 3, contents: '21' } ],
- [ { colspan: 3, contents: '30' }, '32' ]
- ] ) );
- } );
- it( 'should split table cell if split is equal to colspan', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', { colspan: 2, contents: '21[]' } ],
- [ { colspan: 2, contents: '30' }, '32' ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 2, 1 ] ), 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', '21[]', '' ],
- [ { colspan: 2, contents: '30' }, '32' ]
- ] ) );
- } );
- it( 'should properly split table cell if split is uneven', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ { colspan: 3, contents: '10[]' } ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02' ],
- [ { colspan: 2, contents: '10[]' }, '' ]
- ] ) );
- } );
- it( 'should properly set colspan of inserted cells', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03' ],
- [ { colspan: 4, contents: '10[]' } ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02', '03' ],
- [ { colspan: 2, contents: '10[]' }, { colspan: 2, contents: '' } ]
- ] ) );
- } );
- it( 'should keep rowspan attribute for newly inserted cells', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03', '04', '05' ],
- [ { colspan: 5, rowspan: 2, contents: '10[]' }, '15' ],
- [ '25' ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02', '03', '04', '05' ],
- [ { colspan: 3, rowspan: 2, contents: '10[]' }, { colspan: 2, rowspan: 2, contents: '' }, '15' ],
- [ '25' ]
- ] ) );
- } );
- it( 'should keep rowspan attribute of for newly inserted cells if number of cells is bigger then curren colspan', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ { colspan: 2, rowspan: 2, contents: '10[]' }, '12' ],
- [ '22' ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { colspan: 2, contents: '00' }, '01', '02' ],
- [ { rowspan: 2, contents: '10[]' }, { rowspan: 2, contents: '' }, { rowspan: 2, contents: '' }, '12' ],
- [ '22' ]
- ] ) );
- } );
- it( 'should properly break a cell if it has colspan and number of created cells is bigger then colspan', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03' ],
- [ { colspan: 4, contents: '10[]' } ]
- ] ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 6 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { colspan: 3, contents: '00' }, '01', '02', '03' ],
- [ '10[]', '', '', '', '', '' ]
- ] ) );
- } );
- it( 'should update heading columns is split cell is in heading section', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10[]', '11' ]
- ], { headingColumns: 1 } ) );
- tableUtils.splitCellVertically( root.getNodeByPath( [ 0, 1, 0 ] ), 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { colspan: 3, contents: '00' }, '01' ],
- [ '10[]', '', '', '11' ]
- ], { headingColumns: 3 } ) );
- } );
- } );
- describe( 'splitCellHorizontally()', () => {
- it( 'should split table cell to default table cells number', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '[]11', '12' ],
- [ '20', '21', '22' ]
- ] ) );
- tableUtils.splitCellHorizontally( root.getNodeByPath( [ 0, 1, 1 ] ) );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02' ],
- [ { rowspan: 2, contents: '10' }, '[]11', { rowspan: 2, contents: '12' } ],
- [ '' ],
- [ '20', '21', '22' ]
- ] ) );
- } );
- it( 'should split table cell to given table cells number', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '[]11', '12' ],
- [ '20', '21', '22' ]
- ] ) );
- tableUtils.splitCellHorizontally( root.getNodeByPath( [ 0, 1, 1 ] ), 4 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01', '02' ],
- [ { rowspan: 4, contents: '10' }, '[]11', { rowspan: 4, contents: '12' } ],
- [ '' ],
- [ '' ],
- [ '' ],
- [ '20', '21', '22' ]
- ] ) );
- } );
- it( 'should properly update row-spanned cells overlapping selected cell', () => {
- setData( model, modelTable( [
- [ { rowspan: 2, contents: '00' }, '01', { rowspan: 3, contents: '02' } ],
- [ '[]11' ],
- [ '20', '21' ]
- ] ) );
- tableUtils.splitCellHorizontally( root.getNodeByPath( [ 0, 1, 0 ] ), 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { rowspan: 4, contents: '00' }, '01', { rowspan: 5, contents: '02' } ],
- [ '[]11' ],
- [ '' ],
- [ '' ],
- [ '20', '21' ]
- ] ) );
- } );
- it( 'should split row-spanned cell', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, contents: '01[]' } ],
- [ '10' ],
- [ '20', '21' ]
- ] ) );
- const tableCell = root.getNodeByPath( [ 0, 0, 1 ] );
- tableUtils.splitCellHorizontally( tableCell, 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', '01[]' ],
- [ '10', '' ],
- [ '20', '21' ]
- ] ) );
- } );
- it( 'should copy colspan while splitting row-spanned cell', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, colspan: 2, contents: '01[]' } ],
- [ '10' ],
- [ '20', '21', '22' ]
- ] ) );
- const tableCell = root.getNodeByPath( [ 0, 0, 1 ] );
- tableUtils.splitCellHorizontally( tableCell, 2 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', { colspan: 2, contents: '01[]' } ],
- [ '10', { colspan: 2, contents: '' } ],
- [ '20', '21', '22' ]
- ] ) );
- } );
- it( 'should evenly distribute rowspan attribute', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 7, contents: '01[]' } ],
- [ '10' ],
- [ '20' ],
- [ '30' ],
- [ '40' ],
- [ '50' ],
- [ '60' ],
- [ '70', '71' ]
- ] ) );
- const tableCell = root.getNodeByPath( [ 0, 0, 1 ] );
- tableUtils.splitCellHorizontally( tableCell, 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00', { rowspan: 3, contents: '01[]' } ],
- [ '10' ],
- [ '20' ],
- [ '30', { rowspan: 2, contents: '' } ],
- [ '40' ],
- [ '50', { rowspan: 2, contents: '' } ],
- [ '60' ],
- [ '70', '71' ]
- ] ) );
- } );
- it( 'should split row-spanned cell and updated other cells rowspan when splitting to bigger number of cells', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, contents: '01[]' } ],
- [ '10' ],
- [ '20', '21' ]
- ] ) );
- const tableCell = root.getNodeByPath( [ 0, 0, 1 ] );
- tableUtils.splitCellHorizontally( tableCell, 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { rowspan: 2, contents: '00' }, '01[]' ],
- [ '' ],
- [ '10', '' ],
- [ '20', '21' ]
- ] ) );
- } );
- it( 'should split row-spanned & col-spanned cell', () => {
- setData( model, modelTable( [
- [ '00', { colspan: 2, contents: '01[]' } ],
- [ '10', '11', '12' ]
- ] ) );
- const tableCell = root.getNodeByPath( [ 0, 0, 1 ] );
- tableUtils.splitCellHorizontally( tableCell, 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ { rowspan: 3, contents: '00' }, { colspan: 2, contents: '01[]' } ],
- [ { colspan: 2, contents: '' } ],
- [ { colspan: 2, contents: '' } ],
- [ '10', '11', '12' ]
- ] ) );
- } );
- it( 'should split table cell from a heading section', () => {
- setData( model, modelTable( [
- [ '00[]', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ]
- ], { headingRows: 1 } ) );
- tableUtils.splitCellHorizontally( root.getNodeByPath( [ 0, 0, 0 ] ), 3 );
- assertEqualMarkup( getData( model ), modelTable( [
- [ '00[]', { rowspan: 3, contents: '01' }, { rowspan: 3, contents: '02' } ],
- [ '' ],
- [ '' ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ]
- ], { headingRows: 3 } ) );
- } );
- } );
- describe( 'getColumns()', () => {
- it( 'should return proper number of columns', () => {
- setData( model, modelTable( [
- [ '00', { colspan: 3, contents: '01' }, '04' ]
- ] ) );
- expect( tableUtils.getColumns( root.getNodeByPath( [ 0 ] ) ) ).to.equal( 5 );
- } );
- } );
- describe( 'getRows()', () => {
- it( 'should return proper number of columns for simple table', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ]
- ] ) );
- expect( tableUtils.getRows( root.getNodeByPath( [ 0 ] ) ) ).to.equal( 2 );
- } );
- it( 'should return proper number of columns for a table with header', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ]
- ], { headingRows: 1 } ) );
- expect( tableUtils.getRows( root.getNodeByPath( [ 0 ] ) ) ).to.equal( 2 );
- } );
- it( 'should return proper number of columns for rowspan table', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ { rowspan: 2, contents: '10' }, '11' ],
- [ '21' ]
- ] ) );
- expect( tableUtils.getRows( root.getNodeByPath( [ 0 ] ) ) ).to.equal( 3 );
- } );
- } );
- describe( 'removeRows()', () => {
- describe( 'single row', () => {
- it( 'should remove a given row from a table start', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '10', '11' ],
- [ '20', '21' ]
- ] ) );
- } );
- it( 'should remove last row', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01' ]
- ] ) );
- } );
- it( 'should change heading rows if removing a heading row', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ]
- ], { headingRows: 2 } ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01' ],
- [ '20', '21' ]
- ], { headingRows: 1 } ) );
- } );
- it( 'should change heading rows if removing a heading row (and cell below is row-spanned)', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', { contents: '11', rowspan: 2 } ],
- [ '20' ]
- ], { headingRows: 1 } ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '10', { contents: '11', rowspan: 2 } ],
- [ '20' ]
- ] ) );
- } );
- it( 'should decrease rowspan of table cells from previous rows', () => {
- // +----+----+----+----+----+
- // | 00 | 01 | 02 | 03 | 04 |
- // +----+ + + + +
- // | 10 | | | | |
- // +----+----+ + + +
- // | 20 | 21 | | | |
- // +----+----+----+ + +
- // | 30 | 31 | 32 | | |
- // +----+----+----+----+ +
- // | 40 | 41 | 42 | 43 | |
- // +----+----+----+----+----+
- // | 50 | 51 | 52 | 53 | 54 |
- // +----+----+----+----+----+
- setData( model, modelTable( [
- [ '00', { contents: '01', rowspan: 2 }, { contents: '02', rowspan: 3 }, { contents: '03', rowspan: 4 },
- { contents: '04', rowspan: 5 } ],
- [ '10' ],
- [ '20', '21' ],
- [ '30', '31', '32' ],
- [ '40', '41', '42', '43' ],
- [ '50', '51', '52', '53', '54' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1, rows: 1 } );
- // +----+----+----+----+----+
- // | 00 | 01 | 02 | 03 | 04 |
- // +----+----+ + + +
- // | 20 | 21 | | | |
- // +----+----+----+ + +
- // | 30 | 31 | 32 | | |
- // +----+----+----+----+ +
- // | 40 | 41 | 42 | 43 | |
- // +----+----+----+----+----+
- // | 50 | 51 | 52 | 53 | 54 |
- // +----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01', { contents: '02', rowspan: 2 }, { contents: '03', rowspan: 3 }, { contents: '04', rowspan: 4 } ],
- [ '20', '21' ],
- [ '30', '31', '32' ],
- [ '40', '41', '42', '43' ],
- [ '50', '51', '52', '53', '54' ]
- ] ) );
- } );
- it( 'should decrease rowspan of table cells from previous rows (row-spanned cells on different rows)', () => {
- setData( model, modelTable( [
- [ { rowspan: 4, contents: '00' }, { rowspan: 3, contents: '01' }, { rowspan: 2, contents: '02' }, '03', '04' ],
- [ { rowspan: 2, contents: '13' }, '14' ],
- [ '22', '24' ],
- [ '31', '32', '33', '34' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ { rowspan: 3, contents: '00' }, { rowspan: 2, contents: '01' }, { rowspan: 2, contents: '02' }, '03', '04' ],
- [ '13', '14' ],
- [ '31', '32', '33', '34' ]
- ] ) );
- } );
- it( 'should move row-spanned cells to a row below removing it\'s row', () => {
- setData( model, modelTable( [
- [ { rowspan: 3, contents: '00' }, { rowspan: 2, contents: '01' }, '02' ],
- [ '12' ],
- [ '21', '22' ],
- [ '30', '31', '32' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ { rowspan: 2, contents: '00' }, '01', '12' ],
- [ '21', '22' ],
- [ '30', '31', '32' ]
- ] ) );
- } );
- it( 'should move row-spanned cells to a row below removing it\'s row (other cell is overlapping removed row)', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 3, contents: '01' }, '02', '03', '04' ],
- [ '10', { rowspan: 2, contents: '12' }, '13', '14' ],
- [ '20', '23', '24' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', { rowspan: 2, contents: '01' }, '02', '03', '04' ],
- [ '20', '12', '23', '24' ]
- ] ) );
- } );
- } );
- describe( 'many rows', () => {
- it( 'should properly remove middle rows', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01' ],
- [ '30', '31' ]
- ] ) );
- } );
- it( 'should properly remove tailing rows', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 2, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01' ],
- [ '10', '11' ]
- ] ) );
- } );
- it( 'should properly remove beginning rows', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '20', '21' ],
- [ '30', '31' ]
- ] ) );
- } );
- it( 'should support removing multiple headings (removed rows in heading section)', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ]
- ], { headingRows: 3 } ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '20', '21' ],
- [ '30', '31' ]
- ], { headingRows: 1 } ) );
- } );
- it( 'should support removing multiple headings (removed rows in heading and body section)', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ],
- [ '40', '41' ]
- ], { headingRows: 3 } ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1, rows: 3 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01' ],
- [ '40', '41' ]
- ], { headingRows: 1 } ) );
- } );
- it( 'should support removing mixed heading and cell rows', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ]
- ], { headingRows: 1 } ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 0, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '20', '21' ]
- ] ) );
- } );
- it( 'should move row-spanned cells to a row after removed rows section', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03' ],
- [ { rowspan: 4, contents: '10' }, { rowspan: 3, contents: '11' }, { rowspan: 2, contents: '12' }, '13' ],
- [ { rowspan: 3, contents: '23' } ],
- [ '32' ],
- [ '41', '42' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '01', '02', '03' ],
- [ { rowspan: 2, contents: '10' }, '11', '32', { rowspan: 2, contents: '23' } ],
- [ '41', '42' ]
- ] ) );
- } );
- it( 'should decrease rowspan of table cells from rows before removed rows section', () => {
- setData( model, modelTable( [
- [ { rowspan: 4, contents: '00' }, { rowspan: 3, contents: '01' }, { rowspan: 2, contents: '02' }, '03' ],
- [ '13' ],
- [ '22', '23' ],
- [ '31', '32', '33' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 1, rows: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ { rowspan: 2, contents: '00' }, '01', '02', '03' ],
- [ '31', '32', '33' ]
- ] ) );
- } );
- it( 'should decrease rowspan of table cells from previous rows', () => {
- // +----+----+----+----+----+
- // | 00 | 01 | 02 | 03 | 04 |
- // +----+ + + + +
- // | 10 | | | | |
- // +----+----+ + + +
- // | 20 | 21 | | | |
- // +----+----+----+ + +
- // | 30 | 31 | 32 | | |
- // +----+----+----+----+ +
- // | 40 | 41 | 42 | 43 | |
- // +----+----+----+----+----+
- // | 50 | 51 | 52 | 53 | 54 |
- // +----+----+----+----+----+
- setData( model, modelTable( [
- [ '00', { contents: '01', rowspan: 2 }, { contents: '02', rowspan: 3 }, { contents: '03', rowspan: 4 },
- { contents: '04', rowspan: 5 } ],
- [ '10' ],
- [ '20', '21' ],
- [ '30', '31', '32' ],
- [ '40', '41', '42', '43' ],
- [ '50', '51', '52', '53', '54' ]
- ] ) );
- tableUtils.removeRows( root.getChild( 0 ), { at: 2, rows: 2 } );
- // +----+----+----+----+----+
- // | 00 | 01 | 02 | 03 | 04 |
- // +----+ + + + +
- // | 10 | | | | |
- // +----+----+----+----+ +
- // | 40 | 41 | 42 | 43 | |
- // +----+----+----+----+----+
- // | 50 | 51 | 52 | 53 | 54 |
- // +----+----+----+----+----+
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', { contents: '01', rowspan: 2 }, { contents: '02', rowspan: 2 }, { contents: '03', rowspan: 2 },
- { contents: '04', rowspan: 3 } ],
- [ '10' ],
- [ '40', '41', '42', '43' ],
- [ '50', '51', '52', '53', '54' ]
- ] ) );
- } );
- it( 'should re-use batch to create one undo step', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ],
- [ '30', '31' ]
- ], { headingRows: 3 } ) );
- const createdBatches = new Set();
- model.on( 'applyOperation', ( evt, args ) => {
- const operation = args[ 0 ];
- createdBatches.add( operation.batch );
- } );
- const batch = model.createBatch();
- tableUtils.removeRows( root.getChild( 0 ), { at: 0, rows: 2, batch } );
- expect( createdBatches.size ).to.equal( 1 );
- } );
- } );
- } );
- describe( 'removeColumns()', () => {
- describe( 'single row', () => {
- it( 'should remove a given column', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '02' ],
- [ '10', '12' ],
- [ '20', '22' ]
- ] ) );
- } );
- it( 'should remove a given column from a table start', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01' ],
- [ '11' ],
- [ '21' ]
- ] ) );
- } );
- it( 'should change heading columns if removing a heading column', () => {
- setData( model, modelTable( [
- [ '00', '01' ],
- [ '10', '11' ],
- [ '20', '21' ]
- ], { headingColumns: 2 } ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01' ],
- [ '11' ],
- [ '21' ]
- ], { headingColumns: 1 } ) );
- } );
- it( 'should decrease colspan of table cells from previous column', () => {
- setData( model, modelTable( [
- [ { colspan: 4, contents: '00' }, '04' ],
- [ { colspan: 3, contents: '10' }, '13', '14' ],
- [ { colspan: 2, contents: '20' }, '22', '23', '24' ],
- [ '30', { colspan: 2, contents: '31' }, '33', '34' ],
- [ '40', '41', '42', '43', '44' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ { colspan: 3, contents: '00' }, '04' ],
- [ { colspan: 2, contents: '10' }, '13', '14' ],
- [ { colspan: 2, contents: '20' }, '23', '24' ],
- [ '30', '31', '33', '34' ],
- [ '40', '41', '43', '44' ]
- ] ) );
- } );
- it( 'should decrease colspan of cells that are on removed column', () => {
- setData( model, modelTable( [
- [ { colspan: 3, contents: '00' }, '03' ],
- [ { colspan: 2, contents: '10' }, '12', '13' ],
- [ '20', '21', '22', '23' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ { colspan: 2, contents: '00' }, '03' ],
- [ '10', '12', '13' ],
- [ '21', '22', '23' ]
- ] ) );
- } );
- it( 'should remove column with rowspan (first column)', () => {
- setData( model, modelTable( [
- [ { rowspan: 2, contents: '00' }, '01' ],
- [ '11' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01' ],
- [ '11' ]
- ] ) );
- } );
- it( 'should remove column with rowspan (last column)', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, contents: '01' } ],
- [ '10' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00' ],
- [ '10' ]
- ] ) );
- } );
- it( 'should remove column if other column is row-spanned (last column)', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, contents: '01' } ],
- [ '10' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01' ]
- ] ) );
- } );
- it( 'should remove column if other column is row-spanned (first column)', () => {
- setData( model, modelTable( [
- [ { rowspan: 2, contents: '00' }, '01' ],
- [ '11' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00' ]
- ] ) );
- } );
- it( 'should remove column if removing row with one column - other columns are spanned', () => {
- setData( model, modelTable( [
- [ '00', { rowspan: 2, contents: '01' }, { rowspan: 2, contents: '02' } ],
- [ '10' ],
- [ '20', '21', '22' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01', '02' ],
- [ '21', '22' ]
- ] ) );
- } );
- it( 'should remove the column properly when multiple rows should be removed (because of to row-spans)', () => {
- setData( model, modelTable( [
- [ '00', { contents: '01', rowspan: 3 }, { contents: '02', rowspan: 3 } ],
- [ '10' ],
- [ '20' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '01', '02' ]
- ] ) );
- } );
- } );
- describe( 'multiple columns', () => {
- it( 'should properly remove two first columns', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ],
- [ '30', '31', '32' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0, columns: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '02' ],
- [ '12' ],
- [ '22' ],
- [ '32' ]
- ] ) );
- } );
- it( 'should properly remove two middle columns', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03' ],
- [ '10', '11', '12', '13' ],
- [ '20', '21', '22', '23' ],
- [ '30', '31', '32', '33' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '03' ],
- [ '10', '13' ],
- [ '20', '23' ],
- [ '30', '33' ]
- ] ) );
- } );
- it( 'should properly remove two last columns', () => {
- setData( model, modelTable( [
- [ '00', '01', '02' ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ],
- [ '30', '31', '32' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00' ],
- [ '10' ],
- [ '20' ],
- [ '30' ]
- ] ) );
- } );
- it( 'should properly remove multiple heading columns', () => {
- setData( model, modelTable( [
- [ '00', '01', '02', '03', '04' ],
- [ '10', '11', '12', '13', '14' ]
- ], { headingColumns: 3 } ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 1, columns: 3 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00', '04' ],
- [ '10', '14' ]
- ], { headingColumns: 1 } ) );
- } );
- it( 'should properly calculate truncated colspans', () => {
- setData( model, modelTable( [
- [ { contents: '00', colspan: 3 } ],
- [ '10', '11', '12' ],
- [ '20', '21', '22' ]
- ] ) );
- tableUtils.removeColumns( root.getNodeByPath( [ 0 ] ), { at: 0, columns: 2 } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '00' ],
- [ '12' ],
- [ '22' ]
- ] ) );
- } );
- } );
- } );
- describe( 'createTable()', () => {
- it( 'should create table', () => {
- setData( model, '[]' );
- model.change( writer => {
- const table = tableUtils.createTable( writer, { rows: 3, columns: 2 } );
- model.insertContent( table, model.document.selection.focus );
- } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '', '' ],
- [ '', '' ],
- [ '', '' ]
- ] ) );
- } );
- it( 'should create table with heading rows', () => {
- setData( model, '[]' );
- model.change( writer => {
- const table = tableUtils.createTable( writer, { rows: 3, columns: 2, headingRows: 1 } );
- model.insertContent( table, model.document.selection.focus );
- } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '', '' ],
- [ '', '' ],
- [ '', '' ]
- ], { headingRows: 1 } ) );
- } );
- it( 'should create table with heading columns', () => {
- setData( model, '[]' );
- model.change( writer => {
- const table = tableUtils.createTable( writer, { rows: 3, columns: 2, headingColumns: 1 } );
- model.insertContent( table, model.document.selection.focus );
- } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '', '' ],
- [ '', '' ],
- [ '', '' ]
- ], { headingColumns: 1 } ) );
- } );
- it( 'should create table with heading rows and columns', () => {
- setData( model, '[]' );
- model.change( writer => {
- const table = tableUtils.createTable( writer, { rows: 3, columns: 2, headingRows: 2, headingColumns: 1 } );
- model.insertContent( table, model.document.selection.focus );
- } );
- assertEqualMarkup( getData( model, { withoutSelection: true } ), modelTable( [
- [ '', '' ],
- [ '', '' ],
- [ '', '' ]
- ], { headingRows: 2, headingColumns: 1 } ) );
- } );
- } );
- } );
|