table.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. import Delta from 'quill-delta';
  2. import Editor from '../../../core/editor';
  3. const tableDelta = new Delta()
  4. .insert('A1')
  5. .insert('\n', { table: 'a' })
  6. .insert('A2')
  7. .insert('\n', { table: 'a' })
  8. .insert('A3')
  9. .insert('\n', { table: 'a' })
  10. .insert('B1')
  11. .insert('\n', { table: 'b' })
  12. .insert('B2')
  13. .insert('\n', { table: 'b' })
  14. .insert('B3')
  15. .insert('\n', { table: 'b' })
  16. .insert('C1')
  17. .insert('\n', { table: 'c' })
  18. .insert('C2')
  19. .insert('\n', { table: 'c' })
  20. .insert('C3')
  21. .insert('\n', { table: 'c' });
  22. const tableHTML = `
  23. <table>
  24. <tbody>
  25. <tr>
  26. <td data-row="a">A1</td>
  27. <td data-row="a">A2</td>
  28. <td data-row="a">A3</td>
  29. </tr>
  30. <tr>
  31. <td data-row="b">B1</td>
  32. <td data-row="b">B2</td>
  33. <td data-row="b">B3</td>
  34. </tr>
  35. <tr>
  36. <td data-row="c">C1</td>
  37. <td data-row="c">C2</td>
  38. <td data-row="c">C3</td>
  39. </tr>
  40. </tbody>
  41. </table>`;
  42. describe('Table', function() {
  43. it('initialize', function() {
  44. const editor = this.initialize(Editor, tableHTML);
  45. expect(editor.getDelta()).toEqual(tableDelta);
  46. expect(this.container).toEqualHTML(tableHTML);
  47. });
  48. it('add', function() {
  49. const editor = this.initialize(Editor, '');
  50. editor.applyDelta(new Delta([...tableDelta.ops]).delete(1));
  51. expect(this.container).toEqualHTML(tableHTML);
  52. });
  53. it('add format plaintext', function() {
  54. const editor = this.initialize(Editor, '<p>Test</p>');
  55. editor.formatLine(0, 5, { table: 'a' });
  56. expect(this.container).toEqualHTML(
  57. '<table><tbody><tr><td data-row="a">Test</td></tr></tbody></table>',
  58. );
  59. });
  60. it('add format replace', function() {
  61. const editor = this.initialize(Editor, '<h1>Test</h1>');
  62. editor.formatLine(0, 5, { table: 'a' });
  63. expect(this.container).toEqualHTML(
  64. '<table><tbody><tr><td data-row="a">Test</td></tr></tbody></table>',
  65. );
  66. });
  67. it('remove format plaintext', function() {
  68. const editor = this.initialize(
  69. Editor,
  70. '<table><tr><td data-row="a">Test</td></tr></table>',
  71. );
  72. editor.formatLine(0, 5, { table: null });
  73. expect(this.container).toEqualHTML('<p>Test</p>');
  74. });
  75. it('remove format replace', function() {
  76. const editor = this.initialize(
  77. Editor,
  78. '<table><tr><td data-row="a">Test</td></tr></table>',
  79. );
  80. editor.formatLine(0, 5, { header: 1 });
  81. expect(this.container).toEqualHTML('<h1>Test</h1>');
  82. });
  83. it('group rows', function() {
  84. const editor = this.initialize(
  85. Editor,
  86. `
  87. <table>
  88. <tbody>
  89. <tr><td data-row="a">A</td></tr>
  90. <tr><td data-row="a">B</td></tr>
  91. </tbody>
  92. </table>
  93. `,
  94. );
  95. editor.scroll.children.head.children.head.children.head.optimize();
  96. expect(this.container).toEqualHTML(`
  97. <table>
  98. <tbody>
  99. <tr><td data-row="a">A</td><td data-row="a">B</td></tr>
  100. </tbody>
  101. </table>
  102. `);
  103. });
  104. it('split rows', function() {
  105. const editor = this.initialize(
  106. Editor,
  107. `
  108. <table>
  109. <tbody>
  110. <tr><td data-row="a">A</td><td data-row="b">B</td></tr>
  111. </tbody>
  112. </table>
  113. `,
  114. );
  115. editor.scroll.children.head.children.head.children.head.optimize();
  116. expect(this.container).toEqualHTML(`
  117. <table>
  118. <tbody>
  119. <tr><td data-row="a">A</td></tr>
  120. <tr><td data-row="b">B</td></tr>
  121. </tbody>
  122. </table>
  123. `);
  124. });
  125. it('group and split rows', function() {
  126. const editor = this.initialize(
  127. Editor,
  128. `
  129. <table>
  130. <tbody>
  131. <tr><td data-row="a">A</td><td data-row="b">B1</td></tr>
  132. <tr><td data-row="b">B2</td></tr>
  133. </tbody>
  134. </table>
  135. `,
  136. );
  137. editor.scroll.children.head.children.head.children.head.optimize();
  138. expect(this.container).toEqualHTML(`
  139. <table>
  140. <tbody>
  141. <tr><td data-row="a">A</td></tr>
  142. <tr><td data-row="b">B1</td><td data-row="b">B2</td></tr>
  143. </tbody>
  144. </table>
  145. `);
  146. });
  147. xit('group and split multiple rows', function() {
  148. const editor = this.initialize(
  149. Editor,
  150. `
  151. <table>
  152. <tbody>
  153. <tr><td data-row="1"><br></td><td data-row="1"><br></td><td data-row="1"><br></td></tr>
  154. <tr><td data-row="2"><br></td><td data-row="2"><br></td><td data-row="2"><br></td></tr>
  155. <tr><td data-row="3"><br></td><td data-row="3"><br></td></tr>
  156. <tr><td data-row="3"><br></td><td data-row="4"><br></td></tr>
  157. <tr><td data-row="4"><br></td><td data-row="4"><br></td></tr>
  158. </tbody>
  159. </table>
  160. `,
  161. );
  162. editor.scroll.children.head.children.head.optimize();
  163. expect(this.container).toEqualHTML(`
  164. <table>
  165. <tbody>
  166. <tr><td data-row="1"><br></td><td data-row="1"><br></td><td data-row="1"><br></td></tr>
  167. <tr><td data-row="2"><br></td><td data-row="2"><br></td><td data-row="2"><br></td></tr>
  168. <tr><td data-row="3"><br></td><td data-row="3"><br></td><td data-row="3"><br></td></tr>
  169. <tr><td data-row="4"><br></td><td data-row="4"><br></td><td data-row="4"><br></td></tr>
  170. </tbody>
  171. </table>
  172. `);
  173. });
  174. it('balance cells', function() {
  175. const editor = this.initialize(
  176. Editor,
  177. `<table>
  178. <tbody>
  179. <tr>
  180. <td data-row="a">A1</td>
  181. </tr>
  182. <tr>
  183. <td data-row="b">B1</td>
  184. <td data-row="b">B2</td>
  185. </tr>
  186. <tr>
  187. <td data-row="c">C1</td>
  188. <td data-row="c">C2</td>
  189. <td data-row="c">C3</td>
  190. </tr>
  191. </tbody>
  192. </table>`,
  193. );
  194. editor.scroll.children.head.balanceCells();
  195. expect(this.container).toEqualHTML(
  196. `<table>
  197. <tbody>
  198. <tr>
  199. <td data-row="a">A1</td>
  200. <td data-row="a"><br></td>
  201. <td data-row="a"><br></td>
  202. </tr>
  203. <tr>
  204. <td data-row="b">B1</td>
  205. <td data-row="b">B2</td>
  206. <td data-row="b"><br></td>
  207. </tr>
  208. <tr>
  209. <td data-row="c">C1</td>
  210. <td data-row="c">C2</td>
  211. <td data-row="c">C3</td>
  212. </tr>
  213. </tbody>
  214. </table>`,
  215. );
  216. });
  217. it('format', function() {
  218. const editor = this.initialize(Editor, '<p>a</p><p>b</p><p>1</p><p>2</p>');
  219. editor.formatLine(0, 4, { table: 'a' });
  220. editor.formatLine(4, 4, { table: 'b' });
  221. expect(this.container).toEqualHTML(
  222. `<table>
  223. <tbody>
  224. <tr>
  225. <td data-row="a">a</td>
  226. <td data-row="a">b</td>
  227. </tr>
  228. <tr>
  229. <td data-row="b">1</td>
  230. <td data-row="b">2</td>
  231. </tr>
  232. </tbody>
  233. </table>`,
  234. );
  235. });
  236. it('applyDelta', function() {
  237. const editor = this.initialize(Editor, '<p><br></p>');
  238. editor.applyDelta(
  239. new Delta().insert('\n\n', { table: 'a' }).insert('\n\n', { table: 'b' }),
  240. );
  241. expect(this.container).toEqualHTML(
  242. `<table>
  243. <tbody>
  244. <tr>
  245. <td data-row="a"><br></td>
  246. <td data-row="a"><br></td>
  247. </tr>
  248. <tr>
  249. <td data-row="b"><br></td>
  250. <td data-row="b"><br></td>
  251. </tr>
  252. </tbody>
  253. </table>
  254. <p><br></p>`,
  255. );
  256. });
  257. it('unbalanced table applyDelta', function() {
  258. const editor = this.initialize(Editor, '<p><br></p>');
  259. editor.applyDelta(
  260. new Delta()
  261. .insert('A1\nB1\nC1\n', { table: '1' })
  262. .insert('A2\nB2\nC2\n', { table: '2' })
  263. .insert('A3\nB3\n', { table: '3' }),
  264. );
  265. expect(this.container).toEqualHTML(
  266. `<table>
  267. <tbody>
  268. <tr>
  269. <td data-row="1">A1</td>
  270. <td data-row="1">B1</td>
  271. <td data-row="1">C1</td>
  272. </tr>
  273. <tr>
  274. <td data-row="2">A2</td>
  275. <td data-row="2">B2</td>
  276. <td data-row="2">C2</td>
  277. </tr>
  278. <tr>
  279. <td data-row="3">A3</td>
  280. <td data-row="3">B3</td>
  281. </tr>
  282. </tbody>
  283. </table>
  284. <p><br></p>`,
  285. );
  286. });
  287. it('existing table applyDelta', function() {
  288. const editor = this.initialize(
  289. Editor,
  290. `
  291. <table>
  292. <tbody>
  293. <tr>
  294. <td data-row="1">A1</td>
  295. </tr>
  296. <tr>
  297. <td data-row="2"><br></td>
  298. <td data-row="2">B1</td>
  299. </tr>
  300. </tbody>
  301. </table>`,
  302. );
  303. editor.applyDelta(
  304. new Delta()
  305. .retain(3)
  306. .retain(1, { table: '1' })
  307. .insert('\n', { table: '2' }),
  308. );
  309. expect(this.container).toEqualHTML(
  310. `<table>
  311. <tbody>
  312. <tr>
  313. <td data-row="1">A1</td>
  314. <td data-row="1"><br></td>
  315. </tr>
  316. <tr>
  317. <td data-row="2"><br></td>
  318. <td data-row="2">B1</td>
  319. </tr>
  320. </tbody>
  321. </table>`,
  322. );
  323. });
  324. });