'use strict'; describe('AutoRowSize', function () { var id = 'testContainer'; beforeEach(function () { this.$container = $('
').appendTo('body'); }); afterEach(function () { if (this.$container) { destroy(); this.$container.remove(); } }); function arrayOfObjects() { return [{ id: 'Short' }, { id: 'Somewhat\nlong' }, { id: 'The\nvery\nvery\nvery\nlongest one' }]; } function arrayOfObjects2() { return [{ id: 'Short', name: 'Somewhat long' }, { id: 'Somewhat long', name: 'The very very longest one' }, { id: 'The very very very longest one', name: 'Short' }]; } it('should apply auto size by default', function () { handsontable({ data: arrayOfObjects() }); var height0 = rowHeight(this.$container, 0); var height1 = rowHeight(this.$container, 1); var height2 = rowHeight(this.$container, 2); expect(height0).toBeLessThan(height1); expect(height1).toBeLessThan(height2); }); it('should draw scrollbar correctly (proper height) after calculation when autoRowSize option is set (long text in row) #4000', function (done) { var row = ['This is very long text which will break this cell text into two lines']; var data = []; var nrOfRows = 200; var columnWidth = 100; for (var i = 0; i < nrOfRows; i += 1) { data.push(row); } handsontable({ data: data, colWidths: function colWidths() { return columnWidth; }, autoRowSize: true }); var oldHeight = spec().$container[0].scrollHeight; setTimeout(function () { var newHeight = spec().$container[0].scrollHeight; expect(oldHeight).toBeLessThan(newHeight); done(); }, 200); }); describe('should draw scrollbar correctly (proper height) after calculation when autoRowSize option is set (`table td` element height set by CSS) #4000', function () { var cellHeightInPx = 100; var nrOfRows = null; var nrOfColumns = 200, style; var SYNC_CALCULATION_LIMIT = Handsontable.plugins.AutoRowSize.SYNC_CALCULATION_LIMIT; var CALCULATION_STEP = Handsontable.plugins.AutoRowSize.CALCULATION_STEP; beforeEach(function () { if (!this.$container) { this.$container = $('').appendTo('body'); } var css = '.handsontable table td { height: ' + cellHeightInPx + 'px !important }', head = document.head; style = document.createElement('style'); style.type = 'text/css'; if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } $(head).append(style); }); afterEach(function () { if (this.$container) { destroy(); this.$container.remove(); } if (style) { $(style).remove(); } }); it('(SYNC_CALCULATION_LIMIT - 1 rows)', function (done) { nrOfRows = SYNC_CALCULATION_LIMIT - 1; handsontable({ data: Handsontable.helper.createSpreadsheetData(nrOfRows, nrOfColumns), autoRowSize: true }); setTimeout(function () { var newHeight = spec().$container[0].scrollHeight; expect(newHeight).toEqual((cellHeightInPx + 1) * nrOfRows + 1); done(); }, 200); }); it('(SYNC_CALCULATION_LIMIT + 1 rows)', function (done) { nrOfRows = SYNC_CALCULATION_LIMIT + 1; handsontable({ data: Handsontable.helper.createSpreadsheetData(nrOfRows, nrOfColumns), autoRowSize: true }); setTimeout(function () { var newHeight = spec().$container[0].scrollHeight; expect(newHeight).toEqual((cellHeightInPx + 1) * nrOfRows + 1); done(); }, 200); }); it('(SYNC_CALCULATION_LIMIT + CALCULATION_STEP - 1 rows)', function (done) { nrOfRows = SYNC_CALCULATION_LIMIT + CALCULATION_STEP - 1; handsontable({ data: Handsontable.helper.createSpreadsheetData(nrOfRows, nrOfColumns), autoRowSize: true }); setTimeout(function () { var newHeight = spec().$container[0].scrollHeight; expect(newHeight).toEqual((cellHeightInPx + 1) * nrOfRows + 1); done(); }, 200); }); it('(SYNC_CALCULATION_LIMIT + CALCULATION_STEP + 1 rows)', function (done) { nrOfRows = SYNC_CALCULATION_LIMIT + CALCULATION_STEP + 1; handsontable({ data: Handsontable.helper.createSpreadsheetData(nrOfRows, nrOfColumns), autoRowSize: true }); setTimeout(function () { var newHeight = spec().$container[0].scrollHeight; expect(newHeight).toEqual((cellHeightInPx + 1) * nrOfRows + 1); done(); }, 200); }); }); it('should correctly detect row height when table is hidden on init (display: none)', function (done) { this.$container.css('display', 'none'); var hot = handsontable({ data: arrayOfObjects(), rowHeaders: true, autoRowSize: true }); setTimeout(function () { spec().$container.css('display', 'block'); hot.render(); expect(rowHeight(spec().$container, 0)).toBe(24); expect(rowHeight(spec().$container, 1)).toBe(43); expect([106, 127]).toEqual(jasmine.arrayContaining([rowHeight(spec().$container, 2)])); done(); }, 200); }); it('should be possible to disable plugin using updateSettings', function () { var hot = handsontable({ data: arrayOfObjects() }); var height0 = rowHeight(this.$container, 0); var height1 = rowHeight(this.$container, 1); var height2 = rowHeight(this.$container, 2); expect(height0).toBeLessThan(height1); expect(height1).toBeLessThan(height2); updateSettings({ autoRowSize: false }); hot.setDataAtCell(0, 0, 'A\nB\nC'); var height4 = rowHeight(this.$container, 0); expect(height4).toBeGreaterThan(height0); }); it('should be possible to enable plugin using updateSettings', function () { handsontable({ data: arrayOfObjects(), autoRowSize: false }); var height0 = parseInt(getCell(0, 0).style.height, 10); var height1 = parseInt(getCell(1, 0).style.height, 10); var height2 = parseInt(getCell(2, 0).style.height, 10); expect(height0).toEqual(height1); expect(height0).toEqual(height2); expect(height1).toEqual(height2); updateSettings({ autoRowSize: true }); height0 = parseInt(getCell(0, 0).style.height, 10); height1 = parseInt(getCell(1, 0).style.height, 10); height2 = parseInt(getCell(2, 0).style.height, 10); expect(height0).toBeLessThan(height1); expect(height1).toBeLessThan(height2); }); it('should consider CSS style of each instance separately', function () { var $style = $('').appendTo('head'); var $container1 = $('').appendTo('body').handsontable({ data: arrayOfObjects(), autoRowSize: true }); var $container2 = $('').appendTo('body').handsontable({ data: arrayOfObjects(), autoRowSize: true }); var hot1 = $container1.handsontable('getInstance'); var hot2 = $container2.handsontable('getInstance'); expect(parseInt(hot1.getCell(0, 0).style.height, 10)).toEqual(parseInt(hot2.getCell(0, 0).style.height, 10)); $container1.addClass('big'); hot1.render(); hot2.render(); expect(parseInt(hot1.getCell(2, 0).style.height, 10)).toBeGreaterThan(parseInt(hot2.getCell(2, 0).style.height, 10)); $container1.removeClass('big'); hot1.render(); $container2.addClass('big'); hot2.render(); expect(parseInt(hot1.getCell(2, 0).style.height, 10)).toBeLessThan(parseInt(hot2.getCell(2, 0).style.height, 10)); $style.remove(); $container1.handsontable('destroy'); $container1.remove(); $container2.handsontable('destroy'); $container2.remove(); }); it('should consider CSS class of the