@nyaruka/temba-components 0.142.0 → 0.142.2

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 (137) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/temba-components.js +825 -654
  3. package/dist/temba-components.js.map +1 -1
  4. package/out-tsc/src/Icons.js +1 -0
  5. package/out-tsc/src/Icons.js.map +1 -1
  6. package/out-tsc/src/flow/CanvasMenu.js +30 -35
  7. package/out-tsc/src/flow/CanvasMenu.js.map +1 -1
  8. package/out-tsc/src/flow/CanvasNode.js +13 -8
  9. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  10. package/out-tsc/src/flow/Editor.js +18 -5
  11. package/out-tsc/src/flow/Editor.js.map +1 -1
  12. package/out-tsc/src/flow/NodeEditor.js +346 -10
  13. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  14. package/out-tsc/src/flow/NodeTypeSelector.js +2 -0
  15. package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -1
  16. package/out-tsc/src/flow/Plumber.js +3 -1
  17. package/out-tsc/src/flow/Plumber.js.map +1 -1
  18. package/out-tsc/src/flow/actions/add_contact_urn.js +2 -6
  19. package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
  20. package/out-tsc/src/flow/actions/enter_flow.js +2 -2
  21. package/out-tsc/src/flow/actions/enter_flow.js.map +1 -1
  22. package/out-tsc/src/flow/actions/say_msg.js +2 -1
  23. package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
  24. package/out-tsc/src/flow/actions/send_broadcast.js +2 -6
  25. package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
  26. package/out-tsc/src/flow/actions/send_email.js +2 -6
  27. package/out-tsc/src/flow/actions/send_email.js.map +1 -1
  28. package/out-tsc/src/flow/actions/send_msg.js +52 -35
  29. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  30. package/out-tsc/src/flow/actions/set_contact_channel.js +2 -1
  31. package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
  32. package/out-tsc/src/flow/actions/set_contact_field.js +4 -5
  33. package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
  34. package/out-tsc/src/flow/actions/set_contact_language.js +3 -3
  35. package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
  36. package/out-tsc/src/flow/actions/set_contact_name.js +2 -1
  37. package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
  38. package/out-tsc/src/flow/actions/set_contact_status.js +2 -1
  39. package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
  40. package/out-tsc/src/flow/actions/set_run_result.js +3 -3
  41. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  42. package/out-tsc/src/flow/actions/start_session.js +2 -2
  43. package/out-tsc/src/flow/actions/start_session.js.map +1 -1
  44. package/out-tsc/src/flow/nodes/split_by_llm.js +4 -5
  45. package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
  46. package/out-tsc/src/flow/nodes/split_by_resthook.js +3 -8
  47. package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -1
  48. package/out-tsc/src/flow/nodes/split_by_subflow.js +2 -2
  49. package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
  50. package/out-tsc/src/flow/nodes/split_by_webhook.js +25 -33
  51. package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
  52. package/out-tsc/src/flow/nodes/wait_for_response.js +1 -0
  53. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  54. package/out-tsc/src/flow/types.js.map +1 -1
  55. package/out-tsc/src/flow/utils.js +68 -0
  56. package/out-tsc/src/flow/utils.js.map +1 -1
  57. package/out-tsc/src/form/FieldRenderer.js +17 -2
  58. package/out-tsc/src/form/FieldRenderer.js.map +1 -1
  59. package/out-tsc/src/interfaces.js +1 -0
  60. package/out-tsc/src/interfaces.js.map +1 -1
  61. package/out-tsc/src/simulator/Simulator.js +1 -1
  62. package/out-tsc/src/simulator/Simulator.js.map +1 -1
  63. package/out-tsc/src/utils.js +5 -12
  64. package/out-tsc/src/utils.js.map +1 -1
  65. package/out-tsc/test/nodes/split_by_run_result.test.js +1 -2
  66. package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -1
  67. package/out-tsc/test/temba-canvas-menu.test.js +13 -9
  68. package/out-tsc/test/temba-canvas-menu.test.js.map +1 -1
  69. package/out-tsc/test/temba-flow-reflow.test.js.map +1 -1
  70. package/out-tsc/test/temba-node-editor.test.js +9 -10
  71. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  72. package/out-tsc/test/temba-node-type-selector.test.js +3 -3
  73. package/out-tsc/test/temba-node-type-selector.test.js.map +1 -1
  74. package/out-tsc/test/temba-simulator.test.js +2 -2
  75. package/out-tsc/test/temba-simulator.test.js.map +1 -1
  76. package/package.json +2 -2
  77. package/screenshots/truth/actions/enter_flow/render/basic-flow.png +0 -0
  78. package/screenshots/truth/actions/enter_flow/render/long-flow-name.png +0 -0
  79. package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
  80. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  81. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  82. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  83. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  84. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  85. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  86. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  87. package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
  88. package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
  89. package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
  90. package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
  91. package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
  92. package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
  93. package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
  94. package/screenshots/truth/canvas-menu/open.png +0 -0
  95. package/screenshots/truth/node-type-selector/action-mode.png +0 -0
  96. package/screenshots/truth/node-type-selector/split-mode.png +0 -0
  97. package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
  98. package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
  99. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  100. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  101. package/src/Icons.ts +1 -0
  102. package/src/flow/CanvasMenu.ts +38 -39
  103. package/src/flow/CanvasNode.ts +16 -8
  104. package/src/flow/Editor.ts +33 -6
  105. package/src/flow/NodeEditor.ts +373 -10
  106. package/src/flow/NodeTypeSelector.ts +2 -0
  107. package/src/flow/Plumber.ts +3 -1
  108. package/src/flow/actions/add_contact_urn.ts +5 -6
  109. package/src/flow/actions/enter_flow.ts +2 -2
  110. package/src/flow/actions/say_msg.ts +2 -1
  111. package/src/flow/actions/send_broadcast.ts +2 -6
  112. package/src/flow/actions/send_email.ts +2 -6
  113. package/src/flow/actions/send_msg.ts +56 -38
  114. package/src/flow/actions/set_contact_channel.ts +5 -1
  115. package/src/flow/actions/set_contact_field.ts +10 -5
  116. package/src/flow/actions/set_contact_language.ts +6 -3
  117. package/src/flow/actions/set_contact_name.ts +5 -1
  118. package/src/flow/actions/set_contact_status.ts +5 -1
  119. package/src/flow/actions/set_run_result.ts +6 -3
  120. package/src/flow/actions/start_session.ts +2 -2
  121. package/src/flow/nodes/split_by_llm.ts +5 -5
  122. package/src/flow/nodes/split_by_resthook.ts +3 -8
  123. package/src/flow/nodes/split_by_subflow.ts +2 -2
  124. package/src/flow/nodes/split_by_webhook.ts +26 -34
  125. package/src/flow/nodes/wait_for_response.ts +1 -0
  126. package/src/flow/types.ts +25 -2
  127. package/src/flow/utils.ts +81 -1
  128. package/src/form/FieldRenderer.ts +32 -3
  129. package/src/interfaces.ts +1 -0
  130. package/src/simulator/Simulator.ts +1 -1
  131. package/src/utils.ts +5 -12
  132. package/test/nodes/split_by_run_result.test.ts +1 -2
  133. package/test/temba-canvas-menu.test.ts +13 -9
  134. package/test/temba-flow-reflow.test.ts +4 -2
  135. package/test/temba-node-editor.test.ts +9 -10
  136. package/test/temba-node-type-selector.test.ts +3 -3
  137. package/test/temba-simulator.test.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"split_by_run_result.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_run_result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_run_result } from '../../src/flow/nodes/split_by_run_result';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { zustand } from '../../src/store/AppState';\nimport { NODE_CONFIG } from '../../src/flow/config';\n\n/**\n * Test suite for the split_by_run_result node configuration.\n */\ndescribe('split_by_run_result node config', () => {\n const helper = new NodeTest(split_by_run_result, 'split_by_run_result');\n\n // Setup mock flow results in the store before each test\n beforeEach(() => {\n // Mock the store with flow results\n zustand.setState({\n flowInfo: {\n results: [\n {\n key: 'favorite_color',\n name: 'Favorite Color',\n categories: ['Red', 'Blue', 'Green'],\n node_uuids: ['node-1']\n },\n {\n key: 'age',\n name: 'Age',\n categories: ['Adult', 'Teen', 'Child'],\n node_uuids: ['node-2']\n }\n ],\n dependencies: [],\n counts: { nodes: 0, languages: 0 },\n locals: []\n }\n } as any);\n });\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_run_result.name).to.equal('Split by Result');\n });\n\n it('has correct type', () => {\n expect(split_by_run_result.type).to.equal('split_by_run_result');\n });\n\n it('has correct dialog size', () => {\n expect(split_by_run_result.dialogSize).to.equal('large');\n });\n });\n\n describe('toFormData', () => {\n it('should transform node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n },\n {\n uuid: 'case-2',\n type: 'has_any_word',\n arguments: ['blue', 'azure'],\n category_uuid: 'cat-2'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Blue', exit_uuid: 'exit-2' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('favorite_color');\n expect(formData.result[0].name).to.equal('Favorite Color');\n expect(formData.rules).to.have.lengthOf(2);\n\n // Check first rule\n expect(formData.rules[0].operator.value).to.equal('has_phrase');\n expect(formData.rules[0].value1).to.equal('red');\n expect(formData.rules[0].category).to.equal('Red');\n\n // Check second rule\n expect(formData.rules[1].operator.value).to.equal('has_any_word');\n expect(formData.rules[1].value1).to.equal('blue azure');\n expect(formData.rules[1].category).to.equal('Blue');\n\n expect(formData.result_name).to.equal('color_category');\n });\n\n it('should transform node with no rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('age');\n expect(formData.result[0].name).to.equal('Age');\n expect(formData.rules).to.have.lengthOf(0);\n expect(formData.result_name).to.equal('');\n });\n\n it('should handle missing nodeUI config gracefully', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const formData = split_by_run_result.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result).to.have.lengthOf(0);\n });\n\n it('should transform node with two-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number_between',\n arguments: ['13', '17'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Teen', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number_between');\n expect(formData.rules[0].value1).to.equal('13');\n expect(formData.rules[0].value2).to.equal('17');\n expect(formData.rules[0].category).to.equal('Teen');\n });\n\n it('should transform node with zero-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number',\n arguments: [],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Has Number', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number');\n expect(formData.rules[0].value1).to.equal('');\n expect(formData.rules[0].value2).to.equal('');\n });\n });\n\n describe('fromFormData', () => {\n it('should transform form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: { value: 'has_any_word', name: 'has any of the words' },\n value1: 'blue azure',\n value2: '',\n category: 'Blue'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n expect(resultNode.router!.result_name).to.equal('color_category');\n\n // Verify cases\n expect(resultNode.router!.cases).to.have.lengthOf(2);\n expect(resultNode.router!.cases![0].type).to.equal('has_phrase');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal(['red']);\n expect(resultNode.router!.cases![1].type).to.equal('has_any_word');\n expect(resultNode.router!.cases![1].arguments).to.deep.equal([\n 'blue',\n 'azure'\n ]);\n\n // Verify categories\n expect(resultNode.router!.categories).to.have.lengthOf(3); // Red, Blue, Other\n expect(resultNode.router!.categories[0].name).to.equal('Red');\n expect(resultNode.router!.categories[1].name).to.equal('Blue');\n expect(resultNode.router!.categories[2].name).to.equal('Other');\n\n // Verify exits\n expect(resultNode.exits).to.have.lengthOf(3);\n });\n\n it('should transform form data without rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.age');\n expect(resultNode.router!.result_name).to.be.undefined;\n\n // Should have only the default 'All Responses' category (no rules means \"All Responses\")\n expect(resultNode.router!.categories).to.have.lengthOf(1);\n expect(resultNode.router!.categories[0].name).to.equal('All Responses');\n\n // Should have one exit\n expect(resultNode.exits).to.have.lengthOf(1);\n });\n\n it('should not set result_name if empty', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.result_name).to.be.undefined;\n });\n\n it('should preserve existing UUIDs when updating categories', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'existing-case-uuid',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'existing-cat-uuid'\n }\n ],\n categories: [\n {\n uuid: 'existing-cat-uuid',\n name: 'Red',\n exit_uuid: 'existing-exit-uuid'\n },\n {\n uuid: 'existing-other-uuid',\n name: 'Other',\n exit_uuid: 'existing-other-exit-uuid'\n }\n ],\n default_category_uuid: 'existing-other-uuid'\n },\n exits: [\n { uuid: 'existing-exit-uuid', destination_uuid: 'some-node' },\n { uuid: 'existing-other-exit-uuid', destination_uuid: null }\n ]\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should preserve existing category UUIDs\n const redCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Red'\n );\n expect(redCategory!.uuid).to.equal('existing-cat-uuid');\n expect(redCategory!.exit_uuid).to.equal('existing-exit-uuid');\n\n const otherCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n expect(otherCategory!.uuid).to.equal('existing-other-uuid');\n expect(otherCategory!.exit_uuid).to.equal('existing-other-exit-uuid');\n\n // Should preserve exit destinations\n const redExit = resultNode.exits.find(\n (exit) => exit.uuid === 'existing-exit-uuid'\n );\n expect(redExit!.destination_uuid).to.equal('some-node');\n });\n\n it('should handle form data without result selection', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should return the original node unchanged\n expect(resultNode).to.equal(originalNode);\n });\n\n it('should handle incomplete rules gracefully', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n },\n {\n operator: { value: 'has_number_lt', name: 'has a number below' },\n value1: '', // Missing value1\n value2: '',\n category: 'Child'\n },\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '10',\n value2: '', // Missing value2 for 2-operand operator\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Only the first complete rule should be included\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_gte');\n\n // Should have Adult category and Other\n expect(resultNode.router!.categories).to.have.lengthOf(2);\n expect(resultNode.router!.categories[0].name).to.equal('Adult');\n expect(resultNode.router!.categories[1].name).to.equal('Other');\n });\n\n it('should handle two-operand operators correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '13',\n value2: '17',\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_between');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal([\n '13',\n '17'\n ]);\n });\n });\n\n describe('validation', () => {\n it('should validate that a result is required', () => {\n const formData = {\n result: [],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.false;\n expect(validation.errors).to.have.property('result');\n expect(validation.errors.result).to.equal('A flow result is required');\n });\n\n it('should pass validation with valid result', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n\n it('should pass validation with result and rules', () => {\n const formData = {\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n }\n ],\n result_name: 'age_category'\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n });\n\n describe('delimiter functionality', () => {\n describe('toFormData', () => {\n it('should extract delimiter configuration when enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_by[0].name).to.equal('Delimited by periods');\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('2');\n expect(formData.delimit_index[0].name).to.equal('third result');\n });\n\n it('should handle delimiter not enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('');\n expect(formData.delimit_by[0].name).to.equal(\"Don't delimit result\");\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n\n describe('fromFormData', () => {\n it('should generate operand with field() function when delimiter enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '1', name: 'second' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 1, \"+\"))'\n );\n });\n\n it('should generate standard operand when delimiter not enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle different field numbers correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n delimit_by: [{ value: '.', name: 'periods' }],\n delimit_index: [{ value: '9', name: 'tenth' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.age, 9, \".\"))'\n );\n });\n\n it('should use default values when delimiter fields missing', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: ' ', name: 'spaces' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 0, \" \"))'\n );\n });\n });\n\n describe('toUIConfig', () => {\n it('should persist delimiter configuration when enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.equal(3);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should not include delimiter config when not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n });\n\n it('should set type to split_by_run_result_delimited when delimiter is enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result_delimited');\n });\n\n it('should set type to split_by_run_result when delimiter is not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result');\n });\n });\n\n describe('round-trip tests', () => {\n it('should preserve delimiter configuration through toFormData and fromFormData', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 5, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 5,\n delimiter: '.'\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Verify operand is preserved\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 5, \".\"))'\n );\n });\n\n it('should handle toggling delimiter on and off', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n // Start with delimiter disabled\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.delimit_by[0].value).to.equal('');\n\n // Enable delimiter\n formData.delimit_by = [{ value: '+', name: 'plusses' }];\n formData.delimit_index = [{ value: '2', name: 'third' }];\n\n // Convert to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \"+\"))'\n );\n\n // Get UI config and verify it persists delimiter settings\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.equal(2);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should properly remove delimiter when switching from delimited to non-delimited', () => {\n // Start with a node that has delimiter enabled\n const nodeWithDelimiter: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data - should show delimiter is enabled\n const formData = split_by_run_result.toFormData!(\n nodeWithDelimiter,\n nodeUI\n );\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_index[0].value).to.equal('2');\n\n // Now remove the delimiter by selecting \"Don't delimit result\"\n formData.delimit_by = [{ value: '', name: \"Don't delimit result\" }];\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n nodeWithDelimiter\n );\n\n // Operand should now be standard without field() function\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n\n // Get UI config - should NOT have index or delimiter\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n\n // Re-open the dialog - toFormData should show no delimiter\n const formDataReopened = split_by_run_result.toFormData!(\n resultNode,\n nodeUI\n );\n expect(formDataReopened.delimit_by[0].value).to.equal('');\n expect(formDataReopened.delimit_by[0].name).to.equal(\n \"Don't delimit result\"\n );\n });\n });\n });\n\n describe('toFormData normalizes operand from toUIConfig', () => {\n it('should handle round-trip when operand has only id (no value)', () => {\n // Reproduces the bug: toUIConfig saves { id, name, type } without 'value',\n // then toFormData loads it, and fromFormData must still produce a valid operand.\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n // nodeUI as saved by toUIConfig - note: NO 'value' property, only 'id'\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n }\n }\n };\n\n // Step 1: toFormData (opening the editor)\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // The result should have 'value' normalized from 'id'\n expect(formData.result[0].value).to.equal('favorite_color');\n\n // Step 2: fromFormData (saving without re-selecting the result)\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // The operand must NOT be @results.undefined\n expect(updatedNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle round-trip with delimiter when operand has only id', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [{ uuid: 'exit-other', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.result[0].value).to.equal('favorite_color');\n\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n expect(updatedNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \".\"))'\n );\n });\n });\n\n describe('backwards compatibility', () => {\n it('should support split_by_run_result_delimited type from old flows', () => {\n // Verify that split_by_run_result_delimited points to the same config as split_by_run_result\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n NODE_CONFIG['split_by_run_result']\n );\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n split_by_run_result\n );\n\n // Verify we can look up the config with the old type name\n const config = NODE_CONFIG['split_by_run_result_delimited'];\n expect(config).to.not.be.undefined;\n expect(config.name).to.equal('Split by Result');\n });\n\n it('should correctly process old flow with split_by_run_result_delimited type', () => {\n // Simulate a node from an old flow with the delimited type\n const oldNode: Node = {\n uuid: 'old-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.bloop, 0, \"+\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const oldNodeUI = {\n type: 'split_by_run_result_delimited',\n config: {\n operand: {\n id: 'bloop',\n name: 'Bloop',\n type: 'result'\n },\n index: 0,\n delimiter: '+'\n }\n };\n\n // Get config using the old type name - this should work due to backwards compatibility\n const config = NODE_CONFIG[oldNodeUI.type];\n expect(config).to.not.be.undefined;\n\n // Verify we can convert to form data\n const formData = config.toFormData!(oldNode, oldNodeUI);\n expect(formData.result[0].id).to.equal('bloop');\n expect(formData.result[0].name).to.equal('Bloop');\n expect(formData.delimit_by[0].value).to.equal('+');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n});\n"]}
1
+ {"version":3,"file":"split_by_run_result.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_run_result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_run_result } from '../../src/flow/nodes/split_by_run_result';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { zustand } from '../../src/store/AppState';\nimport { NODE_CONFIG } from '../../src/flow/config';\n\n/**\n * Test suite for the split_by_run_result node configuration.\n */\ndescribe('split_by_run_result node config', () => {\n const helper = new NodeTest(split_by_run_result, 'split_by_run_result');\n\n // Setup mock flow results in the store before each test\n beforeEach(() => {\n // Mock the store with flow results\n zustand.setState({\n flowInfo: {\n results: [\n {\n key: 'favorite_color',\n name: 'Favorite Color',\n categories: ['Red', 'Blue', 'Green'],\n node_uuids: ['node-1']\n },\n {\n key: 'age',\n name: 'Age',\n categories: ['Adult', 'Teen', 'Child'],\n node_uuids: ['node-2']\n }\n ],\n dependencies: [],\n counts: { nodes: 0, languages: 0 },\n locals: []\n }\n } as any);\n });\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_run_result.name).to.equal('Split by Result');\n });\n\n it('has correct type', () => {\n expect(split_by_run_result.type).to.equal('split_by_run_result');\n });\n\n it('has correct dialog size', () => {\n expect(split_by_run_result.dialogSize).to.equal('large');\n });\n });\n\n describe('toFormData', () => {\n it('should transform node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n },\n {\n uuid: 'case-2',\n type: 'has_any_word',\n arguments: ['blue', 'azure'],\n category_uuid: 'cat-2'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Blue', exit_uuid: 'exit-2' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('favorite_color');\n expect(formData.result[0].name).to.equal('Favorite Color');\n expect(formData.rules).to.have.lengthOf(2);\n\n // Check first rule\n expect(formData.rules[0].operator.value).to.equal('has_phrase');\n expect(formData.rules[0].value1).to.equal('red');\n expect(formData.rules[0].category).to.equal('Red');\n\n // Check second rule\n expect(formData.rules[1].operator.value).to.equal('has_any_word');\n expect(formData.rules[1].value1).to.equal('blue azure');\n expect(formData.rules[1].category).to.equal('Blue');\n\n expect(formData.result_name).to.equal('color_category');\n });\n\n it('should transform node with no rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('age');\n expect(formData.result[0].name).to.equal('Age');\n expect(formData.rules).to.have.lengthOf(0);\n expect(formData.result_name).to.equal('');\n });\n\n it('should handle missing nodeUI config gracefully', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const formData = split_by_run_result.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result).to.have.lengthOf(0);\n });\n\n it('should transform node with two-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number_between',\n arguments: ['13', '17'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Teen', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number_between');\n expect(formData.rules[0].value1).to.equal('13');\n expect(formData.rules[0].value2).to.equal('17');\n expect(formData.rules[0].category).to.equal('Teen');\n });\n\n it('should transform node with zero-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number',\n arguments: [],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Has Number', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number');\n expect(formData.rules[0].value1).to.equal('');\n expect(formData.rules[0].value2).to.equal('');\n });\n });\n\n describe('fromFormData', () => {\n it('should transform form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: { value: 'has_any_word', name: 'has any of the words' },\n value1: 'blue azure',\n value2: '',\n category: 'Blue'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n expect(resultNode.router!.result_name).to.equal('color_category');\n\n // Verify cases\n expect(resultNode.router!.cases).to.have.lengthOf(2);\n expect(resultNode.router!.cases![0].type).to.equal('has_phrase');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal(['red']);\n expect(resultNode.router!.cases![1].type).to.equal('has_any_word');\n expect(resultNode.router!.cases![1].arguments).to.deep.equal([\n 'blue azure'\n ]);\n\n // Verify categories\n expect(resultNode.router!.categories).to.have.lengthOf(3); // Red, Blue, Other\n expect(resultNode.router!.categories[0].name).to.equal('Red');\n expect(resultNode.router!.categories[1].name).to.equal('Blue');\n expect(resultNode.router!.categories[2].name).to.equal('Other');\n\n // Verify exits\n expect(resultNode.exits).to.have.lengthOf(3);\n });\n\n it('should transform form data without rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.age');\n expect(resultNode.router!.result_name).to.be.undefined;\n\n // Should have only the default 'All Responses' category (no rules means \"All Responses\")\n expect(resultNode.router!.categories).to.have.lengthOf(1);\n expect(resultNode.router!.categories[0].name).to.equal('All Responses');\n\n // Should have one exit\n expect(resultNode.exits).to.have.lengthOf(1);\n });\n\n it('should not set result_name if empty', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.result_name).to.be.undefined;\n });\n\n it('should preserve existing UUIDs when updating categories', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'existing-case-uuid',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'existing-cat-uuid'\n }\n ],\n categories: [\n {\n uuid: 'existing-cat-uuid',\n name: 'Red',\n exit_uuid: 'existing-exit-uuid'\n },\n {\n uuid: 'existing-other-uuid',\n name: 'Other',\n exit_uuid: 'existing-other-exit-uuid'\n }\n ],\n default_category_uuid: 'existing-other-uuid'\n },\n exits: [\n { uuid: 'existing-exit-uuid', destination_uuid: 'some-node' },\n { uuid: 'existing-other-exit-uuid', destination_uuid: null }\n ]\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should preserve existing category UUIDs\n const redCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Red'\n );\n expect(redCategory!.uuid).to.equal('existing-cat-uuid');\n expect(redCategory!.exit_uuid).to.equal('existing-exit-uuid');\n\n const otherCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n expect(otherCategory!.uuid).to.equal('existing-other-uuid');\n expect(otherCategory!.exit_uuid).to.equal('existing-other-exit-uuid');\n\n // Should preserve exit destinations\n const redExit = resultNode.exits.find(\n (exit) => exit.uuid === 'existing-exit-uuid'\n );\n expect(redExit!.destination_uuid).to.equal('some-node');\n });\n\n it('should handle form data without result selection', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should return the original node unchanged\n expect(resultNode).to.equal(originalNode);\n });\n\n it('should handle incomplete rules gracefully', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n },\n {\n operator: { value: 'has_number_lt', name: 'has a number below' },\n value1: '', // Missing value1\n value2: '',\n category: 'Child'\n },\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '10',\n value2: '', // Missing value2 for 2-operand operator\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Only the first complete rule should be included\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_gte');\n\n // Should have Adult category and Other\n expect(resultNode.router!.categories).to.have.lengthOf(2);\n expect(resultNode.router!.categories[0].name).to.equal('Adult');\n expect(resultNode.router!.categories[1].name).to.equal('Other');\n });\n\n it('should handle two-operand operators correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '13',\n value2: '17',\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_between');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal([\n '13',\n '17'\n ]);\n });\n });\n\n describe('validation', () => {\n it('should validate that a result is required', () => {\n const formData = {\n result: [],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.false;\n expect(validation.errors).to.have.property('result');\n expect(validation.errors.result).to.equal('A flow result is required');\n });\n\n it('should pass validation with valid result', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n\n it('should pass validation with result and rules', () => {\n const formData = {\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n }\n ],\n result_name: 'age_category'\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n });\n\n describe('delimiter functionality', () => {\n describe('toFormData', () => {\n it('should extract delimiter configuration when enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_by[0].name).to.equal('Delimited by periods');\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('2');\n expect(formData.delimit_index[0].name).to.equal('third result');\n });\n\n it('should handle delimiter not enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('');\n expect(formData.delimit_by[0].name).to.equal(\"Don't delimit result\");\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n\n describe('fromFormData', () => {\n it('should generate operand with field() function when delimiter enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '1', name: 'second' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 1, \"+\"))'\n );\n });\n\n it('should generate standard operand when delimiter not enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle different field numbers correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n delimit_by: [{ value: '.', name: 'periods' }],\n delimit_index: [{ value: '9', name: 'tenth' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.age, 9, \".\"))'\n );\n });\n\n it('should use default values when delimiter fields missing', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: ' ', name: 'spaces' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 0, \" \"))'\n );\n });\n });\n\n describe('toUIConfig', () => {\n it('should persist delimiter configuration when enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.equal(3);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should not include delimiter config when not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n });\n\n it('should set type to split_by_run_result_delimited when delimiter is enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result_delimited');\n });\n\n it('should set type to split_by_run_result when delimiter is not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result');\n });\n });\n\n describe('round-trip tests', () => {\n it('should preserve delimiter configuration through toFormData and fromFormData', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 5, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 5,\n delimiter: '.'\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Verify operand is preserved\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 5, \".\"))'\n );\n });\n\n it('should handle toggling delimiter on and off', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n // Start with delimiter disabled\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.delimit_by[0].value).to.equal('');\n\n // Enable delimiter\n formData.delimit_by = [{ value: '+', name: 'plusses' }];\n formData.delimit_index = [{ value: '2', name: 'third' }];\n\n // Convert to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \"+\"))'\n );\n\n // Get UI config and verify it persists delimiter settings\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.equal(2);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should properly remove delimiter when switching from delimited to non-delimited', () => {\n // Start with a node that has delimiter enabled\n const nodeWithDelimiter: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data - should show delimiter is enabled\n const formData = split_by_run_result.toFormData!(\n nodeWithDelimiter,\n nodeUI\n );\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_index[0].value).to.equal('2');\n\n // Now remove the delimiter by selecting \"Don't delimit result\"\n formData.delimit_by = [{ value: '', name: \"Don't delimit result\" }];\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n nodeWithDelimiter\n );\n\n // Operand should now be standard without field() function\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n\n // Get UI config - should NOT have index or delimiter\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n\n // Re-open the dialog - toFormData should show no delimiter\n const formDataReopened = split_by_run_result.toFormData!(\n resultNode,\n nodeUI\n );\n expect(formDataReopened.delimit_by[0].value).to.equal('');\n expect(formDataReopened.delimit_by[0].name).to.equal(\n \"Don't delimit result\"\n );\n });\n });\n });\n\n describe('toFormData normalizes operand from toUIConfig', () => {\n it('should handle round-trip when operand has only id (no value)', () => {\n // Reproduces the bug: toUIConfig saves { id, name, type } without 'value',\n // then toFormData loads it, and fromFormData must still produce a valid operand.\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n // nodeUI as saved by toUIConfig - note: NO 'value' property, only 'id'\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n }\n }\n };\n\n // Step 1: toFormData (opening the editor)\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // The result should have 'value' normalized from 'id'\n expect(formData.result[0].value).to.equal('favorite_color');\n\n // Step 2: fromFormData (saving without re-selecting the result)\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // The operand must NOT be @results.undefined\n expect(updatedNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle round-trip with delimiter when operand has only id', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [{ uuid: 'exit-other', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.result[0].value).to.equal('favorite_color');\n\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n expect(updatedNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \".\"))'\n );\n });\n });\n\n describe('backwards compatibility', () => {\n it('should support split_by_run_result_delimited type from old flows', () => {\n // Verify that split_by_run_result_delimited points to the same config as split_by_run_result\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n NODE_CONFIG['split_by_run_result']\n );\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n split_by_run_result\n );\n\n // Verify we can look up the config with the old type name\n const config = NODE_CONFIG['split_by_run_result_delimited'];\n expect(config).to.not.be.undefined;\n expect(config.name).to.equal('Split by Result');\n });\n\n it('should correctly process old flow with split_by_run_result_delimited type', () => {\n // Simulate a node from an old flow with the delimited type\n const oldNode: Node = {\n uuid: 'old-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.bloop, 0, \"+\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const oldNodeUI = {\n type: 'split_by_run_result_delimited',\n config: {\n operand: {\n id: 'bloop',\n name: 'Bloop',\n type: 'result'\n },\n index: 0,\n delimiter: '+'\n }\n };\n\n // Get config using the old type name - this should work due to backwards compatibility\n const config = NODE_CONFIG[oldNodeUI.type];\n expect(config).to.not.be.undefined;\n\n // Verify we can convert to form data\n const formData = config.toFormData!(oldNode, oldNodeUI);\n expect(formData.result[0].id).to.equal('bloop');\n expect(formData.result[0].name).to.equal('Bloop');\n expect(formData.delimit_by[0].value).to.equal('+');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n});\n"]}
@@ -34,16 +34,18 @@ describe('temba-canvas-menu', () => {
34
34
  expect(menuElement).to.not.be.null;
35
35
  await assertScreenshot('canvas-menu/open', getClip(menu));
36
36
  });
37
- it('has three menu items', async () => {
37
+ it('has five menu items', async () => {
38
38
  var _a;
39
39
  const menu = await createCanvasMenu();
40
40
  menu.show(100, 100, { x: 50, y: 50 });
41
41
  await menu.updateComplete;
42
42
  const menuItems = (_a = menu.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.menu-item');
43
- expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(3);
43
+ expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(5);
44
44
  // check menu item titles
45
45
  const titles = Array.from(menuItems || []).map((item) => { var _a; return (_a = item.querySelector('.menu-item-title')) === null || _a === void 0 ? void 0 : _a.textContent; });
46
46
  expect(titles).to.deep.equal([
47
+ 'Send Message',
48
+ 'Wait for Response',
47
49
  'Add Action',
48
50
  'Add Split',
49
51
  'Add Sticky Note'
@@ -69,9 +71,9 @@ describe('temba-canvas-menu', () => {
69
71
  selectionFired = true;
70
72
  selectionDetail = event.detail;
71
73
  });
72
- // click on sticky note option (now the third item)
74
+ // click on sticky note option (now the fifth item)
73
75
  const menuItems = (_a = menu.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.menu-item');
74
- const stickyItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[2];
76
+ const stickyItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[4];
75
77
  stickyItem.click();
76
78
  await menu.updateComplete;
77
79
  expect(selectionFired).to.be.true;
@@ -87,9 +89,11 @@ describe('temba-canvas-menu', () => {
87
89
  menu.show(100, 100, { x: 50, y: 50 }, true, true);
88
90
  await menu.updateComplete;
89
91
  const menuItems = (_a = menu.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.menu-item');
90
- expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(4);
92
+ expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(6);
91
93
  const titles = Array.from(menuItems || []).map((item) => { var _a; return (_a = item.querySelector('.menu-item-title')) === null || _a === void 0 ? void 0 : _a.textContent; });
92
94
  expect(titles).to.deep.equal([
95
+ 'Send Message',
96
+ 'Wait for Response',
93
97
  'Add Action',
94
98
  'Add Split',
95
99
  'Add Sticky Note',
@@ -106,7 +110,7 @@ describe('temba-canvas-menu', () => {
106
110
  selectionDetail = event.detail;
107
111
  });
108
112
  const menuItems = (_a = menu.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.menu-item');
109
- const reflowItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[3];
113
+ const reflowItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[5];
110
114
  reflowItem.click();
111
115
  await menu.updateComplete;
112
116
  expect(selectionDetail).to.deep.equal({
@@ -121,7 +125,7 @@ describe('temba-canvas-menu', () => {
121
125
  menu.show(100, 100, { x: 50, y: 50 });
122
126
  await menu.updateComplete;
123
127
  const menuItems = (_a = menu.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.menu-item');
124
- expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(3);
128
+ expect(menuItems === null || menuItems === void 0 ? void 0 : menuItems.length).to.equal(5);
125
129
  const titles = Array.from(menuItems || []).map((item) => { var _a; return (_a = item.querySelector('.menu-item-title')) === null || _a === void 0 ? void 0 : _a.textContent; });
126
130
  expect(titles).to.not.include('Reflow');
127
131
  });
@@ -155,8 +159,8 @@ describe('temba-canvas-menu', () => {
155
159
  selectionDetail = event.detail;
156
160
  });
157
161
  const menuItems = (_b = menu.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.menu-item');
158
- const actionItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[0];
159
- actionItem.click();
162
+ const sendMsgItem = menuItems === null || menuItems === void 0 ? void 0 : menuItems[0];
163
+ sendMsgItem.click();
160
164
  await menu.updateComplete;
161
165
  expect(selectionFired).to.be.true;
162
166
  // click position should remain unchanged
@@ -1 +1 @@
1
- {"version":3,"file":"temba-canvas-menu.test.js","sourceRoot":"","sources":["../../test/temba-canvas-menu.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, assert } from '@open-wc/testing';\nimport { CanvasMenu } from '../src/flow/CanvasMenu';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\ndescribe('temba-canvas-menu', () => {\n const createCanvasMenu = async () => {\n const component = (await getComponent(\n 'temba-canvas-menu',\n {},\n '',\n 250,\n 250\n )) as CanvasMenu;\n await component.updateComplete;\n return component;\n };\n\n it('can be created', async () => {\n const menu = await createCanvasMenu();\n assert.instanceOf(menu, CanvasMenu);\n expect(menu.open).to.be.false;\n });\n\n it('is not visible when closed', async () => {\n const menu = await createCanvasMenu();\n expect(menu.open).to.be.false;\n\n // verify no menu is rendered\n const menuElement = menu.shadowRoot?.querySelector('.menu');\n expect(menuElement).to.be.null;\n });\n\n it('shows menu when opened', async () => {\n const menu = await createCanvasMenu();\n\n // open the menu\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n expect(menu.open).to.be.true;\n expect(menu.x).to.equal(100);\n expect(menu.y).to.equal(100);\n\n // verify menu is rendered\n const menuElement = menu.shadowRoot?.querySelector('.menu');\n expect(menuElement).to.not.be.null;\n\n await assertScreenshot('canvas-menu/open', getClip(menu));\n });\n\n it('has three menu items', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(3);\n\n // check menu item titles\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.deep.equal([\n 'Add Action',\n 'Add Split',\n 'Add Sticky Note'\n ]);\n });\n\n it('closes when close() is called', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n expect(menu.open).to.be.true;\n\n menu.close();\n await menu.updateComplete;\n\n expect(menu.open).to.be.false;\n });\n\n it('fires selection event when menu item is clicked', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n let selectionFired = false;\n let selectionDetail = null;\n\n menu.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n // click on sticky note option (now the third item)\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const stickyItem = menuItems?.[2] as HTMLElement;\n stickyItem.click();\n await menu.updateComplete;\n\n expect(selectionFired).to.be.true;\n expect(selectionDetail).to.deep.equal({\n action: 'sticky',\n position: { x: 50, y: 50 }\n });\n expect(menu.open).to.be.false;\n });\n\n it('shows reflow option when showReflow is true', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 }, true, true);\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(4);\n\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.deep.equal([\n 'Add Action',\n 'Add Split',\n 'Add Sticky Note',\n 'Reflow'\n ]);\n });\n\n it('fires reflow selection event when reflow is clicked', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 }, true, true);\n await menu.updateComplete;\n\n let selectionDetail = null;\n menu.addEventListener('temba-selection', (event: any) => {\n selectionDetail = event.detail;\n });\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const reflowItem = menuItems?.[3] as HTMLElement;\n reflowItem.click();\n await menu.updateComplete;\n\n expect(selectionDetail).to.deep.equal({\n action: 'reflow',\n position: { x: 50, y: 50 }\n });\n expect(menu.open).to.be.false;\n });\n\n it('hides reflow option by default', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(3);\n\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.not.include('Reflow');\n });\n\n it('adjusts position to stay within viewport bounds', async () => {\n const menu = await createCanvasMenu();\n\n // open menu at position that would go off screen\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const margin = 10; // matches the margin in CanvasMenu\n\n // position that would go off the right and bottom edges\n menu.show(viewportWidth - 50, viewportHeight - 50, {\n x: 100,\n y: 100\n });\n await menu.updateComplete;\n\n // wait for position adjustment\n await new Promise((resolve) => setTimeout(resolve, 100));\n await menu.updateComplete;\n\n const menuElement = menu.shadowRoot?.querySelector('.menu') as HTMLElement;\n expect(menuElement).to.not.be.null;\n\n const menuRect = menuElement.getBoundingClientRect();\n\n // verify menu stays within viewport with margin\n expect(menuRect.right).to.be.at.most(viewportWidth - margin);\n expect(menuRect.bottom).to.be.at.most(viewportHeight - margin);\n\n // verify click position is preserved (not adjusted)\n let selectionFired = false;\n let selectionDetail = null;\n\n menu.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const actionItem = menuItems?.[0] as HTMLElement;\n actionItem.click();\n await menu.updateComplete;\n\n expect(selectionFired).to.be.true;\n // click position should remain unchanged\n expect(selectionDetail.position).to.deep.equal({ x: 100, y: 100 });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-canvas-menu.test.js","sourceRoot":"","sources":["../../test/temba-canvas-menu.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, assert } from '@open-wc/testing';\nimport { CanvasMenu } from '../src/flow/CanvasMenu';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\ndescribe('temba-canvas-menu', () => {\n const createCanvasMenu = async () => {\n const component = (await getComponent(\n 'temba-canvas-menu',\n {},\n '',\n 250,\n 250\n )) as CanvasMenu;\n await component.updateComplete;\n return component;\n };\n\n it('can be created', async () => {\n const menu = await createCanvasMenu();\n assert.instanceOf(menu, CanvasMenu);\n expect(menu.open).to.be.false;\n });\n\n it('is not visible when closed', async () => {\n const menu = await createCanvasMenu();\n expect(menu.open).to.be.false;\n\n // verify no menu is rendered\n const menuElement = menu.shadowRoot?.querySelector('.menu');\n expect(menuElement).to.be.null;\n });\n\n it('shows menu when opened', async () => {\n const menu = await createCanvasMenu();\n\n // open the menu\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n expect(menu.open).to.be.true;\n expect(menu.x).to.equal(100);\n expect(menu.y).to.equal(100);\n\n // verify menu is rendered\n const menuElement = menu.shadowRoot?.querySelector('.menu');\n expect(menuElement).to.not.be.null;\n\n await assertScreenshot('canvas-menu/open', getClip(menu));\n });\n\n it('has five menu items', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(5);\n\n // check menu item titles\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.deep.equal([\n 'Send Message',\n 'Wait for Response',\n 'Add Action',\n 'Add Split',\n 'Add Sticky Note'\n ]);\n });\n\n it('closes when close() is called', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n expect(menu.open).to.be.true;\n\n menu.close();\n await menu.updateComplete;\n\n expect(menu.open).to.be.false;\n });\n\n it('fires selection event when menu item is clicked', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n let selectionFired = false;\n let selectionDetail = null;\n\n menu.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n // click on sticky note option (now the fifth item)\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const stickyItem = menuItems?.[4] as HTMLElement;\n stickyItem.click();\n await menu.updateComplete;\n\n expect(selectionFired).to.be.true;\n expect(selectionDetail).to.deep.equal({\n action: 'sticky',\n position: { x: 50, y: 50 }\n });\n expect(menu.open).to.be.false;\n });\n\n it('shows reflow option when showReflow is true', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 }, true, true);\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(6);\n\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.deep.equal([\n 'Send Message',\n 'Wait for Response',\n 'Add Action',\n 'Add Split',\n 'Add Sticky Note',\n 'Reflow'\n ]);\n });\n\n it('fires reflow selection event when reflow is clicked', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 }, true, true);\n await menu.updateComplete;\n\n let selectionDetail = null;\n menu.addEventListener('temba-selection', (event: any) => {\n selectionDetail = event.detail;\n });\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const reflowItem = menuItems?.[5] as HTMLElement;\n reflowItem.click();\n await menu.updateComplete;\n\n expect(selectionDetail).to.deep.equal({\n action: 'reflow',\n position: { x: 50, y: 50 }\n });\n expect(menu.open).to.be.false;\n });\n\n it('hides reflow option by default', async () => {\n const menu = await createCanvasMenu();\n menu.show(100, 100, { x: 50, y: 50 });\n await menu.updateComplete;\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n expect(menuItems?.length).to.equal(5);\n\n const titles = Array.from(menuItems || []).map(\n (item) => item.querySelector('.menu-item-title')?.textContent\n );\n expect(titles).to.not.include('Reflow');\n });\n\n it('adjusts position to stay within viewport bounds', async () => {\n const menu = await createCanvasMenu();\n\n // open menu at position that would go off screen\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const margin = 10; // matches the margin in CanvasMenu\n\n // position that would go off the right and bottom edges\n menu.show(viewportWidth - 50, viewportHeight - 50, {\n x: 100,\n y: 100\n });\n await menu.updateComplete;\n\n // wait for position adjustment\n await new Promise((resolve) => setTimeout(resolve, 100));\n await menu.updateComplete;\n\n const menuElement = menu.shadowRoot?.querySelector('.menu') as HTMLElement;\n expect(menuElement).to.not.be.null;\n\n const menuRect = menuElement.getBoundingClientRect();\n\n // verify menu stays within viewport with margin\n expect(menuRect.right).to.be.at.most(viewportWidth - margin);\n expect(menuRect.bottom).to.be.at.most(viewportHeight - margin);\n\n // verify click position is preserved (not adjusted)\n let selectionFired = false;\n let selectionDetail = null;\n\n menu.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n const menuItems = menu.shadowRoot?.querySelectorAll('.menu-item');\n const sendMsgItem = menuItems?.[0] as HTMLElement;\n sendMsgItem.click();\n await menu.updateComplete;\n\n expect(selectionFired).to.be.true;\n // click position should remain unchanged\n expect(selectionDetail.position).to.deep.equal({ x: 100, y: 100 });\n });\n});\n"]}