UNPKG

@quantlab/handsontable

Version:

Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs

1,470 lines (1,138 loc) 87.5 kB
describe('UndoRedo', () => { var id = 'testContainer'; beforeEach(function() { this.$container = $(`<div id="${id}"></div>`).appendTo('body'); }); afterEach(function() { if (this.$container) { destroy(); this.$container.remove(); } }); describe('core features', () => { describe('Array data', () => { describe('undo', () => { it('should undo single change', () => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); var HOT = getInstance(); setDataAtCell(0, 0, 'X1'); expect(getDataAtCell(0, 0)).toBe('X1'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('A1'); }); it('should undo single change on cell with validator', (done) => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), }); var HOT = getInstance(); setDataAtCell(0, 0, 'X1'); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); HOT.undo(); }, 200); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('A1'); done(); }, 400); }); it('should undo creation of a single row', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row'); expect(countRows()).toEqual(3); HOT.undo(); expect(countRows()).toEqual(2); }); it('should undo creation of multiple rows', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row', 0, 5); expect(countRows()).toEqual(7); HOT.undo(); expect(countRows()).toEqual(2); }); it('should undo creation of multiple rows with minSpareRows', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 1), minSpareRows: 2 }); expect(getData()).toEqual([['A1'], ['A2'], [null], [null]]); setDataAtCell(2, 0, 'A3'); setDataAtCell(4, 0, 'A4'); expect(getData()).toEqual([['A1'], ['A2'], ['A3'], [null], ['A4'], [null], [null]]); HOT.undo(); HOT.undo(); expect(getData()).toEqual([['A1'], ['A2'], [null], [null]]); }); it('should undo removal of single row', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(3, 2) }); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); alter('remove_row', 1); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A3'); expect(getDataAtCell(1, 1)).toEqual('B3'); HOT.undo(); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); }); it('should undo removal of multiple rows', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(4, 2) }); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); alter('remove_row', 1, 2); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A4'); expect(getDataAtCell(1, 1)).toEqual('B4'); HOT.undo(); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); }); it('should undo creation of a single column (colHeaders: undefined)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 3) }); expect(countCols()).toEqual(3); alter('insert_col'); expect(countCols()).toEqual(4); HOT.undo(); expect(countCols()).toEqual(3); }); it('should undo creation of a single column (colHeaders: true)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 3), colHeaders: true }); expect(countCols()).toEqual(3); expect(getColHeader()).toEqual(['A', 'B', 'C']); alter('insert_col'); expect(countCols()).toEqual(4); expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']); HOT.undo(); expect(countCols()).toEqual(3); expect(getColHeader()).toEqual(['A', 'B', 'C']); }); it('should undo creation of a single column (colHeaders: Array)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 3), colHeaders: ['Header1', 'Header2', 'Header3'] }); expect(countCols()).toEqual(3); expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3']); alter('insert_col', 1); expect(countCols()).toEqual(4); expect(getColHeader()).toEqual(['Header1', 'B', 'Header2', 'Header3']); HOT.undo(); expect(countCols()).toEqual(3); expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3']); }); it('should undo creation of multiple columns (colHeaders: undefined)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countCols()).toEqual(2); alter('insert_col', 1, 5); expect(countCols()).toEqual(7); HOT.undo(); expect(countCols()).toEqual(2); }); it('should undo creation of multiple columns (colHeaders: true)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), colHeaders: true }); expect(countCols()).toEqual(2); expect(getColHeader()).toEqual(['A', 'B']); alter('insert_col', 1, 5); expect(countCols()).toEqual(7); expect(getColHeader()).toEqual(['A', 'B', 'C', 'D', 'E', 'F', 'G']); HOT.undo(); expect(countCols()).toEqual(2); expect(getColHeader()).toEqual(['A', 'B']); }); it('should undo creation of multiple columns (colHeaders: Array)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), colHeaders: ['Header1', 'Header2'] }); expect(countCols()).toEqual(2); expect(getColHeader()).toEqual(['Header1', 'Header2']); alter('insert_col', 1, 5); expect(countCols()).toEqual(7); expect(getColHeader()).toEqual(['Header1', 'B', 'C', 'D', 'E', 'F', 'Header2']); HOT.undo(); expect(countCols()).toEqual(2); expect(getColHeader()).toEqual(['Header1', 'Header2']); }); it('should undo creation of multiple columns with minSpareCols', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(1, 1), minSpareCols: 2 }); expect(getData()).toEqual([['A1', null, null]]); setDataAtCell(0, 1, 'B1'); setDataAtCell(0, 3, 'C1'); expect(getData()).toEqual([['A1', 'B1', null, 'C1', null, null]]); HOT.undo(); HOT.undo(); expect(getData()).toEqual([['A1', null, null]]); }); it('should undo removal of single column (colHeaders: undefined)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 3) }); expect(countCols()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); alter('remove_col', 1); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('C1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('C2'); HOT.undo(); expect(countCols()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); }); it('should undo removal of single column (colHeaders: true)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), colHeaders: true }); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getColHeader()).toEqual(['A', 'B']); alter('remove_col'); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); expect(getColHeader()).toEqual(['A']); HOT.undo(); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getColHeader()).toEqual(['A', 'B']); }); it('should undo removal of single column (colHeaders: Array)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), colHeaders: ['Header1', 'Header2'] }); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getColHeader()).toEqual(['Header1', 'Header2']); alter('remove_col'); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); expect(getColHeader()).toEqual(['Header1']); HOT.undo(); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getColHeader()).toEqual(['Header1', 'Header2']); }); it('should undo removal of multiple columns (colHeaders: undefined)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 4) }); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); alter('remove_col', 1, 2); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('D1'); expect(getDataAtCell(0, 2)).toBeNull(); expect(getDataAtCell(0, 3)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('D2'); expect(getDataAtCell(1, 2)).toBeNull(); expect(getDataAtCell(1, 3)).toBeNull(); HOT.undo(); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); }); it('should undo removal of multiple columns (colHeaders: true)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 4), colHeaders: true }); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']); alter('remove_col', 1, 3); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(0, 2)).toBeNull(); expect(getDataAtCell(0, 3)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); expect(getDataAtCell(1, 2)).toBeNull(); expect(getDataAtCell(1, 3)).toBeNull(); expect(getColHeader()).toEqual(['A']); HOT.undo(); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']); }); it('should undo removal of multiple columns (colHeaders: Array)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 4), colHeaders: ['Header1', 'Header2', 'Header3', 'Header4'] }); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3', 'Header4']); alter('remove_col', 1, 2); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('D1'); expect(getDataAtCell(0, 2)).toBeNull(); expect(getDataAtCell(0, 3)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('D2'); expect(getDataAtCell(1, 2)).toBeNull(); expect(getDataAtCell(1, 3)).toBeNull(); expect(getColHeader()).toEqual(['Header1', 'Header4']); HOT.undo(); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3', 'Header4']); }); it('should undo removal of multiple columns (with a used manualColumnMove)', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 7), manualColumnMove: [3, 2, 0, 6, 1, 5, 4] }); expect(countCols()).toEqual(7); expect(getDataAtRow(0)).toEqual(['D1', 'C1', 'A1', 'G1', 'B1', 'F1', 'E1']); alter('remove_col', 1, 3); expect(countCols()).toEqual(4); expect(getDataAtRow(0)).toEqual(['D1', 'B1', 'F1', 'E1']); // HOT.undo(); // // expect(countCols()).toEqual(7); // expect(getDataAtRow(0)).toEqual(['D1', 'C1', 'A1', 'G1', 'B1', 'F1', 'E1']); }); it('should undo multiple changes', () => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); var HOT = getInstance(); setDataAtCell(0, 0, 'X1'); setDataAtCell(1, 0, 'X2'); setDataAtCell(0, 1, 'Y1'); setDataAtCell(1, 1, 'Y2'); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); }); it('should undo multiple changes in cells with validators', (done) => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), }); var HOT = getInstance(); setDataAtCell(0, 0, 'X1'); setDataAtCell(1, 0, 'X2'); setDataAtCell(0, 1, 'Y1'); setDataAtCell(1, 1, 'Y2'); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.undo(); }, 200); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); }, 400); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); }, 600); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); }, 800); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.undo(); }, 1000); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); done(); }, 1200); }); it('should undo multiple row creations', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row'); alter('insert_row'); alter('insert_row'); alter('insert_row'); expect(countRows()).toEqual(6); HOT.undo(); expect(countRows()).toEqual(5); HOT.undo(); expect(countRows()).toEqual(4); HOT.undo(); expect(countRows()).toEqual(3); HOT.undo(); expect(countRows()).toEqual(2); HOT.undo(); expect(countRows()).toEqual(2); }); it('should undo multiple row removals', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(4, 2) }); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); alter('remove_row'); alter('remove_row'); alter('remove_row'); expect(countRows()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); HOT.undo(); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); HOT.undo(); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); HOT.undo(); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); HOT.undo(); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); }); it('should undo changes only for table where the change actually took place', function() { this.$container2 = $(`<div id="${id}-2"></div>`).appendTo('body'); var hot1 = handsontable({ data: [ [1], [2], [3] ] }); this.$container2.handsontable({ data: [ ['A'], ['B'], ['C'] ] }); var hot2 = this.$container2.handsontable('getInstance'); hot1.setDataAtCell(0, 0, 4); expect(hot1.getDataAtCell(0, 0)).toEqual(4); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); hot2.undo(); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); expect(hot1.getDataAtCell(0, 0)).toEqual(4); hot1.undo(); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); expect(hot1.getDataAtCell(0, 0)).toEqual(1); hot2.destroy(); this.$container2.remove(); }); }); describe('redo', () => { it('should redo single change', () => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); var HOT = getInstance(); setDataAtCell(0, 0, 'new value'); expect(getDataAtCell(0, 0)).toBe('new value'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('A1'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('new value'); }); it('should redo single change in cell with validator', (done) => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), }); var HOT = getInstance(); setDataAtCell(0, 0, 'new value'); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('new value'); HOT.undo(); }, 200); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('A1'); HOT.redo(); }, 400); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('new value'); done(); }, 600); }); it('should redo creation of a single row', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row'); expect(countRows()).toEqual(3); HOT.undo(); expect(countRows()).toEqual(2); HOT.redo(); expect(countRows()).toEqual(3); }); it('should redo creation of multiple rows', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row', 0, 5); expect(countRows()).toEqual(7); HOT.undo(); expect(countRows()).toEqual(2); HOT.redo(); expect(countRows()).toEqual(7); }); it('should redo removal of single row', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(3, 2) }); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); alter('remove_row', 1); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A3'); expect(getDataAtCell(1, 1)).toEqual('B3'); HOT.undo(); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); HOT.redo(); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A3'); expect(getDataAtCell(1, 1)).toEqual('B3'); }); it('should redo removal of multiple rows', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(4, 2) }); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); alter('remove_row', 1, 2); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A4'); expect(getDataAtCell(1, 1)).toEqual('B4'); HOT.undo(); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); HOT.redo(); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A4'); expect(getDataAtCell(1, 1)).toEqual('B4'); }); it('should redo creation of a single column', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countCols()).toEqual(2); alter('insert_col'); expect(countCols()).toEqual(3); HOT.undo(); expect(countCols()).toEqual(2); HOT.redo(); expect(countCols()).toEqual(3); }); it('should redo creation of multiple columns', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countCols()).toEqual(2); alter('insert_col', 1, 5); expect(countCols()).toEqual(7); HOT.undo(); expect(countCols()).toEqual(2); HOT.redo(); expect(countCols()).toEqual(7); }); it('should redo removal of single column', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); alter('remove_col'); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); HOT.undo(); expect(countCols()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); HOT.redo(); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); }); it('should redo removal of multiple columns', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 4) }); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); alter('remove_col', 1, 3); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(0, 2)).toBeNull(); expect(getDataAtCell(0, 3)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); expect(getDataAtCell(1, 2)).toBeNull(); expect(getDataAtCell(1, 3)).toBeNull(); HOT.undo(); expect(countCols()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(0, 2)).toEqual('C1'); expect(getDataAtCell(0, 3)).toEqual('D1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(1, 2)).toEqual('C2'); expect(getDataAtCell(1, 3)).toEqual('D2'); HOT.redo(); expect(countCols()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toBeNull(); expect(getDataAtCell(0, 2)).toBeNull(); expect(getDataAtCell(0, 3)).toBeNull(); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toBeNull(); expect(getDataAtCell(1, 2)).toBeNull(); expect(getDataAtCell(1, 3)).toBeNull(); }); it('should redo multiple changes', () => { handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); var HOT = getInstance(); setDataAtCell(0, 0, 'X1'); setDataAtCell(1, 0, 'X2'); setDataAtCell(0, 1, 'Y1'); setDataAtCell(1, 1, 'Y2'); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.undo(); HOT.undo(); HOT.undo(); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.redo(); expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); }); it('should redo multiple changes in cell with validator', (done) => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2), }); setDataAtCell(0, 0, 'X1'); setDataAtCell(1, 0, 'X2'); setDataAtCell(0, 1, 'Y1'); setDataAtCell(1, 1, 'Y2'); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.undo(); }, 200); setTimeout(() => { HOT.undo(); }, 400); setTimeout(() => { HOT.undo(); }, 600); setTimeout(() => { HOT.undo(); }, 800); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('A1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); }, 1000); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('A2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); }, 1200); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('B1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); }, 1400); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('B2'); HOT.redo(); }, 1600); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); HOT.redo(); }, 1800); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('X1'); expect(getDataAtCell(1, 0)).toBe('X2'); expect(getDataAtCell(0, 1)).toBe('Y1'); expect(getDataAtCell(1, 1)).toBe('Y2'); done(); }, 2000); }); it('should redo multiple row creations', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(2, 2) }); expect(countRows()).toEqual(2); alter('insert_row'); alter('insert_row'); alter('insert_row'); alter('insert_row'); expect(countRows()).toEqual(6); HOT.undo(); HOT.undo(); HOT.undo(); HOT.undo(); expect(countRows()).toEqual(2); HOT.redo(); expect(countRows()).toEqual(3); HOT.redo(); expect(countRows()).toEqual(4); HOT.redo(); expect(countRows()).toEqual(5); HOT.redo(); expect(countRows()).toEqual(6); HOT.redo(); expect(countRows()).toEqual(6); }); it('should undo multiple row removals', () => { var HOT = handsontable({ data: Handsontable.helper.createSpreadsheetData(4, 2) }); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); alter('remove_row'); alter('remove_row'); alter('remove_row'); expect(countRows()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); HOT.undo(); HOT.undo(); HOT.undo(); expect(countRows()).toEqual(4); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); expect(getDataAtCell(3, 0)).toEqual('A4'); expect(getDataAtCell(3, 1)).toEqual('B4'); HOT.redo(); expect(countRows()).toEqual(3); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); expect(getDataAtCell(2, 0)).toEqual('A3'); expect(getDataAtCell(2, 1)).toEqual('B3'); HOT.redo(); expect(countRows()).toEqual(2); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); expect(getDataAtCell(1, 0)).toEqual('A2'); expect(getDataAtCell(1, 1)).toEqual('B2'); HOT.redo(); expect(countRows()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); HOT.redo(); expect(countRows()).toEqual(1); expect(getDataAtCell(0, 0)).toEqual('A1'); expect(getDataAtCell(0, 1)).toEqual('B1'); }); it('should redo changes only for table where the change actually took place', function() { this.$container2 = $(`<div id="${id}-2"></div>`).appendTo('body'); var hot1 = handsontable({ data: [ [1], [2], [3] ] }); this.$container2.handsontable({ data: [ ['A'], ['B'], ['C'] ] }); var hot2 = this.$container2.handsontable('getInstance'); hot1.setDataAtCell(0, 0, 4); expect(hot1.getDataAtCell(0, 0)).toEqual(4); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); hot1.undo(); expect(hot1.getDataAtCell(0, 0)).toEqual(1); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); hot2.redo(); expect(hot1.getDataAtCell(0, 0)).toEqual(1); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); hot1.redo(); expect(hot1.getDataAtCell(0, 0)).toEqual(4); expect(hot2.getDataAtCell(0, 0)).toEqual('A'); hot2.destroy(); this.$container2.remove(); }); }); }); describe('Object data', () => { function createObjectData() { return [ {name: 'Timothy', surname: 'Dalton'}, {name: 'Sean', surname: 'Connery'}, {name: 'Roger', surname: 'Moore'} ]; } describe('undo', () => { it('should undo single change', () => { handsontable({ data: createObjectData() }); var HOT = getInstance(); setDataAtRowProp(0, 0, 'Pearce'); expect(getDataAtRowProp(0, 0)).toBe('Pearce'); HOT.undo(); expect(getDataAtCell(0, 0)).toBe('Timothy'); }); it('should undo single change in cell with validator', (done) => { handsontable({ data: createObjectData(), }); var HOT = getInstance(); setDataAtRowProp(0, 0, 'Pearce'); setTimeout(() => { expect(getDataAtRowProp(0, 0)).toBe('Pearce'); HOT.undo(); }, 200); setTimeout(() => { expect(getDataAtCell(0, 0)).toBe('Timothy'); done(); }, 400); }); it('should undo creation of a single row', () => { var HOT = handsontable({ data: createObjectData().slice(0, 2) }); expect(countRows()).toEqual(2); alter('insert_row'); expect(countRows()).toEqual(3); HOT.undo(); expect(countRows()).toEqual(2); }); it('should undo creation of multiple rows', () => { var HOT = handsontable({ data: createObjectData().slice(0, 2) }); expect(countRows()).toEqual(2); alter('insert_row', 0, 5); expect(countRows()).toEqual(7); HOT.undo(); expect(countRows()).toEqual(2); }); it('should undo removal of single row', () => { var HOT = handsontable({ data: createObjectData().slice(0, 2) }); expect(countRows()).toEqual(2); expect(getDataAtRowProp(0, 'name')).toEqual('Timothy'); expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton'); expect(getDataAtRowProp(1, 'name')).toEqual('Sean'); expect(getDataAtRowProp(1, 'surname')).toEqual('Connery'); alter('remove_row'); expect(countRows()).toEqual(1); expect(getDataAtRowProp(0, 'name')).toEqual('Timothy'); expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton'); expect(getDataAtRowProp(1, 'name')).toBeNull(); expect(getDataAtRowProp(1, 'surname')).toBeNull(); HOT.undo(); expect(countRows()).toEqual(2); expect(getDataAtRowProp(0, 'name')).toEqual('Timothy'); expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton'); expect(getData