canMergeRange.e2e.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. 'use strict';
  2. describe('MergeCells', function () {
  3. var id = 'testContainer';
  4. beforeEach(function () {
  5. this.$container = $('<div id="' + id + '"></div>').appendTo('body');
  6. });
  7. afterEach(function () {
  8. if (this.$container) {
  9. destroy();
  10. this.$container.remove();
  11. }
  12. });
  13. describe('mergeCells option', function () {
  14. it('should merge cell in startup', function () {
  15. var hot = handsontable({
  16. data: Handsontable.helper.createSpreadsheetObjectData(10, 5),
  17. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }]
  18. });
  19. var TD = hot.rootElement.querySelector('td');
  20. expect(TD.getAttribute('rowspan')).toBe('2');
  21. expect(TD.getAttribute('colspan')).toBe('2');
  22. });
  23. });
  24. describe('mergeCells updateSettings', function () {
  25. it('should allow to overwrite the initial settings using the updateSettings method', function () {
  26. var hot = handsontable({
  27. data: Handsontable.helper.createSpreadsheetObjectData(10, 10),
  28. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }]
  29. });
  30. var TD = hot.rootElement.querySelector('td');
  31. expect(TD.getAttribute('rowspan')).toBe('2');
  32. expect(TD.getAttribute('colspan')).toBe('2');
  33. updateSettings({
  34. mergeCells: [{ row: 2, col: 2, rowspan: 2, colspan: 2 }]
  35. });
  36. TD = hot.rootElement.querySelector('td');
  37. expect(TD.getAttribute('rowspan')).toBe(null);
  38. expect(TD.getAttribute('colspan')).toBe(null);
  39. TD = getCell(2, 2);
  40. expect(TD.getAttribute('rowspan')).toBe('2');
  41. expect(TD.getAttribute('colspan')).toBe('2');
  42. });
  43. it('should allow resetting the merged cells by changing it to \'true\'', function () {
  44. var hot = handsontable({
  45. data: Handsontable.helper.createSpreadsheetObjectData(10, 10),
  46. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }]
  47. });
  48. var TD = hot.rootElement.querySelector('td');
  49. expect(TD.getAttribute('rowspan')).toBe('2');
  50. expect(TD.getAttribute('colspan')).toBe('2');
  51. updateSettings({
  52. mergeCells: true
  53. });
  54. TD = hot.rootElement.querySelector('td');
  55. expect(TD.getAttribute('rowspan')).toBe(null);
  56. expect(TD.getAttribute('colspan')).toBe(null);
  57. });
  58. it('should allow resetting and turning off the mergeCells plugin by changing mergeCells to \'false\'', function () {
  59. var hot = handsontable({
  60. data: Handsontable.helper.createSpreadsheetObjectData(10, 10),
  61. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }]
  62. });
  63. var TD = hot.rootElement.querySelector('td');
  64. expect(TD.getAttribute('rowspan')).toBe('2');
  65. expect(TD.getAttribute('colspan')).toBe('2');
  66. updateSettings({
  67. mergeCells: false
  68. });
  69. TD = hot.rootElement.querySelector('td');
  70. expect(TD.getAttribute('rowspan')).toBe(null);
  71. expect(TD.getAttribute('colspan')).toBe(null);
  72. });
  73. });
  74. describe('mergeCells copy', function () {
  75. it('should not copy text of cells that are merged into another cell', function () {
  76. var hot = handsontable({
  77. data: Handsontable.helper.createSpreadsheetObjectData(10, 5),
  78. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }]
  79. });
  80. expect(hot.getCopyableText(0, 0, 2, 2)).toBe('A1\t\tC1\n\t\tC2\nA3\tB3\tC3');
  81. });
  82. });
  83. describe('merged cells selection', function () {
  84. it('should select the whole range of cells which form a merged cell', function () {
  85. var hot = handsontable({
  86. data: Handsontable.helper.createSpreadsheetObjectData(4, 4),
  87. mergeCells: [{
  88. row: 0,
  89. col: 0,
  90. colspan: 4,
  91. rowspan: 1
  92. }]
  93. });
  94. var $table = this.$container.find('table.htCore');
  95. var $td = $table.find('tr:eq(0) td:eq(0)');
  96. expect($td.attr('rowspan')).toEqual('1');
  97. expect($td.attr('colspan')).toEqual('4');
  98. expect(hot.getSelected()).toBeUndefined();
  99. hot.selectCell(0, 0);
  100. expect(hot.getSelected()).toEqual([0, 0, 0, 3]);
  101. deselectCell();
  102. hot.selectCell(0, 1);
  103. expect(hot.getSelected()).toEqual([0, 0, 0, 3]);
  104. });
  105. it('should always make a rectangular selection, when selecting merged and not merged cells', function () {
  106. var hot = handsontable({
  107. data: Handsontable.helper.createSpreadsheetObjectData(4, 4),
  108. mergeCells: [{
  109. row: 1,
  110. col: 1,
  111. colspan: 3,
  112. rowspan: 2
  113. }]
  114. });
  115. var $table = this.$container.find('table.htCore');
  116. var $td = $table.find('tr:eq(1) td:eq(1)');
  117. expect($td.attr('rowspan')).toEqual('2');
  118. expect($td.attr('colspan')).toEqual('3');
  119. expect(hot.getSelected()).toBeUndefined();
  120. hot.selectCell(0, 0);
  121. expect(hot.getSelected()).toEqual([0, 0, 0, 0]);
  122. deselectCell();
  123. hot.selectCell(0, 0, 1, 1);
  124. expect(hot.getSelected()).not.toEqual([0, 0, 1, 1]);
  125. expect(hot.getSelected()).toEqual([0, 0, 2, 3]);
  126. deselectCell();
  127. hot.selectCell(0, 1, 1, 1);
  128. expect(hot.getSelected()).toEqual([0, 1, 2, 3]);
  129. });
  130. it('should not switch the selection start point when selecting from non-merged cells to merged cells', function () {
  131. var hot = handsontable({
  132. data: Handsontable.helper.createSpreadsheetObjectData(10, 10),
  133. mergeCells: [{ row: 1, col: 1, rowspan: 3, colspan: 3 }, { row: 3, col: 4, rowspan: 2, colspan: 2 }]
  134. });
  135. $(hot.getCell(6, 6)).simulate('mousedown');
  136. expect(hot.getSelectedRange().from.col).toEqual(6);
  137. expect(hot.getSelectedRange().from.row).toEqual(6);
  138. $(hot.getCell(1, 1)).simulate('mouseenter');
  139. expect(hot.getSelectedRange().from.col).toEqual(6);
  140. expect(hot.getSelectedRange().from.row).toEqual(6);
  141. $(hot.getCell(3, 3)).simulate('mouseenter');
  142. expect(hot.getSelectedRange().from.col).toEqual(6);
  143. expect(hot.getSelectedRange().from.row).toEqual(6);
  144. $(hot.getCell(4, 4)).simulate('mouseenter');
  145. expect(hot.getSelectedRange().from.col).toEqual(6);
  146. expect(hot.getSelectedRange().from.row).toEqual(6);
  147. });
  148. it('should select cells in the correct direction when changing selections around a merged range', function () {
  149. var hot = handsontable({
  150. data: Handsontable.helper.createSpreadsheetObjectData(10, 10),
  151. mergeCells: [{ row: 4, col: 4, rowspan: 2, colspan: 2 }]
  152. });
  153. hot.selectCell(5, 5, 5, 2);
  154. expect(hot.getSelectedRange().getDirection()).toEqual('SE-NW');
  155. hot.selectCell(4, 4, 2, 5);
  156. expect(hot.getSelectedRange().getDirection()).toEqual('SW-NE');
  157. hot.selectCell(4, 4, 5, 7);
  158. expect(hot.getSelectedRange().getDirection()).toEqual('NW-SE');
  159. hot.selectCell(4, 5, 7, 5);
  160. expect(hot.getSelectedRange().getDirection()).toEqual('NE-SW');
  161. });
  162. it('should not add an area class to the selected cell if a single merged cell is selected', function () {
  163. var hot = handsontable({
  164. data: Handsontable.helper.createSpreadsheetObjectData(6, 6),
  165. mergeCells: [{
  166. row: 1,
  167. col: 1,
  168. colspan: 3,
  169. rowspan: 2
  170. }]
  171. });
  172. selectCell(1, 1);
  173. expect(getCell(1, 1).className.indexOf('area')).toEqual(-1);
  174. selectCell(1, 1, 4, 4);
  175. expect(getCell(1, 1).className.indexOf('area')).not.toEqual(-1);
  176. selectCell(1, 1);
  177. expect(getCell(1, 1).className.indexOf('area')).toEqual(-1);
  178. selectCell(0, 0);
  179. expect(getCell(1, 1).className.indexOf('area')).toEqual(-1);
  180. });
  181. });
  182. describe('merged cells scroll', function () {
  183. it('getCell should return merged cell parent', function () {
  184. var hot = handsontable({
  185. data: Handsontable.helper.createSpreadsheetObjectData(10, 5),
  186. mergeCells: [{ row: 0, col: 0, rowspan: 2, colspan: 2 }],
  187. height: 100,
  188. width: 400
  189. });
  190. var mergedCellParent = hot.getCell(0, 0);
  191. var mergedCellHidden = hot.getCell(1, 1);
  192. expect(mergedCellHidden).toBe(mergedCellParent);
  193. });
  194. it('should scroll viewport to beginning of a merged cell when it\'s clicked', function () {
  195. var hot = handsontable({
  196. data: Handsontable.helper.createSpreadsheetObjectData(10, 5),
  197. mergeCells: [{ row: 5, col: 0, rowspan: 2, colspan: 2 }],
  198. height: 100,
  199. width: 400
  200. });
  201. var mainHolder = hot.view.wt.wtTable.holder;
  202. mainHolder.scrollTop = 130;
  203. hot.render();
  204. expect(mainHolder.scrollTop).toBe(130);
  205. var TD = hot.getCell(5, 0);
  206. mouseDown(TD);
  207. mouseUp(TD);
  208. var mergedCellScrollTop = mainHolder.scrollTop;
  209. expect(mergedCellScrollTop).toBeLessThan(130);
  210. expect(mergedCellScrollTop).toBeGreaterThan(0);
  211. mainHolder.scrollTop = 0;
  212. hot.render();
  213. mainHolder.scrollTop = 130;
  214. hot.render();
  215. TD = hot.getCell(5, 2);
  216. mouseDown(TD);
  217. mouseUp(TD);
  218. var regularCellScrollTop = mainHolder.scrollTop;
  219. expect(mergedCellScrollTop).toBe(regularCellScrollTop);
  220. });
  221. it('should render whole merged cell even when most rows are not in the viewport - scrolled to top', function () {
  222. var hot = handsontable({
  223. data: Handsontable.helper.createSpreadsheetObjectData(40, 5),
  224. mergeCells: [{ row: 1, col: 0, rowspan: 21, colspan: 2 }, { row: 21, col: 2, rowspan: 18, colspan: 2 }],
  225. height: 100,
  226. width: 400
  227. });
  228. expect(hot.countRenderedRows()).toBe(39);
  229. });
  230. it('should render whole merged cell even when most rows are not in the viewport - scrolled to bottom', function () {
  231. var hot = handsontable({
  232. data: Handsontable.helper.createSpreadsheetObjectData(40, 5),
  233. mergeCells: [{ row: 1, col: 0, rowspan: 21, colspan: 2 }, { row: 21, col: 2, rowspan: 18, colspan: 2 }],
  234. height: 100,
  235. width: 400
  236. });
  237. var mainHolder = hot.view.wt.wtTable.holder;
  238. $(mainHolder).scrollTop(99999);
  239. hot.render();
  240. expect(hot.countRenderedRows()).toBe(39);
  241. });
  242. it('should render whole merged cell even when most columns are not in the viewport - scrolled to the left', function () {
  243. var hot = handsontable({
  244. data: Handsontable.helper.createSpreadsheetObjectData(5, 40),
  245. mergeCells: [{ row: 0, col: 1, rowspan: 2, colspan: 21 }, { row: 2, col: 21, rowspan: 2, colspan: 18 }],
  246. height: 100,
  247. width: 400
  248. });
  249. expect(hot.countRenderedCols()).toBe(39);
  250. });
  251. it('should render whole merged cell even when most columns are not in the viewport - scrolled to the right', function () {
  252. var hot = handsontable({
  253. data: Handsontable.helper.createSpreadsheetObjectData(5, 40),
  254. mergeCells: [{ row: 0, col: 1, rowspan: 2, colspan: 21 }, { row: 2, col: 21, rowspan: 2, colspan: 18 }],
  255. height: 100,
  256. width: 400
  257. });
  258. this.$container.scrollLeft(99999);
  259. hot.render();
  260. expect(hot.countRenderedCols()).toBe(39);
  261. });
  262. });
  263. describe('merge cells shift', function () {
  264. it('should shift the merged cells right, when inserting a column on the left side of them', function () {
  265. var hot = handsontable({
  266. data: Handsontable.helper.createSpreadsheetData(20, 20),
  267. mergeCells: [{ row: 1, col: 1, rowspan: 2, colspan: 2 }, { row: 2, col: 5, rowspan: 2, colspan: 2 }],
  268. height: 400,
  269. width: 400
  270. });
  271. hot.alter('insert_col', 3, 2);
  272. expect(hot.mergeCells.mergedCellInfoCollection[0].col).toEqual(1);
  273. expect(hot.mergeCells.mergedCellInfoCollection[1].col).toEqual(6);
  274. });
  275. it('should shift the merged cells left, when removing a column on the left side of them', function () {
  276. var hot = handsontable({
  277. data: Handsontable.helper.createSpreadsheetData(20, 20),
  278. mergeCells: [{ row: 1, col: 1, rowspan: 2, colspan: 2 }, { row: 2, col: 5, rowspan: 2, colspan: 2 }],
  279. height: 400,
  280. width: 400
  281. });
  282. hot.alter('remove_col', 3, 2);
  283. expect(hot.mergeCells.mergedCellInfoCollection[0].col).toEqual(1);
  284. expect(hot.mergeCells.mergedCellInfoCollection[1].col).toEqual(4);
  285. });
  286. it('should shift the merged cells down, when inserting a row above them', function () {
  287. var hot = handsontable({
  288. data: Handsontable.helper.createSpreadsheetData(20, 20),
  289. mergeCells: [{ row: 1, col: 1, rowspan: 2, colspan: 2 }, { row: 5, col: 5, rowspan: 2, colspan: 2 }],
  290. height: 400,
  291. width: 400
  292. });
  293. hot.alter('insert_row', 3, 2);
  294. expect(hot.mergeCells.mergedCellInfoCollection[0].row).toEqual(1);
  295. expect(hot.mergeCells.mergedCellInfoCollection[1].row).toEqual(6);
  296. });
  297. it('should shift the merged cells down, when inserting a row above them', function () {
  298. var hot = handsontable({
  299. data: Handsontable.helper.createSpreadsheetData(20, 20),
  300. mergeCells: [{ row: 1, col: 1, rowspan: 2, colspan: 2 }, { row: 5, col: 5, rowspan: 2, colspan: 2 }],
  301. height: 400,
  302. width: 400
  303. });
  304. hot.alter('remove_row', 3, 2);
  305. expect(hot.mergeCells.mergedCellInfoCollection[0].row).toEqual(1);
  306. expect(hot.mergeCells.mergedCellInfoCollection[1].row).toEqual(4);
  307. });
  308. });
  309. xdescribe('canMergeRange', function () {
  310. it('should return false if start and end cell is the same', function () {
  311. var hot = handsontable({
  312. data: Handsontable.helper.createSpreadsheetObjectData(10, 5)
  313. });
  314. var mergeCells = new Handsontable.plugins.MergeCells(hot);
  315. var coordsFrom = new WalkontableCellCoords(0, 1);
  316. var cellRange = new WalkontableCellRange(coordsFrom, coordsFrom, new WalkontableCellCoords(0, 1));
  317. var result = mergeCells.canMergeRange(cellRange);
  318. expect(result).toBe(false);
  319. });
  320. it('should return true for 2 consecutive cells in the same column', function () {
  321. var hot = handsontable({
  322. data: Handsontable.helper.createSpreadsheetObjectData(10, 5)
  323. });
  324. var mergeCells = new Handsontable.plugins.MergeCells(hot);
  325. var coordsFrom = new WalkontableCellCoords(0, 1);
  326. var cellRange = new WalkontableCellRange(coordsFrom, coordsFrom, new WalkontableCellCoords(1, 1));
  327. var result = mergeCells.canMergeRange(cellRange);
  328. expect(result).toBe(true);
  329. });
  330. it('should return true for 2 consecutive cells in the same row', function () {
  331. var hot = handsontable({
  332. data: Handsontable.helper.createSpreadsheetObjectData(10, 5)
  333. });
  334. var mergeCells = new Handsontable.MergeCells(hot);
  335. var coordsFrom = new WalkontableCellCoords(0, 1);
  336. var cellRange = new WalkontableCellRange(coordsFrom, coordsFrom, new WalkontableCellCoords(0, 2));
  337. var result = mergeCells.canMergeRange(cellRange);
  338. expect(result).toBe(true);
  339. });
  340. it('should return true for 4 neighboring cells', function () {
  341. var hot = handsontable({
  342. data: Handsontable.helper.createSpreadsheetObjectData(10, 5)
  343. });
  344. var mergeCells = new Handsontable.MergeCells(hot);
  345. var coordsFrom = new WalkontableCellCoords(0, 1);
  346. var cellRange = new WalkontableCellRange(coordsFrom, coordsFrom, new WalkontableCellCoords(1, 2));
  347. var result = mergeCells.canMergeRange(cellRange);
  348. expect(result).toBe(true);
  349. });
  350. });
  351. xdescribe('modifyTransform', function () {
  352. it('should not transform arrow right when entering a merged cell', function () {
  353. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  354. var coords = new WalkontableCellCoords(1, 0);
  355. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  356. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  357. var inDelta = new WalkontableCellCoords(0, 1);
  358. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  359. expect(inDelta).toEqual(new WalkontableCellCoords(0, 1));
  360. });
  361. it('should transform arrow right when leaving a merged cell', function () {
  362. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  363. var coords = new WalkontableCellCoords(1, 1);
  364. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  365. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  366. var inDelta = new WalkontableCellCoords(0, 1);
  367. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  368. expect(inDelta).toEqual(new WalkontableCellCoords(0, 3));
  369. });
  370. it('should transform arrow right when leaving a merged cell (return to desired row)', function () {
  371. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  372. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  373. var coords = new WalkontableCellCoords(2, 0);
  374. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  375. var inDelta = new WalkontableCellCoords(0, 1);
  376. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  377. expect(inDelta).toEqual(new WalkontableCellCoords(-1, 1));
  378. coords = new WalkontableCellCoords(1, 1);
  379. currentSelection = new WalkontableCellRange(coords, coords, coords);
  380. inDelta = new WalkontableCellCoords(0, 1);
  381. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  382. expect(inDelta).toEqual(new WalkontableCellCoords(1, 3));
  383. });
  384. it('should transform arrow left when entering a merged cell', function () {
  385. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  386. var coords = new WalkontableCellCoords(1, 4);
  387. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  388. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  389. var inDelta = new WalkontableCellCoords(0, -1);
  390. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  391. expect(inDelta).toEqual(new WalkontableCellCoords(0, -3));
  392. });
  393. it('should not transform arrow left when leaving a merged cell', function () {
  394. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  395. var coords = new WalkontableCellCoords(1, 1);
  396. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  397. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  398. var inDelta = new WalkontableCellCoords(0, -1);
  399. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  400. expect(inDelta).toEqual(new WalkontableCellCoords(0, -1));
  401. });
  402. it('should transform arrow left when leaving a merged cell (return to desired row)', function () {
  403. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  404. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  405. var coords = new WalkontableCellCoords(2, 4);
  406. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  407. var inDelta = new WalkontableCellCoords(0, -1);
  408. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  409. expect(inDelta).toEqual(new WalkontableCellCoords(-1, -3));
  410. coords = new WalkontableCellCoords(1, 1);
  411. currentSelection = new WalkontableCellRange(coords, coords, coords);
  412. inDelta = new WalkontableCellCoords(0, -1);
  413. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  414. expect(inDelta).toEqual(new WalkontableCellCoords(1, -1));
  415. });
  416. it('should not transform arrow down when entering a merged cell', function () {
  417. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  418. var coords = new WalkontableCellCoords(0, 1);
  419. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  420. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  421. var inDelta = new WalkontableCellCoords(0, -1);
  422. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  423. expect(inDelta).toEqual(new WalkontableCellCoords(0, -1));
  424. });
  425. it('should transform arrow down when leaving a merged cell', function () {
  426. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  427. var coords = new WalkontableCellCoords(1, 1);
  428. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  429. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  430. var inDelta = new WalkontableCellCoords(1, 0);
  431. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  432. expect(inDelta).toEqual(new WalkontableCellCoords(3, 0));
  433. });
  434. it('should transform arrow up when entering a merged cell', function () {
  435. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  436. var coords = new WalkontableCellCoords(4, 1);
  437. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  438. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  439. var inDelta = new WalkontableCellCoords(-1, 0);
  440. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  441. expect(inDelta).toEqual(new WalkontableCellCoords(-3, 0));
  442. });
  443. it('should not transform arrow up when leaving a merged cell', function () {
  444. var mergeCellsSettings = [{ row: 1, col: 1, rowspan: 3, colspan: 3 }];
  445. var coords = new WalkontableCellCoords(1, 1);
  446. var currentSelection = new WalkontableCellRange(coords, coords, coords);
  447. var mergeCells = new Handsontable.MergeCells(mergeCellsSettings);
  448. var inDelta = new WalkontableCellCoords(-1, 0);
  449. mergeCells.modifyTransform('modifyTransformStart', currentSelection, inDelta);
  450. expect(inDelta).toEqual(new WalkontableCellCoords(-1, 0));
  451. });
  452. });
  453. describe('ContextMenu', function () {
  454. it('should disable `Merge cells` context menu item when context menu was triggered from corner header', function () {
  455. var hot = handsontable({
  456. data: Handsontable.helper.createSpreadsheetObjectData(10, 5),
  457. rowHeaders: true,
  458. colHeaders: true,
  459. contextMenu: true,
  460. mergeCells: true
  461. });
  462. $('.ht_clone_top_left_corner .htCore').find('thead').find('th').eq(0).simulate('mousedown', { which: 3 });
  463. contextMenu();
  464. expect($('.htContextMenu tbody td.htDisabled').text()).toBe(['Insert column on the left', 'Insert column on the right', 'Remove row', 'Remove column', 'Undo', 'Redo', 'Read only', 'Alignment', 'Merge cells'].join(''));
  465. });
  466. });
  467. });