Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

move-to-page.command.spec.ts 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import { TLDrawState } from '~state'
  2. import { mockDocument } from '~test'
  3. import { ArrowShape, TLDrawShapeType } from '~types'
  4. describe('Move to page command', () => {
  5. const tlstate = new TLDrawState()
  6. beforeEach(() => {
  7. tlstate.loadDocument(mockDocument).createPage('page2').changePage('page1')
  8. })
  9. describe('when no shape is selected', () => {
  10. it('does nothing', () => {
  11. const initialState = tlstate.state
  12. tlstate.moveToPage('page2')
  13. const currentState = tlstate.state
  14. expect(currentState).toEqual(initialState)
  15. })
  16. })
  17. /*
  18. Moving shapes to a new page should remove those shapes from the
  19. current page and add them to the specified page. If bindings exist
  20. that effect the moved shapes, then the bindings should be destroyed
  21. on the old page and created on the new page only if both the "to"
  22. and "from" shapes were moved. The app should then change pages to
  23. the new page.
  24. */
  25. it('does, undoes and redoes command', () => {
  26. tlstate.select('rect1', 'rect2').moveToPage('page2')
  27. expect(tlstate.currentPageId).toBe('page2')
  28. expect(tlstate.getShape('rect1', 'page1')).toBeUndefined()
  29. expect(tlstate.getShape('rect1', 'page2')).toBeDefined()
  30. expect(tlstate.getShape('rect2', 'page1')).toBeUndefined()
  31. expect(tlstate.getShape('rect2', 'page2')).toBeDefined()
  32. expect(tlstate.selectedIds).toStrictEqual(['rect1', 'rect2'])
  33. tlstate.undo()
  34. expect(tlstate.getShape('rect1', 'page1')).toBeDefined()
  35. expect(tlstate.getShape('rect1', 'page2')).toBeUndefined()
  36. expect(tlstate.getShape('rect2', 'page1')).toBeDefined()
  37. expect(tlstate.getShape('rect2', 'page2')).toBeUndefined()
  38. expect(tlstate.selectedIds).toStrictEqual(['rect1', 'rect2'])
  39. expect(tlstate.currentPageId).toBe('page1')
  40. tlstate.redo()
  41. expect(tlstate.getShape('rect1', 'page1')).toBeUndefined()
  42. expect(tlstate.getShape('rect1', 'page2')).toBeDefined()
  43. expect(tlstate.getShape('rect2', 'page1')).toBeUndefined()
  44. expect(tlstate.getShape('rect2', 'page2')).toBeDefined()
  45. expect(tlstate.selectedIds).toStrictEqual(['rect1', 'rect2'])
  46. expect(tlstate.currentPageId).toBe('page2')
  47. })
  48. describe('when moving shapes with bindings', () => {
  49. it('deletes bindings when only the bound-to shape is moved', () => {
  50. tlstate
  51. .selectAll()
  52. .delete()
  53. .createShapes(
  54. { type: TLDrawShapeType.Rectangle, id: 'target1', size: [100, 100] },
  55. { type: TLDrawShapeType.Arrow, id: 'arrow1', point: [200, 200] }
  56. )
  57. .select('arrow1')
  58. .startHandleSession([200, 200], 'start')
  59. .updateHandleSession([50, 50])
  60. .completeSession()
  61. const bindingId = tlstate.bindings[0].id
  62. expect(tlstate.getShape<ArrowShape>('arrow1').handles.start.bindingId).toBe(bindingId)
  63. tlstate.select('target1').moveToPage('page2')
  64. expect(
  65. tlstate.getShape<ArrowShape>('arrow1', 'page1').handles.start.bindingId
  66. ).toBeUndefined()
  67. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  68. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  69. tlstate.undo()
  70. expect(tlstate.getShape<ArrowShape>('arrow1', 'page1').handles.start.bindingId).toBe(
  71. bindingId
  72. )
  73. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeDefined()
  74. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  75. tlstate.redo()
  76. expect(
  77. tlstate.getShape<ArrowShape>('arrow1', 'page1').handles.start.bindingId
  78. ).toBeUndefined()
  79. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  80. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  81. })
  82. it('deletes bindings when only the bound-from shape is moved', () => {
  83. tlstate
  84. .selectAll()
  85. .delete()
  86. .createShapes(
  87. { type: TLDrawShapeType.Rectangle, id: 'target1', size: [100, 100] },
  88. { type: TLDrawShapeType.Arrow, id: 'arrow1', point: [200, 200] }
  89. )
  90. .select('arrow1')
  91. .startHandleSession([200, 200], 'start')
  92. .updateHandleSession([50, 50])
  93. .completeSession()
  94. const bindingId = tlstate.bindings[0].id
  95. expect(tlstate.getShape<ArrowShape>('arrow1').handles.start.bindingId).toBe(bindingId)
  96. tlstate.select('arrow1').moveToPage('page2')
  97. expect(
  98. tlstate.getShape<ArrowShape>('arrow1', 'page2').handles.start.bindingId
  99. ).toBeUndefined()
  100. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  101. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  102. tlstate.undo()
  103. expect(tlstate.getShape<ArrowShape>('arrow1', 'page1').handles.start.bindingId).toBe(
  104. bindingId
  105. )
  106. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeDefined()
  107. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  108. tlstate.redo()
  109. expect(
  110. tlstate.getShape<ArrowShape>('arrow1', 'page2').handles.start.bindingId
  111. ).toBeUndefined()
  112. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  113. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  114. })
  115. it('moves bindings when both shapes are moved', () => {
  116. tlstate
  117. .selectAll()
  118. .delete()
  119. .createShapes(
  120. { type: TLDrawShapeType.Rectangle, id: 'target1', size: [100, 100] },
  121. { type: TLDrawShapeType.Arrow, id: 'arrow1', point: [200, 200] }
  122. )
  123. .select('arrow1')
  124. .startHandleSession([200, 200], 'start')
  125. .updateHandleSession([50, 50])
  126. .completeSession()
  127. const bindingId = tlstate.bindings[0].id
  128. expect(tlstate.getShape<ArrowShape>('arrow1').handles.start.bindingId).toBe(bindingId)
  129. tlstate.select('arrow1', 'target1').moveToPage('page2')
  130. expect(tlstate.getShape<ArrowShape>('arrow1', 'page2').handles.start.bindingId).toBe(
  131. bindingId
  132. )
  133. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  134. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeDefined()
  135. tlstate.undo()
  136. expect(tlstate.getShape<ArrowShape>('arrow1', 'page1').handles.start.bindingId).toBe(
  137. bindingId
  138. )
  139. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeDefined()
  140. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeUndefined()
  141. tlstate.redo()
  142. expect(tlstate.getShape<ArrowShape>('arrow1', 'page2').handles.start.bindingId).toBe(
  143. bindingId
  144. )
  145. expect(tlstate.document.pages['page1'].bindings[bindingId]).toBeUndefined()
  146. expect(tlstate.document.pages['page2'].bindings[bindingId]).toBeDefined()
  147. })
  148. })
  149. describe('when moving grouped shapes', () => {
  150. it('moves groups and their children', () => {
  151. tlstate.group(['rect1', 'rect2'], 'groupA').moveToPage('page2')
  152. expect(tlstate.getShape('rect1', 'page1')).toBeUndefined()
  153. expect(tlstate.getShape('rect2', 'page1')).toBeUndefined()
  154. expect(tlstate.getShape('groupA', 'page1')).toBeUndefined()
  155. expect(tlstate.getShape('rect1', 'page2')).toBeDefined()
  156. expect(tlstate.getShape('rect2', 'page2')).toBeDefined()
  157. expect(tlstate.getShape('groupA', 'page2')).toBeDefined()
  158. tlstate.undo()
  159. expect(tlstate.getShape('rect1', 'page2')).toBeUndefined()
  160. expect(tlstate.getShape('rect2', 'page2')).toBeUndefined()
  161. expect(tlstate.getShape('groupA', 'page2')).toBeUndefined()
  162. expect(tlstate.getShape('rect1', 'page1')).toBeDefined()
  163. expect(tlstate.getShape('rect2', 'page1')).toBeDefined()
  164. expect(tlstate.getShape('groupA', 'page1')).toBeDefined()
  165. tlstate.redo()
  166. expect(tlstate.getShape('rect1', 'page1')).toBeUndefined()
  167. expect(tlstate.getShape('rect2', 'page1')).toBeUndefined()
  168. expect(tlstate.getShape('groupA', 'page1')).toBeUndefined()
  169. expect(tlstate.getShape('rect1', 'page2')).toBeDefined()
  170. expect(tlstate.getShape('rect2', 'page2')).toBeDefined()
  171. expect(tlstate.getShape('groupA', 'page2')).toBeDefined()
  172. })
  173. it.todo('deletes groups shapes if the groups children were all moved')
  174. it('reparents grouped shapes if the group is not moved', () => {
  175. tlstate.group(['rect1', 'rect2', 'rect3'], 'groupA').select('rect1').moveToPage('page2')
  176. expect(tlstate.getShape('rect1', 'page1')).toBeUndefined()
  177. expect(tlstate.getShape('rect1', 'page2')).toBeDefined()
  178. expect(tlstate.getShape('rect1', 'page2').parentId).toBe('page2')
  179. expect(tlstate.getShape('groupA', 'page1').children).toStrictEqual(['rect2', 'rect3'])
  180. tlstate.undo()
  181. expect(tlstate.getShape('rect1', 'page2')).toBeUndefined()
  182. expect(tlstate.getShape('rect1', 'page1').parentId).toBe('groupA')
  183. expect(tlstate.getShape('groupA', 'page1').children).toStrictEqual([
  184. 'rect1',
  185. 'rect2',
  186. 'rect3',
  187. ])
  188. })
  189. })
  190. })