@nyaruka/temba-components 0.129.3 → 0.129.5
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/.eslintrc.js +1 -0
- package/.github/workflows/build.yml +135 -3
- package/CHANGELOG.md +19 -0
- package/demo/data/flows/sample-flow.json +110 -87
- package/demo/field-config-demo.html +135 -0
- package/dist/temba-components.js +1257 -675
- package/dist/temba-components.js.map +1 -1
- package/docs/ActionEditor-Migration.md +118 -0
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/{EditorNode.js → CanvasNode.js} +345 -42
- package/out-tsc/src/flow/CanvasNode.js.map +1 -0
- package/out-tsc/src/flow/Editor.js +107 -3
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +1211 -0
- package/out-tsc/src/flow/NodeEditor.js.map +1 -0
- package/out-tsc/src/flow/Plumber.js +0 -6
- package/out-tsc/src/flow/Plumber.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js +40 -0
- package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -0
- package/out-tsc/src/flow/actions/add_contact_urn.js +16 -0
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -0
- package/out-tsc/src/flow/actions/add_input_labels.js +11 -0
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -0
- package/out-tsc/src/flow/actions/call_classifier.js +11 -0
- package/out-tsc/src/flow/actions/call_classifier.js.map +1 -0
- package/out-tsc/src/flow/actions/call_llm.js +11 -0
- package/out-tsc/src/flow/actions/call_llm.js.map +1 -0
- package/out-tsc/src/flow/actions/call_resthook.js +11 -0
- package/out-tsc/src/flow/actions/call_resthook.js.map +1 -0
- package/out-tsc/src/flow/actions/call_webhook.js +122 -0
- package/out-tsc/src/flow/actions/call_webhook.js.map +1 -0
- package/out-tsc/src/flow/actions/enter_flow.js +14 -0
- package/out-tsc/src/flow/actions/enter_flow.js.map +1 -0
- package/out-tsc/src/flow/actions/open_ticket.js +11 -0
- package/out-tsc/src/flow/actions/open_ticket.js.map +1 -0
- package/out-tsc/src/flow/actions/play_audio.js +11 -0
- package/out-tsc/src/flow/actions/play_audio.js.map +1 -0
- package/out-tsc/src/flow/actions/remove_contact_groups.js +62 -0
- package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -0
- package/out-tsc/src/flow/actions/request_optin.js +11 -0
- package/out-tsc/src/flow/actions/request_optin.js.map +1 -0
- package/out-tsc/src/flow/actions/say_msg.js +11 -0
- package/out-tsc/src/flow/actions/say_msg.js.map +1 -0
- package/out-tsc/src/flow/actions/send_broadcast.js +33 -0
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -0
- package/out-tsc/src/flow/actions/send_email.js +56 -0
- package/out-tsc/src/flow/actions/send_email.js.map +1 -0
- package/out-tsc/src/flow/actions/send_msg.js +55 -0
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -0
- package/out-tsc/src/flow/actions/set_contact_channel.js +12 -0
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -0
- package/out-tsc/src/flow/actions/set_contact_field.js +12 -0
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -0
- package/out-tsc/src/flow/actions/set_contact_language.js +10 -0
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -0
- package/out-tsc/src/flow/actions/set_contact_name.js +10 -0
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -0
- package/out-tsc/src/flow/actions/set_contact_status.js +10 -0
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -0
- package/out-tsc/src/flow/actions/set_run_result.js +10 -0
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -0
- package/out-tsc/src/flow/actions/split_by_expression_example.js +77 -0
- package/out-tsc/src/flow/actions/split_by_expression_example.js.map +1 -0
- package/out-tsc/src/flow/actions/start_session.js +11 -0
- package/out-tsc/src/flow/actions/start_session.js.map +1 -0
- package/out-tsc/src/flow/actions/transfer_airtime.js +11 -0
- package/out-tsc/src/flow/actions/transfer_airtime.js.map +1 -0
- package/out-tsc/src/flow/config.js +88 -193
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/nodes/execute_actions.js +4 -0
- package/out-tsc/src/flow/nodes/execute_actions.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_airtime.js +9 -0
- package/out-tsc/src/flow/nodes/split_by_airtime.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_contact_field.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_expression.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_groups.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_random.js +10 -0
- package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_run_result.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_scheme.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_scheme.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_subflow.js +9 -0
- package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_webhook.js +18 -0
- package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_audio.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_audio.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_digits.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_image.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_image.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_location.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_location.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_menu.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_menu.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_video.js +7 -0
- package/out-tsc/src/flow/nodes/wait_for_video.js.map +1 -0
- package/out-tsc/src/flow/types.js +79 -0
- package/out-tsc/src/flow/types.js.map +1 -0
- package/out-tsc/src/flow/utils.js +65 -0
- package/out-tsc/src/flow/utils.js.map +1 -0
- package/out-tsc/src/form/ArrayEditor.js +199 -0
- package/out-tsc/src/form/ArrayEditor.js.map +1 -0
- package/out-tsc/src/form/BaseListEditor.js +128 -0
- package/out-tsc/src/form/BaseListEditor.js.map +1 -0
- package/out-tsc/src/form/Checkbox.js +17 -2
- package/out-tsc/src/form/Checkbox.js.map +1 -1
- package/out-tsc/src/form/Completion.js +6 -0
- package/out-tsc/src/form/Completion.js.map +1 -1
- package/out-tsc/src/form/FormField.js +110 -11
- package/out-tsc/src/form/FormField.js.map +1 -1
- package/out-tsc/src/form/KeyValueEditor.js +223 -0
- package/out-tsc/src/form/KeyValueEditor.js.map +1 -0
- package/out-tsc/src/form/select/Select.js +92 -32
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/interfaces.js +6 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +2 -76
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/temba-modules.js +9 -2
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/ActionHelper.js +116 -0
- package/out-tsc/test/ActionHelper.js.map +1 -0
- package/out-tsc/test/actions/add_contact_groups.test.js +66 -0
- package/out-tsc/test/actions/add_contact_groups.test.js.map +1 -0
- package/out-tsc/test/actions/remove_contact_groups.test.js +226 -0
- package/out-tsc/test/actions/remove_contact_groups.test.js.map +1 -0
- package/out-tsc/test/actions/send_email.test.js +160 -0
- package/out-tsc/test/actions/send_email.test.js.map +1 -0
- package/out-tsc/test/actions/send_msg.test.js +95 -0
- package/out-tsc/test/actions/send_msg.test.js.map +1 -0
- package/out-tsc/test/temba-action-editing-integration.test.js +183 -0
- package/out-tsc/test/temba-action-editing-integration.test.js.map +1 -0
- package/out-tsc/test/temba-checkbox.test.js +1 -1
- package/out-tsc/test/temba-checkbox.test.js.map +1 -1
- package/out-tsc/test/temba-field-config.test.js +133 -0
- package/out-tsc/test/temba-field-config.test.js.map +1 -0
- package/out-tsc/test/temba-flow-editor-node.test.js +14 -14
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +283 -0
- package/out-tsc/test/temba-node-editor.test.js.map +1 -0
- package/out-tsc/test/temba-select.test.js +158 -0
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/package.json +1 -1
- 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/editor/router.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/editor/wait.png +0 -0
- package/screenshots/truth/formfield/markdown-errors.png +0 -0
- package/screenshots/truth/formfield/plain-text-errors.png +0 -0
- package/screenshots/truth/formfield/widget-only-markdown-errors.png +0 -0
- package/screenshots/truth/integration/checkbox-markdown-errors.png +0 -0
- package/src/events.ts +1 -40
- package/src/flow/{EditorNode.ts → CanvasNode.ts} +424 -48
- package/src/flow/Editor.ts +140 -4
- package/src/flow/NodeEditor.ts +1454 -0
- package/src/flow/Plumber.ts +0 -9
- package/src/flow/actions/add_contact_groups.ts +42 -0
- package/src/flow/actions/add_contact_urn.ts +17 -0
- package/src/flow/actions/add_input_labels.ts +12 -0
- package/src/flow/actions/call_classifier.ts +12 -0
- package/src/flow/actions/call_llm.ts +12 -0
- package/src/flow/actions/call_resthook.ts +12 -0
- package/src/flow/actions/call_webhook.ts +133 -0
- package/src/flow/actions/enter_flow.ts +15 -0
- package/src/flow/actions/open_ticket.ts +12 -0
- package/src/flow/actions/play_audio.ts +12 -0
- package/src/flow/actions/remove_contact_groups.ts +66 -0
- package/src/flow/actions/request_optin.ts +12 -0
- package/src/flow/actions/say_msg.ts +12 -0
- package/src/flow/actions/send_broadcast.ts +35 -0
- package/src/flow/actions/send_email.ts +60 -0
- package/src/flow/actions/send_msg.ts +58 -0
- package/src/flow/actions/set_contact_channel.ts +13 -0
- package/src/flow/actions/set_contact_field.ts +13 -0
- package/src/flow/actions/set_contact_language.ts +11 -0
- package/src/flow/actions/set_contact_name.ts +11 -0
- package/src/flow/actions/set_contact_status.ts +11 -0
- package/src/flow/actions/set_run_result.ts +11 -0
- package/src/flow/actions/split_by_expression_example.ts +88 -0
- package/src/flow/actions/start_session.ts +12 -0
- package/src/flow/actions/transfer_airtime.ts +12 -0
- package/src/flow/config.ts +93 -232
- package/src/flow/nodes/execute_actions.ts +5 -0
- package/src/flow/nodes/split_by_airtime.ts +9 -0
- package/src/flow/nodes/split_by_contact_field.ts +7 -0
- package/src/flow/nodes/split_by_expression.ts +7 -0
- package/src/flow/nodes/split_by_groups.ts +7 -0
- package/src/flow/nodes/split_by_random.ts +10 -0
- package/src/flow/nodes/split_by_run_result.ts +7 -0
- package/src/flow/nodes/split_by_scheme.ts +7 -0
- package/src/flow/nodes/split_by_subflow.ts +9 -0
- package/src/flow/nodes/split_by_webhook.ts +19 -0
- package/src/flow/nodes/wait_for_audio.ts +7 -0
- package/src/flow/nodes/wait_for_digits.ts +7 -0
- package/src/flow/nodes/wait_for_image.ts +7 -0
- package/src/flow/nodes/wait_for_location.ts +7 -0
- package/src/flow/nodes/wait_for_menu.ts +7 -0
- package/src/flow/nodes/wait_for_response.ts +7 -0
- package/src/flow/nodes/wait_for_video.ts +7 -0
- package/src/flow/types.ts +352 -0
- package/src/flow/utils.ts +76 -0
- package/src/form/ArrayEditor.ts +240 -0
- package/src/form/BaseListEditor.ts +177 -0
- package/src/form/Checkbox.ts +22 -3
- package/src/form/Completion.ts +6 -0
- package/src/form/FormField.ts +115 -11
- package/src/form/KeyValueEditor.ts +251 -0
- package/src/form/select/Select.ts +105 -32
- package/src/interfaces.ts +7 -2
- package/src/live/ContactChat.ts +3 -97
- package/src/store/flow-definition.d.ts +6 -1
- package/static/api/contacts.json +30 -0
- package/static/api/groups.json +4 -426
- package/static/api/locations.json +24 -0
- package/static/api/media.json +5 -0
- package/static/api/optins.json +16 -0
- package/static/api/orgs.json +13 -0
- package/static/api/topics.json +21 -0
- package/static/api/users.json +26 -0
- package/static/css/temba-components.css +3 -6
- package/temba-modules.ts +9 -2
- package/test/ActionHelper.ts +142 -0
- package/test/actions/add_contact_groups.test.ts +89 -0
- package/test/actions/remove_contact_groups.test.ts +265 -0
- package/test/actions/send_email.test.ts +214 -0
- package/test/actions/send_msg.test.ts +130 -0
- package/test/temba-action-editing-integration.test.ts +240 -0
- package/test/temba-checkbox.test.ts +1 -1
- package/test/temba-field-config.test.ts +152 -0
- package/test/temba-flow-editor-node.test.ts +18 -18
- package/test/temba-node-editor.test.ts +353 -0
- package/test/temba-select.test.ts +234 -0
- package/test-assets/contacts/history.json +11 -33
- package/web-dev-server.config.mjs +34 -0
- package/.github/workflows/coverage.yml +0 -80
- package/demo/sticky-note-demo.html +0 -155
- package/out-tsc/src/flow/EditorNode.js.map +0 -1
- package/out-tsc/src/flow/render.js +0 -358
- package/out-tsc/src/flow/render.js.map +0 -1
- package/out-tsc/test/temba-flow-render.test.js +0 -794
- package/out-tsc/test/temba-flow-render.test.js.map +0 -1
- package/src/flow/render.ts +0 -443
- package/test/temba-flow-render.test.ts +0 -1003
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"temba-flow-render.test.js","sourceRoot":"","sources":["../../test/temba-flow-render.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport {\n renderAddContactUrn,\n renderAddInputLabels,\n renderAddToGroups,\n renderCallClassifier,\n renderCallLLM,\n renderCallResthook,\n renderCallWebhook,\n renderEnterFlow,\n renderOpenTicket,\n renderPlayAudio,\n renderRemoveFromGroups,\n renderRequestOptin,\n renderSayMsg,\n renderSendBroadcast,\n renderSendEmail,\n renderSendMsg,\n renderSetContactChannel,\n renderSetContactField,\n renderSetContactLanguage,\n renderSetContactName,\n renderSetContactStatus,\n renderSetRunResult,\n renderStartSession,\n renderTransferAirtime,\n renderWaitForAudio,\n renderWaitForDigits,\n renderWaitForImage,\n renderWaitForLocation,\n renderWaitForMenu,\n renderWaitForResponse,\n renderWaitForVideo\n} from '../src/flow/render';\nimport {\n AddContactUrn,\n AddInputLabels,\n AddToGroup,\n CallClassifier,\n CallLLM,\n CallResthook,\n CallWebhook,\n EnterFlow,\n Node,\n OpenTicket,\n PlayAudio,\n RemoveFromGroup,\n RequestOptin,\n SayMsg,\n SendBroadcast,\n SendEmail,\n SendMsg,\n SetContactChannel,\n SetContactField,\n SetContactLanguage,\n SetContactName,\n SetContactStatus,\n SetRunResult,\n StartSession,\n TransferAirtime,\n WaitForAudio,\n WaitForDigits,\n WaitForImage,\n WaitForLocation,\n WaitForMenu,\n WaitForResponse,\n WaitForVideo\n} from '../src/store/flow-definition.d';\n\ndescribe('Flow Render Functions', () => {\n const mockNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: []\n };\n\n describe('renderSendMsg', () => {\n it('renders message text with line breaks', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-1',\n text: 'Hello world\\nThis is a new line',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain(\n 'Hello world<br>This is a new line'\n );\n });\n\n it('renders quick replies when present', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-2',\n text: 'Choose an option:',\n quick_replies: ['Yes', 'No', 'Maybe']\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Choose an option:');\n expect(container.innerHTML).to.contain('quick-replies');\n expect(container.innerHTML).to.contain('Yes');\n expect(container.innerHTML).to.contain('No');\n expect(container.innerHTML).to.contain('Maybe');\n });\n\n it('renders without quick replies when none provided', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-3',\n text: 'Simple message',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Simple message');\n expect(container.innerHTML).to.not.contain('quick-replies');\n });\n });\n\n describe('renderSetContactName', () => {\n it('renders contact name setting', async () => {\n const action: SetContactName = {\n type: 'set_contact_name',\n uuid: 'action-uuid-4',\n name: 'John Doe'\n };\n\n const result = renderSetContactName(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact name to');\n expect(container.textContent).to.contain('John Doe');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderSetRunResult', () => {\n it('renders run result setting', async () => {\n const action: SetRunResult = {\n type: 'set_run_result',\n uuid: 'action-uuid-5',\n category: 'success',\n name: 'favorite_color',\n value: 'blue'\n };\n\n const result = renderSetRunResult(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Save blue as');\n expect(container.textContent).to.contain('favorite_color');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderCallWebhook', () => {\n it('renders webhook URL', async () => {\n const action: CallWebhook = {\n type: 'call_webhook',\n uuid: 'action-uuid-6',\n url: 'https://example.com/webhook'\n };\n\n const result = renderCallWebhook(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('https://example.com/webhook');\n expect(container.querySelector('div')).to.have.style(\n 'word-break',\n 'break-all'\n );\n });\n });\n\n describe('renderAddToGroups', () => {\n it('renders groups with icons', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-7',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n },\n {\n uuid: 'group2',\n name: 'Newsletter Subscribers',\n status: 'active',\n system: false,\n query: '',\n count: 25\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('VIP Customers');\n expect(container.innerHTML).to.contain('Newsletter Subscribers');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n\n const icons = container.querySelectorAll('temba-icon');\n icons.forEach((icon) => {\n expect(icon.getAttribute('name')).to.equal('group');\n });\n });\n\n it('renders empty groups array', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-8',\n groups: []\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n\n it('renders groups without icons when undefined', async () => {\n // Test the renderNamedObjects function without an icon parameter\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9',\n groups: [\n {\n uuid: 'group1',\n name: 'Test Group',\n status: 'active',\n system: false,\n query: '',\n count: 5\n }\n ]\n };\n\n // Create a test version that calls renderNamedObjects without icon\n // to cover the null case in the render.ts file\n const namedObjects = action.groups;\n\n // Create a test version that calls renderNamedObjects without icon\n const testRender = (assets: any[]) => {\n return assets.map((asset) => {\n return html`<div style=\"display:flex;items-align:center\">\n ${null /* This should trigger the null branch */}\n <div>${asset.name}</div>\n </div>`;\n });\n };\n\n const result = testRender(namedObjects);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Test Group');\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n\n it('renders groups with limit - shows +X more for 5+ items', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9b',\n groups: [\n {\n uuid: 'group1',\n name: 'Group 1',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group2',\n name: 'Group 2',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group3',\n name: 'Group 3',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group4',\n name: 'Group 4',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group5',\n name: 'Group 5',\n status: 'active',\n system: false,\n query: '',\n count: 1\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Group 1');\n expect(container.textContent).to.contain('Group 2');\n expect(container.textContent).to.contain('Group 3');\n expect(container.textContent).to.contain('+2 more');\n expect(container.textContent).to.not.contain('Group 4');\n expect(container.textContent).to.not.contain('Group 5');\n });\n\n it('renders all 4 groups when exactly 4 items', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9c',\n groups: [\n {\n uuid: 'group1',\n name: 'Group 1',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group2',\n name: 'Group 2',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group3',\n name: 'Group 3',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group4',\n name: 'Group 4',\n status: 'active',\n system: false,\n query: '',\n count: 1\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Group 1');\n expect(container.textContent).to.contain('Group 2');\n expect(container.textContent).to.contain('Group 3');\n expect(container.textContent).to.contain('Group 4');\n expect(container.textContent).to.not.contain('+');\n });\n });\n\n describe('renderRemoveFromGroups', () => {\n it('renders groups with icons for removal', async () => {\n const action: RemoveFromGroup = {\n type: 'remove_contact_groups',\n uuid: 'action-uuid-10',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n }\n ]\n };\n\n const result = renderRemoveFromGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('VIP Customers');\n expect(container.querySelectorAll('temba-icon')).to.have.length(1);\n const icon = container.querySelector('temba-icon');\n expect(icon?.getAttribute('name')).to.equal('group');\n });\n });\n\n describe('renderSetContactField', () => {\n it('renders contact field setting', async () => {\n const action: SetContactField = {\n type: 'set_contact_field',\n uuid: 'action-uuid-11',\n field: { uuid: 'field1', name: 'Favorite Color' },\n value: 'Blue'\n };\n\n const result = renderSetContactField(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set');\n expect(container.textContent).to.contain('Favorite Color');\n expect(container.textContent).to.contain('to');\n expect(container.textContent).to.contain('Blue');\n expect(container.querySelectorAll('b')).to.have.length(2);\n });\n });\n\n describe('renderSetContactLanguage', () => {\n it('renders contact language setting', async () => {\n const action: SetContactLanguage = {\n type: 'set_contact_language',\n uuid: 'action-uuid-12',\n language: 'Spanish'\n };\n\n const result = renderSetContactLanguage(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact language to');\n expect(container.textContent).to.contain('Spanish');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderSetContactStatus', () => {\n it('renders contact status setting', async () => {\n const action: SetContactStatus = {\n type: 'set_contact_status',\n uuid: 'action-uuid-13',\n status: 'blocked'\n };\n\n const result = renderSetContactStatus(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact status to');\n expect(container.textContent).to.contain('blocked');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderAddContactUrn', () => {\n it('renders URN addition with friendly scheme names', async () => {\n const action: AddContactUrn = {\n type: 'add_contact_urn',\n uuid: 'action-uuid-14',\n scheme: 'tel',\n path: '+1234567890'\n };\n\n const result = renderAddContactUrn(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Add');\n expect(container.textContent).to.contain('Phone Number');\n expect(container.textContent).to.contain('+1234567890');\n // Only the phone number should be bold, not the scheme\n expect(container.querySelectorAll('b')).to.have.length(1);\n expect(container.querySelector('b')?.textContent).to.equal('+1234567890');\n });\n\n it('renders URN addition with unmapped scheme', async () => {\n const action: AddContactUrn = {\n type: 'add_contact_urn',\n uuid: 'action-uuid-14b',\n scheme: 'unknown',\n path: 'test123'\n };\n\n const result = renderAddContactUrn(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Add');\n expect(container.textContent).to.contain('unknown');\n expect(container.textContent).to.contain('test123');\n // Only the URN path should be bold\n expect(container.querySelectorAll('b')).to.have.length(1);\n expect(container.querySelector('b')?.textContent).to.equal('test123');\n });\n });\n\n describe('renderSendEmail', () => {\n it('renders email with subject and body', async () => {\n const action: SendEmail = {\n type: 'send_email',\n uuid: 'action-uuid-15',\n subject: 'Welcome!',\n body: 'Thanks for signing up',\n addresses: ['user@example.com', 'admin@example.com']\n };\n\n const result = renderSendEmail(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Send email to\" prefix\n expect(container.textContent).to.contain(\n 'user@example.com, admin@example.com'\n );\n expect(container.textContent).to.contain('Welcome!');\n });\n });\n\n describe('renderSendBroadcast', () => {\n it('renders broadcast with groups and contacts', async () => {\n const action: SendBroadcast = {\n type: 'send_broadcast',\n uuid: 'action-uuid-16',\n text: 'Important announcement',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n }\n ],\n contacts: [{ uuid: 'contact1', name: 'John Doe' }]\n };\n\n const result = renderSendBroadcast(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Important announcement');\n expect(container.textContent).to.contain('Groups:');\n expect(container.textContent).to.contain('VIP Customers');\n expect(container.textContent).to.contain('Contacts:');\n expect(container.textContent).to.contain('John Doe');\n });\n\n it('renders broadcast with text only', async () => {\n const action: SendBroadcast = {\n type: 'send_broadcast',\n uuid: 'action-uuid-17',\n text: 'Simple broadcast',\n groups: [],\n contacts: []\n };\n\n const result = renderSendBroadcast(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Simple broadcast');\n expect(container.textContent).to.not.contain('Groups:');\n expect(container.textContent).to.not.contain('Contacts:');\n });\n });\n\n describe('renderEnterFlow', () => {\n it('renders flow entry', async () => {\n const action: EnterFlow = {\n type: 'enter_flow',\n uuid: 'action-uuid-18',\n flow: { uuid: 'flow1', name: 'Registration Flow' }\n };\n\n const result = renderEnterFlow(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Enter flow');\n expect(container.textContent).to.contain('Registration Flow');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderStartSession', () => {\n it('renders session start with groups and contacts', async () => {\n const action: StartSession = {\n type: 'start_session',\n uuid: 'action-uuid-19',\n flow: { uuid: 'flow1', name: 'Survey Flow' },\n groups: [\n {\n uuid: 'group1',\n name: 'Subscribers',\n status: 'active',\n system: false,\n query: '',\n count: 50\n }\n ],\n contacts: [{ uuid: 'contact1', name: 'Jane Smith' }]\n };\n\n const result = renderStartSession(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Subscribers');\n expect(container.textContent).to.contain('Jane Smith');\n expect(container.textContent).to.contain('Survey Flow');\n });\n });\n\n describe('renderTransferAirtime', () => {\n it('renders airtime transfer', async () => {\n const action: TransferAirtime = {\n type: 'transfer_airtime',\n uuid: 'action-uuid-20',\n amounts: [100, 200, 500],\n result_name: 'airtime_result'\n };\n\n const result = renderTransferAirtime(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Transfer airtime amounts:');\n expect(container.textContent).to.contain('100, 200, 500');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('airtime_result');\n });\n });\n\n describe('renderCallClassifier', () => {\n it('renders classifier call', async () => {\n const action: CallClassifier = {\n type: 'call_classifier',\n uuid: 'action-uuid-21',\n classifier: { uuid: 'classifier1', name: 'Intent Classifier' },\n input: 'User message text',\n result_name: 'intent_result'\n };\n\n const result = renderCallClassifier(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Call classifier');\n expect(container.textContent).to.contain('Intent Classifier');\n expect(container.textContent).to.contain('Input:');\n expect(container.textContent).to.contain('User message text');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('intent_result');\n });\n });\n\n describe('renderCallResthook', () => {\n it('renders resthook call', async () => {\n const action: CallResthook = {\n type: 'call_resthook',\n uuid: 'action-uuid-22',\n resthook: 'survey-complete',\n result_name: 'webhook_result'\n };\n\n const result = renderCallResthook(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Call resthook');\n expect(container.textContent).to.contain('survey-complete');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('webhook_result');\n });\n });\n\n describe('renderCallLLM', () => {\n it('renders LLM call', async () => {\n const action: CallLLM = {\n type: 'call_llm',\n uuid: 'action-uuid-23',\n llm: { uuid: 'llm1', name: 'GPT-4' },\n instructions: 'Analyze this text',\n result_name: 'ai_result'\n };\n\n const result = renderCallLLM(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Call AI\" prefix\n expect(container.textContent).to.contain('GPT-4');\n expect(container.textContent).to.contain('Analyze this text');\n });\n });\n\n describe('renderOpenTicket', () => {\n it('renders ticket with assignee and topic', async () => {\n const action: OpenTicket = {\n type: 'open_ticket',\n uuid: 'action-uuid-24',\n subject: 'Support Request',\n body: 'Customer needs help',\n assignee: { uuid: 'user1', name: 'Support Agent' },\n topic: { uuid: 'topic1', name: 'Technical Support' }\n };\n\n const result = renderOpenTicket(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects subject\n expect(container.textContent).to.contain('Customer needs help');\n expect(container.textContent).to.contain('Support Agent');\n expect(container.textContent).to.contain('Technical Support');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n });\n\n it('renders ticket without assignee or topic', async () => {\n const action: OpenTicket = {\n type: 'open_ticket',\n uuid: 'action-uuid-25',\n subject: 'Basic Ticket',\n body: 'Simple ticket content'\n };\n\n const result = renderOpenTicket(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects subject\n expect(container.textContent).to.contain('Simple ticket content');\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n });\n\n describe('renderRequestOptin', () => {\n it('renders optin request', async () => {\n const action: RequestOptin = {\n type: 'request_optin',\n uuid: 'action-uuid-26',\n optin: { uuid: 'optin1', name: 'Newsletter Subscription' }\n };\n\n const result = renderRequestOptin(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Request opt-in for');\n expect(container.textContent).to.contain('Newsletter Subscription');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderAddInputLabels', () => {\n it('renders input labels', async () => {\n const action: AddInputLabels = {\n type: 'add_input_labels',\n uuid: 'action-uuid-27',\n labels: [\n { uuid: 'label1', name: 'Important' },\n { uuid: 'label2', name: 'Customer Service' }\n ]\n };\n\n const result = renderAddInputLabels(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Add labels to input:\" prefix\n expect(container.textContent).to.contain('Important');\n expect(container.textContent).to.contain('Customer Service');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n });\n });\n\n describe('renderSayMsg', () => {\n it('renders voice message with audio URL', async () => {\n const action: SayMsg = {\n type: 'say_msg',\n uuid: 'action-uuid-28',\n text: 'Welcome to our service',\n audio_url: 'https://example.com/audio.mp3'\n };\n\n const result = renderSayMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Welcome to our service');\n expect(container.innerHTML).to.contain('https://example.com/audio.mp3');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n\n it('renders voice message without audio URL', async () => {\n const action: SayMsg = {\n type: 'say_msg',\n uuid: 'action-uuid-29',\n text: 'Text only message'\n };\n\n const result = renderSayMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Text only message');\n expect(container.querySelector('temba-icon')).to.not.exist;\n });\n });\n\n describe('renderPlayAudio', () => {\n it('renders audio playback', async () => {\n const action: PlayAudio = {\n type: 'play_audio',\n uuid: 'action-uuid-30',\n audio_url: 'https://example.com/music.mp3'\n };\n\n const result = renderPlayAudio(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('https://example.com/music.mp3');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n });\n\n describe('renderSetContactChannel', () => {\n it('renders contact channel setting', async () => {\n const action: SetContactChannel = {\n type: 'set_contact_channel',\n uuid: 'action-uuid-31',\n channel: { uuid: 'channel1', name: 'WhatsApp Channel' }\n };\n\n const result = renderSetContactChannel(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact channel to');\n expect(container.textContent).to.contain('WhatsApp Channel');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderWaitForResponse', () => {\n it('renders wait for response with timeout', async () => {\n const action: WaitForResponse = {\n type: 'wait_for_response',\n uuid: 'action-uuid-32',\n timeout: 300\n };\n\n const result = renderWaitForResponse(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for message response');\n expect(container.textContent).to.contain('Timeout after');\n expect(container.textContent).to.contain('300');\n expect(container.textContent).to.contain('seconds');\n });\n\n it('renders wait for response without timeout', async () => {\n const action: WaitForResponse = {\n type: 'wait_for_response',\n uuid: 'action-uuid-33'\n };\n\n const result = renderWaitForResponse(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for message response');\n expect(container.textContent).to.not.contain('Timeout');\n });\n });\n\n describe('renderWaitForMenu', () => {\n it('renders wait for menu with timeout', async () => {\n const action: WaitForMenu = {\n type: 'wait_for_menu',\n uuid: 'action-uuid-34',\n menu: { uuid: 'menu1', name: 'Main Menu' },\n timeout: 120\n };\n\n const result = renderWaitForMenu(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for menu selection:');\n expect(container.textContent).to.contain('Main Menu');\n expect(container.textContent).to.contain('Timeout after');\n expect(container.textContent).to.contain('120');\n });\n });\n\n describe('renderWaitForDigits', () => {\n it('renders wait for single digit', async () => {\n const action: WaitForDigits = {\n type: 'wait_for_digits',\n uuid: 'action-uuid-35',\n count: 1,\n timeout: 60\n };\n\n const result = renderWaitForDigits(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for');\n expect(container.textContent).to.contain('1');\n expect(container.textContent).to.contain('digit');\n expect(container.textContent).to.not.contain('digits');\n expect(container.textContent).to.contain('Timeout after 60');\n });\n\n it('renders wait for multiple digits', async () => {\n const action: WaitForDigits = {\n type: 'wait_for_digits',\n uuid: 'action-uuid-36',\n count: 4\n };\n\n const result = renderWaitForDigits(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for');\n expect(container.textContent).to.contain('4');\n expect(container.textContent).to.contain('digits');\n expect(container.textContent).to.not.contain('Timeout');\n });\n });\n\n describe('renderWaitForAudio', () => {\n it('renders wait for audio with icon', async () => {\n const action: WaitForAudio = {\n type: 'wait_for_audio',\n uuid: 'action-uuid-37',\n timeout: 180\n };\n\n const result = renderWaitForAudio(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for audio recording');\n expect(container.textContent).to.contain('Timeout after 180');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n });\n\n describe('renderWaitForVideo', () => {\n it('renders wait for video with icon', async () => {\n const action: WaitForVideo = {\n type: 'wait_for_video',\n uuid: 'action-uuid-38'\n };\n\n const result = renderWaitForVideo(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for video recording');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('video');\n });\n });\n\n describe('renderWaitForImage', () => {\n it('renders wait for image with icon', async () => {\n const action: WaitForImage = {\n type: 'wait_for_image',\n uuid: 'action-uuid-39',\n timeout: 240\n };\n\n const result = renderWaitForImage(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for image');\n expect(container.textContent).to.contain('Timeout after 240');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('image');\n });\n });\n\n describe('renderWaitForLocation', () => {\n it('renders wait for location with icon', async () => {\n const action: WaitForLocation = {\n type: 'wait_for_location',\n uuid: 'action-uuid-40'\n };\n\n const result = renderWaitForLocation(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for location');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('location');\n });\n });\n});\n"]}
|
package/src/flow/render.ts
DELETED
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import { html } from 'lit-html';
|
|
2
|
-
import { unsafeHTML } from 'lit-html/directives/unsafe-html.js';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
AddContactUrn,
|
|
6
|
-
AddInputLabels,
|
|
7
|
-
AddToGroup,
|
|
8
|
-
CallClassifier,
|
|
9
|
-
CallLLM,
|
|
10
|
-
CallResthook,
|
|
11
|
-
CallWebhook,
|
|
12
|
-
EnterFlow,
|
|
13
|
-
Node,
|
|
14
|
-
NamedObject,
|
|
15
|
-
OpenTicket,
|
|
16
|
-
PlayAudio,
|
|
17
|
-
RemoveFromGroup,
|
|
18
|
-
RequestOptin,
|
|
19
|
-
SayMsg,
|
|
20
|
-
SendBroadcast,
|
|
21
|
-
SendEmail,
|
|
22
|
-
SendMsg,
|
|
23
|
-
SetContactChannel,
|
|
24
|
-
SetContactField,
|
|
25
|
-
SetContactLanguage,
|
|
26
|
-
SetContactName,
|
|
27
|
-
SetContactStatus,
|
|
28
|
-
SetRunResult,
|
|
29
|
-
StartSession,
|
|
30
|
-
TransferAirtime,
|
|
31
|
-
WaitForAudio,
|
|
32
|
-
WaitForDigits,
|
|
33
|
-
WaitForImage,
|
|
34
|
-
WaitForLocation,
|
|
35
|
-
WaitForMenu,
|
|
36
|
-
WaitForResponse,
|
|
37
|
-
WaitForVideo
|
|
38
|
-
} from '../store/flow-definition';
|
|
39
|
-
import { Icon } from '../Icons';
|
|
40
|
-
|
|
41
|
-
// URN scheme mapping for user-friendly display
|
|
42
|
-
const urnSchemeMap: Record<string, string> = {
|
|
43
|
-
tel: 'Phone Number',
|
|
44
|
-
email: 'Email',
|
|
45
|
-
twitter: 'Twitter',
|
|
46
|
-
facebook: 'Facebook',
|
|
47
|
-
telegram: 'Telegram',
|
|
48
|
-
whatsapp: 'WhatsApp',
|
|
49
|
-
viber: 'Viber',
|
|
50
|
-
line: 'Line',
|
|
51
|
-
discord: 'Discord',
|
|
52
|
-
slack: 'Slack',
|
|
53
|
-
external: 'External ID'
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const renderLineItem = (name: string, icon?: string) => {
|
|
57
|
-
return html`<div style="display:flex;items-align:center">
|
|
58
|
-
${icon
|
|
59
|
-
? html`<temba-icon name=${icon} style="margin-right:0.5em"></temba-icon>`
|
|
60
|
-
: null}
|
|
61
|
-
<div
|
|
62
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
63
|
-
>
|
|
64
|
-
${name}
|
|
65
|
-
</div>
|
|
66
|
-
</div>`;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const renderNamedObjects = (assets: NamedObject[], icon?: string) => {
|
|
70
|
-
const items = [];
|
|
71
|
-
const maxDisplay = 3;
|
|
72
|
-
|
|
73
|
-
// Show up to 3 items, or all 4 if exactly 4 items
|
|
74
|
-
const displayCount =
|
|
75
|
-
assets.length === 4 ? 4 : Math.min(maxDisplay, assets.length);
|
|
76
|
-
|
|
77
|
-
for (let i = 0; i < displayCount; i++) {
|
|
78
|
-
const asset = assets[i];
|
|
79
|
-
items.push(renderLineItem(asset.name, icon));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Add "+X more" if there are more than 3 items (and not exactly 4)
|
|
83
|
-
if (assets.length > maxDisplay && assets.length !== 4) {
|
|
84
|
-
const remainingCount = assets.length - maxDisplay;
|
|
85
|
-
items.push(html`<div style="display:flex;items-align:center; color: #666;">
|
|
86
|
-
${icon
|
|
87
|
-
? html`<div style="margin-right:0.5em; width: 1em;"></div>` // spacing placeholder
|
|
88
|
-
: null}
|
|
89
|
-
<div>+${remainingCount} more</div>
|
|
90
|
-
</div>`);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return items;
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export const renderSendMsg = (node: Node, action: SendMsg) => {
|
|
97
|
-
const text = action.text.replace(/\n/g, '<br>');
|
|
98
|
-
return html`
|
|
99
|
-
${unsafeHTML(text)}
|
|
100
|
-
${action.quick_replies.length > 0
|
|
101
|
-
? html`<div class="quick-replies">
|
|
102
|
-
${action.quick_replies.map((reply) => {
|
|
103
|
-
return html`<div class="quick-reply">${reply}</div>`;
|
|
104
|
-
})}
|
|
105
|
-
</div>`
|
|
106
|
-
: null}
|
|
107
|
-
`;
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export const renderSetContactName = (node: Node, action: SetContactName) => {
|
|
111
|
-
return html`<div>Set contact name to <b>${action.name}</b></div>`;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export const renderSetRunResult = (node: Node, action: SetRunResult) => {
|
|
115
|
-
return html`<div>Save ${action.value} as <b>${action.name}</b></div>`;
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
export const renderCallWebhook = (node: Node, action: CallWebhook) => {
|
|
119
|
-
return html`<div
|
|
120
|
-
style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
121
|
-
>
|
|
122
|
-
${action.url}
|
|
123
|
-
</div>`;
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export const renderAddToGroups = (node: Node, action: AddToGroup) => {
|
|
127
|
-
return html`<div>${renderNamedObjects(action.groups, 'group')}</div>`;
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
export const renderRemoveFromGroups = (node: Node, action: RemoveFromGroup) => {
|
|
131
|
-
return html`<div>${renderNamedObjects(action.groups, 'group')}</div>`;
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
export const renderSetContactField = (node: Node, action: SetContactField) => {
|
|
135
|
-
return html`<div>
|
|
136
|
-
Set <b>${action.field.name}</b> to <b>${action.value}</b>
|
|
137
|
-
</div>`;
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
export const renderSetContactLanguage = (
|
|
141
|
-
node: Node,
|
|
142
|
-
action: SetContactLanguage
|
|
143
|
-
) => {
|
|
144
|
-
return html`<div>Set contact language to <b>${action.language}</b></div>`;
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
export const renderSetContactStatus = (
|
|
148
|
-
node: Node,
|
|
149
|
-
action: SetContactStatus
|
|
150
|
-
) => {
|
|
151
|
-
return html`<div>Set contact status to <b>${action.status}</b></div>`;
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
export const renderSetContactChannel = (
|
|
155
|
-
node: Node,
|
|
156
|
-
action: SetContactChannel
|
|
157
|
-
) => {
|
|
158
|
-
return html`<div>Set contact channel to <b>${action.channel.name}</b></div>`;
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
export const renderAddContactUrn = (node: Node, action: AddContactUrn) => {
|
|
162
|
-
const friendlyScheme = urnSchemeMap[action.scheme] || action.scheme;
|
|
163
|
-
return html`<div
|
|
164
|
-
style="word-wrap: break-word; overflow: hidden; text-overflow: ellipsis;"
|
|
165
|
-
>
|
|
166
|
-
Add ${friendlyScheme} <b>${action.path}</b>
|
|
167
|
-
</div>`;
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
export const renderSendEmail = (node: Node, action: SendEmail) => {
|
|
171
|
-
const addressList = action.addresses.join(', ');
|
|
172
|
-
return html`<div>
|
|
173
|
-
<div
|
|
174
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
175
|
-
>
|
|
176
|
-
<b>${addressList}</b>
|
|
177
|
-
</div>
|
|
178
|
-
<div style="margin-top: 0.5em">
|
|
179
|
-
<div
|
|
180
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
181
|
-
>
|
|
182
|
-
${action.subject}
|
|
183
|
-
</div>
|
|
184
|
-
<div
|
|
185
|
-
style="margin-top: 0.25em; word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
|
|
186
|
-
>
|
|
187
|
-
${action.body}
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
</div>`;
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
export const renderSendBroadcast = (node: Node, action: SendBroadcast) => {
|
|
194
|
-
const hasGroups = action.groups && action.groups.length > 0;
|
|
195
|
-
const hasContacts = action.contacts && action.contacts.length > 0;
|
|
196
|
-
|
|
197
|
-
return html`<div>
|
|
198
|
-
<div style="word-wrap: break-word; margin-bottom: 0.5em">
|
|
199
|
-
${action.text}
|
|
200
|
-
</div>
|
|
201
|
-
${hasGroups
|
|
202
|
-
? html`<div style="margin-bottom: 0.25em">
|
|
203
|
-
<div style="font-weight: bold; margin-bottom: 0.25em">Groups:</div>
|
|
204
|
-
${renderNamedObjects(action.groups, 'group')}
|
|
205
|
-
</div>`
|
|
206
|
-
: null}
|
|
207
|
-
${hasContacts
|
|
208
|
-
? html`<div>
|
|
209
|
-
<div style="font-weight: bold; margin-bottom: 0.25em">Contacts:</div>
|
|
210
|
-
${renderNamedObjects(action.contacts, 'contact')}
|
|
211
|
-
</div>`
|
|
212
|
-
: null}
|
|
213
|
-
</div>`;
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
export const renderEnterFlow = (node: Node, action: EnterFlow) => {
|
|
217
|
-
return html`<div>Enter flow <b>${action.flow.name}</b></div>`;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export const renderStartSession = (node: Node, action: StartSession) => {
|
|
221
|
-
const hasGroups = action.groups && action.groups.length > 0;
|
|
222
|
-
const hasContacts = action.contacts && action.contacts.length > 0;
|
|
223
|
-
|
|
224
|
-
return html`<div>
|
|
225
|
-
${hasGroups
|
|
226
|
-
? html`<div style="margin-top: 0.5em">
|
|
227
|
-
<div style="font-weight: bold; margin-bottom: 0.25em">Groups:</div>
|
|
228
|
-
${renderNamedObjects(action.groups, 'group')}
|
|
229
|
-
</div>`
|
|
230
|
-
: null}
|
|
231
|
-
${hasContacts
|
|
232
|
-
? html`<div style="margin-top: 0.5em">
|
|
233
|
-
<div style="font-weight: bold; margin-bottom: 0.25em">Contacts:</div>
|
|
234
|
-
${renderNamedObjects(action.contacts, 'contact')}
|
|
235
|
-
</div>`
|
|
236
|
-
: null}
|
|
237
|
-
${action.create_contact
|
|
238
|
-
? renderLineItem('Create contact', Icon.contact)
|
|
239
|
-
: null}
|
|
240
|
-
${renderLineItem(action.flow.name, Icon.flow)}
|
|
241
|
-
</div>`;
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
export const renderTransferAirtime = (node: Node, action: TransferAirtime) => {
|
|
245
|
-
const amounts = action.amounts.join(', ');
|
|
246
|
-
return html`<div>
|
|
247
|
-
Transfer airtime amounts: <b>${amounts}</b>
|
|
248
|
-
<div>Save result as <b>${action.result_name}</b></div>
|
|
249
|
-
</div>`;
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
export const renderCallClassifier = (node: Node, action: CallClassifier) => {
|
|
253
|
-
return html`<div>
|
|
254
|
-
<div>Call classifier <b>${action.classifier.name}</b></div>
|
|
255
|
-
<div style="margin-top: 0.25em; word-wrap: break-word">
|
|
256
|
-
Input: <b>${action.input}</b>
|
|
257
|
-
</div>
|
|
258
|
-
<div style="margin-top: 0.25em">
|
|
259
|
-
Save result as <b>${action.result_name}</b>
|
|
260
|
-
</div>
|
|
261
|
-
</div>`;
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
export const renderCallResthook = (node: Node, action: CallResthook) => {
|
|
265
|
-
return html`<div>
|
|
266
|
-
<div>Call resthook <b>${action.resthook}</b></div>
|
|
267
|
-
<div style="margin-top: 0.25em">
|
|
268
|
-
Save result as <b>${action.result_name}</b>
|
|
269
|
-
</div>
|
|
270
|
-
</div>`;
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
export const renderCallLLM = (node: Node, action: CallLLM) => {
|
|
274
|
-
return html`<div>
|
|
275
|
-
<div style="margin-top: 0.25em; display: flex; align-items: center;">
|
|
276
|
-
<temba-icon name="ai" style="margin-right: 0.5em"></temba-icon>
|
|
277
|
-
<span
|
|
278
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
279
|
-
>
|
|
280
|
-
${action.llm.name}
|
|
281
|
-
</span>
|
|
282
|
-
</div>
|
|
283
|
-
<div
|
|
284
|
-
style="margin-top: 0.25em; word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
|
|
285
|
-
>
|
|
286
|
-
${action.instructions}
|
|
287
|
-
</div>
|
|
288
|
-
</div>`;
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
export const renderOpenTicket = (node: Node, action: OpenTicket) => {
|
|
292
|
-
return html`<div>
|
|
293
|
-
<div
|
|
294
|
-
style="word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
|
|
295
|
-
>
|
|
296
|
-
${action.body}
|
|
297
|
-
</div>
|
|
298
|
-
${action.assignee
|
|
299
|
-
? html`<div
|
|
300
|
-
style="margin-top: 0.25em; display: flex; align-items: center;"
|
|
301
|
-
>
|
|
302
|
-
<temba-icon name="user" style="margin-right: 0.5em"></temba-icon>
|
|
303
|
-
<span
|
|
304
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
305
|
-
>
|
|
306
|
-
${action.assignee.name}
|
|
307
|
-
</span>
|
|
308
|
-
</div>`
|
|
309
|
-
: null}
|
|
310
|
-
${action.topic
|
|
311
|
-
? html`<div
|
|
312
|
-
style="margin-top: 0.25em; display: flex; align-items: center;"
|
|
313
|
-
>
|
|
314
|
-
<temba-icon name="topic" style="margin-right: 0.5em"></temba-icon>
|
|
315
|
-
<span
|
|
316
|
-
style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
317
|
-
>
|
|
318
|
-
${action.topic.name}
|
|
319
|
-
</span>
|
|
320
|
-
</div>`
|
|
321
|
-
: null}
|
|
322
|
-
</div>`;
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
export const renderRequestOptin = (node: Node, action: RequestOptin) => {
|
|
326
|
-
return html`<div>Request opt-in for <b>${action.optin.name}</b></div>`;
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
export const renderAddInputLabels = (node: Node, action: AddInputLabels) => {
|
|
330
|
-
return html`<div>${renderNamedObjects(action.labels, 'label')}</div>`;
|
|
331
|
-
};
|
|
332
|
-
|
|
333
|
-
export const renderSayMsg = (node: Node, action: SayMsg) => {
|
|
334
|
-
return html`<div>
|
|
335
|
-
<div
|
|
336
|
-
style="word-wrap: break-word; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
337
|
-
>
|
|
338
|
-
${action.text}
|
|
339
|
-
</div>
|
|
340
|
-
${action.audio_url
|
|
341
|
-
? html`<div
|
|
342
|
-
style="margin-top: 0.5em; display: flex; align-items: center;"
|
|
343
|
-
>
|
|
344
|
-
<temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
|
|
345
|
-
<span
|
|
346
|
-
style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
347
|
-
>${action.audio_url}</span
|
|
348
|
-
>
|
|
349
|
-
</div>`
|
|
350
|
-
: null}
|
|
351
|
-
</div>`;
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
export const renderPlayAudio = (node: Node, action: PlayAudio) => {
|
|
355
|
-
return html`<div style="display: flex; align-items: center;">
|
|
356
|
-
<temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
|
|
357
|
-
<span
|
|
358
|
-
style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
|
|
359
|
-
>${action.audio_url}</span
|
|
360
|
-
>
|
|
361
|
-
</div>`;
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
export const renderWaitForResponse = (node: Node, action: WaitForResponse) => {
|
|
365
|
-
return html`<div>
|
|
366
|
-
Wait for message response
|
|
367
|
-
${action.timeout
|
|
368
|
-
? html`<div style="margin-top: 0.25em">
|
|
369
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
370
|
-
</div>`
|
|
371
|
-
: null}
|
|
372
|
-
</div>`;
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
export const renderWaitForMenu = (node: Node, action: WaitForMenu) => {
|
|
376
|
-
return html`<div>
|
|
377
|
-
Wait for menu selection: <b>${action.menu.name}</b>
|
|
378
|
-
${action.timeout
|
|
379
|
-
? html`<div style="margin-top: 0.25em">
|
|
380
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
381
|
-
</div>`
|
|
382
|
-
: null}
|
|
383
|
-
</div>`;
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
export const renderWaitForDigits = (node: Node, action: WaitForDigits) => {
|
|
387
|
-
return html`<div>
|
|
388
|
-
Wait for <b>${action.count}</b> digit${action.count !== 1 ? 's' : ''}
|
|
389
|
-
${action.timeout
|
|
390
|
-
? html`<div style="margin-top: 0.25em">
|
|
391
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
392
|
-
</div>`
|
|
393
|
-
: null}
|
|
394
|
-
</div>`;
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
export const renderWaitForAudio = (node: Node, action: WaitForAudio) => {
|
|
398
|
-
return html`<div>
|
|
399
|
-
<temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
|
|
400
|
-
Wait for audio recording
|
|
401
|
-
${action.timeout
|
|
402
|
-
? html`<div style="margin-top: 0.25em">
|
|
403
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
404
|
-
</div>`
|
|
405
|
-
: null}
|
|
406
|
-
</div>`;
|
|
407
|
-
};
|
|
408
|
-
|
|
409
|
-
export const renderWaitForVideo = (node: Node, action: WaitForVideo) => {
|
|
410
|
-
return html`<div>
|
|
411
|
-
<temba-icon name="video" style="margin-right: 0.25em"></temba-icon>
|
|
412
|
-
Wait for video recording
|
|
413
|
-
${action.timeout
|
|
414
|
-
? html`<div style="margin-top: 0.25em">
|
|
415
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
416
|
-
</div>`
|
|
417
|
-
: null}
|
|
418
|
-
</div>`;
|
|
419
|
-
};
|
|
420
|
-
|
|
421
|
-
export const renderWaitForImage = (node: Node, action: WaitForImage) => {
|
|
422
|
-
return html`<div>
|
|
423
|
-
<temba-icon name="image" style="margin-right: 0.25em"></temba-icon>
|
|
424
|
-
Wait for image
|
|
425
|
-
${action.timeout
|
|
426
|
-
? html`<div style="margin-top: 0.25em">
|
|
427
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
428
|
-
</div>`
|
|
429
|
-
: null}
|
|
430
|
-
</div>`;
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
export const renderWaitForLocation = (node: Node, action: WaitForLocation) => {
|
|
434
|
-
return html`<div>
|
|
435
|
-
<temba-icon name="location" style="margin-right: 0.25em"></temba-icon>
|
|
436
|
-
Wait for location
|
|
437
|
-
${action.timeout
|
|
438
|
-
? html`<div style="margin-top: 0.25em">
|
|
439
|
-
Timeout after <b>${action.timeout}</b> seconds
|
|
440
|
-
</div>`
|
|
441
|
-
: null}
|
|
442
|
-
</div>`;
|
|
443
|
-
};
|