canMergeRange.e2e.js 22 KB

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