/handsontable/src/plugins/hiddenRows/__tests__/plugins/mergeCells.spec.js

https://github.com/handsontable/jquery-handsontable · JavaScript · 1402 lines · 1034 code · 294 blank · 74 comment · 6 complexity · 3d2d7f36c798488973fd9f5f78d82685 MD5 · raw file

  1. describe('HiddenRows', () => {
  2. const 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', () => {
  13. it('should display properly merged cells based on the settings', () => {
  14. handsontable({
  15. data: Handsontable.helper.createSpreadsheetObjectData(5, 5),
  16. mergeCells: [
  17. { row: 0, col: 0, rowspan: 3, colspan: 3 }
  18. ],
  19. hiddenRows: {
  20. rows: [1],
  21. },
  22. });
  23. expect(getData()).toEqual([
  24. ['A1', null, null, 'D1', 'E1'],
  25. [null, null, null, 'D2', 'E2'],
  26. [null, null, null, 'D3', 'E3'],
  27. ['A4', 'B4', 'C4', 'D4', 'E4'],
  28. ['A5', 'B5', 'C5', 'D5', 'E5'],
  29. ]);
  30. expect(getHtCore().outerHeight()).toBe(93);
  31. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  32. getPlugin('hiddenRows').showRows([1]);
  33. render();
  34. expect(getHtCore().outerHeight()).toBe(116);
  35. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(70);
  36. getPlugin('hiddenRows').hideRows([1]);
  37. render();
  38. expect(getHtCore().outerHeight()).toBe(93);
  39. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  40. });
  41. it('should display properly merged cells containing hidden rows (merge area from visible cell to visible cell)', () => {
  42. handsontable({
  43. data: Handsontable.helper.createSpreadsheetData(5, 1),
  44. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  45. hiddenRows: {
  46. rows: [0, 2, 4],
  47. },
  48. mergeCells: true
  49. });
  50. getPlugin('mergeCells').merge(1, 0, 3, 0);
  51. // Merged from visual row index 1 (visible) to visual row index 3 (visible).
  52. // ↓ merged data ↓
  53. expect(getData()).toEqual([['A1'], ['A2'], [null], [null], ['A5']]);
  54. expect(getHtCore().find('td:eq(0)').text()).toBe('A2');
  55. expect(getHtCore().outerHeight()).toBe(47);
  56. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  57. getPlugin('hiddenRows').showRows([2]);
  58. render();
  59. expect(getHtCore().outerHeight()).toBe(70);
  60. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(70);
  61. getPlugin('hiddenRows').hideRows([2]);
  62. render();
  63. expect(getHtCore().outerHeight()).toBe(47);
  64. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  65. getPlugin('hiddenRows').showRows([0, 2, 4]);
  66. render();
  67. expect(getHtCore().outerHeight()).toBe(116);
  68. expect(getHtCore().find('td:eq(1)').outerHeight()).toBe(69);
  69. });
  70. it('should display properly merged cells containing hidden rows (merge area from invisible cell to visible cell)', () => {
  71. handsontable({
  72. data: Handsontable.helper.createSpreadsheetData(5, 1),
  73. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  74. hiddenRows: {
  75. rows: [0, 2, 4],
  76. },
  77. mergeCells: true
  78. });
  79. getPlugin('mergeCells').merge(0, 0, 3, 0);
  80. // Merged from visual row index 0 (invisible) to visual row index 3 (visible).
  81. // ↓ merged data ↓
  82. expect(getData()).toEqual([['A1'], [null], [null], [null], ['A5']]);
  83. expect(getHtCore().find('td:eq(0)').text()).toBe('A1');
  84. expect(getHtCore().outerHeight()).toBe(47);
  85. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  86. getPlugin('hiddenRows').showRows([0]);
  87. render();
  88. expect(getHtCore().outerHeight()).toBe(70);
  89. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(70);
  90. getPlugin('hiddenRows').showRows([2]);
  91. render();
  92. expect(getHtCore().outerHeight()).toBe(93);
  93. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(93);
  94. getPlugin('hiddenRows').hideRows([0, 2]);
  95. render();
  96. expect(getHtCore().outerHeight()).toBe(47);
  97. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  98. getPlugin('hiddenRows').showRows([0, 2, 4]);
  99. render();
  100. expect(getHtCore().outerHeight()).toBe(116);
  101. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(93);
  102. });
  103. it('should display properly merged cells containing hidden rows (merge area from visible cell to invisible cell)', () => {
  104. handsontable({
  105. data: Handsontable.helper.createSpreadsheetData(5, 1),
  106. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  107. hiddenRows: {
  108. rows: [0, 2, 4],
  109. },
  110. mergeCells: true
  111. });
  112. getPlugin('mergeCells').merge(1, 0, 4, 0);
  113. // Merged from visual row index 1 (visible) to visual row index 4 (invisible).
  114. // ↓ merged data ↓
  115. expect(getData()).toEqual([['A1'], ['A2'], [null], [null], [null]]);
  116. expect(getHtCore().find('td:eq(0)').text()).toBe('A2');
  117. expect(getHtCore().outerHeight()).toBe(47);
  118. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  119. getPlugin('hiddenRows').showRows([2]);
  120. render();
  121. expect(getHtCore().outerHeight()).toBe(70);
  122. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(70);
  123. getPlugin('hiddenRows').showRows([4]);
  124. render();
  125. expect(getHtCore().outerHeight()).toBe(93);
  126. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(93);
  127. getPlugin('hiddenRows').hideRows([2, 4]);
  128. render();
  129. expect(getHtCore().outerHeight()).toBe(47);
  130. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  131. getPlugin('hiddenRows').showRows([0, 2, 4]);
  132. render();
  133. expect(getHtCore().outerHeight()).toBe(116);
  134. expect(getHtCore().find('td:eq(1)').outerHeight()).toBe(92);
  135. });
  136. it('should display properly merged cells containing hidden rows (merge area from invisible cell to invisible cell)', () => {
  137. handsontable({
  138. data: Handsontable.helper.createSpreadsheetData(5, 1),
  139. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  140. hiddenRows: {
  141. rows: [0, 2, 4],
  142. },
  143. mergeCells: true
  144. });
  145. getPlugin('mergeCells').merge(0, 0, 4, 0);
  146. // Merged from visual row index 0 (invisible) to visual row index 4 (invisible).
  147. // ↓ merged data ↓
  148. expect(getData()).toEqual([['A1'], [null], [null], [null], [null]]);
  149. expect(getHtCore().find('td:eq(0)').text()).toBe('A1');
  150. expect(getHtCore().outerHeight()).toBe(47);
  151. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  152. getPlugin('hiddenRows').showRows([0]);
  153. render();
  154. expect(getHtCore().outerHeight()).toBe(70);
  155. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(70);
  156. getPlugin('hiddenRows').showRows([2]);
  157. render();
  158. expect(getHtCore().outerHeight()).toBe(93);
  159. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(93);
  160. getPlugin('hiddenRows').showRows([4]);
  161. render();
  162. expect(getHtCore().outerHeight()).toBe(116);
  163. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(116);
  164. getPlugin('hiddenRows').hideRows([0, 2, 4]);
  165. render();
  166. expect(getHtCore().outerHeight()).toBe(47);
  167. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(47);
  168. getPlugin('hiddenRows').showRows([0, 2, 4]);
  169. render();
  170. expect(getHtCore().outerHeight()).toBe(116);
  171. expect(getHtCore().find('td:eq(0)').outerHeight()).toBe(116);
  172. });
  173. it('should return proper values from the `getCell` function', () => {
  174. handsontable({
  175. data: Handsontable.helper.createSpreadsheetData(5, 1),
  176. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  177. hiddenRows: {
  178. rows: [0, 2, 4],
  179. },
  180. mergeCells: true
  181. });
  182. getPlugin('mergeCells').merge(1, 0, 3, 0);
  183. expect(getCell(0, 0)).toBe(null);
  184. expect(getCell(1, 0)).toBe(getHtCore().find('td')[0]);
  185. expect(getCell(2, 0)).toBe(null);
  186. expect(getCell(3, 0)).toBe(getHtCore().find('td')[0]);
  187. expect(getCell(4, 0)).toBe(null);
  188. getPlugin('hiddenRows').showRows([2]);
  189. render();
  190. expect(getCell(0, 0)).toBe(null);
  191. expect(getCell(1, 0)).toBe(getHtCore().find('td')[0]);
  192. expect(getCell(2, 0)).toBe(getHtCore().find('td')[0]);
  193. expect(getCell(3, 0)).toBe(getHtCore().find('td')[0]);
  194. expect(getCell(4, 0)).toBe(null);
  195. });
  196. it('should translate row indexes properly - regression check', () => {
  197. // An error have been thrown and too many rows have been drawn in the specific case. There haven't been done
  198. // index translation (from renderable to visual rows indexes and the other way around).
  199. handsontable({
  200. data: Handsontable.helper.createSpreadsheetData(7, 1),
  201. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  202. hiddenRows: {
  203. rows: [0, 2],
  204. },
  205. mergeCells: true
  206. });
  207. getPlugin('mergeCells').merge(3, 0, 5, 0);
  208. // The same as at the start.
  209. expect($(getHtCore()).find('td').length).toBe(5);
  210. // Still the same height for the whole table.
  211. expect(getHtCore().outerHeight()).toBe(116);
  212. expect(getHtCore().find('td:eq(1)').outerHeight()).toBe(69);
  213. });
  214. // Please keep in mind that this test doesn't fulfil checks for all types of renderers. Change code carefully
  215. // when something is failing.
  216. it('should show start of the merge area properly also when first row from the area is hidden', () => {
  217. handsontable({
  218. data: [
  219. ['<b>Hello world</b>', 123, 'secret'],
  220. ['Hello!', 'not numeric', 'secret too']
  221. ],
  222. columns: [
  223. { renderer: 'html' },
  224. { renderer: 'numeric' },
  225. { renderer: 'password' },
  226. ],
  227. mergeCells: [
  228. { row: 0, col: 0, rowspan: 2, colspan: 1 },
  229. { row: 0, col: 1, rowspan: 2, colspan: 1 },
  230. { row: 0, col: 2, rowspan: 2, colspan: 1 },
  231. ],
  232. hiddenRows: {
  233. rows: [0]
  234. }
  235. });
  236. expect($(getHtCore()).find('td')[0].innerHTML).toBe('<b>Hello world</b>');
  237. expect($(getHtCore()).find('td')[1].innerText).toBe('123');
  238. expect($(getHtCore()).find('td')[2].innerText).toBe('******');
  239. });
  240. it('should select proper cells when calling the `selectCell` within area of merge ' +
  241. '(contains few hidden rows)', () => {
  242. handsontable({
  243. data: Handsontable.helper.createSpreadsheetData(5, 1),
  244. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  245. hiddenRows: {
  246. rows: [0, 2],
  247. },
  248. mergeCells: [
  249. { row: 1, col: 0, rowspan: 4, colspan: 1 }
  250. ]
  251. });
  252. // First visible cell (merged area).
  253. const $mergeArea = spec().$container.find('tr:eq(0) td:eq(0)');
  254. selectCell(1, 0);
  255. // Second and third rows are not displayed (CSS - display: none).
  256. expect(getSelected()).toEqual([[1, 0, 4, 0]]);
  257. expect(getSelectedRangeLast().highlight.row).toBe(1);
  258. expect(getSelectedRangeLast().highlight.col).toBe(0);
  259. expect(getSelectedRangeLast().from.row).toBe(1);
  260. expect(getSelectedRangeLast().from.col).toBe(0);
  261. expect(getSelectedRangeLast().to.row).toBe(4);
  262. expect(getSelectedRangeLast().to.col).toBe(0);
  263. expect(`
  264. | - ║ # |
  265. | - ║ |
  266. | - ║ |
  267. `).toBeMatchToSelectionPattern();
  268. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  269. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  270. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeFalse();
  271. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  272. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  273. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  274. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  275. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  276. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  277. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  278. deselectCell();
  279. selectCell(2, 0);
  280. // Second and third rows are not displayed (CSS - display: none).
  281. expect(getSelected()).toEqual([[1, 0, 4, 0]]);
  282. expect(getSelectedRangeLast().highlight.row).toBe(1);
  283. expect(getSelectedRangeLast().highlight.col).toBe(0);
  284. expect(getSelectedRangeLast().from.row).toBe(1);
  285. expect(getSelectedRangeLast().from.col).toBe(0);
  286. expect(getSelectedRangeLast().to.row).toBe(4);
  287. expect(getSelectedRangeLast().to.col).toBe(0);
  288. expect(`
  289. | - ║ # |
  290. | - ║ |
  291. | - ║ |
  292. `).toBeMatchToSelectionPattern();
  293. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  294. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  295. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeFalse();
  296. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  297. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  298. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  299. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  300. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  301. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  302. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  303. deselectCell();
  304. selectCell(3, 0);
  305. // Second and third rows are not displayed (CSS - display: none).
  306. expect(getSelected()).toEqual([[1, 0, 4, 0]]);
  307. expect(getSelectedRangeLast().highlight.row).toBe(1);
  308. expect(getSelectedRangeLast().highlight.col).toBe(0);
  309. expect(getSelectedRangeLast().from.row).toBe(1);
  310. expect(getSelectedRangeLast().from.col).toBe(0);
  311. expect(getSelectedRangeLast().to.row).toBe(4);
  312. expect(getSelectedRangeLast().to.col).toBe(0);
  313. expect(`
  314. | - ║ # |
  315. | - ║ |
  316. | - ║ |
  317. `).toBeMatchToSelectionPattern();
  318. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  319. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  320. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeFalse();
  321. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  322. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  323. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  324. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  325. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  326. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  327. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  328. // TODO: `selectCell(4, 0)` should give the same effect. There is bug at least from Handsontable 7.
  329. });
  330. it('should select proper cells when calling the `selectCell` within area of merge ' +
  331. '(contains just one hidden and one not hidden row)', () => {
  332. handsontable({
  333. data: Handsontable.helper.createSpreadsheetData(5, 1),
  334. rowHeaders: true, // It has to be enabled due the bug in mergeCells plugin (#4907)
  335. hiddenRows: {
  336. rows: [0],
  337. },
  338. mergeCells: [
  339. { row: 0, col: 0, rowspan: 2, colspan: 1 }
  340. ]
  341. });
  342. // First visible cell (merged area).
  343. const $mergeArea = spec().$container.find('tr:eq(0) td:eq(0)');
  344. selectCell(0, 0);
  345. expect(`
  346. | - ║ # |
  347. | ║ |
  348. | ║ |
  349. | ║ |
  350. `).toBeMatchToSelectionPattern();
  351. expect(getSelected()).toEqual([[0, 0, 1, 0]]);
  352. expect(getSelectedRangeLast().highlight.row).toBe(1);
  353. expect(getSelectedRangeLast().highlight.col).toBe(0);
  354. expect(getSelectedRangeLast().from.row).toBe(0);
  355. expect(getSelectedRangeLast().from.col).toBe(0);
  356. expect(getSelectedRangeLast().to.row).toBe(1);
  357. expect(getSelectedRangeLast().to.col).toBe(0);
  358. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  359. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  360. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeFalse();
  361. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  362. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  363. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  364. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  365. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  366. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  367. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  368. deselectCell();
  369. selectCell(1, 0);
  370. expect(`
  371. | - ║ # |
  372. | ║ |
  373. | ║ |
  374. | ║ |
  375. `).toBeMatchToSelectionPattern();
  376. expect(getSelected()).toEqual([[0, 0, 1, 0]]);
  377. expect(getSelectedRangeLast().highlight.row).toBe(1);
  378. expect(getSelectedRangeLast().highlight.col).toBe(0);
  379. expect(getSelectedRangeLast().from.row).toBe(0);
  380. expect(getSelectedRangeLast().from.col).toBe(0);
  381. expect(getSelectedRangeLast().to.row).toBe(1);
  382. expect(getSelectedRangeLast().to.col).toBe(0);
  383. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  384. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  385. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeFalse();
  386. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  387. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  388. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  389. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  390. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  391. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  392. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  393. });
  394. it('should select proper cells when calling the `selectCells` within area of merge ' +
  395. '(contains just one hidden and one not hidden rows) + singe cell', () => {
  396. handsontable({
  397. data: Handsontable.helper.createSpreadsheetData(5, 1),
  398. hiddenRows: {
  399. rows: [0],
  400. },
  401. mergeCells: [
  402. { row: 0, col: 0, rowspan: 2, colspan: 1 }
  403. ]
  404. });
  405. // First visible cell (merged area).
  406. const $mergeArea = spec().$container.find('tr:eq(0) td:eq(0)');
  407. selectCells([[1, 0], [4, 0]]);
  408. expect(`
  409. | 0 |
  410. | |
  411. | |
  412. | A |
  413. `).toBeMatchToSelectionPattern();
  414. expect(getSelected()).toEqual([[0, 0, 1, 0], [4, 0, 4, 0]]);
  415. expect(getSelectedRangeLast().highlight.row).toBe(4);
  416. expect(getSelectedRangeLast().highlight.col).toBe(0);
  417. expect(getSelectedRangeLast().from.row).toBe(4);
  418. expect(getSelectedRangeLast().from.col).toBe(0);
  419. expect(getSelectedRangeLast().to.row).toBe(4);
  420. expect(getSelectedRangeLast().to.col).toBe(0);
  421. expect($mergeArea.hasClass('area')).toBeTrue();
  422. expect($mergeArea.hasClass('fullySelectedMergedCell')).toBeFalse();
  423. // TODO: Probably it should return `false`.
  424. expect($mergeArea.hasClass('fullySelectedMergedCell-multiple')).toBeTrue();
  425. // Probably it should return `true`, changed since 8.0.0.
  426. expect($mergeArea.hasClass('fullySelectedMergedCell-0')).toBeTrue();
  427. expect($mergeArea.hasClass('fullySelectedMergedCell-1')).toBeFalse();
  428. expect($mergeArea.hasClass('fullySelectedMergedCell-2')).toBeFalse();
  429. expect($mergeArea.hasClass('fullySelectedMergedCell-3')).toBeFalse();
  430. expect($mergeArea.hasClass('fullySelectedMergedCell-4')).toBeFalse();
  431. expect($mergeArea.hasClass('fullySelectedMergedCell-5')).toBeFalse();
  432. expect($mergeArea.hasClass('fullySelectedMergedCell-6')).toBeFalse();
  433. expect($mergeArea.hasClass('fullySelectedMergedCell-7')).toBeFalse();
  434. });
  435. it('should open properly merged cells containing hidden rows (merge area from visible cell to visible cell)', () => {
  436. handsontable({
  437. data: Handsontable.helper.createSpreadsheetData(5, 1),
  438. hiddenRows: {
  439. rows: [0, 2, 4],
  440. },
  441. mergeCells: true
  442. });
  443. getPlugin('mergeCells').merge(1, 0, 3, 0);
  444. selectCell(1, 0);
  445. keyDownUp('enter');
  446. let editor = getActiveEditor();
  447. expect(editor.isOpened()).toBe(true);
  448. expect(editor.isInFullEditMode()).toBe(true);
  449. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  450. // Closing the editor.
  451. keyDownUp('enter');
  452. editor = getActiveEditor();
  453. expect(editor.isOpened()).toBe(false);
  454. expect(editor.isInFullEditMode()).toBe(false);
  455. selectCell(2, 0);
  456. keyDownUp('enter');
  457. editor = getActiveEditor();
  458. expect(editor.isOpened()).toBe(true);
  459. expect(editor.isInFullEditMode()).toBe(true);
  460. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  461. // Closing the editor.
  462. keyDownUp('enter');
  463. editor = getActiveEditor();
  464. expect(editor.isOpened()).toBe(false);
  465. expect(editor.isInFullEditMode()).toBe(false);
  466. selectCell(3, 0);
  467. keyDownUp('enter');
  468. editor = getActiveEditor();
  469. expect(editor.isOpened()).toBe(true);
  470. expect(editor.isInFullEditMode()).toBe(true);
  471. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  472. // Closing the editor.
  473. keyDownUp('enter');
  474. editor = getActiveEditor();
  475. expect(editor.isOpened()).toBe(false);
  476. expect(editor.isInFullEditMode()).toBe(false);
  477. // Double click on the first visible cell (merged area).
  478. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  479. editor = getActiveEditor();
  480. expect(editor.isOpened()).toBe(true);
  481. expect(editor.isInFullEditMode()).toBe(true);
  482. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  483. });
  484. it('should open properly merged cells containing hidden rows (merge area from invisible cell to visible cell)', () => {
  485. handsontable({
  486. data: Handsontable.helper.createSpreadsheetData(5, 1),
  487. hiddenRows: {
  488. rows: [0, 2, 4],
  489. },
  490. mergeCells: true
  491. });
  492. getPlugin('mergeCells').merge(0, 0, 3, 0);
  493. selectCell(0, 0);
  494. keyDownUp('enter');
  495. let editor = getActiveEditor();
  496. expect(editor.isOpened()).toBe(true);
  497. expect(editor.isInFullEditMode()).toBe(true);
  498. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  499. // Closing the editor.
  500. keyDownUp('enter');
  501. editor = getActiveEditor();
  502. expect(editor.isOpened()).toBe(false);
  503. expect(editor.isInFullEditMode()).toBe(false);
  504. selectCell(1, 0);
  505. keyDownUp('enter');
  506. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  507. // Closing the editor.
  508. keyDownUp('enter');
  509. editor = getActiveEditor();
  510. expect(editor.isOpened()).toBe(false);
  511. expect(editor.isInFullEditMode()).toBe(false);
  512. selectCell(2, 0);
  513. keyDownUp('enter');
  514. editor = getActiveEditor();
  515. expect(editor.isOpened()).toBe(true);
  516. expect(editor.isInFullEditMode()).toBe(true);
  517. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  518. // Closing the editor.
  519. keyDownUp('enter');
  520. editor = getActiveEditor();
  521. expect(editor.isOpened()).toBe(false);
  522. expect(editor.isInFullEditMode()).toBe(false);
  523. selectCell(3, 0);
  524. keyDownUp('enter');
  525. editor = getActiveEditor();
  526. expect(editor.isOpened()).toBe(true);
  527. expect(editor.isInFullEditMode()).toBe(true);
  528. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  529. // Closing the editor.
  530. keyDownUp('enter');
  531. editor = getActiveEditor();
  532. expect(editor.isOpened()).toBe(false);
  533. expect(editor.isInFullEditMode()).toBe(false);
  534. // Double click on the first visible cell (merged area).
  535. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  536. editor = getActiveEditor();
  537. expect(editor.isOpened()).toBe(true);
  538. expect(editor.isInFullEditMode()).toBe(true);
  539. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  540. });
  541. it('should open properly merged cells containing hidden rows (merge area from visible cell to invisible cell)', () => {
  542. handsontable({
  543. data: Handsontable.helper.createSpreadsheetData(5, 1),
  544. hiddenRows: {
  545. rows: [0, 2, 4],
  546. },
  547. mergeCells: true
  548. });
  549. getPlugin('mergeCells').merge(1, 0, 4, 0);
  550. selectCell(1, 0);
  551. keyDownUp('enter');
  552. let editor = getActiveEditor();
  553. expect(editor.isOpened()).toBe(true);
  554. expect(editor.isInFullEditMode()).toBe(true);
  555. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  556. // Closing the editor.
  557. keyDownUp('enter');
  558. editor = getActiveEditor();
  559. expect(editor.isOpened()).toBe(false);
  560. expect(editor.isInFullEditMode()).toBe(false);
  561. selectCell(2, 0);
  562. keyDownUp('enter');
  563. editor = getActiveEditor();
  564. expect(editor.isOpened()).toBe(true);
  565. expect(editor.isInFullEditMode()).toBe(true);
  566. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  567. // Closing the editor.
  568. keyDownUp('enter');
  569. editor = getActiveEditor();
  570. expect(editor.isOpened()).toBe(false);
  571. expect(editor.isInFullEditMode()).toBe(false);
  572. selectCell(3, 0);
  573. keyDownUp('enter');
  574. editor = getActiveEditor();
  575. expect(editor.isOpened()).toBe(true);
  576. expect(editor.isInFullEditMode()).toBe(true);
  577. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  578. // Closing the editor.
  579. keyDownUp('enter');
  580. editor = getActiveEditor();
  581. expect(editor.isOpened()).toBe(false);
  582. expect(editor.isInFullEditMode()).toBe(false);
  583. selectCell(4, 0);
  584. keyDownUp('enter');
  585. editor = getActiveEditor();
  586. expect(editor.isOpened()).toBe(true);
  587. expect(editor.isInFullEditMode()).toBe(true);
  588. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  589. // Closing the editor.
  590. keyDownUp('enter');
  591. editor = getActiveEditor();
  592. expect(editor.isOpened()).toBe(false);
  593. expect(editor.isInFullEditMode()).toBe(false);
  594. // Double click on the first visible cell (merged area).
  595. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  596. editor = getActiveEditor();
  597. expect(editor.isOpened()).toBe(true);
  598. expect(editor.isInFullEditMode()).toBe(true);
  599. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A2');
  600. });
  601. it('should open properly merged cells containing hidden rows (merge area from invisible cell to invisible cell)', () => {
  602. handsontable({
  603. data: Handsontable.helper.createSpreadsheetData(5, 1),
  604. hiddenRows: {
  605. rows: [0, 2, 4],
  606. },
  607. mergeCells: true
  608. });
  609. getPlugin('mergeCells').merge(0, 0, 4, 0);
  610. selectCell(0, 0);
  611. keyDownUp('enter');
  612. let editor = getActiveEditor();
  613. expect(editor.isOpened()).toBe(true);
  614. expect(editor.isInFullEditMode()).toBe(true);
  615. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  616. // Closing the editor.
  617. keyDownUp('enter');
  618. editor = getActiveEditor();
  619. expect(editor.isOpened()).toBe(false);
  620. expect(editor.isInFullEditMode()).toBe(false);
  621. selectCell(1, 0);
  622. keyDownUp('enter');
  623. editor = getActiveEditor();
  624. expect(editor.isOpened()).toBe(true);
  625. expect(editor.isInFullEditMode()).toBe(true);
  626. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  627. // Closing the editor.
  628. keyDownUp('enter');
  629. editor = getActiveEditor();
  630. expect(editor.isOpened()).toBe(false);
  631. expect(editor.isInFullEditMode()).toBe(false);
  632. selectCell(2, 0);
  633. keyDownUp('enter');
  634. editor = getActiveEditor();
  635. expect(editor.isOpened()).toBe(true);
  636. expect(editor.isInFullEditMode()).toBe(true);
  637. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  638. // Closing the editor.
  639. keyDownUp('enter');
  640. editor = getActiveEditor();
  641. expect(editor.isOpened()).toBe(false);
  642. expect(editor.isInFullEditMode()).toBe(false);
  643. selectCell(3, 0);
  644. keyDownUp('enter');
  645. editor = getActiveEditor();
  646. expect(editor.isOpened()).toBe(true);
  647. expect(editor.isInFullEditMode()).toBe(true);
  648. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  649. // Closing the editor.
  650. keyDownUp('enter');
  651. editor = getActiveEditor();
  652. expect(editor.isOpened()).toBe(false);
  653. expect(editor.isInFullEditMode()).toBe(false);
  654. selectCell(4, 0);
  655. keyDownUp('enter');
  656. editor = getActiveEditor();
  657. expect(editor.isOpened()).toBe(true);
  658. expect(editor.isInFullEditMode()).toBe(true);
  659. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  660. // Closing the editor.
  661. keyDownUp('enter');
  662. editor = getActiveEditor();
  663. expect(editor.isOpened()).toBe(false);
  664. expect(editor.isInFullEditMode()).toBe(false);
  665. // Double click on the first visible cell (merged area).
  666. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  667. editor = getActiveEditor();
  668. expect(editor.isOpened()).toBe(true);
  669. expect(editor.isInFullEditMode()).toBe(true);
  670. expect(spec().$container.find('.handsontableInputHolder textarea').val()).toEqual('A1');
  671. });
  672. it('should edit merged cells properly (merge area from visible cell to visible cell)', () => {
  673. handsontable({
  674. data: Handsontable.helper.createSpreadsheetData(5, 1),
  675. hiddenRows: {
  676. rows: [0, 2, 4],
  677. },
  678. mergeCells: [
  679. { row: 1, col: 0, rowspan: 3, colspan: 1 }
  680. ]
  681. });
  682. // Double click on the first visible cell (merged area).
  683. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  684. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  685. textarea.value = 'Edited value';
  686. // Closing the editor.
  687. keyDownUp('enter');
  688. expect(getData()).toEqual([['A1'], ['Edited value'], [null], [null], ['A5']]);
  689. });
  690. it('should edit merged cells properly (merge area from invisible cell to visible cell)', () => {
  691. handsontable({
  692. data: Handsontable.helper.createSpreadsheetData(5, 1),
  693. hiddenRows: {
  694. rows: [0, 2, 4],
  695. },
  696. mergeCells: [
  697. { row: 0, col: 0, rowspan: 4, colspan: 1 }
  698. ]
  699. });
  700. // Double click on the first visible cell (merged area).
  701. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  702. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  703. textarea.value = 'Edited value';
  704. // Closing the editor.
  705. keyDownUp('enter');
  706. expect(getData()).toEqual([['Edited value'], [null], [null], [null], ['A5']]);
  707. });
  708. it('should edit merged cells properly (merge area from visible cell to invisible cell)', () => {
  709. handsontable({
  710. data: Handsontable.helper.createSpreadsheetData(5, 1),
  711. hiddenRows: {
  712. rows: [0, 2, 4],
  713. },
  714. mergeCells: [
  715. { row: 1, col: 0, rowspan: 4, colspan: 1 }
  716. ],
  717. });
  718. // Double click on the first visible cell (merged area).
  719. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  720. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  721. textarea.value = 'Edited value';
  722. // Closing the editor.
  723. keyDownUp('enter');
  724. expect(getData()).toEqual([['A1'], ['Edited value'], [null], [null], [null]]);
  725. });
  726. it('should edit merged cells properly (merge area from invisible cell to invisible cell)', () => {
  727. handsontable({
  728. data: Handsontable.helper.createSpreadsheetData(5, 1),
  729. hiddenRows: {
  730. rows: [0, 2, 4],
  731. },
  732. mergeCells: [
  733. { row: 0, col: 0, rowspan: 5, colspan: 1 }
  734. ],
  735. });
  736. // Double click on the first visible cell (merged area).
  737. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  738. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  739. textarea.value = 'Edited value';
  740. // Closing the editor.
  741. keyDownUp('enter');
  742. expect(getData()).toEqual([['Edited value'], [null], [null], [null], [null]]);
  743. });
  744. it('should work properly when hidden row is read only', () => {
  745. handsontable({
  746. data: Handsontable.helper.createSpreadsheetData(5, 1),
  747. hiddenRows: {
  748. rows: [0, 2, 4],
  749. },
  750. mergeCells: [
  751. { row: 0, col: 0, rowspan: 5, colspan: 1 }
  752. ],
  753. cells(physicalRow, physicalColumn) {
  754. const cellProperties = {};
  755. const visualRowIndex = this.instance.toVisualRow(physicalRow);
  756. const visualColIndex = this.instance.toVisualColumn(physicalColumn);
  757. if (visualRowIndex === 0 && visualColIndex === 0) {
  758. cellProperties.readOnly = true;
  759. }
  760. return cellProperties;
  761. }
  762. });
  763. // Double click on the first visible cell (merged area).
  764. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  765. let editor = getActiveEditor();
  766. expect(editor).toBeUndefined();
  767. // Try of opening the editor.
  768. keyDownUp('enter');
  769. editor = getActiveEditor();
  770. expect(editor).toBeUndefined();
  771. });
  772. it('should work properly when editor is set to `false` for hidden row', () => {
  773. handsontable({
  774. data: Handsontable.helper.createSpreadsheetData(5, 1),
  775. hiddenRows: {
  776. rows: [0, 2, 4],
  777. },
  778. mergeCells: [
  779. { row: 0, col: 0, rowspan: 5, colspan: 1 }
  780. ],
  781. cells(physicalRow, physicalColumn) {
  782. const cellProperties = {};
  783. const visualRowIndex = this.instance.toVisualRow(physicalRow);
  784. const visualColIndex = this.instance.toVisualColumn(physicalColumn);
  785. if (visualRowIndex === 0 && visualColIndex === 0) {
  786. cellProperties.editor = false;
  787. }
  788. return cellProperties;
  789. }
  790. });
  791. // Double click on the first visible cell (merged area).
  792. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  793. let editor = getActiveEditor();
  794. expect(editor).toBeUndefined();
  795. // Try of opening the editor.
  796. keyDownUp('enter');
  797. editor = getActiveEditor();
  798. expect(editor).toBeUndefined();
  799. });
  800. it('should edit merged cells properly (merge area from visible cell to visible cell)', () => {
  801. handsontable({
  802. data: Handsontable.helper.createSpreadsheetData(5, 1),
  803. hiddenRows: {
  804. rows: [0, 2, 4],
  805. },
  806. mergeCells: [
  807. { row: 1, col: 0, rowspan: 3, colspan: 1 }
  808. ]
  809. });
  810. // Double click on the first visible cell (merged area).
  811. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  812. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  813. textarea.value = 'Edited value';
  814. // Closing the editor.
  815. keyDownUp('enter');
  816. expect(getData()).toEqual([['A1'], ['Edited value'], [null], [null], ['A5']]);
  817. });
  818. it('should edit merged cells properly (merge area from invisible cell to visible cell)', () => {
  819. handsontable({
  820. data: Handsontable.helper.createSpreadsheetData(5, 1),
  821. hiddenRows: {
  822. rows: [0, 2, 4],
  823. },
  824. mergeCells: [
  825. { row: 0, col: 0, rowspan: 4, colspan: 1 }
  826. ]
  827. });
  828. // Double click on the first visible cell (merged area).
  829. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  830. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  831. textarea.value = 'Edited value';
  832. // Closing the editor.
  833. keyDownUp('enter');
  834. expect(getData()).toEqual([['Edited value'], [null], [null], [null], ['A5']]);
  835. });
  836. it('should edit merged cells properly (merge area from visible cell to invisible cell)', () => {
  837. handsontable({
  838. data: Handsontable.helper.createSpreadsheetData(5, 1),
  839. hiddenRows: {
  840. rows: [0, 2, 4],
  841. },
  842. mergeCells: [
  843. { row: 1, col: 0, rowspan: 4, colspan: 1 }
  844. ],
  845. });
  846. // Double click on the first visible cell (merged area).
  847. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  848. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  849. textarea.value = 'Edited value';
  850. // Closing the editor.
  851. keyDownUp('enter');
  852. expect(getData()).toEqual([['A1'], ['Edited value'], [null], [null], [null]]);
  853. });
  854. it('should edit merged cells properly (merge area from invisible cell to invisible cell)', () => {
  855. handsontable({
  856. data: Handsontable.helper.createSpreadsheetData(5, 1),
  857. hiddenRows: {
  858. rows: [0, 2, 4],
  859. },
  860. mergeCells: [
  861. { row: 0, col: 0, rowspan: 5, colspan: 1 }
  862. ],
  863. });
  864. // Double click on the first visible cell (merged area).
  865. mouseDoubleClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  866. const textarea = spec().$container.find('.handsontableInputHolder textarea')[0];
  867. textarea.value = 'Edited value';
  868. // Closing the editor.
  869. keyDownUp('enter');
  870. expect(getData()).toEqual([['Edited value'], [null], [null], [null], [null]]);
  871. });
  872. it('should populate merged cells properly (merge area from visible cell to visible cell)', () => {
  873. handsontable({
  874. data: Handsontable.helper.createSpreadsheetData(5, 5),
  875. hiddenRows: {
  876. rows: [0, 2, 4],
  877. },
  878. mergeCells: [
  879. { row: 1, col: 0, rowspan: 3, colspan: 1 }
  880. ]
  881. });
  882. // Click on the first visible cell (merged area).
  883. simulateClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  884. spec().$container.find('.wtBorder.current.corner').simulate('mousedown');
  885. spec().$container.find('tbody tr:eq(1) td:eq(4)').simulate('mouseover').simulate('mouseup');
  886. // TODO Empty strings should be equal to the `null` probably.
  887. expect(getData()).toEqual([
  888. ['A1', 'B1', 'C1', 'D1', 'E1'],
  889. ['A2', 'A2', 'A2', 'A2', 'A2'],
  890. [null, '', '', '', ''],
  891. [null, '', '', '', ''],
  892. ['A5', 'B5', 'C5', 'D5', 'E5'],
  893. ]);
  894. });
  895. it('should populate merged cells properly (merge area from invisible cell to visible cell)', () => {
  896. handsontable({
  897. data: Handsontable.helper.createSpreadsheetData(5, 5),
  898. hiddenRows: {
  899. rows: [0, 2, 4],
  900. },
  901. mergeCells: [
  902. { row: 0, col: 0, rowspan: 4, colspan: 1 }
  903. ]
  904. });
  905. // Click on the first visible cell (merged area).
  906. simulateClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  907. spec().$container.find('.ht_master .wtBorder.current.corner').simulate('mousedown');
  908. spec().$container.find('tbody tr:eq(1) td:eq(4)').simulate('mouseover').simulate('mouseup');
  909. // TODO Empty strings should be equal to the `null` probably.
  910. expect(getData()).toEqual([
  911. ['A1', 'A1', 'A1', 'A1', 'A1'],
  912. [null, '', '', '', ''],
  913. [null, '', '', '', ''],
  914. [null, '', '', '', ''],
  915. ['A5', 'B5', 'C5', 'D5', 'E5'],
  916. ]);
  917. });
  918. it('should populate merged cells properly (merge area from visible cell to invisible cell)', () => {
  919. handsontable({
  920. data: Handsontable.helper.createSpreadsheetData(5, 5),
  921. hiddenRows: {
  922. rows: [0, 2, 4],
  923. },
  924. mergeCells: [
  925. { row: 1, col: 0, rowspan: 4, colspan: 1 }
  926. ],
  927. });
  928. // Click on the first visible cell (merged area).
  929. simulateClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  930. spec().$container.find('.wtBorder.current.corner').simulate('mousedown');
  931. spec().$container.find('tbody tr:eq(1) td:eq(4)').simulate('mouseover').simulate('mouseup');
  932. // TODO Empty strings should be equal to the `null` probably.
  933. expect(getData()).toEqual([
  934. ['A1', 'B1', 'C1', 'D1', 'E1'],
  935. ['A2', 'A2', 'A2', 'A2', 'A2'],
  936. [null, '', '', '', ''],
  937. [null, '', '', '', ''],
  938. [null, '', '', '', ''],
  939. ]);
  940. });
  941. it('should populate merged cells properly (merge area from invisible cell to invisible cell)', () => {
  942. handsontable({
  943. data: Handsontable.helper.createSpreadsheetData(5, 5),
  944. hiddenRows: {
  945. rows: [0, 2, 4],
  946. },
  947. mergeCells: [
  948. { row: 0, col: 0, rowspan: 5, colspan: 1 }
  949. ],
  950. });
  951. // Click on the first visible cell (merged area).
  952. simulateClick(spec().$container.find('tr:eq(0) td:eq(0)'));
  953. spec().$container.find('.wtBorder.current.corner').simulate('mousedown');
  954. spec().$container.find('tbody tr:eq(1) td:eq(4)').simulate('mouseover').simulate('mouseup');
  955. // TODO Empty strings should be equal to the `null` probably.
  956. expect(getData()).toEqual([
  957. ['A1', 'A1', 'A1', 'A1', 'A1'],
  958. [null, '', '', '', ''],
  959. [null, '', '', '', ''],
  960. [null, '', '', '', ''],
  961. [null, '', '', '', ''],
  962. ]);
  963. });
  964. it('should select single merged area properly when it starts with hidden row', () => {
  965. handsontable({
  966. data: Handsontable.helper.createSpreadsheetData(5, 5),
  967. rowHeaders: true,
  968. colHeaders: true,
  969. hiddenRows: {
  970. rows: [1],
  971. indicators: true
  972. },
  973. mergeCells: [{ row: 1, col: 1, rowspan: 3, colspan: 3 }]
  974. });
  975. const mergedCell = spec().$container.find('tr:eq(2) td:eq(1)');
  976. simulateClick(mergedCell);
  977. // Third row is not displayed (CSS - display: none).
  978. expect(`
  979. | ║ : - : - : - : |
  980. |===:===:===:===:===:===|
  981. | ║ : : : : |
  982. | - ║ : # : : : |
  983. | - ║ : : : : |
  984. | ║ : : : : |
  985. `).toBeMatchToSelectionPattern();
  986. expect(getSelected()).toEqual([[1, 1, 3, 3]]);
  987. expect(getSelectedRangeLast().highlight.row).toBe(2);
  988. expect(getSelectedRangeLast().highlight.col).toBe(1);
  989. expect(getSelectedRangeLast().from.row).toBe(1);
  990. expect(getSelectedRangeLast().from.col).toBe(1);
  991. expect(getSelectedRangeLast().to.row).toBe(3);
  992. expect(getSelectedRangeLast().to.col).toBe(3);
  993. expect($(mergedCell).hasClass('fullySelectedMergedCell')).toBeFalse();
  994. expect($(mergedCell).hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  995. expect($(mergedCell).hasClass('fullySelectedMergedCell-0')).toBeFalse();
  996. expect($(mergedCell).hasClass('fullySelectedMergedCell-1')).toBeFalse();
  997. expect($(mergedCell).hasClass('fullySelectedMergedCell-2')).toBeFalse();
  998. expect($(mergedCell).hasClass('fullySelectedMergedCell-3')).toBeFalse();
  999. expect($(mergedCell).hasClass('fullySelectedMergedCell-4')).toBeFalse();
  1000. expect($(mergedCell).hasClass('fullySelectedMergedCell-5')).toBeFalse();
  1001. expect($(mergedCell).hasClass('fullySelectedMergedCell-6')).toBeFalse();
  1002. expect($(mergedCell).hasClass('fullySelectedMergedCell-7')).toBeFalse();
  1003. });
  1004. it('should select cells properly when there is a merged area within the selection' +
  1005. '(selecting from non-merged cell to the merged cell; from the left to the right)', () => {
  1006. handsontable({
  1007. data: Handsontable.helper.createSpreadsheetData(5, 5),
  1008. rowHeaders: true,
  1009. colHeaders: true,
  1010. contextMenu: true,
  1011. hiddenRows: {
  1012. rows: [1],
  1013. indicators: true
  1014. },
  1015. mergeCells: [{ row: 1, col: 1, rowspan: 3, colspan: 1 }]
  1016. });
  1017. const dragStart = spec().$container.find('tr:eq(2) td:eq(0)');
  1018. const dragEnd = spec().$container.find('tr:eq(2) td:eq(1)'); // Merged cell.
  1019. mouseDown(dragStart);
  1020. mouseOver(dragEnd);
  1021. mouseUp(dragEnd);
  1022. // Third row is not displayed (CSS - display: none).
  1023. expect(`
  1024. | ║ - : - : : : |
  1025. |===:===:===:===:===:===|
  1026. | ║ : : : : |
  1027. | - ║ A : 0 : : : |
  1028. | - ║ 0 : : : : |
  1029. | ║ : : : : |
  1030. `).toBeMatchToSelectionPattern();
  1031. expect(getSelected()).toEqual([[1, 0, 3, 1]]);
  1032. expect(getSelectedRangeLast().highlight.row).toBe(2);
  1033. expect(getSelectedRangeLast().highlight.col).toBe(0);
  1034. expect(getSelectedRangeLast().from.row).toBe(1);
  1035. expect(getSelectedRangeLast().from.col).toBe(0);
  1036. expect(getSelectedRangeLast().to.row).toBe(3);
  1037. expect(getSelectedRangeLast().to.col).toBe(1);
  1038. expect($(dragEnd).hasClass('fullySelectedMergedCell')).toBeFalse();
  1039. expect($(dragEnd).hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  1040. expect($(dragEnd).hasClass('fullySelectedMergedCell-0')).toBeTrue();
  1041. expect($(dragEnd).hasClass('fullySelectedMergedCell-1')).toBeFalse();
  1042. expect($(dragEnd).hasClass('fullySelectedMergedCell-2')).toBeFalse();
  1043. expect($(dragEnd).hasClass('fullySelectedMergedCell-3')).toBeFalse();
  1044. expect($(dragEnd).hasClass('fullySelectedMergedCell-4')).toBeFalse();
  1045. expect($(dragEnd).hasClass('fullySelectedMergedCell-5')).toBeFalse();
  1046. expect($(dragEnd).hasClass('fullySelectedMergedCell-6')).toBeFalse();
  1047. expect($(dragEnd).hasClass('fullySelectedMergedCell-7')).toBeFalse();
  1048. });
  1049. it('should select cells properly when there is a merged area within the selection' +
  1050. '(selecting from non-merged cell to the merged cell; from the top to the bottom)', () => {
  1051. handsontable({
  1052. data: Handsontable.helper.createSpreadsheetData(5, 5),
  1053. rowHeaders: true,
  1054. colHeaders: true,
  1055. contextMenu: true,
  1056. hiddenRows: {
  1057. rows: [1],
  1058. indicators: true
  1059. },
  1060. mergeCells: [{ row: 1, col: 1, rowspan: 3, colspan: 1 }]
  1061. });
  1062. const dragStart = spec().$container.find('tr:eq(1) td:eq(1)');
  1063. const dragEnd = spec().$container.find('tr:eq(2) td:eq(1)'); // Merged cell.
  1064. mouseDown(dragStart);
  1065. mouseOver(dragEnd);
  1066. mouseUp(dragEnd);
  1067. // Third row is not displayed (CSS - display: none).
  1068. expect(`
  1069. | ║ : - : : : |
  1070. |===:===:===:===:===:===|
  1071. | - ║ : A : : : |
  1072. | - ║ : 0 : : : |
  1073. | - ║ : : : : |
  1074. | ║ : : : : |
  1075. `).toBeMatchToSelectionPattern();
  1076. expect(getSelected()).toEqual([[0, 1, 3, 1]]);
  1077. expect(getSelectedRangeLast().highlight.row).toBe(0);
  1078. expect(getSelectedRangeLast().highlight.col).toBe(1);
  1079. expect(getSelectedRangeLast().from.row).toBe(0);
  1080. expect(getSelectedRangeLast().from.col).toBe(1);
  1081. expect(getSelectedRangeLast().to.row).toBe(3);
  1082. expect(getSelectedRangeLast().to.col).toBe(1);
  1083. expect($(dragEnd).hasClass('fullySelectedMergedCell')).toBeFalse();
  1084. expect($(dragEnd).hasClass('fullySelectedMergedCell-multiple')).toBeFalse();
  1085. expect($(dragEnd).hasClass('fullySelectedMergedCell-0')).toBeTrue();
  1086. expect($(dragEnd).hasClass('fullySelectedMergedCell-1')).toBeFalse();
  1087. expect($(dragEnd).hasClass('fullySelectedMergedCell-2')).toBeFalse();
  1088. expect($(dragEnd).hasClass('fullySelectedMergedCell-3')).toBeFalse();
  1089. expect($(dragEnd).hasClass('fullySelectedMergedCell-4')).toBeFalse();
  1090. expect($(dragEnd).hasClass('fullySelectedMergedCell-5')).toBeFalse();
  1091. expect($(dragEnd).hasClass('fullySelectedMergedCell-6')).toBeFalse();
  1092. expect($(dragEnd).hasClass('fullySelectedMergedCell-7')).toBeFalse();
  1093. });
  1094. it('should select cells properly when there is a merged area within the selection' +
  1095. '(selecting from non-merged cell to the merged cell; from the right to the left)', () => {
  1096. handsontable({
  1097. data: Handsontable.helper.createSpreadsheetData(5, 5),
  1098. rowHeaders: true,
  1099. colHeaders: true,
  1100. contextMenu: true,
  1101. hiddenRows: {
  1102. rows: [1],
  1103. indicators: true
  1104. },
  1105. mergeCells: [{ row: 1, col: 1, rowspan: 3, colspan: 1 }]
  1106. });
  1107. const dragStart = spec().$container.find('tr:eq(2) td:eq(2)');
  1108. const dragEnd = spec().$container.find('tr:eq(2) td:eq(1)'); // Merged cell.