@nyaruka/temba-components 0.130.0 → 0.130.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.
- package/CHANGELOG.md +34 -4
- package/DEV_DATA.md +89 -0
- package/demo/data/flows/food-order.json +4 -4
- package/demo/data/flows/sample-flow.json +132 -147
- package/dist/temba-components.js +764 -628
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/display/Chat.js +5 -3
- package/out-tsc/src/display/Chat.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +83 -78
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +1 -0
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +47 -3
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js +13 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +1 -0
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +3 -1
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +17 -14
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm.js +12 -12
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +609 -6
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/operators.js +194 -0
- package/out-tsc/src/flow/operators.js.map +1 -0
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +84 -19
- package/out-tsc/src/form/ArrayEditor.js.map +1 -1
- package/out-tsc/src/form/Checkbox.js +12 -0
- package/out-tsc/src/form/Checkbox.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +13 -3
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/form/TextInput.js +20 -1
- package/out-tsc/src/form/TextInput.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +14 -1
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/layout/Dialog.js +3 -4
- package/out-tsc/src/layout/Dialog.js.map +1 -1
- package/out-tsc/src/list/RunList.js +2 -2
- package/out-tsc/src/list/RunList.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +114 -34
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/live/ContactDetails.js +7 -0
- package/out-tsc/src/live/ContactDetails.js.map +1 -1
- package/out-tsc/src/live/ContactNameFetch.js +1 -1
- package/out-tsc/src/live/ContactNameFetch.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +25 -27
- package/out-tsc/test/NodeHelper.js.map +1 -1
- package/out-tsc/test/nodes/split_by_llm.test.js +12 -4
- package/out-tsc/test/nodes/split_by_llm.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js +101 -91
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_random.test.js +120 -112
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_digits.test.js +131 -111
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_response.test.js +549 -85
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
- package/out-tsc/test/temba-checkbox.test.js +32 -32
- package/out-tsc/test/temba-checkbox.test.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +2 -1
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-dropdown.test.js +0 -4
- package/out-tsc/test/temba-dropdown.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor-node.test.js +9 -4
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-integration-markdown.test.js +13 -15
- package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +5 -38
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-run-list.test.js +2 -2
- package/out-tsc/test/temba-run-list.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -1
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +6 -2
- package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/checkbox/checkbox-label-background-hover.png +0 -0
- package/screenshots/truth/checkbox/checkbox-whitespace-label-no-background-hover.png +0 -0
- package/screenshots/truth/checkbox/checkbox-with-help-text.png +0 -0
- package/screenshots/truth/checkbox/checked.png +0 -0
- package/screenshots/truth/checkbox/default.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/integration/textinput-markdown-errors.png +0 -0
- package/screenshots/truth/lightbox/img-zoomed.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/screenshots/truth/run-list/basic.png +0 -0
- package/screenshots/truth/templates/default.png +0 -0
- package/screenshots/truth/wait-for-response/rules-editor.png +0 -0
- package/screenshots/truth/wait-for-response/timeout-editor-unchecked.png +0 -0
- package/screenshots/truth/wait-for-response/timeout-editor.png +0 -0
- package/scripts/dev-data-sync.mjs +182 -0
- package/src/display/Chat.ts +6 -4
- package/src/events.ts +6 -5
- package/src/flow/CanvasNode.ts +89 -79
- package/src/flow/Editor.ts +1 -0
- package/src/flow/NodeEditor.ts +55 -3
- package/src/flow/actions/add_contact_groups.ts +16 -1
- package/src/flow/actions/add_contact_urn.ts +1 -1
- package/src/flow/actions/add_input_labels.ts +1 -0
- package/src/flow/actions/set_contact_channel.ts +1 -1
- package/src/flow/actions/set_contact_field.ts +2 -1
- package/src/flow/actions/set_contact_language.ts +3 -1
- package/src/flow/actions/set_contact_name.ts +1 -1
- package/src/flow/actions/set_contact_status.ts +18 -18
- package/src/flow/actions/set_run_result.ts +1 -1
- package/src/flow/nodes/split_by_llm.ts +14 -13
- package/src/flow/nodes/wait_for_response.ts +717 -5
- package/src/flow/operators.ts +215 -0
- package/src/flow/types.ts +10 -2
- package/src/form/ArrayEditor.ts +117 -37
- package/src/form/Checkbox.ts +12 -0
- package/src/form/FieldRenderer.ts +24 -3
- package/src/form/TextInput.ts +19 -1
- package/src/form/select/Select.ts +15 -4
- package/src/interfaces.ts +1 -1
- package/src/layout/Dialog.ts +4 -4
- package/src/list/RunList.ts +2 -2
- package/src/live/ContactChat.ts +144 -58
- package/src/live/ContactDetails.ts +7 -0
- package/src/live/ContactNameFetch.ts +1 -1
- package/static/api/labels.json +6 -1
- package/test/NodeHelper.ts +38 -40
- package/test/nodes/split_by_llm.test.ts +43 -32
- package/test/nodes/split_by_llm_categorize.test.ts +130 -120
- package/test/nodes/split_by_random.test.ts +136 -128
- package/test/nodes/wait_for_digits.test.ts +147 -127
- package/test/nodes/wait_for_response.test.ts +657 -104
- package/test/temba-checkbox.test.ts +36 -32
- package/test/temba-contact-chat.test.ts +2 -1
- package/test/temba-dropdown.test.ts +0 -12
- package/test/temba-flow-editor-node.test.ts +11 -4
- package/test/temba-integration-markdown.test.ts +16 -17
- package/test/temba-node-editor.test.ts +5 -43
- package/test/temba-run-list.test.ts +2 -2
- package/test/utils.test.ts +2 -1
- package/test-assets/list/runs.json +8 -8
- package/web-dev-mock.mjs +86 -30
- package/web-dev-server.config.mjs +272 -31
- package/screenshots/truth/dropdown/bottom-edge-collision.png +0 -0
- package/screenshots/truth/dropdown/right-edge-collision.png +0 -0
- package/screenshots/truth/editor/send_msg.png +0 -0
- package/screenshots/truth/editor/set_contact_language.png +0 -0
- package/screenshots/truth/editor/set_contact_name.png +0 -0
- package/screenshots/truth/editor/set_run_result.png +0 -0
- package/screenshots/truth/integration/checkbox-markdown-errors.png +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-node-editor.test.js","sourceRoot":"","sources":["../../test/temba-node-editor.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { html, fixture, expect } from '@open-wc/testing';\nimport { assertScreenshot, getClip } from './utils.test';\n\n// Define interface for NodeEditor component\ninterface NodeEditorElement extends HTMLElement {\n action?: any;\n node?: any;\n nodeUI?: any;\n isOpen?: boolean;\n updateComplete: Promise<boolean>;\n}\n\nconst assertDialogScreenshot = async (\n el: NodeEditorElement,\n screenshotName: string\n) => {\n const dialog = el.shadowRoot\n .querySelector('temba-dialog')\n .shadowRoot.querySelector('.dialog-container') as HTMLElement;\n await assertScreenshot(screenshotName, getClip(dialog));\n};\n\ndescribe('temba-node-editor', () => {\n it('can be created', async () => {\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n expect(el).to.exist;\n expect(el.tagName).to.equal('TEMBA-NODE-EDITOR');\n });\n\n it('renders send_msg action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders send_msg action with message editor', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello @contact.name, check this out!',\n attachments: [\n 'image/jpeg:http://example.com/photo.jpg',\n 'image:@fields.profile_pic'\n ],\n quick_replies: ['Yes', 'No']\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n\n // Check that the message editor component is rendered\n const messageEditor = el.shadowRoot.querySelector(\n 'temba-message-editor'\n ) as any;\n expect(messageEditor).to.not.be.null;\n expect(messageEditor.value).to.equal(action.text);\n });\n\n it('renders set_run_result action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'set_run_result',\n name: 'result_name',\n value: 'result_value'\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders set_contact_field action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'set_contact_field',\n field: { key: 'age', name: 'Age' },\n value: '25'\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders add_contact_groups action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'add_contact_groups',\n groups: [{ uuid: 'group-1', name: 'Test Group' }]\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders enter_flow action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'enter_flow',\n flow: { uuid: 'flow-1', name: 'Sub Flow' }\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders node with router configuration', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: [{ uuid: 'exit-1', name: 'Default' }],\n router: {\n type: 'switch',\n result_name: 'result',\n categories: [{ uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' }]\n }\n };\n\n const nodeUI = {\n type: 'split_by_expression',\n position: { left: 100, top: 100 }\n };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n await assertDialogScreenshot(el, 'editor/router');\n });\n\n it('renders node with wait configuration', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: [{ uuid: 'exit-1', name: 'Default' }],\n wait: {\n type: 'msg'\n }\n };\n\n const nodeUI = {\n type: 'wait_for_response',\n position: { left: 100, top: 100 }\n };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n await assertDialogScreenshot(el, 'editor/wait');\n });\n\n it('handles different button actions', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n let saveEventFired = false;\n let cancelEventFired = false;\n\n el.addEventListener('temba-action-saved', () => {\n saveEventFired = true;\n });\n\n el.addEventListener('temba-node-edit-cancelled', () => {\n cancelEventFired = true;\n });\n\n // Get the dialog element inside the node editor\n const dialog = el.shadowRoot!.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n\n // Test Save button by dispatching event on the dialog\n const saveEvent = new CustomEvent('temba-button-clicked', {\n detail: { button: { name: 'Save' } },\n bubbles: true\n });\n dialog!.dispatchEvent(saveEvent);\n expect(saveEventFired).to.equal(true);\n\n // Reset for cancel test\n saveEventFired = false;\n\n // Test Cancel button\n const cancelEvent = new CustomEvent('temba-button-clicked', {\n detail: { button: { name: 'Cancel' } },\n bubbles: true\n });\n dialog!.dispatchEvent(cancelEvent);\n expect(cancelEventFired).to.equal(true);\n });\n\n it('handles property updates', async () => {\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n // Test action property update\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n el.action = action;\n await el.updateComplete;\n expect(el.action).to.equal(action);\n\n // Test node property update\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: []\n };\n\n el.node = node;\n await el.updateComplete;\n expect(el.node).to.equal(node);\n\n // Test nodeUI property update\n const nodeUI = {\n type: 'execute_actions',\n position: { left: 100, top: 100 }\n };\n\n el.nodeUI = nodeUI;\n await el.updateComplete;\n expect(el.nodeUI).to.equal(nodeUI);\n });\n\n it('handles form submission events', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Since the form submission handling is complex and involves internal components,\n // we'll just verify the component renders without errors and has the expected structure\n const shadowRoot = el.shadowRoot;\n expect(shadowRoot).to.not.be.null;\n\n // Verify dialog is present\n const dialog = shadowRoot!.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n });\n\n it('handles form validation', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Test that the component renders form elements\n const shadowRoot = el.shadowRoot;\n expect(shadowRoot).to.not.be.null;\n });\n\n it('renders different action types correctly', async () => {\n const actionTypes = [\n {\n type: 'send_msg',\n data: { text: 'Message', quick_replies: [] }\n },\n {\n type: 'set_run_result',\n data: { name: 'result', value: 'value' }\n },\n {\n type: 'set_contact_name',\n data: { name: 'John Doe' }\n },\n {\n type: 'set_contact_language',\n data: { language: 'eng' }\n }\n ];\n\n for (const actionType of actionTypes) {\n const action = {\n uuid: `test-${actionType.type}`,\n type: actionType.type,\n ...actionType.data\n };\n\n const el = (await fixture(html`\n <temba-node-editor\n .action=${action}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action.type).to.equal(actionType.type);\n\n await assertDialogScreenshot(el, `editor/${actionType.type}`);\n }\n });\n\n it('displays bubble count for group value counts', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: ['Yes', 'No', 'Maybe'],\n attachments: ['image:@contact.photo', 'document:@contact.resume']\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data to be fully initialized and re-render to complete\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that bubble counts are displayed\n const shadowRoot = el.shadowRoot;\n const bubbles = shadowRoot.querySelectorAll('.group-count-bubble');\n\n // Should have bubbles for groups with values\n expect(bubbles.length).to.be.greaterThan(0);\n\n // Check specific bubble values (trim to handle whitespace in rendered text)\n const bubbleTexts = Array.from(bubbles).map((bubble) =>\n bubble.textContent?.trim()\n );\n\n // Runtime attachments group should show bubble when collapsed and has values\n expect(bubbleTexts).to.include('2'); // 2 runtime attachments\n // Note: Quick replies group auto-expands when it has content, so no bubble is shown\n });\n\n it('shows arrow when group has no values', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world'\n // No quick_replies or attachments provided\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that arrows are displayed instead of bubbles\n const shadowRoot = el.shadowRoot;\n const bubbles = shadowRoot.querySelectorAll('.group-count-bubble');\n const arrows = shadowRoot.querySelectorAll('.group-toggle-icon');\n\n // Should have no bubbles when counts are 0\n expect(bubbles.length).to.equal(0);\n\n // Should have arrows for collapsible groups\n expect(arrows.length).to.be.greaterThan(0);\n });\n\n it('renders split_by_llm_categorize node', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check if the dialog is rendered with correct header\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n expect(dialog.getAttribute('header')).to.equal('Split by AI');\n\n // Check that the form is rendered\n const form = el.shadowRoot.querySelector('.node-editor-form');\n expect(form).to.not.be.null;\n\n // Check that all expected form components are rendered\n const selectComponents = el.shadowRoot.querySelectorAll('temba-select');\n const arrayComponents =\n el.shadowRoot.querySelectorAll('temba-array-editor');\n const completionComponents =\n el.shadowRoot.querySelectorAll('temba-completion');\n\n // Should have LLM select field\n expect(selectComponents.length).to.equal(1);\n expect(selectComponents[0].getAttribute('label')).to.equal('LLM');\n\n // Should have input completion field\n expect(completionComponents.length).to.equal(1);\n expect(completionComponents[0].getAttribute('label')).to.equal('Input');\n\n // Should have categories array editor\n expect(arrayComponents.length).to.equal(1);\n });\n\n it('renders wait_for_response node', async () => {\n const node = {\n uuid: 'test-wait-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: 300 // 5 minutes in seconds\n },\n result_name: 'response',\n categories: []\n },\n exits: []\n };\n\n const nodeUI = { type: 'wait_for_response' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that the dialog is rendered with correct header\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n expect(dialog.getAttribute('header')).to.equal('Wait for Response');\n\n // Check that timeout and result name fields are rendered\n const textComponents = el.shadowRoot.querySelectorAll('temba-textinput');\n expect(textComponents.length).to.equal(1);\n\n // Verify the field labels\n const labels = Array.from(textComponents).map((comp) =>\n comp.getAttribute('label')\n );\n expect(labels).to.include('Result Name');\n });\n\n it('prioritizes node config over action config for non-execute_actions nodes', async () => {\n // Create a split_by_llm_categorize node that has both actions and should use node config\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n // Simulate having both node and action set (which happens when editing from flow)\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .action=${node.actions[0]}\n .isOpen=${true}\n >\n </temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Should show node editor (Split by AI Categorize), not action editor (Call LLM)\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog.getAttribute('header')).to.equal('Split by AI');\n\n // Should have node config fields (LLM, Input, Categories, Result Name)\n const selectComponents = el.shadowRoot.querySelectorAll('temba-select');\n const arrayComponents =\n el.shadowRoot.querySelectorAll('temba-array-editor');\n\n // Should have LLM select and categories array (node config fields)\n expect(selectComponents.length).to.equal(1);\n expect(arrayComponents.length).to.equal(1);\n });\n\n it('initializes categories correctly for split_by_llm_categorize', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Access the component's formData directly to check initialization\n const formData = (el as any).formData;\n\n // Should have 2 categories (Greeting and Question, excluding Other and Failure)\n expect(formData.categories).to.be.an('array');\n expect(formData.categories.length).to.equal(2);\n expect(formData.categories[0].name).to.equal('Greeting');\n expect(formData.categories[1].name).to.equal('Question');\n\n // Check that the array editor component receives the correct value\n const arrayEditor = el.shadowRoot.querySelector('temba-array-editor');\n expect(arrayEditor).to.not.be.null;\n\n // Wait a bit more for the array editor to fully render\n await new Promise((resolve) => setTimeout(resolve, 500));\n await el.updateComplete;\n\n // Check the values of the textinput components within the array items\n const textInputs =\n arrayEditor.shadowRoot?.querySelectorAll('temba-textinput');\n\n if (textInputs && textInputs.length >= 2) {\n // The first two textinputs should have the category names\n expect((textInputs[0] as any).value).to.equal('Greeting');\n expect((textInputs[1] as any).value).to.equal('Question');\n }\n });\n\n it('properly initializes categories when node is set after component creation', async () => {\n // First create the component without any data\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${false}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Then set the node data (simulating real usage)\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n // Set the properties (this should trigger updated() and openDialog())\n el.node = node;\n el.nodeUI = nodeUI;\n\n await el.updateComplete;\n\n // Wait for dialog to open and form data to initialize\n await new Promise((resolve) => setTimeout(resolve, 300));\n await el.updateComplete;\n\n // Check that the form data is properly initialized\n const formData = (el as any).formData;\n\n expect(formData.categories).to.be.an('array');\n expect(formData.categories.length).to.equal(2);\n expect(formData.categories[0].name).to.equal('Greeting');\n expect(formData.categories[1].name).to.equal('Question');\n\n // Check that array editor gets the correct values\n const arrayEditor = el.shadowRoot.querySelector('temba-array-editor');\n expect(arrayEditor).to.not.be.null;\n\n const textInputs =\n arrayEditor.shadowRoot?.querySelectorAll('temba-textinput');\n if (textInputs && textInputs.length >= 2) {\n expect((textInputs[0] as any).value).to.equal('Greeting');\n expect((textInputs[1] as any).value).to.equal('Question');\n }\n });\n\n it('preserves UUIDs for unchanged categories in split_by_llm_categorize', async () => {\n const originalNode: any = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'existing-call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n {\n uuid: 'existing-cat-1',\n name: 'Greeting',\n exit_uuid: 'existing-exit-1'\n },\n {\n uuid: 'existing-cat-2',\n name: 'Question',\n exit_uuid: 'existing-exit-2'\n },\n {\n uuid: 'existing-cat-other',\n name: 'Other',\n exit_uuid: 'existing-exit-other'\n },\n {\n uuid: 'existing-cat-failure',\n name: 'Failure',\n exit_uuid: 'existing-exit-failure'\n }\n ],\n cases: [\n {\n uuid: 'existing-case-1',\n type: 'has_only_text',\n arguments: ['Greeting'],\n category_uuid: 'existing-cat-1'\n },\n {\n uuid: 'existing-case-2',\n type: 'has_only_text',\n arguments: ['Question'],\n category_uuid: 'existing-cat-2'\n },\n {\n uuid: 'existing-case-error',\n type: 'has_only_text',\n arguments: ['<ERROR>'],\n category_uuid: 'existing-cat-failure'\n }\n ]\n },\n exits: [\n { uuid: 'existing-exit-1', destination_uuid: 'some-destination-1' },\n { uuid: 'existing-exit-2', destination_uuid: 'some-destination-2' },\n { uuid: 'existing-exit-other', destination_uuid: null },\n { uuid: 'existing-exit-failure', destination_uuid: null }\n ]\n };\n\n // Import the node config to test fromFormData directly\n const { split_by_llm_categorize } = await import(\n '../src/flow/nodes/split_by_llm_categorize'\n );\n\n // Test with same categories - should preserve UUIDs\n const formDataSame = {\n llm: [{ value: 'llm-123', name: 'Test LLM' }],\n input: '@input',\n categories: [{ name: 'Greeting' }, { name: 'Question' }],\n result_name: 'Intent'\n };\n\n const resultSame = split_by_llm_categorize.fromFormData(\n formDataSame,\n originalNode\n );\n\n // Should preserve existing UUIDs for unchanged categories\n expect(resultSame.actions[0].uuid).to.equal('existing-call-llm-uuid');\n\n const greetingCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Greeting'\n );\n const questionCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Question'\n );\n const otherCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Other'\n );\n const failureCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Failure'\n );\n\n expect(greetingCategory.uuid).to.equal('existing-cat-1');\n expect(greetingCategory.exit_uuid).to.equal('existing-exit-1');\n expect(questionCategory.uuid).to.equal('existing-cat-2');\n expect(questionCategory.exit_uuid).to.equal('existing-exit-2');\n expect(otherCategory.uuid).to.equal('existing-cat-other');\n expect(failureCategory.uuid).to.equal('existing-cat-failure');\n\n // Should preserve destination UUIDs for exits\n const greetingExit = resultSame.exits.find(\n (exit) => exit.uuid === 'existing-exit-1'\n );\n const questionExit = resultSame.exits.find(\n (exit) => exit.uuid === 'existing-exit-2'\n );\n expect(greetingExit.destination_uuid).to.equal('some-destination-1');\n expect(questionExit.destination_uuid).to.equal('some-destination-2');\n\n // Test with changed categories - should generate new UUIDs for new categories\n const formDataChanged = {\n llm: [{ value: 'llm-123', name: 'Test LLM' }],\n input: '@input',\n categories: [\n { name: 'Greeting' }, // unchanged - should keep UUID\n { name: 'NewCategory' } // new - should get new UUID\n ],\n result_name: 'Intent'\n };\n\n const resultChanged = split_by_llm_categorize.fromFormData(\n formDataChanged,\n originalNode\n );\n\n const greetingCategoryChanged = resultChanged.router.categories.find(\n (cat) => cat.name === 'Greeting'\n );\n const newCategory = resultChanged.router.categories.find(\n (cat) => cat.name === 'NewCategory'\n );\n\n // Greeting should keep its existing UUID\n expect(greetingCategoryChanged.uuid).to.equal('existing-cat-1');\n expect(greetingCategoryChanged.exit_uuid).to.equal('existing-exit-1');\n\n // NewCategory should get a new UUID (not one of the existing ones)\n expect(newCategory.uuid).to.not.equal('existing-cat-1');\n expect(newCategory.uuid).to.not.equal('existing-cat-2');\n expect(newCategory.uuid).to.not.equal('existing-cat-other');\n expect(newCategory.uuid).to.not.equal('existing-cat-failure');\n expect(newCategory.uuid).to.have.length.greaterThan(0);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-node-editor.test.js","sourceRoot":"","sources":["../../test/temba-node-editor.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWzD,MAAM,sBAAsB,GAAG,KAAK,EAClC,EAAqB,EACrB,cAAsB,EACtB,EAAE;IACF,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU;SACzB,aAAa,CAAC,cAAc,CAAC;SAC7B,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAgB,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,4BAA4B;IAChE,MAAM,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,IAAI;KAClC,CAAC,CAAsB,CAAC;QAEzB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,sCAAsC;YAC5C,WAAW,EAAE;gBACX,yCAAyC;gBACzC,2BAA2B;aAC5B;YACD,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;SAC7B,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,sDAAsD;QACtD,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAC/C,sBAAsB,CAChB,CAAC;QACT,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,cAAc;SACtB,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;YAClC,KAAK,EAAE,IAAI;SACZ,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SAClD,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;SAC3C,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC5C,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;aACzE;SACF,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAClC,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI;;KAEjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,sBAAsB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC5C,IAAI,EAAE;gBACJ,IAAI,EAAE,KAAK;aACZ;SACF,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAClC,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI;;KAEjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,sBAAsB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,EAAE,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC7C,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACpD,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAE9B,sDAAsD;QACtD,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,sBAAsB,EAAE;YACxD,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACpC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtC,wBAAwB;QACxB,cAAc,GAAG,KAAK,CAAC;QAEvB,qBAAqB;QACrB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,sBAAsB,EAAE;YAC1D,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACtC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,IAAI;KAClC,CAAC,CAAsB,CAAC;QAEzB,8BAA8B;QAC9B,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;QACnB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;QACf,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,8BAA8B;QAC9B,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAClC,CAAC;QAEF,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;QACnB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,kFAAkF;QAClF,wFAAwF;QACxF,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAElC,2BAA2B;QAC3B,MAAM,MAAM,GAAG,UAAW,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,gDAAgD;QAChD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;YACrC,WAAW,EAAE,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;SAClE,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,uEAAuE;QACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,yCAAyC;QACzC,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;QAEnE,6CAA6C;QAC7C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE5C,4EAA4E;QAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,WACrD,OAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAA,EAAA,CAC3B,CAAC;QAEF,6EAA6E;QAC7E,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB;QAC7D,oFAAoF;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,2CAA2C;SAC5C,CAAC;QAEF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,MAAM,YAAY,IAAI;KACpD,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,qDAAqD;QACrD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QAEjE,2CAA2C;QAC3C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,4CAA4C;QAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;oBAC1C,KAAK,EAAE,QAAQ;oBACf,YAAY,EACV,wDAAwD;oBAC1D,YAAY,EAAE,aAAa;iBAC5B;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACrD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;iBACxD;aACF;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;QAEnD,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI;;KAEjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,sDAAsD;QACtD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE9D,kCAAkC;QAClC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAE5B,uDAAuD;QACvD,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACxE,MAAM,eAAe,GACnB,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,oBAAoB,GACxB,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;QAErD,+BAA+B;QAC/B,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAElE,qCAAqC;QACrC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAExE,sCAAsC;QACtC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,EAAE;YACX,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,GAAG,CAAC,uBAAuB;iBACrC;gBACD,WAAW,EAAE,UAAU;gBACvB,UAAU,EAAE,EAAE;aACf;YACD,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;QAE7C,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI;;KAEjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,wDAAwD;QACxD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEpE,yDAAyD;QACzD,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACzE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE1C,0BAA0B;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAC3B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,yFAAyF;QACzF,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;oBAC1C,KAAK,EAAE,QAAQ;oBACf,YAAY,EACV,wDAAwD;oBAC1D,YAAY,EAAE,aAAa;iBAC5B;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;iBACzD;aACF;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;QAEnD,kFAAkF;QAClF,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;kBACf,IAAI;;;KAGjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,iFAAiF;QACjF,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE9D,uEAAuE;QACvE,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACxE,MAAM,eAAe,GACnB,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QAEvD,mEAAmE;QACnE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;;QAC5E,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;oBAC1C,KAAK,EAAE,QAAQ;oBACf,YAAY,EACV,wDAAwD;oBAC1D,YAAY,EAAE,aAAa;iBAC5B;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACrD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;iBACxD;aACF;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;QAEnD,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;gBAElB,IAAI;kBACF,MAAM;kBACN,IAAI;;KAEjB,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,mEAAmE;QACnE,MAAM,QAAQ,GAAI,EAAU,CAAC,QAAQ,CAAC;QAEtC,gFAAgF;QAChF,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEzD,mEAAmE;QACnE,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAEnC,uDAAuD;QACvD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,sEAAsE;QACtE,MAAM,UAAU,GACd,MAAA,WAAW,CAAC,UAAU,0CAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAE9D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACzC,0DAA0D;YAC1D,MAAM,CAAE,UAAU,CAAC,CAAC,CAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,CAAE,UAAU,CAAC,CAAC,CAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;;QACzF,8CAA8C;QAC9C,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;mCACC,KAAK;KACnC,CAAC,CAAsB,CAAC;QAEzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,iDAAiD;QACjD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;oBAC1C,KAAK,EAAE,QAAQ;oBACf,YAAY,EACV,wDAAwD;oBAC1D,YAAY,EAAE,aAAa;iBAC5B;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;oBACrD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;iBACxD;aACF;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC3C;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;QAEnD,sEAAsE;QACtE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;QACf,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;QAEnB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,sDAAsD;QACtD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,mDAAmD;QACnD,MAAM,QAAQ,GAAI,EAAU,CAAC,QAAQ,CAAC;QAEtC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEzD,kDAAkD;QAClD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAEnC,MAAM,UAAU,GACd,MAAA,WAAW,CAAC,UAAU,0CAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAC9D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,CAAE,UAAU,CAAC,CAAC,CAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,CAAE,UAAU,CAAC,CAAC,CAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,YAAY,GAAQ;YACxB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,wBAAwB;oBAC9B,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;oBAC1C,KAAK,EAAE,QAAQ;oBACf,YAAY,EACV,wDAAwD;oBAC1D,YAAY,EAAE,aAAa;iBAC5B;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE;oBACV;wBACE,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,iBAAiB;qBAC7B;oBACD;wBACE,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,iBAAiB;qBAC7B;oBACD;wBACE,IAAI,EAAE,oBAAoB;wBAC1B,IAAI,EAAE,OAAO;wBACb,SAAS,EAAE,qBAAqB;qBACjC;oBACD;wBACE,IAAI,EAAE,sBAAsB;wBAC5B,IAAI,EAAE,SAAS;wBACf,SAAS,EAAE,uBAAuB;qBACnC;iBACF;gBACD,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,iBAAiB;wBACvB,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,aAAa,EAAE,gBAAgB;qBAChC;oBACD;wBACE,IAAI,EAAE,iBAAiB;wBACvB,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,aAAa,EAAE,gBAAgB;qBAChC;oBACD;wBACE,IAAI,EAAE,qBAAqB;wBAC3B,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,CAAC,SAAS,CAAC;wBACtB,aAAa,EAAE,sBAAsB;qBACtC;iBACF;aACF;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE;gBACnE,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE;gBACnE,EAAE,IAAI,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBACvD,EAAE,IAAI,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC1D;SACF,CAAC;QAEF,uDAAuD;QACvD,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAC9C,2CAA2C,CAC5C,CAAC;QAEF,oDAAoD;QACpD,MAAM,YAAY,GAAG;YACnB,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACxD,WAAW,EAAE,QAAQ;SACtB,CAAC;QAEF,MAAM,UAAU,GAAG,uBAAuB,CAAC,YAAY,CACrD,YAAY,EACZ,YAAY,CACb,CAAC;QAEF,0DAA0D;QAC1D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAEtE,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CACxD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CACjC,CAAC;QACF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CACxD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CACjC,CAAC;QACF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CACrD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAC9B,CAAC;QACF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CACvD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAChC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE9D,8CAA8C;QAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAC1C,CAAC;QACF,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAC1C,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAErE,8EAA8E;QAC9E,MAAM,eAAe,GAAG;YACtB,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE;gBACV,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,+BAA+B;gBACrD,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,4BAA4B;aACrD;YACD,WAAW,EAAE,QAAQ;SACtB,CAAC;QAEF,MAAM,aAAa,GAAG,uBAAuB,CAAC,YAAY,CACxD,eAAe,EACf,YAAY,CACb,CAAC;QAEF,MAAM,uBAAuB,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAClE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CACjC,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CACtD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,aAAa,CACpC,CAAC;QAEF,yCAAyC;QACzC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChE,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEtE,mEAAmE;QACnE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import '../temba-modules';\nimport { html, fixture, expect } from '@open-wc/testing';\nimport { assertScreenshot, getClip } from './utils.test';\n\n// Define interface for NodeEditor component\ninterface NodeEditorElement extends HTMLElement {\n action?: any;\n node?: any;\n nodeUI?: any;\n isOpen?: boolean;\n updateComplete: Promise<boolean>;\n}\n\nconst assertDialogScreenshot = async (\n el: NodeEditorElement,\n screenshotName: string\n) => {\n const dialog = el.shadowRoot\n .querySelector('temba-dialog')\n .shadowRoot.querySelector('.dialog-container') as HTMLElement;\n const clip = getClip(dialog);\n // Adjust width to show full dialog with proper padding\n const dialogRect = dialog.getBoundingClientRect();\n clip.width = dialogRect.width + 20; // 10px padding on each side\n await assertScreenshot(screenshotName, clip);\n};\n\ndescribe('temba-node-editor', () => {\n it('can be created', async () => {\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n expect(el).to.exist;\n expect(el.tagName).to.equal('TEMBA-NODE-EDITOR');\n });\n\n it('renders send_msg action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders send_msg action with message editor', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello @contact.name, check this out!',\n attachments: [\n 'image/jpeg:http://example.com/photo.jpg',\n 'image:@fields.profile_pic'\n ],\n quick_replies: ['Yes', 'No']\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n\n // Check that the message editor component is rendered\n const messageEditor = el.shadowRoot.querySelector(\n 'temba-message-editor'\n ) as any;\n expect(messageEditor).to.not.be.null;\n expect(messageEditor.value).to.equal(action.text);\n });\n\n it('renders set_run_result action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'set_run_result',\n name: 'result_name',\n value: 'result_value'\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders set_contact_field action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'set_contact_field',\n field: { key: 'age', name: 'Age' },\n value: '25'\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders add_contact_groups action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'add_contact_groups',\n groups: [{ uuid: 'group-1', name: 'Test Group' }]\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders enter_flow action', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'enter_flow',\n flow: { uuid: 'flow-1', name: 'Sub Flow' }\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.action).to.equal(action);\n });\n\n it('renders node with router configuration', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: [{ uuid: 'exit-1', name: 'Default' }],\n router: {\n type: 'switch',\n result_name: 'result',\n categories: [{ uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' }]\n }\n };\n\n const nodeUI = {\n type: 'split_by_expression',\n position: { left: 100, top: 100 }\n };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n await assertDialogScreenshot(el, 'editor/router');\n });\n\n it('renders node with wait configuration', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: [{ uuid: 'exit-1', name: 'Default' }],\n wait: {\n type: 'msg'\n }\n };\n\n const nodeUI = {\n type: 'wait_for_response',\n position: { left: 100, top: 100 }\n };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n await assertDialogScreenshot(el, 'editor/wait');\n });\n\n it('handles different button actions', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n let saveEventFired = false;\n let cancelEventFired = false;\n\n el.addEventListener('temba-action-saved', () => {\n saveEventFired = true;\n });\n\n el.addEventListener('temba-node-edit-cancelled', () => {\n cancelEventFired = true;\n });\n\n // Get the dialog element inside the node editor\n const dialog = el.shadowRoot!.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n\n // Test Save button by dispatching event on the dialog\n const saveEvent = new CustomEvent('temba-button-clicked', {\n detail: { button: { name: 'Save' } },\n bubbles: true\n });\n dialog!.dispatchEvent(saveEvent);\n expect(saveEventFired).to.equal(true);\n\n // Reset for cancel test\n saveEventFired = false;\n\n // Test Cancel button\n const cancelEvent = new CustomEvent('temba-button-clicked', {\n detail: { button: { name: 'Cancel' } },\n bubbles: true\n });\n dialog!.dispatchEvent(cancelEvent);\n expect(cancelEventFired).to.equal(true);\n });\n\n it('handles property updates', async () => {\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n // Test action property update\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n el.action = action;\n await el.updateComplete;\n expect(el.action).to.equal(action);\n\n // Test node property update\n const node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: []\n };\n\n el.node = node;\n await el.updateComplete;\n expect(el.node).to.equal(node);\n\n // Test nodeUI property update\n const nodeUI = {\n type: 'execute_actions',\n position: { left: 100, top: 100 }\n };\n\n el.nodeUI = nodeUI;\n await el.updateComplete;\n expect(el.nodeUI).to.equal(nodeUI);\n });\n\n it('handles form submission events', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Since the form submission handling is complex and involves internal components,\n // we'll just verify the component renders without errors and has the expected structure\n const shadowRoot = el.shadowRoot;\n expect(shadowRoot).to.not.be.null;\n\n // Verify dialog is present\n const dialog = shadowRoot!.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n });\n\n it('handles form validation', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: []\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Test that the component renders form elements\n const shadowRoot = el.shadowRoot;\n expect(shadowRoot).to.not.be.null;\n });\n\n it('displays bubble count for group value counts', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world',\n quick_replies: ['Yes', 'No', 'Maybe'],\n attachments: ['image:@contact.photo', 'document:@contact.resume']\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data to be fully initialized and re-render to complete\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that bubble counts are displayed\n const shadowRoot = el.shadowRoot;\n const bubbles = shadowRoot.querySelectorAll('.group-count-bubble');\n\n // Should have bubbles for groups with values\n expect(bubbles.length).to.be.greaterThan(0);\n\n // Check specific bubble values (trim to handle whitespace in rendered text)\n const bubbleTexts = Array.from(bubbles).map((bubble) =>\n bubble.textContent?.trim()\n );\n\n // Runtime attachments group should show bubble when collapsed and has values\n expect(bubbleTexts).to.include('2'); // 2 runtime attachments\n // Note: Quick replies group auto-expands when it has content, so no bubble is shown\n });\n\n it('shows arrow when group has no values', async () => {\n const action = {\n uuid: 'test-action-uuid',\n type: 'send_msg',\n text: 'Hello world'\n // No quick_replies or attachments provided\n };\n\n const el = (await fixture(html`\n <temba-node-editor .action=${action} .isOpen=${true}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that arrows are displayed instead of bubbles\n const shadowRoot = el.shadowRoot;\n const bubbles = shadowRoot.querySelectorAll('.group-count-bubble');\n const arrows = shadowRoot.querySelectorAll('.group-toggle-icon');\n\n // Should have no bubbles when counts are 0\n expect(bubbles.length).to.equal(0);\n\n // Should have arrows for collapsible groups\n expect(arrows.length).to.be.greaterThan(0);\n });\n\n it('renders split_by_llm_categorize node', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n expect(el.shadowRoot).to.not.be.null;\n expect(el.node).to.equal(node);\n expect(el.nodeUI).to.equal(nodeUI);\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check if the dialog is rendered with correct header\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n expect(dialog.getAttribute('header')).to.equal('Split by AI');\n\n // Check that the form is rendered\n const form = el.shadowRoot.querySelector('.node-editor-form');\n expect(form).to.not.be.null;\n\n // Check that all expected form components are rendered\n const selectComponents = el.shadowRoot.querySelectorAll('temba-select');\n const arrayComponents =\n el.shadowRoot.querySelectorAll('temba-array-editor');\n const completionComponents =\n el.shadowRoot.querySelectorAll('temba-completion');\n\n // Should have LLM select field\n expect(selectComponents.length).to.equal(1);\n expect(selectComponents[0].getAttribute('label')).to.equal('LLM');\n\n // Should have input completion field\n expect(completionComponents.length).to.equal(1);\n expect(completionComponents[0].getAttribute('label')).to.equal('Input');\n\n // Should have categories array editor\n expect(arrayComponents.length).to.equal(1);\n });\n\n it('renders wait_for_response node', async () => {\n const node = {\n uuid: 'test-wait-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: 300 // 5 minutes in seconds\n },\n result_name: 'response',\n categories: []\n },\n exits: []\n };\n\n const nodeUI = { type: 'wait_for_response' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Check that the dialog is rendered with correct header\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog).to.not.be.null;\n expect(dialog.getAttribute('header')).to.equal('Wait for Response');\n\n // Check that timeout and result name fields are rendered\n const textComponents = el.shadowRoot.querySelectorAll('temba-textinput');\n expect(textComponents.length).to.equal(1);\n\n // Verify the field labels\n const labels = Array.from(textComponents).map((comp) =>\n comp.getAttribute('label')\n );\n expect(labels).to.include('Result Name');\n });\n\n it('prioritizes node config over action config for non-execute_actions nodes', async () => {\n // Create a split_by_llm_categorize node that has both actions and should use node config\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n // Simulate having both node and action set (which happens when editing from flow)\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .action=${node.actions[0]}\n .isOpen=${true}\n >\n </temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Should show node editor (Split by AI Categorize), not action editor (Call LLM)\n const dialog = el.shadowRoot.querySelector('temba-dialog');\n expect(dialog.getAttribute('header')).to.equal('Split by AI');\n\n // Should have node config fields (LLM, Input, Categories, Result Name)\n const selectComponents = el.shadowRoot.querySelectorAll('temba-select');\n const arrayComponents =\n el.shadowRoot.querySelectorAll('temba-array-editor');\n\n // Should have LLM select and categories array (node config fields)\n expect(selectComponents.length).to.equal(1);\n expect(arrayComponents.length).to.equal(1);\n });\n\n it('initializes categories correctly for split_by_llm_categorize', async () => {\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n const el = (await fixture(html`\n <temba-node-editor\n .node=${node}\n .nodeUI=${nodeUI}\n .isOpen=${true}\n ></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Wait for form data initialization\n await new Promise((resolve) => setTimeout(resolve, 200));\n await el.updateComplete;\n\n // Access the component's formData directly to check initialization\n const formData = (el as any).formData;\n\n // Should have 2 categories (Greeting and Question, excluding Other and Failure)\n expect(formData.categories).to.be.an('array');\n expect(formData.categories.length).to.equal(2);\n expect(formData.categories[0].name).to.equal('Greeting');\n expect(formData.categories[1].name).to.equal('Question');\n\n // Check that the array editor component receives the correct value\n const arrayEditor = el.shadowRoot.querySelector('temba-array-editor');\n expect(arrayEditor).to.not.be.null;\n\n // Wait a bit more for the array editor to fully render\n await new Promise((resolve) => setTimeout(resolve, 500));\n await el.updateComplete;\n\n // Check the values of the textinput components within the array items\n const textInputs =\n arrayEditor.shadowRoot?.querySelectorAll('temba-textinput');\n\n if (textInputs && textInputs.length >= 2) {\n // The first two textinputs should have the category names\n expect((textInputs[0] as any).value).to.equal('Greeting');\n expect((textInputs[1] as any).value).to.equal('Question');\n }\n });\n\n it('properly initializes categories when node is set after component creation', async () => {\n // First create the component without any data\n const el = (await fixture(html`\n <temba-node-editor .isOpen=${false}></temba-node-editor>\n `)) as NodeEditorElement;\n\n await el.updateComplete;\n\n // Then set the node data (simulating real usage)\n const node = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n { uuid: 'cat-1', name: 'Greeting', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Question', exit_uuid: 'exit-2' },\n { uuid: 'cat-3', name: 'Other', exit_uuid: 'exit-3' },\n { uuid: 'cat-4', name: 'Failure', exit_uuid: 'exit-4' }\n ]\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-3', destination_uuid: null },\n { uuid: 'exit-4', destination_uuid: null }\n ]\n };\n\n const nodeUI = { type: 'split_by_llm_categorize' };\n\n // Set the properties (this should trigger updated() and openDialog())\n el.node = node;\n el.nodeUI = nodeUI;\n\n await el.updateComplete;\n\n // Wait for dialog to open and form data to initialize\n await new Promise((resolve) => setTimeout(resolve, 300));\n await el.updateComplete;\n\n // Check that the form data is properly initialized\n const formData = (el as any).formData;\n\n expect(formData.categories).to.be.an('array');\n expect(formData.categories.length).to.equal(2);\n expect(formData.categories[0].name).to.equal('Greeting');\n expect(formData.categories[1].name).to.equal('Question');\n\n // Check that array editor gets the correct values\n const arrayEditor = el.shadowRoot.querySelector('temba-array-editor');\n expect(arrayEditor).to.not.be.null;\n\n const textInputs =\n arrayEditor.shadowRoot?.querySelectorAll('temba-textinput');\n if (textInputs && textInputs.length >= 2) {\n expect((textInputs[0] as any).value).to.equal('Greeting');\n expect((textInputs[1] as any).value).to.equal('Question');\n }\n });\n\n it('preserves UUIDs for unchanged categories in split_by_llm_categorize', async () => {\n const originalNode: any = {\n uuid: 'test-node-uuid',\n actions: [\n {\n uuid: 'existing-call-llm-uuid',\n type: 'call_llm',\n llm: { uuid: 'llm-123', name: 'Test LLM' },\n input: '@input',\n instructions:\n '@(prompt(\"categorize\", slice(node.categories, 0, -2)))',\n output_local: '_llm_output'\n }\n ],\n router: {\n type: 'switch',\n operand: '@locals._llm_output',\n result_name: 'Intent',\n categories: [\n {\n uuid: 'existing-cat-1',\n name: 'Greeting',\n exit_uuid: 'existing-exit-1'\n },\n {\n uuid: 'existing-cat-2',\n name: 'Question',\n exit_uuid: 'existing-exit-2'\n },\n {\n uuid: 'existing-cat-other',\n name: 'Other',\n exit_uuid: 'existing-exit-other'\n },\n {\n uuid: 'existing-cat-failure',\n name: 'Failure',\n exit_uuid: 'existing-exit-failure'\n }\n ],\n cases: [\n {\n uuid: 'existing-case-1',\n type: 'has_only_text',\n arguments: ['Greeting'],\n category_uuid: 'existing-cat-1'\n },\n {\n uuid: 'existing-case-2',\n type: 'has_only_text',\n arguments: ['Question'],\n category_uuid: 'existing-cat-2'\n },\n {\n uuid: 'existing-case-error',\n type: 'has_only_text',\n arguments: ['<ERROR>'],\n category_uuid: 'existing-cat-failure'\n }\n ]\n },\n exits: [\n { uuid: 'existing-exit-1', destination_uuid: 'some-destination-1' },\n { uuid: 'existing-exit-2', destination_uuid: 'some-destination-2' },\n { uuid: 'existing-exit-other', destination_uuid: null },\n { uuid: 'existing-exit-failure', destination_uuid: null }\n ]\n };\n\n // Import the node config to test fromFormData directly\n const { split_by_llm_categorize } = await import(\n '../src/flow/nodes/split_by_llm_categorize'\n );\n\n // Test with same categories - should preserve UUIDs\n const formDataSame = {\n llm: [{ value: 'llm-123', name: 'Test LLM' }],\n input: '@input',\n categories: [{ name: 'Greeting' }, { name: 'Question' }],\n result_name: 'Intent'\n };\n\n const resultSame = split_by_llm_categorize.fromFormData(\n formDataSame,\n originalNode\n );\n\n // Should preserve existing UUIDs for unchanged categories\n expect(resultSame.actions[0].uuid).to.equal('existing-call-llm-uuid');\n\n const greetingCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Greeting'\n );\n const questionCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Question'\n );\n const otherCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Other'\n );\n const failureCategory = resultSame.router.categories.find(\n (cat) => cat.name === 'Failure'\n );\n\n expect(greetingCategory.uuid).to.equal('existing-cat-1');\n expect(greetingCategory.exit_uuid).to.equal('existing-exit-1');\n expect(questionCategory.uuid).to.equal('existing-cat-2');\n expect(questionCategory.exit_uuid).to.equal('existing-exit-2');\n expect(otherCategory.uuid).to.equal('existing-cat-other');\n expect(failureCategory.uuid).to.equal('existing-cat-failure');\n\n // Should preserve destination UUIDs for exits\n const greetingExit = resultSame.exits.find(\n (exit) => exit.uuid === 'existing-exit-1'\n );\n const questionExit = resultSame.exits.find(\n (exit) => exit.uuid === 'existing-exit-2'\n );\n expect(greetingExit.destination_uuid).to.equal('some-destination-1');\n expect(questionExit.destination_uuid).to.equal('some-destination-2');\n\n // Test with changed categories - should generate new UUIDs for new categories\n const formDataChanged = {\n llm: [{ value: 'llm-123', name: 'Test LLM' }],\n input: '@input',\n categories: [\n { name: 'Greeting' }, // unchanged - should keep UUID\n { name: 'NewCategory' } // new - should get new UUID\n ],\n result_name: 'Intent'\n };\n\n const resultChanged = split_by_llm_categorize.fromFormData(\n formDataChanged,\n originalNode\n );\n\n const greetingCategoryChanged = resultChanged.router.categories.find(\n (cat) => cat.name === 'Greeting'\n );\n const newCategory = resultChanged.router.categories.find(\n (cat) => cat.name === 'NewCategory'\n );\n\n // Greeting should keep its existing UUID\n expect(greetingCategoryChanged.uuid).to.equal('existing-cat-1');\n expect(greetingCategoryChanged.exit_uuid).to.equal('existing-exit-1');\n\n // NewCategory should get a new UUID (not one of the existing ones)\n expect(newCategory.uuid).to.not.equal('existing-cat-1');\n expect(newCategory.uuid).to.not.equal('existing-cat-2');\n expect(newCategory.uuid).to.not.equal('existing-cat-other');\n expect(newCategory.uuid).to.not.equal('existing-cat-failure');\n expect(newCategory.uuid).to.have.length.greaterThan(0);\n });\n});\n"]}
|
|
@@ -424,7 +424,7 @@ describe('temba-run-list', () => {
|
|
|
424
424
|
contact: {
|
|
425
425
|
name: 'John Doe',
|
|
426
426
|
urn: 'tel:+1234567890',
|
|
427
|
-
|
|
427
|
+
ref: 'E2E6MX'
|
|
428
428
|
},
|
|
429
429
|
modified_on: '2023-12-01T10:30:00.000Z',
|
|
430
430
|
exited_on: '2023-12-01T10:30:00.000Z',
|
|
@@ -440,7 +440,7 @@ describe('temba-run-list', () => {
|
|
|
440
440
|
contact: {
|
|
441
441
|
name: null,
|
|
442
442
|
urn: 'tel:+1234567890',
|
|
443
|
-
|
|
443
|
+
ref: 'E2E6MX'
|
|
444
444
|
},
|
|
445
445
|
modified_on: '2023-12-01T10:30:00.000Z',
|
|
446
446
|
exited_on: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-run-list.test.js","sourceRoot":"","sources":["../../test/temba-run-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport * as sinon from 'sinon';\nimport { useFakeTimers } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\nimport { RunList } from '../src/list/RunList';\nimport {\n assertScreenshot,\n getClip,\n getComponent,\n mockGET,\n mockAPI\n} from './utils.test';\n\nlet clock: any;\n\nconst TAG = 'temba-run-list';\nconst getRunList = async (attrs: any = {}, width = 250, height = 0) => {\n const runList = (await getComponent(\n TAG,\n attrs,\n '',\n width,\n height\n )) as RunList;\n\n if (!runList.endpoint) {\n return runList;\n }\n\n return new Promise<RunList>((resolve) => {\n runList.addEventListener(\n CustomEventType.FetchComplete,\n async () => {\n resolve(runList);\n },\n { once: true }\n );\n });\n};\n\ndescribe('temba-run-list', () => {\n beforeEach(function () {\n clock = useFakeTimers();\n // set up general mocking\n mockAPI();\n // mock the runs API endpoint\n mockGET(/\\/api\\/v2\\/runs\\.json/, '/test-assets/list/runs.json');\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const runList: RunList = await getRunList();\n assert.instanceOf(runList, RunList);\n expect(runList.responses).to.equal(true);\n expect(runList.allowDelete).to.equal(false);\n expect(runList.valueKey).to.equal('uuid');\n expect(runList.hideShadow).to.equal(true);\n expect(runList.reverseRefresh).to.equal(false);\n });\n\n it('initializes with correct default properties', async () => {\n const runList: RunList = await getRunList();\n expect(runList.responses).to.equal(true);\n expect(runList.allowDelete).to.equal(false);\n expect(runList.resultPreview).to.be.undefined;\n expect(runList.selectedRun).to.be.undefined;\n expect(runList.results).to.be.undefined;\n expect(runList.flow).to.be.undefined;\n });\n\n it('sets endpoint when flow property changes', async () => {\n const runList: RunList = await getRunList();\n\n runList.flow = 'test-flow-uuid';\n await runList.updateComplete;\n\n expect(runList.endpoint).to.equal(\n '/api/v2/runs.json?flow=test-flow-uuid&responded=1'\n );\n });\n\n it('sets endpoint without responded parameter when responses is false', async () => {\n const runList: RunList = await getRunList();\n\n runList.responses = false;\n runList.flow = 'test-flow-uuid';\n await runList.updateComplete;\n\n expect(runList.endpoint).to.equal('/api/v2/runs.json?flow=test-flow-uuid');\n });\n\n it('loads runs with flow endpoint', async () => {\n const runList: RunList = await getRunList(\n {\n flow: 'test-flow-uuid'\n },\n 250,\n 400\n ); // use bigger height to avoid overlap\n\n expect(runList.items.length).to.equal(5);\n await assertScreenshot('run-list/basic', getClip(runList));\n });\n\n it('handles results property change', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n const results = [\n { key: 'name', name: 'Name', categories: ['Text'] },\n { key: 'age', name: 'Age', categories: ['Number'] }\n ];\n\n runList.results = results;\n await runList.updateComplete;\n\n expect(mockSelect.setOptions.calledWith(results)).to.be.true;\n // Since resultKeys is private, we test the observable behavior indirectly\n // by verifying the results were processed correctly via setOptions call.\n });\n\n it('calls createRenderOption when resultPreview changes', async () => {\n const runList: RunList = await getRunList();\n const createRenderOptionSpy = sinon.spy(runList, 'createRenderOption');\n\n runList.resultPreview = { key: 'name', name: 'Name' };\n await runList.updateComplete;\n\n expect(createRenderOptionSpy.called).to.be.true;\n });\n\n it('getIcon returns correct icon for completed run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'completed' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"check\"');\n });\n\n it('getIcon returns correct icon for interrupted run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'interrupted' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"x-octagon\"');\n });\n\n it('getIcon returns correct icon for expired run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'expired' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"clock\"');\n });\n\n it('getIcon returns activity icon for active responded run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: null, responded: true };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"activity\"');\n });\n\n it('getIcon returns hourglass icon for active non-responded run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: null, responded: false };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"hourglass\"');\n });\n\n it('renderResultPreview returns category for multi-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = {\n key: 'gender',\n categories: ['Male', 'Female', 'Other']\n };\n\n const run = {\n values: {\n gender: {\n category: 'Male',\n value: 'Male'\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('Male');\n });\n\n it('renderResultPreview returns value for single-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', categories: ['Text'] };\n\n const run = {\n values: {\n name: {\n category: 'Text',\n value: 'John Doe'\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('John Doe');\n });\n\n it('renderResultPreview returns null when no result preview', async () => {\n const runList: RunList = await getRunList();\n\n const run = { values: {} };\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('renderResultPreview returns null when no matching value', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'missing', categories: ['Text'] };\n\n const run = { values: {} };\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('handles results property change when results is null', async () => {\n const runList: RunList = await getRunList();\n\n // set initial results\n runList.results = [{ key: 'name', name: 'Name' }];\n await runList.updateComplete;\n\n // clear results\n runList.results = null;\n await runList.updateComplete;\n\n // should not throw an error\n expect(runList.results).to.be.null;\n });\n\n it('handles responses/flow change when flow is not set', async () => {\n const runList: RunList = await getRunList();\n\n // change responses without setting flow\n runList.responses = false;\n await runList.updateComplete;\n\n // endpoint should not be set\n expect(runList.endpoint).to.be.undefined;\n });\n\n it('renderResultPreview returns null when category is missing in multi-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = {\n key: 'gender',\n categories: ['Male', 'Female', 'Other']\n };\n\n const run = {\n values: {\n gender: {\n value: 'Male'\n // missing category property\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('removeRun removes item and updates cursor', async () => {\n const runList: RunList = await getRunList({\n flow: 'test-flow-uuid'\n });\n\n const initialCount = runList.items.length;\n expect(initialCount).to.equal(5);\n\n runList.cursorIndex = 2;\n runList.removeRun(2);\n\n expect(runList.items.length).to.equal(4);\n expect(runList.items.find((item) => item.id === 2)).to.be.undefined;\n expect(runList.cursorIndex).to.equal(2);\n });\n\n it('removeRun adjusts cursor when removing last item', async () => {\n const runList: RunList = await getRunList();\n\n // set up items manually\n runList.items = [\n { id: 1, uuid: 'uuid-1' },\n { id: 2, uuid: 'uuid-2' }\n ];\n runList.cursorIndex = 1;\n\n runList.removeRun(2);\n\n expect(runList.items.length).to.equal(1);\n expect(runList.cursorIndex).to.equal(1);\n });\n\n it('getRefreshEndpoint returns endpoint with after parameter when items exist', async () => {\n const runList: RunList = await getRunList({\n flow: 'test-flow-uuid'\n });\n\n const endpoint = runList.getRefreshEndpoint();\n expect(endpoint).to.contain('&after=');\n expect(endpoint).to.contain('2023-12-01T10:30:00.000Z');\n });\n\n it('getRefreshEndpoint returns base endpoint when no items', async () => {\n const runList: RunList = await getRunList();\n runList.endpoint = '/api/v2/runs.json?flow=test';\n\n const endpoint = runList.getRefreshEndpoint();\n expect(endpoint).to.equal('/api/v2/runs.json?flow=test');\n });\n\n it('toggleResponded updates responses property', async () => {\n const runList: RunList = await getRunList();\n\n // mock checkbox element\n const mockCheckbox = document.createElement('input') as any;\n mockCheckbox.checked = false;\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockCheckbox);\n\n runList.toggleResponded();\n\n expect(runList.responses).to.equal(false);\n });\n\n it('handleColumnChanged sets resultPreview from event', async () => {\n const runList: RunList = await getRunList();\n\n const event = {\n target: {\n values: [{ key: 'name', name: 'Name' }]\n }\n };\n\n runList.handleColumnChanged(event);\n\n expect(runList.resultPreview).to.deep.equal({ key: 'name', name: 'Name' });\n });\n\n it('handleColumnChanged clears resultPreview when no values', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', name: 'Name' };\n\n const event = {\n target: {\n values: []\n }\n };\n\n runList.handleColumnChanged(event);\n\n expect(runList.resultPreview).to.be.null;\n });\n\n it('handleSelected sets selectedRun', async () => {\n const runList: RunList = await getRunList();\n\n const selectedRun = { id: 1, uuid: 'test-uuid' };\n runList.handleSelected(selectedRun);\n\n expect(runList.selectedRun).to.equal(selectedRun);\n });\n\n it('getListStyle returns empty string', async () => {\n const runList: RunList = await getRunList();\n\n const style = runList.getListStyle();\n expect(style).to.equal('');\n });\n\n it('renderHeader shows checkbox', async () => {\n const runList: RunList = await getRunList();\n\n const header = runList.renderHeader();\n const headerString = header.strings.join('');\n expect(headerString).to.contain('temba-checkbox');\n expect(headerString).to.contain('Responses Only');\n });\n\n it('renderHeader shows select when results exist', async () => {\n const runList: RunList = await getRunList();\n\n runList.results = [{ key: 'name', name: 'Name' }];\n await runList.updateComplete;\n\n const header = runList.renderHeader();\n\n // check if the template includes the results check and nested template\n expect(header.values).to.have.length.greaterThan(0);\n\n // check that results is truthy which will render the select\n expect(runList.results).to.not.be.null;\n });\n\n it('renderHeader without results hides select', async () => {\n const runList: RunList = await getRunList();\n\n const header = runList.renderHeader();\n expect(header.strings.join('')).to.not.contain('temba-select');\n expect(header.strings.join('')).to.contain('temba-checkbox');\n });\n\n it('renderFooter returns null when no selectedRun', async () => {\n const runList: RunList = await getRunList();\n\n const footer = runList.renderFooter();\n expect(footer).to.be.null;\n });\n\n it('renderFooter returns null when no resultKeys', async () => {\n const runList: RunList = await getRunList();\n\n runList.selectedRun = { id: 1, values: {} };\n // Don't set results, so resultKeys will be empty object {} which is truthy.\n // The method only returns null if selectedRun is null/undefined, not for empty resultKeys.\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null; // Empty object {} is truthy, so footer should render\n });\n\n it('renderFooter handles selectedRun without values', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z'\n };\n\n // should work now with the safety check\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n });\n\n it('renderFooter displays contact information', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n exit_type: 'completed',\n exited_on: '2023-12-01T10:30:00.000Z',\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n expect(footer.strings[0]).to.contain('temba-contact-name');\n });\n\n it('renderFooter shows delete icon when allowDelete is true', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.allowDelete = true;\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // verify the conditions that would show the delete icon\n expect(runList.allowDelete).to.be.true;\n expect(runList.selectedRun.id).to.equal(1);\n });\n\n it('renderFooter shows active run status', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n exit_type: null,\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer.strings.join('')).to.contain('Started');\n });\n\n it('createRenderOption creates renderOption function', async () => {\n const runList: RunList = await getRunList();\n\n expect(runList.renderOption).to.be.a('function');\n\n const run = {\n contact: {\n name: 'John Doe',\n urn: 'tel:+1234567890',\n anon_display: '1234567890'\n },\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: '2023-12-01T10:30:00.000Z',\n responded: true\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n expect(result.strings.join('')).to.contain('temba-date');\n });\n\n it('renderOption handles run without contact name', async () => {\n const runList: RunList = await getRunList();\n\n const run = {\n contact: {\n name: null,\n urn: 'tel:+1234567890',\n anon_display: '1234567890'\n },\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: null,\n responded: false\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n });\n\n it('renderOption handles run without contact', async () => {\n const runList: RunList = await getRunList();\n\n const run = {\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: null,\n responded: false\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n });\n\n it('handles results without categories in renderResultPreview', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', categories: ['Text'] };\n\n const run = {\n values: {\n name: {\n value: 'Test Value'\n // missing category property\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('Test Value');\n });\n\n it('firstUpdated calls super', async () => {\n const runList: RunList = await getRunList();\n const superSpy = sinon.spy(\n Object.getPrototypeOf(RunList.prototype),\n 'firstUpdated'\n );\n\n runList.firstUpdated(new Map());\n\n expect(superSpy.called).to.be.true;\n superSpy.restore();\n });\n\n it('renderFooter shows result values', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // check that the conditions for showing the table are met\n const resultKeys = Object.keys(runList.selectedRun.values || {});\n expect(resultKeys.length).to.be.greaterThan(0);\n });\n\n it('renderFooter shows multi-category display', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [\n { key: 'gender', name: 'Gender', categories: ['Male', 'Female', 'Other'] }\n ];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n gender: {\n name: 'Gender',\n key: 'gender',\n value: 'Male',\n category: 'Male'\n }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // check that we have data setup correctly by verifying the selected run has values\n expect(Object.keys(runList.selectedRun.values).length).to.be.greaterThan(0);\n });\n\n it('renderFooter handles missing contact uuid', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: null, // Missing contact to trigger the fallback\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n expect(footer.strings[0]).to.contain('temba-contact-name');\n });\n\n it('renderFooter shows single-category result display', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n const footerString = footer.strings.join('');\n expect(footerString).to.contain('--'); // Single category shows '--' for category\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-run-list.test.js","sourceRoot":"","sources":["../../test/temba-run-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from '@open-wc/testing';\nimport * as sinon from 'sinon';\nimport { useFakeTimers } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\nimport { RunList } from '../src/list/RunList';\nimport {\n assertScreenshot,\n getClip,\n getComponent,\n mockGET,\n mockAPI\n} from './utils.test';\n\nlet clock: any;\n\nconst TAG = 'temba-run-list';\nconst getRunList = async (attrs: any = {}, width = 250, height = 0) => {\n const runList = (await getComponent(\n TAG,\n attrs,\n '',\n width,\n height\n )) as RunList;\n\n if (!runList.endpoint) {\n return runList;\n }\n\n return new Promise<RunList>((resolve) => {\n runList.addEventListener(\n CustomEventType.FetchComplete,\n async () => {\n resolve(runList);\n },\n { once: true }\n );\n });\n};\n\ndescribe('temba-run-list', () => {\n beforeEach(function () {\n clock = useFakeTimers();\n // set up general mocking\n mockAPI();\n // mock the runs API endpoint\n mockGET(/\\/api\\/v2\\/runs\\.json/, '/test-assets/list/runs.json');\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const runList: RunList = await getRunList();\n assert.instanceOf(runList, RunList);\n expect(runList.responses).to.equal(true);\n expect(runList.allowDelete).to.equal(false);\n expect(runList.valueKey).to.equal('uuid');\n expect(runList.hideShadow).to.equal(true);\n expect(runList.reverseRefresh).to.equal(false);\n });\n\n it('initializes with correct default properties', async () => {\n const runList: RunList = await getRunList();\n expect(runList.responses).to.equal(true);\n expect(runList.allowDelete).to.equal(false);\n expect(runList.resultPreview).to.be.undefined;\n expect(runList.selectedRun).to.be.undefined;\n expect(runList.results).to.be.undefined;\n expect(runList.flow).to.be.undefined;\n });\n\n it('sets endpoint when flow property changes', async () => {\n const runList: RunList = await getRunList();\n\n runList.flow = 'test-flow-uuid';\n await runList.updateComplete;\n\n expect(runList.endpoint).to.equal(\n '/api/v2/runs.json?flow=test-flow-uuid&responded=1'\n );\n });\n\n it('sets endpoint without responded parameter when responses is false', async () => {\n const runList: RunList = await getRunList();\n\n runList.responses = false;\n runList.flow = 'test-flow-uuid';\n await runList.updateComplete;\n\n expect(runList.endpoint).to.equal('/api/v2/runs.json?flow=test-flow-uuid');\n });\n\n it('loads runs with flow endpoint', async () => {\n const runList: RunList = await getRunList(\n {\n flow: 'test-flow-uuid'\n },\n 250,\n 400\n ); // use bigger height to avoid overlap\n\n expect(runList.items.length).to.equal(5);\n await assertScreenshot('run-list/basic', getClip(runList));\n });\n\n it('handles results property change', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n const results = [\n { key: 'name', name: 'Name', categories: ['Text'] },\n { key: 'age', name: 'Age', categories: ['Number'] }\n ];\n\n runList.results = results;\n await runList.updateComplete;\n\n expect(mockSelect.setOptions.calledWith(results)).to.be.true;\n // Since resultKeys is private, we test the observable behavior indirectly\n // by verifying the results were processed correctly via setOptions call.\n });\n\n it('calls createRenderOption when resultPreview changes', async () => {\n const runList: RunList = await getRunList();\n const createRenderOptionSpy = sinon.spy(runList, 'createRenderOption');\n\n runList.resultPreview = { key: 'name', name: 'Name' };\n await runList.updateComplete;\n\n expect(createRenderOptionSpy.called).to.be.true;\n });\n\n it('getIcon returns correct icon for completed run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'completed' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"check\"');\n });\n\n it('getIcon returns correct icon for interrupted run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'interrupted' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"x-octagon\"');\n });\n\n it('getIcon returns correct icon for expired run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: 'expired' };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"clock\"');\n });\n\n it('getIcon returns activity icon for active responded run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: null, responded: true };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"activity\"');\n });\n\n it('getIcon returns hourglass icon for active non-responded run', async () => {\n const runList: RunList = await getRunList();\n const run = { exit_type: null, responded: false };\n\n const icon = runList.getIcon(run);\n expect(icon.strings[0]).to.contain('temba-icon');\n expect(icon.strings[0]).to.contain('name=\"hourglass\"');\n });\n\n it('renderResultPreview returns category for multi-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = {\n key: 'gender',\n categories: ['Male', 'Female', 'Other']\n };\n\n const run = {\n values: {\n gender: {\n category: 'Male',\n value: 'Male'\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('Male');\n });\n\n it('renderResultPreview returns value for single-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', categories: ['Text'] };\n\n const run = {\n values: {\n name: {\n category: 'Text',\n value: 'John Doe'\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('John Doe');\n });\n\n it('renderResultPreview returns null when no result preview', async () => {\n const runList: RunList = await getRunList();\n\n const run = { values: {} };\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('renderResultPreview returns null when no matching value', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'missing', categories: ['Text'] };\n\n const run = { values: {} };\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('handles results property change when results is null', async () => {\n const runList: RunList = await getRunList();\n\n // set initial results\n runList.results = [{ key: 'name', name: 'Name' }];\n await runList.updateComplete;\n\n // clear results\n runList.results = null;\n await runList.updateComplete;\n\n // should not throw an error\n expect(runList.results).to.be.null;\n });\n\n it('handles responses/flow change when flow is not set', async () => {\n const runList: RunList = await getRunList();\n\n // change responses without setting flow\n runList.responses = false;\n await runList.updateComplete;\n\n // endpoint should not be set\n expect(runList.endpoint).to.be.undefined;\n });\n\n it('renderResultPreview returns null when category is missing in multi-category result', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = {\n key: 'gender',\n categories: ['Male', 'Female', 'Other']\n };\n\n const run = {\n values: {\n gender: {\n value: 'Male'\n // missing category property\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.be.null;\n });\n\n it('removeRun removes item and updates cursor', async () => {\n const runList: RunList = await getRunList({\n flow: 'test-flow-uuid'\n });\n\n const initialCount = runList.items.length;\n expect(initialCount).to.equal(5);\n\n runList.cursorIndex = 2;\n runList.removeRun(2);\n\n expect(runList.items.length).to.equal(4);\n expect(runList.items.find((item) => item.id === 2)).to.be.undefined;\n expect(runList.cursorIndex).to.equal(2);\n });\n\n it('removeRun adjusts cursor when removing last item', async () => {\n const runList: RunList = await getRunList();\n\n // set up items manually\n runList.items = [\n { id: 1, uuid: 'uuid-1' },\n { id: 2, uuid: 'uuid-2' }\n ];\n runList.cursorIndex = 1;\n\n runList.removeRun(2);\n\n expect(runList.items.length).to.equal(1);\n expect(runList.cursorIndex).to.equal(1);\n });\n\n it('getRefreshEndpoint returns endpoint with after parameter when items exist', async () => {\n const runList: RunList = await getRunList({\n flow: 'test-flow-uuid'\n });\n\n const endpoint = runList.getRefreshEndpoint();\n expect(endpoint).to.contain('&after=');\n expect(endpoint).to.contain('2023-12-01T10:30:00.000Z');\n });\n\n it('getRefreshEndpoint returns base endpoint when no items', async () => {\n const runList: RunList = await getRunList();\n runList.endpoint = '/api/v2/runs.json?flow=test';\n\n const endpoint = runList.getRefreshEndpoint();\n expect(endpoint).to.equal('/api/v2/runs.json?flow=test');\n });\n\n it('toggleResponded updates responses property', async () => {\n const runList: RunList = await getRunList();\n\n // mock checkbox element\n const mockCheckbox = document.createElement('input') as any;\n mockCheckbox.checked = false;\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockCheckbox);\n\n runList.toggleResponded();\n\n expect(runList.responses).to.equal(false);\n });\n\n it('handleColumnChanged sets resultPreview from event', async () => {\n const runList: RunList = await getRunList();\n\n const event = {\n target: {\n values: [{ key: 'name', name: 'Name' }]\n }\n };\n\n runList.handleColumnChanged(event);\n\n expect(runList.resultPreview).to.deep.equal({ key: 'name', name: 'Name' });\n });\n\n it('handleColumnChanged clears resultPreview when no values', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', name: 'Name' };\n\n const event = {\n target: {\n values: []\n }\n };\n\n runList.handleColumnChanged(event);\n\n expect(runList.resultPreview).to.be.null;\n });\n\n it('handleSelected sets selectedRun', async () => {\n const runList: RunList = await getRunList();\n\n const selectedRun = { id: 1, uuid: 'test-uuid' };\n runList.handleSelected(selectedRun);\n\n expect(runList.selectedRun).to.equal(selectedRun);\n });\n\n it('getListStyle returns empty string', async () => {\n const runList: RunList = await getRunList();\n\n const style = runList.getListStyle();\n expect(style).to.equal('');\n });\n\n it('renderHeader shows checkbox', async () => {\n const runList: RunList = await getRunList();\n\n const header = runList.renderHeader();\n const headerString = header.strings.join('');\n expect(headerString).to.contain('temba-checkbox');\n expect(headerString).to.contain('Responses Only');\n });\n\n it('renderHeader shows select when results exist', async () => {\n const runList: RunList = await getRunList();\n\n runList.results = [{ key: 'name', name: 'Name' }];\n await runList.updateComplete;\n\n const header = runList.renderHeader();\n\n // check if the template includes the results check and nested template\n expect(header.values).to.have.length.greaterThan(0);\n\n // check that results is truthy which will render the select\n expect(runList.results).to.not.be.null;\n });\n\n it('renderHeader without results hides select', async () => {\n const runList: RunList = await getRunList();\n\n const header = runList.renderHeader();\n expect(header.strings.join('')).to.not.contain('temba-select');\n expect(header.strings.join('')).to.contain('temba-checkbox');\n });\n\n it('renderFooter returns null when no selectedRun', async () => {\n const runList: RunList = await getRunList();\n\n const footer = runList.renderFooter();\n expect(footer).to.be.null;\n });\n\n it('renderFooter returns null when no resultKeys', async () => {\n const runList: RunList = await getRunList();\n\n runList.selectedRun = { id: 1, values: {} };\n // Don't set results, so resultKeys will be empty object {} which is truthy.\n // The method only returns null if selectedRun is null/undefined, not for empty resultKeys.\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null; // Empty object {} is truthy, so footer should render\n });\n\n it('renderFooter handles selectedRun without values', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z'\n };\n\n // should work now with the safety check\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n });\n\n it('renderFooter displays contact information', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n exit_type: 'completed',\n exited_on: '2023-12-01T10:30:00.000Z',\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n expect(footer.strings[0]).to.contain('temba-contact-name');\n });\n\n it('renderFooter shows delete icon when allowDelete is true', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.allowDelete = true;\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // verify the conditions that would show the delete icon\n expect(runList.allowDelete).to.be.true;\n expect(runList.selectedRun.id).to.equal(1);\n });\n\n it('renderFooter shows active run status', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n exit_type: null,\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer.strings.join('')).to.contain('Started');\n });\n\n it('createRenderOption creates renderOption function', async () => {\n const runList: RunList = await getRunList();\n\n expect(runList.renderOption).to.be.a('function');\n\n const run = {\n contact: {\n name: 'John Doe',\n urn: 'tel:+1234567890',\n ref: 'E2E6MX'\n },\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: '2023-12-01T10:30:00.000Z',\n responded: true\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n expect(result.strings.join('')).to.contain('temba-date');\n });\n\n it('renderOption handles run without contact name', async () => {\n const runList: RunList = await getRunList();\n\n const run = {\n contact: {\n name: null,\n urn: 'tel:+1234567890',\n ref: 'E2E6MX'\n },\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: null,\n responded: false\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n });\n\n it('renderOption handles run without contact', async () => {\n const runList: RunList = await getRunList();\n\n const run = {\n modified_on: '2023-12-01T10:30:00.000Z',\n exited_on: null,\n responded: false\n };\n\n const result = runList.renderOption(run, false);\n expect(result.strings.join('')).to.contain('temba-contact-name');\n });\n\n it('handles results without categories in renderResultPreview', async () => {\n const runList: RunList = await getRunList();\n\n runList.resultPreview = { key: 'name', categories: ['Text'] };\n\n const run = {\n values: {\n name: {\n value: 'Test Value'\n // missing category property\n }\n }\n };\n\n const result = runList.renderResultPreview(run);\n expect(result).to.equal('Test Value');\n });\n\n it('firstUpdated calls super', async () => {\n const runList: RunList = await getRunList();\n const superSpy = sinon.spy(\n Object.getPrototypeOf(RunList.prototype),\n 'firstUpdated'\n );\n\n runList.firstUpdated(new Map());\n\n expect(superSpy.called).to.be.true;\n superSpy.restore();\n });\n\n it('renderFooter shows result values', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // check that the conditions for showing the table are met\n const resultKeys = Object.keys(runList.selectedRun.values || {});\n expect(resultKeys.length).to.be.greaterThan(0);\n });\n\n it('renderFooter shows multi-category display', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [\n { key: 'gender', name: 'Gender', categories: ['Male', 'Female', 'Other'] }\n ];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n gender: {\n name: 'Gender',\n key: 'gender',\n value: 'Male',\n category: 'Male'\n }\n }\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n\n // check that we have data setup correctly by verifying the selected run has values\n expect(Object.keys(runList.selectedRun.values).length).to.be.greaterThan(0);\n });\n\n it('renderFooter handles missing contact uuid', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: null, // Missing contact to trigger the fallback\n created_on: '2023-12-01T10:00:00.000Z',\n values: {}\n };\n\n const footer = runList.renderFooter();\n expect(footer).to.not.be.null;\n expect(footer.strings[0]).to.contain('temba-contact-name');\n });\n\n it('renderFooter shows single-category result display', async () => {\n const runList: RunList = await getRunList();\n\n // mock temba-select element for the results\n const mockSelect = document.createElement('div') as any;\n mockSelect.setOptions = sinon.spy();\n sinon.stub(runList.shadowRoot, 'querySelector').returns(mockSelect);\n\n // set results to populate resultKeys\n runList.results = [{ key: 'name', name: 'Name', categories: ['Text'] }];\n await runList.updateComplete;\n\n runList.selectedRun = {\n id: 1,\n contact: {\n uuid: 'contact-uuid',\n name: 'John Doe',\n urn: 'tel:+1234567890'\n },\n created_on: '2023-12-01T10:00:00.000Z',\n values: {\n name: { name: 'Name', key: 'name', value: 'John Doe', category: 'Text' }\n }\n };\n\n const footer = runList.renderFooter();\n const footerString = footer.strings.join('');\n expect(footerString).to.contain('--'); // Single category shows '--' for category\n });\n});\n"]}
|
|
@@ -75,7 +75,7 @@ const getResponse = (endpoint, options = { method: 'GET' }) => {
|
|
|
75
75
|
before(async () => {
|
|
76
76
|
normalFetch = window.fetch;
|
|
77
77
|
stub(window, 'fetch').callsFake(getResponse);
|
|
78
|
-
await setViewport({ width:
|
|
78
|
+
await setViewport({ width: 1920, height: 1080, deviceScaleFactor: 2 });
|
|
79
79
|
});
|
|
80
80
|
after(() => {
|
|
81
81
|
window.fetch.restore();
|
|
@@ -174,6 +174,7 @@ export const getClip = (ele) => {
|
|
|
174
174
|
if (!clip.width || !clip.height) {
|
|
175
175
|
clip = ele.shadowRoot.firstElementChild.getBoundingClientRect();
|
|
176
176
|
}
|
|
177
|
+
// add some padding
|
|
177
178
|
const padding = 10;
|
|
178
179
|
const width = clip.width + padding * 2;
|
|
179
180
|
const height = clip.height + padding * 2;
|