@nyaruka/temba-components 0.130.1 → 0.130.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/CHANGELOG.md +34 -4
  2. package/DEV_DATA.md +89 -0
  3. package/demo/data/flows/food-order.json +4 -4
  4. package/demo/data/flows/sample-flow.json +132 -147
  5. package/dist/temba-components.js +787 -659
  6. package/dist/temba-components.js.map +1 -1
  7. package/out-tsc/src/display/Chat.js +5 -3
  8. package/out-tsc/src/display/Chat.js.map +1 -1
  9. package/out-tsc/src/events.js.map +1 -1
  10. package/out-tsc/src/flow/CanvasNode.js +83 -78
  11. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  12. package/out-tsc/src/flow/Editor.js +1 -0
  13. package/out-tsc/src/flow/Editor.js.map +1 -1
  14. package/out-tsc/src/flow/NodeEditor.js +47 -3
  15. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  16. package/out-tsc/src/flow/actions/add_contact_urn.js +1 -1
  17. package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
  18. package/out-tsc/src/flow/actions/set_contact_channel.js +1 -1
  19. package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
  20. package/out-tsc/src/flow/actions/set_contact_field.js +2 -1
  21. package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
  22. package/out-tsc/src/flow/actions/set_contact_language.js +3 -1
  23. package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
  24. package/out-tsc/src/flow/actions/set_contact_name.js +1 -1
  25. package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
  26. package/out-tsc/src/flow/actions/set_contact_status.js +17 -14
  27. package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
  28. package/out-tsc/src/flow/actions/set_run_result.js +1 -1
  29. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  30. package/out-tsc/src/flow/nodes/split_by_llm.js +12 -12
  31. package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
  32. package/out-tsc/src/flow/nodes/wait_for_response.js +609 -6
  33. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  34. package/out-tsc/src/flow/operators.js +194 -0
  35. package/out-tsc/src/flow/operators.js.map +1 -0
  36. package/out-tsc/src/flow/types.js.map +1 -1
  37. package/out-tsc/src/form/ArrayEditor.js +84 -19
  38. package/out-tsc/src/form/ArrayEditor.js.map +1 -1
  39. package/out-tsc/src/form/Checkbox.js +12 -0
  40. package/out-tsc/src/form/Checkbox.js.map +1 -1
  41. package/out-tsc/src/form/FieldRenderer.js +13 -3
  42. package/out-tsc/src/form/FieldRenderer.js.map +1 -1
  43. package/out-tsc/src/form/TextInput.js +20 -1
  44. package/out-tsc/src/form/TextInput.js.map +1 -1
  45. package/out-tsc/src/form/select/Select.js +7 -0
  46. package/out-tsc/src/form/select/Select.js.map +1 -1
  47. package/out-tsc/src/interfaces.js.map +1 -1
  48. package/out-tsc/src/layout/Dialog.js +3 -4
  49. package/out-tsc/src/layout/Dialog.js.map +1 -1
  50. package/out-tsc/src/list/RunList.js +2 -2
  51. package/out-tsc/src/list/RunList.js.map +1 -1
  52. package/out-tsc/src/live/ContactChat.js +101 -44
  53. package/out-tsc/src/live/ContactChat.js.map +1 -1
  54. package/out-tsc/src/live/ContactDetails.js +7 -0
  55. package/out-tsc/src/live/ContactDetails.js.map +1 -1
  56. package/out-tsc/src/live/ContactNameFetch.js +1 -1
  57. package/out-tsc/src/live/ContactNameFetch.js.map +1 -1
  58. package/out-tsc/src/webchat/index.js +0 -11
  59. package/out-tsc/src/webchat/index.js.map +1 -1
  60. package/out-tsc/test/NodeHelper.js +25 -27
  61. package/out-tsc/test/NodeHelper.js.map +1 -1
  62. package/out-tsc/test/nodes/split_by_llm.test.js +12 -4
  63. package/out-tsc/test/nodes/split_by_llm.test.js.map +1 -1
  64. package/out-tsc/test/nodes/split_by_llm_categorize.test.js +101 -91
  65. package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -1
  66. package/out-tsc/test/nodes/split_by_random.test.js +120 -112
  67. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
  68. package/out-tsc/test/nodes/wait_for_digits.test.js +131 -111
  69. package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
  70. package/out-tsc/test/nodes/wait_for_response.test.js +549 -85
  71. package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
  72. package/out-tsc/test/temba-checkbox.test.js +32 -32
  73. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  74. package/out-tsc/test/temba-contact-chat.test.js +2 -1
  75. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  76. package/out-tsc/test/temba-dropdown.test.js +0 -4
  77. package/out-tsc/test/temba-dropdown.test.js.map +1 -1
  78. package/out-tsc/test/temba-flow-editor-node.test.js +9 -4
  79. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
  80. package/out-tsc/test/temba-integration-markdown.test.js +13 -15
  81. package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
  82. package/out-tsc/test/temba-node-editor.test.js +5 -38
  83. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  84. package/out-tsc/test/temba-run-list.test.js +2 -2
  85. package/out-tsc/test/temba-run-list.test.js.map +1 -1
  86. package/out-tsc/test/utils.test.js +2 -1
  87. package/out-tsc/test/utils.test.js.map +1 -1
  88. package/package.json +6 -2
  89. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  90. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  91. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  92. package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
  93. package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
  94. package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
  95. package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
  96. package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
  97. package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
  98. package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
  99. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  100. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  101. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  102. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  103. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  104. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  105. package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
  106. package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
  107. package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
  108. package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
  109. package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
  110. package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
  111. package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
  112. package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
  113. package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
  114. package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
  115. package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
  116. package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
  117. package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
  118. package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
  119. package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
  120. package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
  121. package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
  122. package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
  123. package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
  124. package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
  125. package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
  126. package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
  127. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  128. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  129. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  130. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  131. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  132. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  133. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  134. package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
  135. package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
  136. package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
  137. package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
  138. package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
  139. package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
  140. package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
  141. package/screenshots/truth/checkbox/checkbox-label-background-hover.png +0 -0
  142. package/screenshots/truth/checkbox/checkbox-whitespace-label-no-background-hover.png +0 -0
  143. package/screenshots/truth/checkbox/checkbox-with-help-text.png +0 -0
  144. package/screenshots/truth/checkbox/checked.png +0 -0
  145. package/screenshots/truth/checkbox/default.png +0 -0
  146. package/screenshots/truth/editor/wait.png +0 -0
  147. package/screenshots/truth/integration/textinput-markdown-errors.png +0 -0
  148. package/screenshots/truth/lightbox/img-zoomed.png +0 -0
  149. package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
  150. package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
  151. package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
  152. package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
  153. package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
  154. package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
  155. package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
  156. package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
  157. package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
  158. package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
  159. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  160. package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
  161. package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
  162. package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
  163. package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
  164. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  165. package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
  166. package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
  167. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  168. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  169. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  170. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  171. package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
  172. package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
  173. package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
  174. package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
  175. package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
  176. package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
  177. package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
  178. package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
  179. package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
  180. package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
  181. package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
  182. package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
  183. package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
  184. package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
  185. package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
  186. package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
  187. package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
  188. package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
  189. package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
  190. package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
  191. package/screenshots/truth/run-list/basic.png +0 -0
  192. package/screenshots/truth/templates/default.png +0 -0
  193. package/screenshots/truth/wait-for-response/rules-editor.png +0 -0
  194. package/screenshots/truth/wait-for-response/timeout-editor-unchecked.png +0 -0
  195. package/screenshots/truth/wait-for-response/timeout-editor.png +0 -0
  196. package/scripts/dev-data-sync.mjs +182 -0
  197. package/src/display/Chat.ts +6 -4
  198. package/src/events.ts +6 -6
  199. package/src/flow/CanvasNode.ts +89 -79
  200. package/src/flow/Editor.ts +1 -0
  201. package/src/flow/NodeEditor.ts +55 -3
  202. package/src/flow/actions/add_contact_urn.ts +1 -1
  203. package/src/flow/actions/set_contact_channel.ts +1 -1
  204. package/src/flow/actions/set_contact_field.ts +2 -1
  205. package/src/flow/actions/set_contact_language.ts +3 -1
  206. package/src/flow/actions/set_contact_name.ts +1 -1
  207. package/src/flow/actions/set_contact_status.ts +18 -18
  208. package/src/flow/actions/set_run_result.ts +1 -1
  209. package/src/flow/nodes/split_by_llm.ts +14 -13
  210. package/src/flow/nodes/wait_for_response.ts +717 -5
  211. package/src/flow/operators.ts +215 -0
  212. package/src/flow/types.ts +10 -2
  213. package/src/form/ArrayEditor.ts +117 -37
  214. package/src/form/Checkbox.ts +12 -0
  215. package/src/form/FieldRenderer.ts +24 -3
  216. package/src/form/TextInput.ts +19 -1
  217. package/src/form/select/Select.ts +7 -0
  218. package/src/interfaces.ts +1 -1
  219. package/src/layout/Dialog.ts +4 -4
  220. package/src/list/RunList.ts +2 -2
  221. package/src/live/ContactChat.ts +128 -67
  222. package/src/live/ContactDetails.ts +7 -0
  223. package/src/live/ContactNameFetch.ts +1 -1
  224. package/src/webchat/index.ts +0 -16
  225. package/static/api/labels.json +6 -1
  226. package/test/NodeHelper.ts +38 -40
  227. package/test/nodes/split_by_llm.test.ts +43 -32
  228. package/test/nodes/split_by_llm_categorize.test.ts +130 -120
  229. package/test/nodes/split_by_random.test.ts +136 -128
  230. package/test/nodes/wait_for_digits.test.ts +147 -127
  231. package/test/nodes/wait_for_response.test.ts +657 -104
  232. package/test/temba-checkbox.test.ts +36 -32
  233. package/test/temba-contact-chat.test.ts +2 -1
  234. package/test/temba-dropdown.test.ts +0 -12
  235. package/test/temba-flow-editor-node.test.ts +11 -4
  236. package/test/temba-integration-markdown.test.ts +16 -17
  237. package/test/temba-node-editor.test.ts +5 -43
  238. package/test/temba-run-list.test.ts +2 -2
  239. package/test/utils.test.ts +2 -1
  240. package/test-assets/contacts/history.json +4 -7
  241. package/test-assets/list/runs.json +8 -8
  242. package/web-dev-mock.mjs +86 -30
  243. package/web-dev-server.config.mjs +272 -31
  244. package/screenshots/truth/dropdown/bottom-edge-collision.png +0 -0
  245. package/screenshots/truth/dropdown/right-edge-collision.png +0 -0
  246. package/screenshots/truth/editor/send_msg.png +0 -0
  247. package/screenshots/truth/editor/set_contact_language.png +0 -0
  248. package/screenshots/truth/editor/set_contact_name.png +0 -0
  249. package/screenshots/truth/editor/set_run_result.png +0 -0
  250. package/screenshots/truth/integration/checkbox-markdown-errors.png +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"temba-flow-editor-node.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor-node.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { html, fixture, expect } from '@open-wc/testing';\nimport { CanvasNode } from '../src/flow/CanvasNode';\nimport {\n Node,\n NodeUI,\n Action,\n Exit,\n Router\n} from '../src/store/flow-definition.d';\nimport { stub, restore, useFakeTimers } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\n\ndescribe('EditorNode', () => {\n let editorNode: CanvasNode;\n let mockPlumber: any;\n\n beforeEach(async () => {\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub()\n };\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editorNode = new CanvasNode();\n expect(editorNode.createRenderRoot()).to.equal(editorNode);\n });\n });\n\n describe('renderAction', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders action with known config', () => {\n const mockNode: Node = {\n uuid: 'test-node-3',\n actions: [],\n exits: []\n };\n\n const action: any = {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Test message',\n quick_replies: []\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 0);\n expect(result).to.exist;\n });\n\n it('renders action with unknown config', () => {\n const mockNode: Node = {\n uuid: 'test-node-4',\n actions: [],\n exits: []\n };\n\n const action: Action = {\n type: 'unknown_action' as any,\n uuid: 'action-1'\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 1);\n expect(result).to.exist;\n });\n });\n\n describe('renderRouter', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders router with result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n result_name: 'test_result',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('renders router without result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('returns undefined for router with unknown UI type', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'unknown_type' as any\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.be.undefined;\n });\n });\n\n describe('renderCategories', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('returns null when no router', () => {\n const mockNode: Node = {\n uuid: 'test-node-7',\n actions: [],\n exits: []\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('returns null when no categories', () => {\n const mockNode: Node = {\n uuid: 'test-node-8',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: undefined as any\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('renders categories with exits', () => {\n const mockNode: Node = {\n uuid: 'test-node-9',\n actions: [],\n exits: [{ uuid: 'exit-1' }, { uuid: 'exit-2' }],\n router: {\n type: 'switch',\n categories: [\n { uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Category 2', exit_uuid: 'exit-2' }\n ]\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.exist;\n });\n });\n\n describe('renderExit', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders exit with connected class when destination exists', async () => {\n const exit: Exit = {\n uuid: 'exit-connected',\n destination_uuid: 'destination-node'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.true;\n expect(exitElement?.getAttribute('id')).to.equal('exit-connected');\n });\n\n it('renders exit without connected class when no destination', async () => {\n const exit: Exit = {\n uuid: 'exit-unconnected'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.false;\n expect(exitElement?.getAttribute('id')).to.equal('exit-unconnected');\n });\n });\n\n describe('renderTitle', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders title with config color and name', async () => {\n const config = {\n name: 'Test Action',\n color: '#ff0000'\n };\n\n const result = (editorNode as any).renderTitle(config);\n const container = await fixture(html`<div>${result}</div>`);\n\n const title = container.querySelector('.title');\n expect(title).to.exist;\n expect(title?.textContent?.trim()).to.equal('Test Action');\n expect(title?.getAttribute('style')).to.contain('background:#ff0000');\n });\n });\n\n describe('updated lifecycle', () => {\n it('handles updated without node changes', () => {\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n\n const changes = new Map();\n changes.set('other', true);\n\n // Should not throw and not call plumber methods\n expect(() => {\n (editorNode as any).updated(changes);\n }).to.not.throw();\n\n expect(mockPlumber.makeTarget).to.not.have.been.called;\n });\n\n it('verifies updated method exists', () => {\n editorNode = new CanvasNode();\n expect(typeof (editorNode as any).updated).to.equal('function');\n });\n\n it('processes node changes and calls plumber methods', () => {\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n\n const mockNode: Node = {\n uuid: 'test-node-10',\n actions: [],\n exits: [\n { uuid: 'exit-1', destination_uuid: 'node-2' },\n { uuid: 'exit-2' } // This should call makeSource\n ]\n };\n\n // Mock querySelector to return a mock element with getBoundingClientRect\n const mockElement = {\n getBoundingClientRect: stub().returns({ width: 200, height: 100 })\n };\n stub(editorNode, 'querySelector').returns(mockElement as any);\n\n // Simulate the updated lifecycle\n (editorNode as any).node = mockNode;\n\n const changes = new Map();\n changes.set('node', true);\n\n // Test just the plumber method calls without store dependency\n // by directly calling the logic that would be in updated\n if ((editorNode as any).plumber && mockNode) {\n (editorNode as any).plumber.makeTarget(mockNode.uuid);\n\n for (const exit of mockNode.exits) {\n if (!exit.destination_uuid) {\n (editorNode as any).plumber.makeSource(exit.uuid);\n } else {\n (editorNode as any).plumber.connectIds(\n exit.uuid,\n exit.destination_uuid\n );\n }\n }\n }\n\n expect(mockPlumber.makeTarget).to.have.been.calledWith('test-node-10');\n expect(mockPlumber.makeSource).to.have.been.calledWith('exit-2');\n expect(mockPlumber.connectIds).to.have.been.calledWith(\n 'exit-1',\n 'node-2'\n );\n });\n });\n\n describe('basic integration', () => {\n it('can create and verify structure without full rendering', () => {\n const mockNode: Node = {\n uuid: 'integration-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: 'next-node' }]\n };\n\n // Test individual render methods work\n editorNode = new CanvasNode();\n\n // Test renderAction\n const actionResult = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n expect(actionResult).to.exist;\n\n // Test renderExit\n const exitResult = (editorNode as any).renderExit(mockNode.exits[0]);\n expect(exitResult).to.exist;\n\n // Verify the node structure is as expected\n expect(mockNode.uuid).to.equal('integration-test-node');\n expect(mockNode.actions).to.have.length(1);\n expect(mockNode.exits).to.have.length(1);\n });\n });\n\n describe('drag and drop functionality', () => {\n let editorNode: CanvasNode;\n\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders actions with sortable class and proper IDs', async () => {\n const mockNode: Node = {\n uuid: 'sortable-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n // Test that renderAction includes sortable class and proper ID\n const result1 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n const result2 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[1],\n 1\n );\n\n expect(result1).to.exist;\n expect(result2).to.exist;\n\n // Render the template to check the actual DOM\n const container1 = await fixture(html`<div>${result1}</div>`);\n const container2 = await fixture(html`<div>${result2}</div>`);\n\n const actionElement1 = container1.querySelector('.action');\n const actionElement2 = container2.querySelector('.action');\n\n expect(actionElement1).to.exist;\n expect(actionElement1?.classList.contains('sortable')).to.be.true;\n expect(actionElement1?.id).to.equal('action-0');\n\n expect(actionElement2).to.exist;\n expect(actionElement2?.classList.contains('sortable')).to.be.true;\n expect(actionElement2?.id).to.equal('action-1');\n });\n\n it('includes drag handle in rendered actions', async () => {\n const mockNode: Node = {\n uuid: 'drag-handle-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n let editorNode: CanvasNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n // No drag handle should be present if only one action\n let dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.not.exist;\n\n // Now add a second action to verify drag handle appears\n mockNode.actions.push({\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any);\n\n editorNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.exist;\n });\n\n it('renders SortableList when actions are present', async () => {\n const mockNode: Node = {\n uuid: 'sortable-list-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n });\n\n it('does not render SortableList when no actions', async () => {\n const mockNode: Node = {\n uuid: 'no-actions-test',\n actions: [],\n exits: [{ uuid: 'exit-1' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Check that template does not include temba-sortable-list\n expect(renderResult.strings.join('')).to.not.contain(\n 'temba-sortable-list'\n );\n });\n\n it('handles order changed events correctly', async () => {\n const mockNode: Node = {\n uuid: 'order-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Create a mock order changed event (swap first and last actions)\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 2] }\n });\n\n // Call the handler directly\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify the actions were reordered correctly\n expect((editorNode as any).node.actions).to.have.length(3);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Second'\n );\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Third'\n );\n expect(((editorNode as any).node.actions[2] as any).text).to.equal(\n 'First'\n );\n });\n\n it('preserves action data during reordering', () => {\n const mockNode: Node = {\n uuid: 'preserve-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Message 1',\n quick_replies: ['Yes', 'No']\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Message 2',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Swap the two actions\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 1] }\n });\n\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify all action data is preserved\n expect((editorNode as any).node.actions).to.have.length(2);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Message 2'\n );\n expect(\n ((editorNode as any).node.actions[0] as any).quick_replies\n ).to.deep.equal([]);\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Message 1'\n );\n expect(\n ((editorNode as any).node.actions[1] as any).quick_replies\n ).to.deep.equal(['Yes', 'No']);\n });\n\n it('integrates with SortableList for full drag functionality', async () => {\n const mockNode: Node = {\n uuid: 'integration-drag-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third Action',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Render the full component\n const renderResult = editorNode.render();\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n // Find the sortable list\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n\n // Verify all actions are rendered as sortable items\n const sortableItems = container.querySelectorAll('.sortable');\n expect(sortableItems).to.have.length(3);\n\n // Verify each action has correct ID and structure\n expect(sortableItems[0].id).to.equal('action-0');\n expect(sortableItems[1].id).to.equal('action-1');\n expect(sortableItems[2].id).to.equal('action-2');\n\n // Verify drag handles are present\n const dragHandles = container.querySelectorAll('.drag-handle');\n expect(dragHandles).to.have.length(3);\n });\n });\n\n describe('exit disconnection', () => {\n let mockStore: any;\n let mockUpdateNode: any;\n\n beforeEach(() => {\n mockUpdateNode = stub();\n mockStore = {\n getState: stub().returns({\n updateNode: mockUpdateNode\n })\n };\n\n // Mock the plumber with disconnect capabilities\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub(),\n removeExitConnection: stub().returns(true),\n setConnectionRemovingState: stub().returns(true)\n };\n\n (window as any).getStore = () => mockStore;\n\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n });\n\n afterEach(() => {\n // Restore any stubbed functions\n if ((window as any).originalGetStore) {\n (window as any).getStore = (window as any).originalGetStore;\n }\n });\n\n it('handles exit click to initiate disconnection', async () => {\n // Create a node with a connected exit\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [{ uuid: 'exit-1', destination_uuid: 'target-node' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Mock querySelector to return the exit element\n const exitElement = document.createElement('div');\n exitElement.id = 'exit-1';\n exitElement.classList.add('exit', 'connected');\n (editorNode as any).querySelector = stub().returns(exitElement);\n\n // Create a mock event\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub(),\n currentTarget: exitElement\n } as any;\n\n // Mock getStore directly in the disconnectExit method\n const originalDisconnectExit = (editorNode as any).disconnectExit;\n (editorNode as any).disconnectExit = function (exit: any) {\n // Call original but override the store logic\n this.plumber.removeExitConnection(exit.uuid);\n mockUpdateNode.call(null, this.node.uuid, {\n ...this.node,\n exits: this.node.exits.map((e: any) =>\n e.uuid === exit.uuid ? { ...e, destination_uuid: null } : e\n )\n });\n };\n\n // Call the click handler directly to initiate removal\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the exit is marked for removal in the component state\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.true;\n\n // Verify a timeout was set\n expect((editorNode as any).exitRemovalTimeouts.has('exit-1')).to.be.true;\n\n // Now click again to confirm disconnection\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the plumber was called to remove the connection\n expect(mockPlumber.removeExitConnection).to.have.been.calledWith(\n 'exit-1'\n );\n\n // Verify the node was updated with disconnected exit\n expect(mockUpdateNode).to.have.been.called;\n\n // Restore original method\n (editorNode as any).disconnectExit = originalDisconnectExit;\n });\n\n it('cancels disconnection after timeout', async () => {\n // Create a fake timer for this test\n const clock = useFakeTimers();\n\n try {\n // Create a node with a connected exit\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [{ uuid: 'exit-1', destination_uuid: 'target-node' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Mock querySelector to return the exit element\n const exitElement = document.createElement('div');\n exitElement.id = 'exit-1';\n exitElement.classList.add('exit', 'connected');\n (editorNode as any).querySelector = stub().returns(exitElement);\n\n // Create a mock event\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub(),\n currentTarget: exitElement\n } as any;\n\n // Call the click handler to initiate disconnection\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the exit is marked for removal\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.true;\n\n // Advance the clock past the timeout (1500ms is the default timeout)\n clock.tick(1501);\n\n // Verify the removing state is cleared after the timeout\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.false;\n expect(mockPlumber.setConnectionRemovingState).to.have.been.calledWith(\n 'exit-1',\n false\n );\n } finally {\n // Always restore the clock\n clock.restore();\n }\n });\n });\n\n describe('action removal', () => {\n let editorNode: CanvasNode;\n let mockPlumber: any;\n let getStoreStub: any;\n\n beforeEach(() => {\n editorNode = new CanvasNode();\n\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub(),\n removeExitConnection: stub()\n };\n editorNode['plumber'] = mockPlumber;\n });\n\n afterEach(() => {\n if (getStoreStub) {\n getStoreStub.restore();\n }\n });\n\n it('handles action removal state management', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Initially, no action should be in removing state\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .false;\n\n // Call the click handler to initiate removal\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n // Verify the action is marked for removal\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n\n // Verify event handlers were called\n expect(mockEvent.preventDefault).to.have.been.called;\n expect(mockEvent.stopPropagation).to.have.been.called;\n });\n\n it('cancels action removal after timeout', async () => {\n const clock = useFakeTimers();\n\n try {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Call the click handler to initiate removal\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n // Verify the action is marked for removal\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n\n // Advance the clock past the timeout (1000ms is the action removal timeout)\n clock.tick(1001);\n\n // Verify the removing state is cleared after the timeout\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .false;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .false;\n } finally {\n // Always restore the clock\n clock.restore();\n }\n });\n\n it('clears timeouts on disconnect', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Start a removal process\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n\n // Disconnect the component\n editorNode.disconnectedCallback();\n\n // Verify all state is cleared\n expect((editorNode as any).actionRemovingState.size).to.equal(0);\n expect((editorNode as any).actionRemovalTimeouts.size).to.equal(0);\n });\n\n it('renders action with remove button', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n // Test that renderAction includes remove button\n const result = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n\n expect(result).to.exist;\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${result}</div>`);\n const removeButton = container.querySelector('.remove-button');\n\n expect(removeButton).to.exist;\n expect(removeButton?.textContent?.trim()).to.equal('✕');\n expect(removeButton?.getAttribute('title')).to.equal('Remove action');\n });\n\n it('shows removing state in UI', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n // Set action to removing state\n (editorNode as any).actionRemovingState.add('action-1');\n\n // Test that renderAction shows removing state\n const result = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n\n expect(result).to.exist;\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${result}</div>`);\n const actionElement = container.querySelector('.action');\n\n expect(actionElement).to.exist;\n expect(actionElement?.classList.contains('removing')).to.be.true;\n\n // Check that title shows \"Remove?\"\n const titleElement = container.querySelector('.title .name');\n expect(titleElement?.textContent?.trim()).to.equal('Remove?');\n });\n\n it('handles multiple action removal states independently', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Start removal for first action\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovingState.has('action-2')).to.be\n .false;\n\n // Start removal for second action\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[1],\n 1\n );\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovingState.has('action-2')).to.be\n .true;\n\n // Both actions should have timeouts\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-2')).to.be\n .true;\n });\n\n it('properly reroutes JSPlumb connections when removing node with connections', async () => {\n // This test verifies that the connection rerouting logic works correctly\n // by testing the specific logic within removeNodeWithConnections\n\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-after', destination_uuid: 'node-after' }]\n };\n\n editorNode['node'] = mockNode;\n\n // Mock the flow definition that would be returned by getStore\n const mockFlowDefinition = {\n nodes: [\n {\n uuid: 'node-before',\n exits: [\n { uuid: 'exit-before-1', destination_uuid: 'test-node' },\n { uuid: 'exit-before-2', destination_uuid: 'test-node' }\n ]\n },\n mockNode,\n {\n uuid: 'node-after',\n exits: []\n }\n ]\n };\n\n // Test the connection rerouting logic directly by simulating what happens\n // when a node with incoming and outgoing connections is removed\n const nodeUuid = mockNode.uuid;\n const incomingConnections: {\n exitUuid: string;\n sourceNodeUuid: string;\n }[] = [];\n const outgoingExits = mockNode.exits.filter(\n (exit) => exit.destination_uuid\n );\n\n // Find incoming connections (same logic as in removeNodeWithConnections)\n for (const node of mockFlowDefinition.nodes) {\n if (node.uuid !== nodeUuid) {\n for (const exit of node.exits) {\n if (exit.destination_uuid === nodeUuid) {\n incomingConnections.push({\n exitUuid: exit.uuid,\n sourceNodeUuid: node.uuid\n });\n }\n }\n }\n }\n\n // Verify we found the expected incoming connections\n expect(incomingConnections).to.have.length(2);\n expect(incomingConnections[0].exitUuid).to.equal('exit-before-1');\n expect(incomingConnections[1].exitUuid).to.equal('exit-before-2');\n\n // Verify we found the expected outgoing connections\n expect(outgoingExits).to.have.length(1);\n expect(outgoingExits[0].destination_uuid).to.equal('node-after');\n\n // Simulate the rerouting logic\n if (incomingConnections.length > 0 && outgoingExits.length > 0) {\n const firstDestination = outgoingExits[0].destination_uuid;\n\n // Verify the destination is correct for rerouting\n expect(firstDestination).to.equal('node-after');\n }\n\n // This test verifies the rerouting logic is correct. The actual fix ensures that:\n // 1. Old JSPlumb connections are removed with removeExitConnection\n // 2. Store is updated with updateConnection\n // 3. New JSPlumb connections are created with connectIds\n // This sequence ensures JSPlumb visuals stay in sync with the flow definition\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-flow-editor-node.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor-node.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { html, fixture, expect } from '@open-wc/testing';\nimport { CanvasNode } from '../src/flow/CanvasNode';\nimport {\n Node,\n NodeUI,\n Action,\n Exit,\n Router\n} from '../src/store/flow-definition.d';\nimport { stub, restore, useFakeTimers } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\n\ndescribe('EditorNode', () => {\n let editorNode: CanvasNode;\n let mockPlumber: any;\n\n beforeEach(async () => {\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub()\n };\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editorNode = new CanvasNode();\n expect(editorNode.createRenderRoot()).to.equal(editorNode);\n });\n });\n\n describe('renderAction', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders action with known config', () => {\n const mockNode: Node = {\n uuid: 'test-node-3',\n actions: [],\n exits: []\n };\n\n const action: any = {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Test message',\n quick_replies: []\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 0);\n expect(result).to.exist;\n });\n\n it('renders action with unknown config', () => {\n const mockNode: Node = {\n uuid: 'test-node-4',\n actions: [],\n exits: []\n };\n\n const action: Action = {\n type: 'unknown_action' as any,\n uuid: 'action-1'\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 1);\n expect(result).to.exist;\n });\n });\n\n describe('renderRouter', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders router with result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n result_name: 'test_result',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('renders router without result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('returns undefined for router with unknown UI type', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'unknown_type' as any\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.be.undefined;\n });\n });\n\n describe('renderCategories', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('returns null when no router', () => {\n const mockNode: Node = {\n uuid: 'test-node-7',\n actions: [],\n exits: []\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('returns null when no categories', () => {\n const mockNode: Node = {\n uuid: 'test-node-8',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: undefined as any\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('renders categories with exits', () => {\n const mockNode: Node = {\n uuid: 'test-node-9',\n actions: [],\n exits: [{ uuid: 'exit-1' }, { uuid: 'exit-2' }],\n router: {\n type: 'switch',\n categories: [\n { uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Category 2', exit_uuid: 'exit-2' }\n ]\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.exist;\n });\n });\n\n describe('renderExit', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders exit with connected class when destination exists', async () => {\n const exit: Exit = {\n uuid: 'exit-connected',\n destination_uuid: 'destination-node'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.true;\n expect(exitElement?.getAttribute('id')).to.equal('exit-connected');\n });\n\n it('renders exit without connected class when no destination', async () => {\n const exit: Exit = {\n uuid: 'exit-unconnected'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.false;\n expect(exitElement?.getAttribute('id')).to.equal('exit-unconnected');\n });\n });\n\n describe('renderTitle', () => {\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders title with config color and name', async () => {\n const config = {\n name: 'Test Action',\n color: '#ff0000'\n };\n\n const mockAction: Action = {\n type: 'send_msg',\n uuid: 'test-action'\n };\n\n const result = (editorNode as any).renderTitle(config, mockAction, 0);\n const container = await fixture(html`<div>${result}</div>`);\n\n const title = container.querySelector('.cn-title');\n expect(title).to.exist;\n\n const nameElement = title?.querySelector('.name');\n expect(nameElement?.textContent?.trim()).to.equal('Test Action');\n expect(title?.getAttribute('style')).to.contain('background:#ff0000');\n });\n });\n\n describe('updated lifecycle', () => {\n it('handles updated without node changes', () => {\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n\n const changes = new Map();\n changes.set('other', true);\n\n // Should not throw and not call plumber methods\n expect(() => {\n (editorNode as any).updated(changes);\n }).to.not.throw();\n\n expect(mockPlumber.makeTarget).to.not.have.been.called;\n });\n\n it('verifies updated method exists', () => {\n editorNode = new CanvasNode();\n expect(typeof (editorNode as any).updated).to.equal('function');\n });\n\n it('processes node changes and calls plumber methods', () => {\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n\n const mockNode: Node = {\n uuid: 'test-node-10',\n actions: [],\n exits: [\n { uuid: 'exit-1', destination_uuid: 'node-2' },\n { uuid: 'exit-2' } // This should call makeSource\n ]\n };\n\n // Mock querySelector to return a mock element with getBoundingClientRect\n const mockElement = {\n getBoundingClientRect: stub().returns({ width: 200, height: 100 })\n };\n stub(editorNode, 'querySelector').returns(mockElement as any);\n\n // Simulate the updated lifecycle\n (editorNode as any).node = mockNode;\n\n const changes = new Map();\n changes.set('node', true);\n\n // Test just the plumber method calls without store dependency\n // by directly calling the logic that would be in updated\n if ((editorNode as any).plumber && mockNode) {\n (editorNode as any).plumber.makeTarget(mockNode.uuid);\n\n for (const exit of mockNode.exits) {\n if (!exit.destination_uuid) {\n (editorNode as any).plumber.makeSource(exit.uuid);\n } else {\n (editorNode as any).plumber.connectIds(\n exit.uuid,\n exit.destination_uuid\n );\n }\n }\n }\n\n expect(mockPlumber.makeTarget).to.have.been.calledWith('test-node-10');\n expect(mockPlumber.makeSource).to.have.been.calledWith('exit-2');\n expect(mockPlumber.connectIds).to.have.been.calledWith(\n 'exit-1',\n 'node-2'\n );\n });\n });\n\n describe('basic integration', () => {\n it('can create and verify structure without full rendering', () => {\n const mockNode: Node = {\n uuid: 'integration-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: 'next-node' }]\n };\n\n // Test individual render methods work\n editorNode = new CanvasNode();\n\n // Test renderAction\n const actionResult = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n expect(actionResult).to.exist;\n\n // Test renderExit\n const exitResult = (editorNode as any).renderExit(mockNode.exits[0]);\n expect(exitResult).to.exist;\n\n // Verify the node structure is as expected\n expect(mockNode.uuid).to.equal('integration-test-node');\n expect(mockNode.actions).to.have.length(1);\n expect(mockNode.exits).to.have.length(1);\n });\n });\n\n describe('drag and drop functionality', () => {\n let editorNode: CanvasNode;\n\n beforeEach(() => {\n editorNode = new CanvasNode();\n });\n\n it('renders actions with sortable class and proper IDs', async () => {\n const mockNode: Node = {\n uuid: 'sortable-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n // Test that renderAction includes sortable class and proper ID\n const result1 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n const result2 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[1],\n 1\n );\n\n expect(result1).to.exist;\n expect(result2).to.exist;\n\n // Render the template to check the actual DOM\n const container1 = await fixture(html`<div>${result1}</div>`);\n const container2 = await fixture(html`<div>${result2}</div>`);\n\n const actionElement1 = container1.querySelector('.action');\n const actionElement2 = container2.querySelector('.action');\n\n expect(actionElement1).to.exist;\n expect(actionElement1?.classList.contains('sortable')).to.be.true;\n expect(actionElement1?.id).to.equal('action-0');\n\n expect(actionElement2).to.exist;\n expect(actionElement2?.classList.contains('sortable')).to.be.true;\n expect(actionElement2?.id).to.equal('action-1');\n });\n\n it('includes drag handle in rendered actions', async () => {\n const mockNode: Node = {\n uuid: 'drag-handle-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n let editorNode: CanvasNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n // No drag handle should be present if only one action\n let dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.not.exist;\n\n // Now add a second action to verify drag handle appears\n mockNode.actions.push({\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any);\n\n editorNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.exist;\n });\n\n it('renders SortableList when actions are present', async () => {\n const mockNode: Node = {\n uuid: 'sortable-list-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n });\n\n it('does not render SortableList when no actions', async () => {\n const mockNode: Node = {\n uuid: 'no-actions-test',\n actions: [],\n exits: [{ uuid: 'exit-1' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Check that template does not include temba-sortable-list\n expect(renderResult.strings.join('')).to.not.contain(\n 'temba-sortable-list'\n );\n });\n\n it('handles order changed events correctly', async () => {\n const mockNode: Node = {\n uuid: 'order-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Create a mock order changed event (swap first and last actions)\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 2] }\n });\n\n // Call the handler directly\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify the actions were reordered correctly\n expect((editorNode as any).node.actions).to.have.length(3);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Second'\n );\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Third'\n );\n expect(((editorNode as any).node.actions[2] as any).text).to.equal(\n 'First'\n );\n });\n\n it('preserves action data during reordering', () => {\n const mockNode: Node = {\n uuid: 'preserve-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Message 1',\n quick_replies: ['Yes', 'No']\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Message 2',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Swap the two actions\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 1] }\n });\n\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify all action data is preserved\n expect((editorNode as any).node.actions).to.have.length(2);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Message 2'\n );\n expect(\n ((editorNode as any).node.actions[0] as any).quick_replies\n ).to.deep.equal([]);\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Message 1'\n );\n expect(\n ((editorNode as any).node.actions[1] as any).quick_replies\n ).to.deep.equal(['Yes', 'No']);\n });\n\n it('integrates with SortableList for full drag functionality', async () => {\n const mockNode: Node = {\n uuid: 'integration-drag-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third Action',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Render the full component\n const renderResult = editorNode.render();\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n // Find the sortable list\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n\n // Verify all actions are rendered as sortable items\n const sortableItems = container.querySelectorAll('.sortable');\n expect(sortableItems).to.have.length(3);\n\n // Verify each action has correct ID and structure\n expect(sortableItems[0].id).to.equal('action-0');\n expect(sortableItems[1].id).to.equal('action-1');\n expect(sortableItems[2].id).to.equal('action-2');\n\n // Verify drag handles are present\n const dragHandles = container.querySelectorAll('.drag-handle');\n expect(dragHandles).to.have.length(3);\n });\n });\n\n describe('exit disconnection', () => {\n let mockStore: any;\n let mockUpdateNode: any;\n\n beforeEach(() => {\n mockUpdateNode = stub();\n mockStore = {\n getState: stub().returns({\n updateNode: mockUpdateNode\n })\n };\n\n // Mock the plumber with disconnect capabilities\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub(),\n removeExitConnection: stub().returns(true),\n setConnectionRemovingState: stub().returns(true)\n };\n\n (window as any).getStore = () => mockStore;\n\n editorNode = new CanvasNode();\n (editorNode as any).plumber = mockPlumber;\n });\n\n afterEach(() => {\n // Restore any stubbed functions\n if ((window as any).originalGetStore) {\n (window as any).getStore = (window as any).originalGetStore;\n }\n });\n\n it('handles exit click to initiate disconnection', async () => {\n // Create a node with a connected exit\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [{ uuid: 'exit-1', destination_uuid: 'target-node' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Mock querySelector to return the exit element\n const exitElement = document.createElement('div');\n exitElement.id = 'exit-1';\n exitElement.classList.add('exit', 'connected');\n (editorNode as any).querySelector = stub().returns(exitElement);\n\n // Create a mock event\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub(),\n currentTarget: exitElement\n } as any;\n\n // Mock getStore directly in the disconnectExit method\n const originalDisconnectExit = (editorNode as any).disconnectExit;\n (editorNode as any).disconnectExit = function (exit: any) {\n // Call original but override the store logic\n this.plumber.removeExitConnection(exit.uuid);\n mockUpdateNode.call(null, this.node.uuid, {\n ...this.node,\n exits: this.node.exits.map((e: any) =>\n e.uuid === exit.uuid ? { ...e, destination_uuid: null } : e\n )\n });\n };\n\n // Call the click handler directly to initiate removal\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the exit is marked for removal in the component state\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.true;\n\n // Verify a timeout was set\n expect((editorNode as any).exitRemovalTimeouts.has('exit-1')).to.be.true;\n\n // Now click again to confirm disconnection\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the plumber was called to remove the connection\n expect(mockPlumber.removeExitConnection).to.have.been.calledWith(\n 'exit-1'\n );\n\n // Verify the node was updated with disconnected exit\n expect(mockUpdateNode).to.have.been.called;\n\n // Restore original method\n (editorNode as any).disconnectExit = originalDisconnectExit;\n });\n\n it('cancels disconnection after timeout', async () => {\n // Create a fake timer for this test\n const clock = useFakeTimers();\n\n try {\n // Create a node with a connected exit\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [{ uuid: 'exit-1', destination_uuid: 'target-node' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Mock querySelector to return the exit element\n const exitElement = document.createElement('div');\n exitElement.id = 'exit-1';\n exitElement.classList.add('exit', 'connected');\n (editorNode as any).querySelector = stub().returns(exitElement);\n\n // Create a mock event\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub(),\n currentTarget: exitElement\n } as any;\n\n // Call the click handler to initiate disconnection\n (editorNode as any).handleExitClick(mockEvent, mockNode.exits[0]);\n\n // Verify the exit is marked for removal\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.true;\n\n // Advance the clock past the timeout (1500ms is the default timeout)\n clock.tick(1501);\n\n // Verify the removing state is cleared after the timeout\n expect((editorNode as any).exitRemovingState.has('exit-1')).to.be.false;\n expect(mockPlumber.setConnectionRemovingState).to.have.been.calledWith(\n 'exit-1',\n false\n );\n } finally {\n // Always restore the clock\n clock.restore();\n }\n });\n });\n\n describe('action removal', () => {\n let editorNode: CanvasNode;\n let mockPlumber: any;\n let getStoreStub: any;\n\n beforeEach(() => {\n editorNode = new CanvasNode();\n\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub(),\n removeExitConnection: stub()\n };\n editorNode['plumber'] = mockPlumber;\n });\n\n afterEach(() => {\n if (getStoreStub) {\n getStoreStub.restore();\n }\n });\n\n it('handles action removal state management', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Initially, no action should be in removing state\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .false;\n\n // Call the click handler to initiate removal\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n // Verify the action is marked for removal\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n\n // Verify event handlers were called\n expect(mockEvent.preventDefault).to.have.been.called;\n expect(mockEvent.stopPropagation).to.have.been.called;\n });\n\n it('cancels action removal after timeout', async () => {\n const clock = useFakeTimers();\n\n try {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: null }]\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Call the click handler to initiate removal\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n // Verify the action is marked for removal\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n\n // Advance the clock past the timeout (1000ms is the action removal timeout)\n clock.tick(1001);\n\n // Verify the removing state is cleared after the timeout\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .false;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .false;\n } finally {\n // Always restore the clock\n clock.restore();\n }\n });\n\n it('clears timeouts on disconnect', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Start a removal process\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n\n // Disconnect the component\n editorNode.disconnectedCallback();\n\n // Verify all state is cleared\n expect((editorNode as any).actionRemovingState.size).to.equal(0);\n expect((editorNode as any).actionRemovalTimeouts.size).to.equal(0);\n });\n\n it('renders action with remove button', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n // Test that renderAction includes remove button\n const result = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n\n expect(result).to.exist;\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${result}</div>`);\n const removeButton = container.querySelector('.remove-button');\n\n expect(removeButton).to.exist;\n expect(removeButton?.textContent?.trim()).to.equal('✕');\n expect(removeButton?.getAttribute('title')).to.equal('Remove action');\n });\n\n it('shows removing state in UI', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n // Set action to removing state\n (editorNode as any).actionRemovingState.add('action-1');\n\n // Test that renderAction shows removing state\n const result = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n\n expect(result).to.exist;\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${result}</div>`);\n const actionElement = container.querySelector('.action');\n\n expect(actionElement).to.exist;\n expect(actionElement?.classList.contains('removing')).to.be.true;\n\n // Check that title shows \"Remove?\"\n const titleElement = container.querySelector('.cn-title .name');\n expect(titleElement?.textContent?.trim()).to.equal('Remove?');\n });\n\n it('handles multiple action removal states independently', async () => {\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n editorNode['node'] = mockNode;\n\n const mockEvent = {\n preventDefault: stub(),\n stopPropagation: stub()\n } as any;\n\n // Start removal for first action\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[0],\n 0\n );\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovingState.has('action-2')).to.be\n .false;\n\n // Start removal for second action\n (editorNode as any).handleActionRemoveClick(\n mockEvent,\n mockNode.actions[1],\n 1\n );\n expect((editorNode as any).actionRemovingState.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovingState.has('action-2')).to.be\n .true;\n\n // Both actions should have timeouts\n expect((editorNode as any).actionRemovalTimeouts.has('action-1')).to.be\n .true;\n expect((editorNode as any).actionRemovalTimeouts.has('action-2')).to.be\n .true;\n });\n\n it('properly reroutes JSPlumb connections when removing node with connections', async () => {\n // This test verifies that the connection rerouting logic works correctly\n // by testing the specific logic within removeNodeWithConnections\n\n const mockNode: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-after', destination_uuid: 'node-after' }]\n };\n\n editorNode['node'] = mockNode;\n\n // Mock the flow definition that would be returned by getStore\n const mockFlowDefinition = {\n nodes: [\n {\n uuid: 'node-before',\n exits: [\n { uuid: 'exit-before-1', destination_uuid: 'test-node' },\n { uuid: 'exit-before-2', destination_uuid: 'test-node' }\n ]\n },\n mockNode,\n {\n uuid: 'node-after',\n exits: []\n }\n ]\n };\n\n // Test the connection rerouting logic directly by simulating what happens\n // when a node with incoming and outgoing connections is removed\n const nodeUuid = mockNode.uuid;\n const incomingConnections: {\n exitUuid: string;\n sourceNodeUuid: string;\n }[] = [];\n const outgoingExits = mockNode.exits.filter(\n (exit) => exit.destination_uuid\n );\n\n // Find incoming connections (same logic as in removeNodeWithConnections)\n for (const node of mockFlowDefinition.nodes) {\n if (node.uuid !== nodeUuid) {\n for (const exit of node.exits) {\n if (exit.destination_uuid === nodeUuid) {\n incomingConnections.push({\n exitUuid: exit.uuid,\n sourceNodeUuid: node.uuid\n });\n }\n }\n }\n }\n\n // Verify we found the expected incoming connections\n expect(incomingConnections).to.have.length(2);\n expect(incomingConnections[0].exitUuid).to.equal('exit-before-1');\n expect(incomingConnections[1].exitUuid).to.equal('exit-before-2');\n\n // Verify we found the expected outgoing connections\n expect(outgoingExits).to.have.length(1);\n expect(outgoingExits[0].destination_uuid).to.equal('node-after');\n\n // Simulate the rerouting logic\n if (incomingConnections.length > 0 && outgoingExits.length > 0) {\n const firstDestination = outgoingExits[0].destination_uuid;\n\n // Verify the destination is correct for rerouting\n expect(firstDestination).to.equal('node-after');\n }\n\n // This test verifies the rerouting logic is correct. The actual fix ensures that:\n // 1. Old JSPlumb connections are removed with removeExitConnection\n // 2. Store is updated with updateConnection\n // 3. New JSPlumb connections are created with connectIds\n // This sequence ensures JSPlumb visuals stay in sync with the flow definition\n });\n });\n});\n"]}
@@ -1,19 +1,17 @@
1
- import { html, fixture, expect } from '@open-wc/testing';
2
- import { assertScreenshot, getClip } from './utils.test';
1
+ import { expect } from '@open-wc/testing';
2
+ import { assertScreenshot, getClip, getComponent } from './utils.test';
3
3
  describe('FormElement markdown integration', () => {
4
- it('renders checkbox with markdown errors', async () => {
5
- const checkbox = await fixture(html `
6
- <temba-checkbox
7
- label="Accept Terms"
8
- .errors=${[
9
- 'Please read the **terms and conditions** at [this link](https://example.com)',
10
- 'This field *requires* acceptance'
11
- ]}
12
- ></temba-checkbox>
13
- `);
14
- await checkbox.updateComplete;
4
+ it('renders textinput with markdown errors', async () => {
5
+ const el = (await getComponent('temba-textinput', {
6
+ name: 'my_textinput'
7
+ }));
8
+ el.errors = [
9
+ 'You must agree to the **terms and conditions** at [this link](https://example.com)',
10
+ 'This field *requires* a value'
11
+ ];
12
+ await el.updateComplete;
15
13
  // Check that errors are rendered with markdown directly in checkbox shadow root
16
- const errorElements = checkbox.shadowRoot.querySelectorAll('.alert-error');
14
+ const errorElements = el.shadowRoot.querySelectorAll('.alert-error');
17
15
  expect(errorElements.length).to.equal(2);
18
16
  // First error should have bold text and link
19
17
  const firstError = errorElements[0];
@@ -28,7 +26,7 @@ describe('FormElement markdown integration', () => {
28
26
  const italicElement = secondError.querySelector('em');
29
27
  expect(italicElement).to.not.be.null;
30
28
  expect(italicElement.textContent).to.equal('requires');
31
- await assertScreenshot('integration/checkbox-markdown-errors', getClip(checkbox));
29
+ await assertScreenshot('integration/textinput-markdown-errors', getClip(el));
32
30
  });
33
31
  });
34
32
  //# sourceMappingURL=temba-integration-markdown.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"temba-integration-markdown.test.js","sourceRoot":"","sources":["../../test/temba-integration-markdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,QAAQ,GAAa,MAAM,OAAO,CAAC,IAAI,CAAA;;;kBAG/B;YACR,8EAA8E;YAC9E,kCAAkC;SACnC;;KAEJ,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,cAAc,CAAC;QAE9B,gFAAgF;QAChF,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzE,uCAAuC;QACvC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,gBAAgB,CACpB,sCAAsC,EACtC,OAAO,CAAC,QAAQ,CAAC,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { Checkbox } from '../src/form/Checkbox';\nimport { assertScreenshot, getClip } from './utils.test';\n\ndescribe('FormElement markdown integration', () => {\n it('renders checkbox with markdown errors', async () => {\n const checkbox: Checkbox = await fixture(html`\n <temba-checkbox\n label=\"Accept Terms\"\n .errors=${[\n 'Please read the **terms and conditions** at [this link](https://example.com)',\n 'This field *requires* acceptance'\n ]}\n ></temba-checkbox>\n `);\n\n await checkbox.updateComplete;\n\n // Check that errors are rendered with markdown directly in checkbox shadow root\n const errorElements = checkbox.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(2);\n\n // First error should have bold text and link\n const firstError = errorElements[0];\n const boldElement = firstError.querySelector('strong');\n const linkElement = firstError.querySelector('a');\n expect(boldElement).to.not.be.null;\n expect(boldElement.textContent).to.equal('terms and conditions');\n expect(linkElement).to.not.be.null;\n expect(linkElement.getAttribute('href')).to.equal('https://example.com');\n\n // Second error should have italic text\n const secondError = errorElements[1];\n const italicElement = secondError.querySelector('em');\n expect(italicElement).to.not.be.null;\n expect(italicElement.textContent).to.equal('requires');\n\n await assertScreenshot(\n 'integration/checkbox-markdown-errors',\n getClip(checkbox)\n );\n });\n});\n"]}
1
+ {"version":3,"file":"temba-integration-markdown.test.js","sourceRoot":"","sources":["../../test/temba-integration-markdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGvE,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,GAAc,CAAC,MAAM,YAAY,CAAC,iBAAiB,EAAE;YAC3D,IAAI,EAAE,cAAc;SACrB,CAAC,CAAc,CAAC;QAEjB,EAAE,CAAC,MAAM,GAAG;YACV,oFAAoF;YACpF,+BAA+B;SAChC,CAAC;QAEF,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,gFAAgF;QAChF,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACrE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzE,uCAAuC;QACvC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,gBAAgB,CACpB,uCAAuC,EACvC,OAAO,CAAC,EAAE,CAAC,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\nimport { TextInput } from '../src/form/TextInput';\n\ndescribe('FormElement markdown integration', () => {\n it('renders textinput with markdown errors', async () => {\n const el: TextInput = (await getComponent('temba-textinput', {\n name: 'my_textinput'\n })) as TextInput;\n\n el.errors = [\n 'You must agree to the **terms and conditions** at [this link](https://example.com)',\n 'This field *requires* a value'\n ];\n\n await el.updateComplete;\n\n // Check that errors are rendered with markdown directly in checkbox shadow root\n const errorElements = el.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(2);\n\n // First error should have bold text and link\n const firstError = errorElements[0];\n const boldElement = firstError.querySelector('strong');\n const linkElement = firstError.querySelector('a');\n expect(boldElement).to.not.be.null;\n expect(boldElement.textContent).to.equal('terms and conditions');\n expect(linkElement).to.not.be.null;\n expect(linkElement.getAttribute('href')).to.equal('https://example.com');\n\n // Second error should have italic text\n const secondError = errorElements[1];\n const italicElement = secondError.querySelector('em');\n expect(italicElement).to.not.be.null;\n expect(italicElement.textContent).to.equal('requires');\n\n await assertScreenshot(\n 'integration/textinput-markdown-errors',\n getClip(el)\n );\n });\n});\n"]}
@@ -5,7 +5,11 @@ const assertDialogScreenshot = async (el, screenshotName) => {
5
5
  const dialog = el.shadowRoot
6
6
  .querySelector('temba-dialog')
7
7
  .shadowRoot.querySelector('.dialog-container');
8
- await assertScreenshot(screenshotName, getClip(dialog));
8
+ const clip = getClip(dialog);
9
+ // Adjust width to show full dialog with proper padding
10
+ const dialogRect = dialog.getBoundingClientRect();
11
+ clip.width = dialogRect.width + 20; // 10px padding on each side
12
+ await assertScreenshot(screenshotName, clip);
9
13
  };
10
14
  describe('temba-node-editor', () => {
11
15
  it('can be created', async () => {
@@ -264,43 +268,6 @@ describe('temba-node-editor', () => {
264
268
  const shadowRoot = el.shadowRoot;
265
269
  expect(shadowRoot).to.not.be.null;
266
270
  });
267
- it('renders different action types correctly', async () => {
268
- const actionTypes = [
269
- {
270
- type: 'send_msg',
271
- data: { text: 'Message', quick_replies: [] }
272
- },
273
- {
274
- type: 'set_run_result',
275
- data: { name: 'result', value: 'value' }
276
- },
277
- {
278
- type: 'set_contact_name',
279
- data: { name: 'John Doe' }
280
- },
281
- {
282
- type: 'set_contact_language',
283
- data: { language: 'eng' }
284
- }
285
- ];
286
- for (const actionType of actionTypes) {
287
- const action = {
288
- uuid: `test-${actionType.type}`,
289
- type: actionType.type,
290
- ...actionType.data
291
- };
292
- const el = (await fixture(html `
293
- <temba-node-editor
294
- .action=${action}
295
- .isOpen=${true}
296
- ></temba-node-editor>
297
- `));
298
- await el.updateComplete;
299
- expect(el.shadowRoot).to.not.be.null;
300
- expect(el.action.type).to.equal(actionType.type);
301
- await assertDialogScreenshot(el, `editor/${actionType.type}`);
302
- }
303
- });
304
271
  it('displays bubble count for group value counts', async () => {
305
272
  const action = {
306
273
  uuid: 'test-action-uuid',