@nyaruka/temba-components 0.131.0 → 0.131.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/.github/workflows/publish.yml +4 -1
- package/CHANGELOG.md +67 -1
- package/demo/data/flows/food-order.json +2 -2
- package/demo/data/flows/sample-flow.json +74 -125
- package/dist/static/svg/index.svg +1 -1
- package/dist/temba-components.js +1156 -619
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/Icons.js +4 -1
- package/out-tsc/src/Icons.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasMenu.js +200 -0
- package/out-tsc/src/flow/CanvasMenu.js.map +1 -0
- package/out-tsc/src/flow/CanvasNode.js +327 -19
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +562 -66
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +240 -93
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/NodeTypeSelector.js +499 -0
- package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -0
- package/out-tsc/src/flow/actions/add_contact_groups.js +3 -3
- package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +62 -4
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +3 -3
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/play_audio.js +2 -2
- package/out-tsc/src/flow/actions/play_audio.js.map +1 -1
- package/out-tsc/src/flow/actions/remove_contact_groups.js +6 -5
- package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/request_optin.js +2 -2
- package/out-tsc/src/flow/actions/request_optin.js.map +1 -1
- package/out-tsc/src/flow/actions/say_msg.js +2 -2
- package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/send_broadcast.js +76 -23
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
- package/out-tsc/src/flow/actions/send_email.js +4 -5
- package/out-tsc/src/flow/actions/send_email.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +9 -19
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +5 -9
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +19 -20
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +2 -2
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +2 -12
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +2 -2
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +3 -3
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/actions/start_session.js +180 -6
- package/out-tsc/src/flow/actions/start_session.js.map +1 -1
- package/out-tsc/src/flow/config.js +11 -15
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/currencies.js +45 -0
- package/out-tsc/src/flow/currencies.js.map +1 -0
- package/out-tsc/src/flow/nodes/shared-rules.js +257 -0
- package/out-tsc/src/flow/nodes/shared-rules.js.map +1 -0
- package/out-tsc/src/flow/nodes/shared.js +17 -0
- package/out-tsc/src/flow/nodes/shared.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_airtime.js +205 -5
- package/out-tsc/src/flow/nodes/split_by_airtime.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_contact_field.js +147 -3
- package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_expression.js +68 -2
- package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_groups.js +12 -9
- package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_intent.js +7 -0
- package/out-tsc/src/flow/nodes/split_by_intent.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_llm.js +3 -2
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +2 -2
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_random.js +3 -3
- package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_resthook.js +108 -0
- package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_run_result.js +206 -3
- package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_scheme.js +153 -2
- package/out-tsc/src/flow/nodes/split_by_scheme.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_subflow.js +6 -4
- package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_ticket.js +3 -2
- package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_webhook.js +3 -2
- package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_audio.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_audio.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_digits.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_image.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_image.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_location.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_location.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_menu.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_menu.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +32 -567
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_video.js +2 -2
- package/out-tsc/src/flow/nodes/wait_for_video.js.map +1 -1
- package/out-tsc/src/flow/types.js +71 -12
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/flow/utils.js +101 -14
- package/out-tsc/src/flow/utils.js.map +1 -1
- package/out-tsc/src/form/ContactSearch.js +1 -1
- package/out-tsc/src/form/ContactSearch.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +2 -4
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/interfaces.js +3 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/list/SortableList.js +98 -33
- package/out-tsc/src/list/SortableList.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +15 -18
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/store/AppState.js +53 -0
- package/out-tsc/src/store/AppState.js.map +1 -1
- package/out-tsc/src/utils.js +254 -13
- package/out-tsc/src/utils.js.map +1 -1
- package/out-tsc/temba-modules.js +4 -0
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/ActionHelper.js +3 -3
- package/out-tsc/test/ActionHelper.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +6 -3
- package/out-tsc/test/NodeHelper.js.map +1 -1
- package/out-tsc/test/actions/add_contact_urn.test.js +202 -0
- package/out-tsc/test/actions/add_contact_urn.test.js.map +1 -0
- package/out-tsc/test/actions/send_broadcast.test.js +148 -0
- package/out-tsc/test/actions/send_broadcast.test.js.map +1 -0
- package/out-tsc/test/actions/send_email.test.js +17 -23
- package/out-tsc/test/actions/send_email.test.js.map +1 -1
- package/out-tsc/test/actions/send_msg.test.js +33 -15
- package/out-tsc/test/actions/send_msg.test.js.map +1 -1
- package/out-tsc/test/actions/start_session.test.js +116 -0
- package/out-tsc/test/actions/start_session.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_airtime.test.js +604 -0
- package/out-tsc/test/nodes/split_by_airtime.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_contact_field.test.js +387 -0
- package/out-tsc/test/nodes/split_by_contact_field.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_expression.test.js +614 -0
- package/out-tsc/test/nodes/split_by_expression.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_random.test.js +3 -3
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_resthook.test.js +337 -0
- package/out-tsc/test/nodes/split_by_resthook.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_run_result.test.js +920 -0
- package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_scheme.test.js +399 -0
- package/out-tsc/test/nodes/split_by_scheme.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_subflow.test.js +333 -0
- package/out-tsc/test/nodes/split_by_subflow.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js +2 -2
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_response.test.js +2 -1
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
- package/out-tsc/test/temba-action-drag-between-nodes.test.js +252 -0
- package/out-tsc/test/temba-action-drag-between-nodes.test.js.map +1 -0
- package/out-tsc/test/temba-canvas-menu.test.js +122 -0
- package/out-tsc/test/temba-canvas-menu.test.js.map +1 -0
- package/out-tsc/test/temba-flow-editor-node.test.js +85 -2
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor.test.js +7 -8
- package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +3 -1
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-node-type-selector.test.js +115 -0
- package/out-tsc/test/temba-node-type-selector.test.js.map +1 -0
- package/out-tsc/test/temba-omnibox.test.js +2 -1
- package/out-tsc/test/temba-omnibox.test.js.map +1 -1
- package/out-tsc/test/temba-sortable-list.test.js +51 -0
- package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
- package/out-tsc/test/temba-utils-index.test.js +1 -27
- package/out-tsc/test/temba-utils-index.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -0
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +2 -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/add_contact_urn/editor/expression-facebook.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/expression-phone.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/facebook-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/instagram-handle.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/line-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/phone-number.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/telegram-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/viber-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/wechat-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/editor/whatsapp.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-facebook.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-phone.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/facebook-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/instagram-handle.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/line-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/phone-number.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/telegram-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/viber-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/wechat-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/whatsapp.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_broadcast/editor/contacts-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/groups-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/multiline-text.png +0 -0
- package/screenshots/truth/actions/send_broadcast/editor/with-attachments.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/many-groups.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/multiline-text.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/with-attachments.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/actions/start_session/editor/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/editor/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/editor/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/editor/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/editor/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/editor/many-recipients.png +0 -0
- package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
- package/screenshots/truth/canvas-menu/open.png +0 -0
- package/screenshots/truth/editor/router.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/list/fields-dragging.png +0 -0
- package/screenshots/truth/list/sortable-dragging.png +0 -0
- package/screenshots/truth/node-type-selector/action-mode.png +0 -0
- package/screenshots/truth/node-type-selector/split-mode.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/src/Icons.ts +4 -1
- package/src/events.ts +2 -6
- package/src/flow/CanvasMenu.ts +217 -0
- package/src/flow/CanvasNode.ts +408 -10
- package/src/flow/Editor.ts +683 -44
- package/src/flow/NodeEditor.ts +304 -125
- package/src/flow/NodeTypeSelector.ts +592 -0
- package/src/flow/actions/add_contact_groups.ts +4 -4
- package/src/flow/actions/add_contact_urn.ts +76 -4
- package/src/flow/actions/add_input_labels.ts +4 -4
- package/src/flow/actions/play_audio.ts +2 -2
- package/src/flow/actions/remove_contact_groups.ts +14 -6
- package/src/flow/actions/request_optin.ts +2 -2
- package/src/flow/actions/say_msg.ts +2 -2
- package/src/flow/actions/send_broadcast.ts +85 -23
- package/src/flow/actions/send_email.ts +10 -6
- package/src/flow/actions/send_msg.ts +22 -32
- package/src/flow/actions/set_contact_channel.ts +5 -11
- package/src/flow/actions/set_contact_field.ts +20 -25
- package/src/flow/actions/set_contact_language.ts +9 -4
- package/src/flow/actions/set_contact_name.ts +3 -15
- package/src/flow/actions/set_contact_status.ts +3 -3
- package/src/flow/actions/set_run_result.ts +4 -4
- package/src/flow/actions/start_session.ts +208 -6
- package/src/flow/config.ts +13 -15
- package/src/flow/currencies.ts +51 -0
- package/src/flow/nodes/shared-rules.ts +301 -0
- package/src/flow/nodes/shared.ts +18 -0
- package/src/flow/nodes/split_by_airtime.ts +238 -5
- package/src/flow/nodes/split_by_contact_field.ts +185 -3
- package/src/flow/nodes/split_by_expression.ts +94 -2
- package/src/flow/nodes/split_by_groups.ts +15 -10
- package/src/flow/nodes/split_by_intent.ts +7 -0
- package/src/flow/nodes/split_by_llm.ts +4 -3
- package/src/flow/nodes/split_by_llm_categorize.ts +4 -4
- package/src/flow/nodes/split_by_random.ts +5 -5
- package/src/flow/nodes/split_by_resthook.ts +130 -0
- package/src/flow/nodes/split_by_run_result.ts +249 -3
- package/src/flow/nodes/split_by_scheme.ts +192 -2
- package/src/flow/nodes/split_by_subflow.ts +6 -4
- package/src/flow/nodes/split_by_ticket.ts +4 -3
- package/src/flow/nodes/split_by_webhook.ts +6 -5
- package/src/flow/nodes/wait_for_audio.ts +2 -2
- package/src/flow/nodes/wait_for_digits.ts +2 -2
- package/src/flow/nodes/wait_for_image.ts +2 -2
- package/src/flow/nodes/wait_for_location.ts +2 -2
- package/src/flow/nodes/wait_for_menu.ts +2 -2
- package/src/flow/nodes/wait_for_response.ts +48 -679
- package/src/flow/nodes/wait_for_video.ts +2 -2
- package/src/flow/types.ts +109 -23
- package/src/flow/utils.ts +108 -14
- package/src/form/ContactSearch.ts +1 -1
- package/src/form/FieldRenderer.ts +2 -4
- package/src/interfaces.ts +3 -0
- package/src/list/SortableList.ts +109 -34
- package/src/live/ContactChat.ts +15 -18
- package/src/store/AppState.ts +69 -0
- package/src/store/flow-definition.d.ts +2 -5
- package/src/utils.ts +332 -12
- package/static/api/channels.json +46 -0
- package/static/api/resthooks.json +31 -0
- package/static/svg/index.svg +1 -1
- package/static/svg/work/traced/lightning-02.svg +1 -0
- package/static/svg/work/used/lightning-02.svg +3 -0
- package/temba-modules.ts +4 -0
- package/test/ActionHelper.ts +3 -3
- package/test/NodeHelper.ts +6 -3
- package/test/actions/add_contact_urn.test.ts +287 -0
- package/test/actions/send_broadcast.test.ts +190 -0
- package/test/actions/send_email.test.ts +17 -23
- package/test/actions/send_msg.test.ts +39 -15
- package/test/actions/start_session.test.ts +151 -0
- package/test/nodes/split_by_airtime.test.ts +673 -0
- package/test/nodes/split_by_contact_field.test.ts +451 -0
- package/test/nodes/split_by_expression.test.ts +751 -0
- package/test/nodes/split_by_random.test.ts +3 -3
- package/test/nodes/split_by_resthook.test.ts +398 -0
- package/test/nodes/split_by_run_result.test.ts +1109 -0
- package/test/nodes/split_by_scheme.test.ts +486 -0
- package/test/nodes/split_by_subflow.test.ts +381 -0
- package/test/nodes/wait_for_digits.test.ts +2 -2
- package/test/nodes/wait_for_response.test.ts +2 -1
- package/test/temba-action-drag-between-nodes.test.ts +301 -0
- package/test/temba-canvas-menu.test.ts +156 -0
- package/test/temba-flow-editor-node.test.ts +102 -2
- package/test/temba-flow-editor.test.ts +7 -8
- package/test/temba-node-editor.test.ts +3 -1
- package/test/temba-node-type-selector.test.ts +152 -0
- package/test/temba-omnibox.test.ts +2 -1
- package/test/temba-sortable-list.test.ts +69 -0
- package/test/temba-utils-index.test.ts +0 -35
- package/test/utils.test.ts +2 -0
- package/test-assets/contacts/history.json +14 -20
- package/web-dev-server.config.mjs +3 -1
- package/out-tsc/src/flow/actions/call_classifier.js +0 -11
- package/out-tsc/src/flow/actions/call_classifier.js.map +0 -1
- package/out-tsc/src/flow/actions/call_resthook.js +0 -11
- package/out-tsc/src/flow/actions/call_resthook.js.map +0 -1
- package/out-tsc/src/flow/actions/split_by_expression_example.js +0 -77
- package/out-tsc/src/flow/actions/split_by_expression_example.js.map +0 -1
- package/out-tsc/src/flow/actions/transfer_airtime.js +0 -11
- package/out-tsc/src/flow/actions/transfer_airtime.js.map +0 -1
- package/src/flow/actions/call_classifier.ts +0 -12
- package/src/flow/actions/call_resthook.ts +0 -12
- package/src/flow/actions/split_by_expression_example.ts +0 -88
- package/src/flow/actions/transfer_airtime.ts +0 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeEditor.js","sourceRoot":"","sources":["../../../src/flow/NodeEditor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAkB,GAAG,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAGL,WAAW,EACX,aAAa,EAGd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,OAAO,UAAW,SAAQ,YAAY;IAA5C;;QAiRE,WAAM,GAAY,KAAK,CAAC;QAGhB,aAAQ,GAAQ,EAAE,CAAC;QAGnB,qBAAgB,GAAQ,EAAE,CAAC;QAG3B,WAAM,GAA8B,EAAE,CAAC;QAGvC,uBAAkB,GAA+B,EAAE,CAAC;QAGpD,oBAAe,GAA+B,EAAE,CAAC;IAkxC3D,CAAC;IAjjDC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkQT,CAAC;IACJ,CAAC;IA6BD,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,iBAAyD;QAC/D,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjC,IACE,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC/B,CAAC;YACD,8CAA8C;YAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,iDAAiD;iBAC5C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,uDAAuD;iBAClD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,kBAAkB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,IAAI,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1E,0CAA0C;YAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAErD,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,CAAC;YAED,+DAA+D;YAC/D,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAEjC,wEAAwE;YACxE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,sCAAsC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,CAAC;YAED,+DAA+D;YAC/D,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAEjC,wEAAwE;YACxE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9C,yDAAyD;gBACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,yBAAyB;QAC/B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEvC,mEAAmE;QACnE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,mDAAmD;gBACnD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAClD,IAAI,eAAe,EAAE,CAAC;oBACpB,iCAAiC;oBACjC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtD,GAAG,EAAE,CAAC;wBACN,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAEO,mBAAmB,CAAC,IAAS,EAAE,UAAe;QACpD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAChC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAgB,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAE9B,iCAAiC;YACjC,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;YAED,0CAA0C;YAC1C,IACE,WAAW,CAAC,IAAI,KAAK,OAAO;gBAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,WAAW,CAAC,UAAU,EACtB,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;oBAC1B,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAAC,KAAU;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,SAAiB;;QACvC,wDAAwD;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAC;QAC5B,OAAO,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,SAAS,CAAC,0CAAE,IAAI,MAAK,WAAW,CAAC;IACnD,CAAC;IAEO,SAAS;QACf,mEAAmE;QACnE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAExC,8EAA8E;YAC9E,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1D,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YACjD,CAAC;YAED,yDAAyD;YACzD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACjD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9B,6CAA6C;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,KAAI,SAAS,CAAC;IACpC,CAAC;IAEO,uBAAuB,CAAC,KAAkB;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAEnC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,oBAAoB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAEhC,mDAAmD;YACnD,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAE/C,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAExD,kEAAkE;QAClE,kFAAkF;QAClF,4DAA4D;QAC5D,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,qDAAqD;YACrD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAC3D,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,EAAE;gBAC9C,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,uCAAuC;YACvC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YAC/D,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,WAAW,EAAE;gBAChD,MAAM,EAAE,aAAa;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,mCAAmC;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAC3D,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,EAAE;gBAC9C,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEvC,sCAAsC;QACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,MAAM,GAAG,CAAC;gBAChB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC5B,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;gBACjB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EACnB,CAAC;gBACD,+CAA+C;gBAC/C,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;oBACrC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACvC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YAC1B,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,mDAAmD;gBACnD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAClD,IAAI,eAAe,EAAE,CAAC;oBACpB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAEO,YAAY;QAClB,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,IAAI,MAAM,EAAE,CAAC;YACX,uDAAuD;YACvD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;oBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBACvC,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;wBAC7D,oDAAoD;wBACpD,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBACxC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;4BAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;4BACxC,CAAC,CAAC,IAAI,CAAC;wBAET,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;4BACnC,MAAM,CAAC,SAAS,CAAC;gCACf,6BAA6B,GAAG,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;wBAC/D,CAAC;oBACH,CAAC;oBAED,wBAAwB;oBACxB,IACG,WAAmB,CAAC,QAAQ;wBAC7B,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EACxD,CAAC;wBACD,MAAM,CAAC,SAAS,CAAC,GAAG,GACjB,WAAmB,CAAC,KAAK,IAAI,SAChC,eAAe,CAAC;oBAClB,CAAC;oBAED,kCAAkC;oBAClC,IACE,OAAO,KAAK,KAAK,QAAQ;wBACxB,WAAmB,CAAC,SAAS;wBAC9B,KAAK,CAAC,MAAM,GAAI,WAAmB,CAAC,SAAS,EAC7C,CAAC;wBACD,MAAM,CAAC,SAAS,CAAC,GAAG,GACjB,WAAmB,CAAC,KAAK,IAAI,SAChC,qBAAsB,WAAmB,CAAC,SAAS,aAAa,CAAC;oBACnE,CAAC;oBAED,kCAAkC;oBAClC,IACE,OAAO,KAAK,KAAK,QAAQ;wBACxB,WAAmB,CAAC,SAAS;wBAC9B,KAAK,CAAC,MAAM,GAAI,WAAmB,CAAC,SAAS,EAC7C,CAAC;wBACD,MAAM,CAAC,SAAS,CAAC,GAAG,GACjB,WAAmB,CAAC,KAAK,IAAI,SAChC,yBACG,WAAmB,CAAC,SACvB,aAAa,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEnC,qCAAqC;YACrC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;gBAED,IAAI,gBAAgB,CAAC;gBACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;wBACjC,GAAG,IAAI,CAAC,MAAM;wBACd,GAAG,IAAI,CAAC,QAAQ;qBACjB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpD,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAExC,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACvC,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAAC,MAAiC;QAClE,4GAA4G;QAC5G,2EAA2E;QAC3E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;YAC3D,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,MAAM,GAAG,CAAC;gBAChB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC5B,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;gBACjB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EACnB,CAAC;gBACD,4BAA4B;gBAC5B,IAAI,mBAAmB,GAAG,KAAK,CAAC;gBAEhC,mCAAmC;gBACnC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAO,EAAE,EAAE;oBAC/C,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACjD,mBAAmB,GAAG,IAAI,CAAC;oBAC7B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,iDAAiD;gBACjD,MAAM,IAAI,GAAG,KAAK;qBACf,MAAM,CAAC,CAAC,EAAE,GAAG,EAAO,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,4BAA4B;qBACxE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAO,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAErC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;oBACpC,mBAAmB,GAAG,IAAI,CAAC;gBAC7B,CAAC;gBAED,IAAI,mBAAmB,EAAE,CAAC;oBACxB,MAAM,CAAC,SAAS,CAAC,GAAG,8CAA8C,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,MAAiC;QAC7D,gEAAgE;QAChE,kFAAkF;QAClF,oDAAoD;QACpD,MAAM,aAAa,GAAG;YACpB,OAAO;YACP,SAAS;YACT,SAAS;YACT,eAAe;YACf,aAAa;SACd,CAAC;QAEF,4CAA4C;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE;YAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAC7B,CAAC,IAAS,EAAE,EAAE,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,KAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CACrD,CAAC;gBAEF,2BAA2B;gBAC3B,MAAM,YAAY,GAAG,UAAU;qBAC5B,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;oBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACjD,OAAO,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC,CAAC;qBACD,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,yBAAyB;gBAElE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,CACJ,SAAS,CACV,GAAG,2CAA2C,YAAY,CAAC,IAAI,CAC9D,IAAI,CACL,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,WAAgB,IAAI,CAAC,QAAQ;;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACrD,IAAI,WAAW,GAAS,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEzC,kEAAkE;QAClE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACrD,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,YAAY,EAAE,CAAC;wBAC/B,+CAA+C;wBAC/C,OAAO,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBAC7C,CAAC;yBAAM,CAAC;wBACN,gEAAgE;wBAChE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;oBACpC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,+BAA+B;oBAC/B,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAExC,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,YAAY,EAAE,CAAC;gBAC7B,6CAA6C;gBAC7C,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,WAAW,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAE7C,iDAAiD;gBACjD,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACvC,WAAW,CAAC,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;gBACxD,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,KAAK,EAAE,CAAC;oBAC9B,wEAAwE;oBACxE,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;oBAC/D,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;oBAE9C,MAAM,aAAa,GAAU,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAU,EAAE,CAAC;oBAE3B,sFAAsF;oBACtF,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAGhC,CAAC;oBACJ,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACvC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;4BAChD,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;wBACjD,CAAC;wBACD,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzD,CAAC,CAAC,CAAC;oBAEH,kDAAkD;oBAClD,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;wBAClD,sEAAsE;wBACtE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,CAC9C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CACnC,CAAC;wBAEF,IAAI,gBAAgB,EAAE,CAAC;4BACrB,qDAAqD;4BACrD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;4BACrC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,CACnD,CAAC;4BACF,IAAI,cAAc,EAAE,CAAC;gCACnB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;4BAChC,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,+BAA+B;4BAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;4BACpC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;4BAEhC,aAAa,CAAC,IAAI,CAAC;gCACjB,IAAI,EAAE,YAAY;gCAClB,IAAI,EAAE,YAAY;gCAClB,SAAS,EAAE,QAAQ;6BACpB,CAAC,CAAC;4BAEH,QAAQ,CAAC,IAAI,CAAC;gCACZ,IAAI,EAAE,QAAQ;gCACd,gBAAgB,EAAE,IAAI;6BACvB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,oCAAoC;oBACpC,IAAI,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;wBACtC,2DAA2D;wBAC3D,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CACxC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,eAAe,CACxD,CAAC;wBAEF,IAAI,CAAC,eAAe,EAAE,CAAC;4BACrB,gDAAgD;4BAChD,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAC7C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,eAAe,CACxD,CAAC;4BAEF,IAAI,eAAe,EAAE,CAAC;gCACpB,kDAAkD;gCAClD,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gCACpC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,SAAS,CAClD,CAAC;gCACF,IAAI,cAAc,EAAE,CAAC;oCACnB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gCAChC,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,uCAAuC;gCACvC,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;gCACpC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;gCAEhC,aAAa,CAAC,IAAI,CAAC;oCACjB,IAAI,EAAE,YAAY;oCAClB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,eAAe;oCACvC,SAAS,EAAE,QAAQ;iCACpB,CAAC,CAAC;gCAEH,QAAQ,CAAC,IAAI,CAAC;oCACZ,IAAI,EAAE,QAAQ;oCACd,gBAAgB,EAAE,IAAI;iCACvB,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,2EAA2E;oBAC3E,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC;oBAC9C,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,IACE,GAAG,KAAK,MAAM;oBACd,GAAG,KAAK,SAAS;oBACjB,GAAG,KAAK,OAAO;oBACf,GAAG,KAAK,QAAQ,EAChB,CAAC;oBACA,WAAmB,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,WAAgB,IAAI,CAAC,QAAQ;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzD,gDAAgD;QAChD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,YAAY,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,YAAoB,EAAE,KAAY;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAa,CAAC;QACnC,IAAI,KAAU,CAAC;QAEf,0DAA0D;QAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACxC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;QACzB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;YAChB,CAAC,YAAY,CAAC,EAAE,KAAK;SACtB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAExC,6DAA6D;QAC7D,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjC,2DAA2D;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,yBAAyB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA;YAAE,OAAO;QAE5B,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAEO,kCAAkC,CAAC,KAAmB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;gBAE/C,sFAAsF;gBACtF,IAAI,WAAW,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;oBACnD,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAEnD,uEAAuE;oBACvE,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,iBAAiB,EAAE,CAAC;wBACzD,IAAI,CAAC,kBAAkB,GAAG;4BACxB,GAAG,IAAI,CAAC,kBAAkB;4BAC1B,CAAC,KAAK,CAAC,EAAE,iBAAiB;yBAC3B,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,iCAAiC;gBACjC,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3D,kCAAkC;gBAClC,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,gBAAwB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAA;YAAE,OAAO;QAE1B,6DAA6D;QAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;;YAC/D,IAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACtD,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;oBAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAE9C,MAAM,aAAa,GAAG,WAAW,CAAC,YAAY,CAC5C,IAAI,CAAC,QAAQ,EACb,YAAY,EACZ,IAAI,CAAC,gBAAgB,CACtB,CAAC;oBAEF,+CAA+C;oBAC/C,IAAI,CAAC,QAAQ,GAAG;wBACd,GAAG,IAAI,CAAC,QAAQ;wBAChB,CAAC,SAAS,CAAC,EAAE,aAAa;qBAC3B,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CACpB,SAAiB,EACjB,MAAmB,EACnB,KAAU;;QAEV,6BAA6B;QAC7B,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,IAAI,CAAA,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;gBACpE,iDAAiD;YACnD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtE,mDAAmD;QACnD,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ;YACpC,CAAC,CAAC,cAAc,MAAM,CAAC,QAAQ,GAAG;YAClC,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAC1C,SAAS,EACT,MAAM,EACN,KAAK,EACL,MAAM,CACP,CAAC;QAEF,wDAAwD;QACxD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA,eAAe,cAAc,KAAK,YAAY,QAAQ,CAAC;QACpE,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,kBAAkB,CACxB,SAAiB,EACjB,MAAmB,EACnB,KAAU,EACV,MAAgB;QAEhB,mDAAmD;QACnD,OAAO,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;YACzD,MAAM;YACN,QAAQ,EAAE,CAAC,CAAQ,EAAE,EAAE;gBACrB,sCAAsC;gBACtC,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC7C,wCAAwC;oBACxC,MAAM,WAAW,GAAG,CAAgB,CAAC;oBACrC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;wBACvB,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC;qBAAM,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAChD,oCAAoC;oBACpC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAG,CAAC,CAAC,MAAc,CAAC,KAAK,CAAC,CAAC;gBAChE,CAAC;qBAAM,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACzD,sCAAsC;oBACtC,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,wCAAwC;oBACxC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE;gBACd,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE;aAC7C;SACF,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,UAAkB;QAC1C,IAAI,CAAC,kBAAkB,GAAG;YACxB,GAAG,IAAI,CAAC,kBAAkB;YAC1B,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;SACnD,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC9C,IAAI,CAAC,eAAe,GAAG;YACrB,GAAG,IAAI,CAAC,eAAe;YACvB,CAAC,UAAU,CAAC,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC9C,IAAI,CAAC,eAAe,GAAG;YACrB,GAAG,IAAI,CAAC,eAAe;YACvB,CAAC,UAAU,CAAC,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,MAAiC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA;YAAE,OAAO;QAE5B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAEO,+BAA+B,CACrC,KAAmB,EACnB,WAAwB;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9D,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACtD,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAC3B,CAAC;gBAEF,IAAI,cAAc,EAAE,CAAC;oBACnB,oBAAoB;oBACpB,IAAI,CAAC,kBAAkB,GAAG;wBACxB,GAAG,IAAI,CAAC,kBAAkB;wBAC1B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK;qBACpB,CAAC;gBACJ,CAAC;gBAED,iCAAiC;gBACjC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3D,kCAAkC;gBAClC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CACtB,IAAgB,EAChB,MAAiC,EACjC,cAA2B;QAE3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,6BAA6B;YAC7B,OAAO,IAAI,CAAC,gBAAgB,CAC1B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAC9B,MAAM,EACN,cAAc,CACf,CAAC;QACJ,CAAC;QAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,IAAI,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC/B,OAAO,IAAI,CAAC,cAAc,CACxB,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC,KAAK,CAAgB,EACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAC1B,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,CAAA,EAAE,CAAC;YAEhB,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAEtD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAExD;gBACE,OAAO,IAAI,CAAA,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,SAAS,CACf,SAA0B,EAC1B,MAAiC,EACjC,cAA2B;QAE3B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QAE1C,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CACpC,CAAC,SAAS,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,IAAI,0CAAG,SAAS,CAAC,CAAA,EAAA,CACxC,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA,EAAE,CAAC;QAChB,CAAC;QAED,sEAAsE;QACtE,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAK,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO,WAAW,CAAC,QAAQ,IAAI,KAAK,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAA;;;uDAGwC,OAAO,CAAC,IAAI,CACzD,GAAG,CACJ,UAAU,GAAG;;UAEZ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CACpD;;KAEJ,CAAC;IACJ,CAAC;IAEO,WAAW,CACjB,WAA8B,EAC9B,MAAiC,EACjC,cAA2B;;QAE3B,MAAM,EACJ,KAAK,EACL,KAAK,EACL,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,kBAAkB,EACnB,GAAG,WAAW,CAAC;QAEhB,uCAAuC;QACvC,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvD,2DAA2D;YAC3D,MAAM,gBAAgB,GACpB,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEzE,IAAI,CAAC,kBAAkB,GAAG;gBACxB,GAAG,IAAI,CAAC,kBAAkB;gBAC1B,CAAC,KAAK,CAAC,EAAE,gBAAgB;aAC1B,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW;YAC7B,CAAC,CAAC,MAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,mCAC9B,CAAC,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,CAAC,CAAC,KAAK,CAAC;QAEV,8CAA8C;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CACvC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CACtC,CAAC;QAEF,qCAAqC;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,mCAAI,KAAK,CAAC;QAEvD,IAAI,kBAAkB,IAAI,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEjD,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,4CAA4C;oBAC5C,aAAa,GAAG,MAAM,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC;oBACpD,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;qBAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtC,qCAAqC;oBACrC,UAAU,GAAG,MAAM,CAAC;oBACpB,UAAU,GAAG,UAAU,GAAG,CAAC,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC;oBACzD,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,2CAA2C,KAAK,GAAG,EACnD,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;;4BAEa,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,cAAc;YACpE,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,IAAI,QAAQ;YAC1D,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE;;;qCAGuB,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;mBAChD,WAAW;YAClB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACrC,CAAC,CAAC,SAAS;wBACC,WAAW;YACvB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,SAAS;wBACC,WAAW;YACvB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,SAAS;;;4CAGqB,KAAK;cACnC,QAAQ;YACR,CAAC,CAAC,IAAI,CAAA;oBACA,oBAAoB,CAAC,QAAQ,CAAC;uBAC3B;YACT,CAAC,CAAC,EAAE;;YAEN,cAAc;YACd,CAAC,CAAC,IAAI,CAAA;;;;6BAIW;YACjB,CAAC,CAAC,EAAE;YACJ,WAAW,IAAI,CAAC,cAAc;YAC9B,CAAC,CAAC,IAAI,CAAA;;;;6CAI2B,WAAW;gBACpC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,UAAU,IAAI,UAAU,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;;kBAE5D,aAAa;gBACb,CAAC,CAAC,IAAI,CAAA;;;;mCAIW;gBACjB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,IAAI,CAAA;kDAC0B,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;wBAErD,UAAU;2BACP;oBACT,CAAC,CAAC,EAAE;qBACD;YACT,CAAC,CAAC,EAAE;;;sCAGsB,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;;YAEhE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CACpD;;;KAGN,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,KAAmB;QAChD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,cAAc,CACpB,SAA0B,EAC1B,MAAiC;QAEjC,oDAAoD;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,gBAAgB,CACtB,WAA8B,EAC9B,MAAiC;QAEjC,sDAAsD;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEO,oBAAoB,CAAC,SAAiB,EAAE,KAAU;QACxD,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;YAChB,CAAC,SAAS,CAAC,EAAE,KAAK;SACnB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjC,oBAAoB;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IACO,yBAAyB,CAAC,SAAiB,EAAE,KAAY;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAa,CAAC;QAEnC,2DAA2D;QAC3D,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;YAChB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;SACtC,CAAC;QAEF,4CAA4C;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,SAAS,CAAC,WAAW,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAA,yCAAyC,CAAC;QACvD,CAAC;QAED,0CAA0C;QAC1C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,iCAAiC;YACjC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;gBAEzC,uEAAuE;gBACvE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;gBACvC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACpE,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBAED,OAAO,IAAI,CAAA;YACP,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CACpD;YACC;gBACA,iEAAiE;gBACjE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;oBAC3D,IACE,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC9B,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAC5B,CAAC;wBACD,OAAO,IAAI,CAAC,cAAc,CACxB,SAAS,EACT,WAA0B,EAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CACzB,CAAC;oBACJ,CAAC;oBACD,OAAO,IAAI,CAAA,EAAE,CAAC;gBAChB,CAAC,CACH;SACD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,OAAO,IAAI,CAAA;YACP,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,CAC7D,IAAI,CAAC,cAAc,CACjB,SAAS,EACT,WAA0B,EAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CACzB,CACF;SACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA,8DAA8D,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA,4DAA4D,CAAC;QAC1E,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAA,EAAE,CAAC;QAChB,CAAC;QAED,yDAAyD;QACzD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QAEzC,OAAO,IAAI,CAAA;;UAEL,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CACpD;;KAEJ,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAA,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,sDAAsD;QACtD,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;YAEpE,OAAO,IAAI,CAAA;;;;wCAIuB,MAAM,CAAC,IAAI;;;;OAI5C,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAA,EAAE,CAAC;IAChB,CAAC;IAEO,mBAAmB;;QACzB,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAA,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,OAAO,IAAI,CAAA;;;UAGL,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM;YAClB,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC3B,CAAC,CAAC,IAAI,CAAA,iDAAiD;;KAE5D,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA;YAAE,OAAO,IAAI,CAAA,EAAE,CAAC;QAEvC,mDAAmD;QACnD,uDAAuD;QACvD,OAAO,IAAI,CAAA;;oCAEqB,UAAU,CAAC,MAAM,CAAC,IAAI;UAChD,UAAU,CAAC,MAAM,CAAC,KAAK;YACvB,CAAC,CAAC,IAAI,CAAA;;;;;;aAMH;YACH,CAAC,CAAC,EAAE;;KAET,CAAC;IACJ,CAAC;IAED,MAAM;;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,QAAQ,CAAC,CAAC,sCAAsC;QAEzF,OAAO,IAAI,CAAA;;kBAEG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM;iBACvB,IAAI,CAAC,MAAM;gCACI,IAAI,CAAC,uBAAuB;;;8BAG9B,WAAW;gBACzB,UAAU;;;YAGd,IAAI,CAAC,YAAY,EAAE;YACnB,CAAA,MAAA,MAAA,IAAI,CAAC,aAAa,EAAE,0CAAE,MAAM,0CAAE,YAAY;YAC1C,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC5B,CAAC,CAAC,IAAI;;;6BAGW,IAAI,CAAC,YAAY,EAAE;;KAE3C,CAAC;IACJ,CAAC;CACF;AA1yCC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CACX;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACf;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CACX;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0CACJ;AAGhB;IADP,KAAK,EAAE;4CACmB;AAGnB;IADP,KAAK,EAAE;oDAC2B;AAG3B;IADP,KAAK,EAAE;0CACuC;AAGvC;IADP,KAAK,EAAE;sDACoD;AAGpD;IADP,KAAK,EAAE;mDACiD","sourcesContent":["import { html, TemplateResult, css } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { Node, NodeUI, Action } from '../store/flow-definition';\nimport {\n ValidationResult,\n NodeConfig,\n NODE_CONFIG,\n ACTION_CONFIG,\n FieldConfig,\n ActionConfig\n} from './config';\nimport { LayoutItem, RowLayoutConfig, GroupLayoutConfig } from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\nimport { FieldRenderer } from '../form/FieldRenderer';\nimport { renderMarkdownInline } from '../markdown';\n\nexport class NodeEditor extends RapidElement {\n static get styles() {\n return css`\n .node-editor-form {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n min-width: 400px;\n padding-bottom: 40px;\n\n --color-bubble-bg: rgba(var(--primary-rgb), 0.7);\n --color-bubble-border: rgba(0, 0, 0, 0.2);\n --color-bubble-text: #fff;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .form-field label {\n }\n\n .field-errors {\n color: var(--color-error, tomato);\n font-size: 12px;\n margin-left: 5px;\n margin-top: 15px;\n }\n\n .form-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n\n .action-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .action-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .router-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .router-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .form-row {\n display: grid;\n gap: 1rem;\n align-items: center;\n }\n\n .form-group {\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .form-group.has-errors {\n border-color: var(--color-error, tomato);\n }\n\n .form-group.has-bubble {\n border-width: 2px;\n border-color: rgba(var(--primary-rgb), 0.5);\n }\n\n .form-group-header {\n background: #f8f9fa;\n padding: 8px 10px;\n border-bottom: 1px solid #e0e0e0;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n }\n\n .form-group.has-bubble .form-group-header {\n background: rgba(var(--primary-rgb), 0.1);\n }\n\n .collapsed .form-group-header {\n border: none;\n }\n\n .form-group-header:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .form-group-header.collapsible:hover {\n background: #f1f3f4;\n }\n\n .form-group-info {\n flex: 1;\n }\n\n .form-group-title {\n font-weight: 500;\n color: var(--color-label, #777);\n font-size: 14px;\n display: flex;\n }\n\n .form-group-help {\n font-size: 12px;\n color: #666;\n margin-top: 2px;\n }\n\n .form-group-toggle {\n color: #666;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n }\n\n .form-group-toggle.collapsed {\n transform: rotate(-90deg);\n }\n\n .form-group-content {\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: hidden;\n transition: all 0.2s ease-in-out;\n\n opacity: 1;\n }\n\n .form-group-content.collapsed {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n\n .group-toggle-icon {\n color: #666;\n transition: transform 0.3s ease, opacity 0.3s ease;\n cursor: pointer;\n transform: rotate(0deg);\n opacity: 1;\n }\n\n .group-toggle-icon.faded {\n opacity: 0;\n }\n\n .group-toggle-icon.expanded {\n transform: rotate(90deg);\n }\n\n .group-toggle-icon.collapsed {\n transform: rotate(0deg);\n }\n\n .group-toggle-icon:hover {\n color: #333;\n }\n\n .group-error-icon {\n color: var(--color-error, tomato);\n margin-right: 8px;\n }\n\n .group-count-bubble {\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 600;\n padding: 4px;\n min-width: 12px;\n min-height: 12px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n line-height: 0px;\n opacity: 1;\n transition: opacity 0.3s ease;\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n color: var(--color-bubble-text, #000);\n }\n\n .group-count-bubble.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-checkmark-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 1;\n transition: opacity 0.3s ease;\n border-radius: 50%;\n color: var(--color-bubble-text, #000);\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n padding: 0.2em;\n }\n\n .group-checkmark-icon.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-toggle-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .gutter-fields {\n display: flex;\n flex-direction: column;\n gap: 10px;\n align-items: flex-start;\n }\n\n .gutter-fields .form-row {\n margin: 0;\n }\n\n .gutter-fields temba-checkbox {\n align-self: flex-start;\n }\n\n .gutter-fields temba-select {\n min-width: 120px;\n }\n `;\n }\n\n @property({ type: Object })\n action?: Action;\n\n @property({ type: Object })\n node?: Node;\n\n @property({ type: Object })\n nodeUI?: NodeUI;\n\n @property({ type: Boolean })\n isOpen: boolean = false;\n\n @state()\n private formData: any = {};\n\n @state()\n private originalFormData: any = {};\n\n @state()\n private errors: { [key: string]: string } = {};\n\n @state()\n private groupCollapseState: { [key: string]: boolean } = {};\n\n @state()\n private groupHoverState: { [key: string]: boolean } = {};\n\n connectedCallback(): void {\n super.connectedCallback();\n this.initializeFormData();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n if (\n changedProperties.has('node') ||\n changedProperties.has('action') ||\n changedProperties.has('nodeUI')\n ) {\n // For action editing, we only need the action\n if (this.action && (!this.node || !this.nodeUI)) {\n this.openDialog();\n }\n // For node editing, we need both node and nodeUI\n else if (this.node && this.nodeUI) {\n this.openDialog();\n }\n // If we don't have the required data, close the dialog\n else if (!this.action && (!this.node || !this.nodeUI)) {\n this.isOpen = false;\n }\n }\n }\n\n private openDialog(): void {\n this.initializeFormData();\n this.errors = {};\n this.isOpen = true;\n }\n\n private initializeFormData(): void {\n const nodeConfig = this.getNodeConfig();\n\n if ((!nodeConfig || nodeConfig.type === 'execute_actions') && this.action) {\n // Action editing mode - use action config\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n if (actionConfig?.toFormData) {\n this.formData = actionConfig.toFormData(this.action);\n } else {\n this.formData = { ...this.action };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n } else if (this.node) {\n // Node editing mode - use node config\n const nodeConfig = this.getNodeConfig();\n if (nodeConfig?.toFormData) {\n this.formData = nodeConfig.toFormData(this.node);\n } else {\n this.formData = { ...this.node };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n }\n\n // enforce immutability of formData\n Object.keys(this.formData).forEach((key) => {\n const value = this.formData[key];\n if (Array.isArray(value)) {\n this.formData[key] = [...value];\n } else if (value && typeof value === 'object') {\n // If it's an object, ensure we don't mutate the original\n this.formData[key] = { ...value };\n }\n });\n }\n\n private processFormDataForEditing(): void {\n const processed = { ...this.formData };\n\n // Convert Record objects to key-value arrays for key-value editors\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Check if this field should be a key-value editor\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n // Convert Record to array format\n processed[key] = Object.entries(value).map(([k, v]) => ({\n key: k,\n value: v\n }));\n }\n }\n });\n\n // Convert select fields to array format\n const config = this.getConfig();\n if (config?.form) {\n this.processSelectFields(processed, config.form);\n }\n\n this.formData = processed;\n }\n\n private processSelectFields(data: any, formConfig: any): void {\n Object.entries(formConfig).forEach(\n ([fieldName, fieldConfig]: [string, any]) => {\n const value = data[fieldName];\n\n // Handle top-level select fields\n if (fieldConfig.type === 'select' && value) {\n data[fieldName] = this.convertToSelectArray(value);\n }\n\n // Handle select fields within array items\n if (\n fieldConfig.type === 'array' &&\n Array.isArray(value) &&\n fieldConfig.itemConfig\n ) {\n value.forEach((item: any) => {\n this.processSelectFields(item, fieldConfig.itemConfig);\n });\n }\n }\n );\n }\n\n private convertToSelectArray(value: any): any[] {\n if (Array.isArray(value)) {\n return value.map((v) =>\n typeof v === 'string' ? { name: v, value: v } : v\n );\n } else if (typeof value === 'string') {\n return [{ name: value, value: value }];\n } else {\n return [value];\n }\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n const config = this.getConfig();\n const fields = config?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n\n private getConfig(): ActionConfig | NodeConfig | null {\n // If we have a node and nodeUI, check if we should use node config\n if (this.node && this.nodeUI) {\n const nodeConfig = this.getNodeConfig();\n\n // For execute_actions nodes, defer to action editing if an action is selected\n if (this.nodeUI.type === 'execute_actions' && this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n // For all other nodes with a config, use the node config\n if (nodeConfig) {\n return nodeConfig;\n }\n }\n\n // Fall back to action config if no node config or for pure action editing\n if (this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n return null;\n }\n\n private getNodeConfig(): NodeConfig | null {\n if (!this.nodeUI) return null;\n // Get node config based on the nodeUI's type\n return this.nodeUI.type ? NODE_CONFIG[this.nodeUI.type] : null;\n }\n\n private getHeaderColor(): string {\n const config = this.getConfig();\n return config?.color || '#666666';\n }\n\n private handleDialogButtonClick(event: CustomEvent): void {\n const button = event.detail.button;\n\n if (button.name === 'Save') {\n this.handleSave();\n } else if (button.name === 'Cancel') {\n this.handleCancel();\n }\n }\n\n private handleSave(): void {\n // Validate the form\n const validation = this.validateForm();\n if (!validation.valid) {\n this.errors = validation.errors;\n\n // Expand any groups that contain validation errors\n this.expandGroupsWithErrors(validation.errors);\n\n return;\n }\n\n // Process form data to convert key-value arrays to Records before saving\n const processedFormData = this.processFormDataForSave();\n\n // Determine whether to use node or action saving based on context\n // If we have a node with a router, always use node saving (even if action is set)\n // because router configuration is handled at the node level\n if (this.node && this.node.router) {\n // Node editing mode with router - use formDataToNode\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n } else if (this.action) {\n // Pure action editing mode (no router)\n const updatedAction = this.formDataToAction(processedFormData);\n this.fireCustomEvent(CustomEventType.ActionSaved, {\n action: updatedAction\n });\n } else if (this.node) {\n // Node editing mode without router\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n }\n }\n\n private processFormDataForSave(): any {\n const processed = { ...this.formData };\n\n // Convert key-value arrays to Records\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array, convert to Record\n const record: Record<string, string> = {};\n value.forEach(({ key: k, value: v }) => {\n if (k.trim() !== '' || v.trim() !== '') {\n record[k] = v;\n }\n });\n processed[key] = record;\n } else if (Array.isArray(value) && value.length === 0) {\n // Empty key-value array should become empty object\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n processed[key] = {};\n }\n }\n });\n\n return processed;\n }\n\n private handleCancel(): void {\n this.fireCustomEvent(CustomEventType.NodeEditCancelled, {});\n }\n\n private validateForm(): ValidationResult {\n const errors: { [key: string]: string } = {};\n const config = this.getConfig();\n\n if (config) {\n // Check if new field configuration system is available\n if (config.form) {\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n if (fieldConfig.type === 'select' && fieldConfig.allowCreate) {\n // check our values to see if any have arbitrary set\n let selected = this.formData[fieldName];\n selected = Array.isArray(selected)\n ? selected.find((v: any) => v.arbitrary)\n : null;\n\n if (selected && selected.arbitrary) {\n errors[fieldName] =\n 'There was an error creating' + ' \"' + selected.name + '\"';\n }\n }\n\n // Check required fields\n if (\n (fieldConfig as any).required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } is required.`;\n }\n\n // Check minLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).minLength &&\n value.length < (fieldConfig as any).minLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be at least ${(fieldConfig as any).minLength} characters`;\n }\n\n // Check maxLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).maxLength &&\n value.length > (fieldConfig as any).maxLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be no more than ${\n (fieldConfig as any).maxLength\n } characters`;\n }\n });\n }\n\n // Universal validation for category arrays to check for reserved names\n this.validateCategoryNames(errors);\n\n // Run custom validation if available\n if (config.validate) {\n if (config.sanitize) {\n config.sanitize(this.formData);\n }\n\n let customValidation;\n if (this.action) {\n customValidation = config.validate({\n ...this.action,\n ...this.formData\n });\n } else {\n customValidation = config.validate(this.formData);\n }\n Object.assign(errors, customValidation.errors);\n }\n }\n\n // Validate key-value fields for unique keys\n this.validateKeyValueUniqueness(errors);\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n }\n\n private validateKeyValueUniqueness(errors: { [key: string]: string }): void {\n // The individual key-value editors will show validation errors on duplicate keys and empty keys with values\n // We just need to prevent form submission when there are validation issues\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array\n let hasValidationErrors = false;\n\n // Check for empty keys with values\n value.forEach(({ key, value: itemValue }: any) => {\n if (key.trim() === '' && itemValue.trim() !== '') {\n hasValidationErrors = true;\n }\n });\n\n // Check for duplicate keys (only non-empty ones)\n const keys = value\n .filter(({ key }: any) => key.trim() !== '') // Only check non-empty keys\n .map(({ key }: any) => key.trim());\n\n const uniqueKeys = new Set(keys);\n\n if (keys.length !== uniqueKeys.size) {\n hasValidationErrors = true;\n }\n\n if (hasValidationErrors) {\n errors[fieldName] = `Please resolve validation errors to continue`;\n }\n }\n });\n }\n\n private validateCategoryNames(errors: { [key: string]: string }): void {\n // Universal validation for category names across all node types\n // Prevents use of reserved category names that have special meaning in the system\n // Define reserved category names (case-insensitive)\n const reservedNames = [\n 'other',\n 'failure',\n 'success',\n 'all responses',\n 'no response'\n ];\n\n // Check all form fields for category arrays\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (Array.isArray(value) && fieldName === 'categories') {\n const categories = value.filter(\n (item: any) => item?.name && item.name.trim() !== ''\n );\n\n // Check for reserved names\n const reservedUsed = categories\n .filter((item: any) => {\n const lowerName = item.name.trim().toLowerCase();\n return reservedNames.includes(lowerName);\n })\n .map((item: any) => item.name.trim()); // Preserve original case\n\n if (reservedUsed.length > 0) {\n errors[\n fieldName\n ] = `Reserved category names cannot be used: ${reservedUsed.join(\n ', '\n )}`;\n }\n }\n });\n }\n\n private formDataToNode(formData: any = this.formData): Node {\n if (!this.node) throw new Error('No node to update');\n let updatedNode: Node = { ...this.node };\n\n // Handle actions using action config transformations if available\n if (this.node.actions && this.node.actions.length > 0) {\n updatedNode.actions = this.node.actions.map((action) => {\n // If we're editing a specific action, only transform that one\n if (this.action && action.uuid === this.action.uuid) {\n const actionConfig = ACTION_CONFIG[action.type];\n if (actionConfig?.fromFormData) {\n // Use action-specific form data transformation\n return actionConfig.fromFormData(formData);\n } else {\n // Default transformation - merge form data with original action\n return { ...action, ...formData };\n }\n } else {\n // Keep other actions unchanged\n return action;\n }\n });\n }\n\n // Handle router configuration using node config\n if (this.node.router) {\n const nodeConfig = this.getNodeConfig();\n\n if (nodeConfig?.fromFormData) {\n // Use node-specific form data transformation\n updatedNode = nodeConfig.fromFormData(formData, updatedNode);\n } else {\n // Default router handling\n updatedNode.router = { ...this.node.router };\n\n // Apply form data to router fields if they exist\n if (formData.result_name !== undefined) {\n updatedNode.router.result_name = formData.result_name;\n }\n\n // Handle preconfigured rules from node config\n if (nodeConfig?.router?.rules) {\n // Build a complete new set of categories and exits based on node config\n const existingCategories = updatedNode.router.categories || [];\n const existingExits = updatedNode.exits || [];\n\n const newCategories: any[] = [];\n const newExits: any[] = [];\n\n // Group rules by category name to handle multiple rules pointing to the same category\n const categoryNameToRules = new Map<\n string,\n typeof nodeConfig.router.rules\n >();\n nodeConfig.router.rules.forEach((rule) => {\n if (!categoryNameToRules.has(rule.categoryName)) {\n categoryNameToRules.set(rule.categoryName, []);\n }\n categoryNameToRules.get(rule.categoryName)!.push(rule);\n });\n\n // Create categories for all unique category names\n categoryNameToRules.forEach((rules, categoryName) => {\n // Check if category already exists to preserve its UUID and exit_uuid\n const existingCategory = existingCategories.find(\n (cat) => cat.name === categoryName\n );\n\n if (existingCategory) {\n // Preserve existing category and its associated exit\n newCategories.push(existingCategory);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === existingCategory.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: categoryName,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n });\n\n // Add default category if specified\n if (nodeConfig.router.defaultCategory) {\n // Check if default category already exists in our new list\n const existingDefault = newCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (!existingDefault) {\n // Check if it exists in the original categories\n const originalDefault = existingCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (originalDefault) {\n // Preserve existing default category and its exit\n newCategories.push(originalDefault);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === originalDefault.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new default category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: nodeConfig.router.defaultCategory,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n }\n }\n\n // Replace the entire categories and exits lists with our complete new sets\n updatedNode.router.categories = newCategories;\n updatedNode.exits = newExits;\n }\n }\n } else {\n // If no router, just apply form data to node properties\n Object.keys(formData).forEach((key) => {\n if (\n key !== 'uuid' &&\n key !== 'actions' &&\n key !== 'exits' &&\n key !== 'router'\n ) {\n (updatedNode as any)[key] = formData[key];\n }\n });\n }\n\n return updatedNode;\n }\n\n private formDataToAction(formData: any = this.formData): Action {\n if (!this.action) throw new Error('No action to update');\n\n // Use action config transformation if available\n const actionConfig = ACTION_CONFIG[this.action.type];\n if (actionConfig?.fromFormData) {\n return actionConfig.fromFormData(formData);\n } else {\n // Default 1:1 mapping\n return { ...this.action, ...formData };\n }\n }\n\n private handleFormFieldChange(propertyName: string, event: Event): void {\n const target = event.target as any;\n let value: any;\n\n // Handle different component types like ActionEditor does\n if (target.tagName === 'TEMBA-CHECKBOX') {\n value = target.checked;\n } else if (target.values !== undefined) {\n value = target.values;\n } else {\n value = target.value;\n }\n\n this.formData = {\n ...this.formData,\n [propertyName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[propertyName]) {\n const newErrors = { ...this.errors };\n delete newErrors[propertyName];\n this.errors = newErrors;\n }\n\n // Check for computed values in dependent fields\n this.updateComputedFields(propertyName);\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render to handle conditional field visibility\n this.requestUpdate();\n }\n\n private updateGroupCollapseStates(): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n this.updateGroupCollapseStatesRecursive(config.layout);\n }\n\n private updateGroupCollapseStatesRecursive(items: LayoutItem[]): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const { label, collapsed, collapsible } = item;\n\n // Only update if the group is collapsible and has a function-based collapsed property\n if (collapsible && typeof collapsed === 'function') {\n const newCollapsedState = collapsed(this.formData);\n\n // Only update if the state has changed to avoid unnecessary re-renders\n if (this.groupCollapseState[label] !== newCollapsedState) {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: newCollapsedState\n };\n }\n }\n\n // Recursively check nested items\n this.updateGroupCollapseStatesRecursive(item.items);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.updateGroupCollapseStatesRecursive(item.items);\n }\n });\n }\n\n private updateComputedFields(changedFieldName: string): void {\n const config = this.getConfig();\n if (!config?.form) return;\n\n // Check all fields to see if any depend on the changed field\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n if (fieldConfig.dependsOn?.includes(changedFieldName)) {\n if (fieldConfig.computeValue) {\n const currentValue = this.formData[fieldName];\n\n const computedValue = fieldConfig.computeValue(\n this.formData,\n currentValue,\n this.originalFormData\n );\n\n // Update the form data with the computed value\n this.formData = {\n ...this.formData,\n [fieldName]: computedValue\n };\n }\n }\n });\n }\n\n private renderNewField(\n fieldName: string,\n config: FieldConfig,\n value: any\n ): TemplateResult {\n // Check visibility condition\n if (config.conditions?.visible) {\n try {\n const isVisible = config.conditions.visible(this.formData);\n if (!isVisible) {\n return html``;\n }\n } catch (error) {\n console.error(`Error checking visibility for ${fieldName}:`, error);\n // If there's an error, show the field by default\n }\n }\n\n const errors = this.errors[fieldName] ? [this.errors[fieldName]] : [];\n\n // Build container style with maxWidth if specified\n const containerStyle = config.maxWidth\n ? `max-width: ${config.maxWidth};`\n : '';\n\n const fieldContent = this.renderFieldContent(\n fieldName,\n config,\n value,\n errors\n );\n\n // Wrap in container with style if maxWidth is specified\n if (containerStyle) {\n return html`<div style=\"${containerStyle}\">${fieldContent}</div>`;\n }\n\n return fieldContent;\n }\n\n private renderFieldContent(\n fieldName: string,\n config: FieldConfig,\n value: any,\n errors: string[]\n ): TemplateResult {\n // Use FieldRenderer for consistent field rendering\n return FieldRenderer.renderField(fieldName, config, value, {\n errors,\n onChange: (e: Event) => {\n // Handle different change event types\n if (fieldName && config.type === 'key-value') {\n // Special handling for key-value editor\n const customEvent = e as CustomEvent;\n if (customEvent.detail) {\n this.handleNewFieldChange(fieldName, customEvent.detail.value);\n }\n } else if (fieldName && config.type === 'array') {\n // Special handling for array editor\n this.handleNewFieldChange(fieldName, (e.target as any).value);\n } else if (fieldName && config.type === 'message-editor') {\n // Special handling for message editor\n this.handleMessageEditorChange(fieldName, e);\n } else {\n // Default handling for most field types\n this.handleFormFieldChange(fieldName, e);\n }\n },\n showLabel: true,\n formData: this.formData,\n additionalData: {\n attachments: this.formData.attachments || []\n }\n });\n }\n\n private handleGroupToggle(groupLabel: string): void {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [groupLabel]: !this.groupCollapseState[groupLabel]\n };\n }\n\n private handleGroupMouseEnter(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: true\n };\n }\n\n private handleGroupMouseLeave(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: false\n };\n }\n\n private expandGroupsWithErrors(errors: { [key: string]: string }): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n const errorFields = new Set(Object.keys(errors));\n this.expandGroupsWithErrorsRecursive(config.layout, errorFields);\n }\n\n private expandGroupsWithErrorsRecursive(\n items: LayoutItem[],\n errorFields: Set<string>\n ): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const fieldsInGroup = this.collectFieldsFromItems(item.items);\n const groupHasErrors = fieldsInGroup.some((fieldName) =>\n errorFields.has(fieldName)\n );\n\n if (groupHasErrors) {\n // Expand this group\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [item.label]: false\n };\n }\n\n // Recursively check nested items\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n }\n });\n }\n\n private renderLayoutItem(\n item: LayoutItem,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n if (typeof item === 'string') {\n // String shorthand for field\n return this.renderLayoutItem(\n { type: 'field', field: item },\n config,\n renderedFields\n );\n }\n\n switch (item.type) {\n case 'field':\n if (config.form![item.field] && !renderedFields.has(item.field)) {\n renderedFields.add(item.field);\n return this.renderNewField(\n item.field,\n config.form![item.field] as FieldConfig,\n this.formData[item.field]\n );\n }\n return html``;\n\n case 'row':\n return this.renderRow(item, config, renderedFields);\n\n case 'group':\n return this.renderGroup(item, config, renderedFields);\n\n default:\n return html``;\n }\n }\n\n private renderRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const { items, gap = '1rem' } = rowConfig;\n\n // Collect all fields from this row for width calculations\n const fieldsInRow = this.collectFieldsFromItems(items);\n const validFields = fieldsInRow.filter(\n (fieldName) => config.form?.[fieldName]\n );\n\n if (validFields.length === 0) {\n return html``;\n }\n\n // Calculate grid template columns based on field maxWidth constraints\n const columns = validFields.map((fieldName) => {\n const fieldConfig = config.form![fieldName];\n return fieldConfig.maxWidth || '1fr';\n });\n\n return html`\n <div\n class=\"form-row\"\n style=\"display: grid; grid-template-columns: ${columns.join(\n ' '\n )}; gap: ${gap};\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const {\n label,\n items,\n collapsible = false,\n collapsed = false,\n helpText,\n getGroupValueCount\n } = groupConfig;\n\n // Initialize collapse state if not set\n if (collapsible && !(label in this.groupCollapseState)) {\n // Evaluate collapsed property - can be boolean or function\n const initialCollapsed =\n typeof collapsed === 'function' ? collapsed(this.formData) : collapsed;\n\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: initialCollapsed\n };\n }\n\n const isCollapsed = collapsible\n ? this.groupCollapseState[label] ??\n (typeof collapsed === 'function' ? collapsed(this.formData) : collapsed)\n : false;\n\n // Check if any field in this group has errors\n const fieldsInGroup = this.collectFieldsFromItems(items);\n const groupHasErrors = fieldsInGroup.some(\n (fieldName) => this.errors[fieldName]\n );\n\n // Calculate count for bubble display\n let valueCount = 0;\n let showBubble = false;\n let showCheckmark = false;\n let hasValue = false;\n const isHovered = this.groupHoverState[label] ?? false;\n\n if (getGroupValueCount && collapsible) {\n try {\n const result = getGroupValueCount(this.formData);\n\n if (typeof result === 'boolean') {\n // Boolean result - show checkmark when true\n showCheckmark = result && isCollapsed && !isHovered;\n hasValue = result;\n } else if (typeof result === 'number') {\n // Numeric result - show count bubble\n valueCount = result;\n showBubble = valueCount > 0 && isCollapsed && !isHovered;\n hasValue = valueCount > 0;\n }\n } catch (error) {\n console.error(\n `Error calculating group value count for ${label}:`,\n error\n );\n }\n }\n\n return html`\n <div\n class=\"form-group ${collapsible ? 'collapsible' : ''} ${groupHasErrors\n ? 'has-errors'\n : ''} ${isCollapsed ? 'collapsed' : 'expanded'} ${hasValue\n ? 'has-bubble'\n : ''}\"\n >\n <div\n class=\"form-group-header ${collapsible ? 'clickable' : ''}\"\n @click=${collapsible\n ? () => this.handleGroupToggle(label)\n : undefined}\n @mouseenter=${collapsible\n ? () => this.handleGroupMouseEnter(label)\n : undefined}\n @mouseleave=${collapsible\n ? () => this.handleGroupMouseLeave(label)\n : undefined}\n >\n <div class=\"form-group-info\">\n <div class=\"form-group-title\">${label}</div>\n ${helpText\n ? html`<div class=\"form-group-help\">\n ${renderMarkdownInline(helpText)}\n </div>`\n : ''}\n </div>\n ${groupHasErrors\n ? html`<temba-icon\n name=\"alert_warning\"\n class=\"group-error-icon\"\n size=\"1.5\"\n ></temba-icon>`\n : ''}\n ${collapsible && !groupHasErrors\n ? html`<div class=\"group-toggle-container\">\n <temba-icon\n name=\"arrow_right\"\n size=\"1.5\"\n class=\"group-toggle-icon ${isCollapsed\n ? 'collapsed'\n : 'expanded'} ${showBubble || showCheckmark ? 'faded' : ''}\"\n ></temba-icon>\n ${showCheckmark\n ? html`<temba-icon\n name=\"check\"\n size=\"1\"\n class=\"group-checkmark-icon\"\n ></temba-icon>`\n : showBubble\n ? html`<div\n class=\"group-count-bubble ${!showBubble ? 'hidden' : ''}\"\n >\n ${valueCount}\n </div>`\n : ''}\n </div>`\n : ''}\n </div>\n <div\n class=\"form-group-content ${isCollapsed ? 'collapsed' : 'expanded'}\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n </div>\n `;\n }\n\n private collectFieldsFromItems(items: LayoutItem[]): string[] {\n const fields: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === 'string') {\n fields.push(item);\n } else if (item.type === 'field') {\n fields.push(item.field);\n } else if (item.type === 'row') {\n fields.push(...this.collectFieldsFromItems(item.items));\n } else if (item.type === 'group') {\n fields.push(...this.collectFieldsFromItems(item.items));\n }\n });\n\n return fields;\n }\n\n private renderFieldRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderRow instead\n return this.renderRow(rowConfig, config, new Set());\n }\n\n private renderFieldGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderGroup instead\n return this.renderGroup(groupConfig, config, new Set());\n }\n\n private handleNewFieldChange(fieldName: string, value: any) {\n this.formData = {\n ...this.formData,\n [fieldName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n this.errors = newErrors;\n }\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render\n this.requestUpdate();\n }\n private handleMessageEditorChange(fieldName: string, event: Event): void {\n const target = event.target as any;\n\n // Update both text and attachments from the message editor\n this.formData = {\n ...this.formData,\n [fieldName]: target.value,\n attachments: target.attachments || []\n };\n\n // Clear any existing errors for both fields\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n delete newErrors.attachments;\n this.errors = newErrors;\n }\n\n // Trigger re-render\n this.requestUpdate();\n }\n\n private renderFields(): TemplateResult {\n const config = this.getConfig();\n if (!config) {\n return html` <div>No configuration available</div> `;\n }\n\n // Use the new fields configuration system\n if (config.form) {\n // If layout is specified, use it\n if (config.layout) {\n const renderedFields = new Set<string>();\n\n // Also collect fields from gutter to avoid rendering them in main form\n const gutterFields = new Set<string>();\n if (config.gutter) {\n const gutterFieldNames = this.collectFieldsFromItems(config.gutter);\n gutterFieldNames.forEach((field) => gutterFields.add(field));\n }\n\n return html`\n ${config.layout.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n ${\n /* Render any fields not explicitly placed in layout or gutter */\n Object.entries(config.form).map(([fieldName, fieldConfig]) => {\n if (\n !renderedFields.has(fieldName) &&\n !gutterFields.has(fieldName)\n ) {\n return this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n );\n }\n return html``;\n })\n }\n `;\n } else {\n // Default rendering without layout\n return html`\n ${Object.entries(config.form).map(([fieldName, fieldConfig]) =>\n this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n )\n )}\n `;\n }\n }\n\n // Fallback for configs without form configuration\n if (this.action) {\n return html` <div>No form configuration available for this action</div> `;\n } else {\n return html` <div>No form configuration available for this node</div> `;\n }\n }\n\n private renderGutter(): TemplateResult {\n const config = this.getConfig();\n if (!config?.gutter || config.gutter.length === 0) {\n return html``;\n }\n\n // Use the same layout rendering system for gutter fields\n const renderedFields = new Set<string>();\n\n return html`\n <div class=\"gutter-fields\">\n ${config.gutter.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderActionSection(): TemplateResult {\n if (!this.node || this.node.actions.length === 0) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n // If node has an action config, defer to ActionEditor\n if (nodeConfig?.action) {\n const action = this.node.actions[0]; // Assume single action for now\n\n return html`\n <div class=\"action-section\">\n <h3>Action Configuration</h3>\n <div class=\"action-preview\">\n <p><strong>Type:</strong> ${action.type}</p>\n <p><em>Action details will be editable here</em></p>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private renderRouterSection(): TemplateResult {\n if (!this.node?.router) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n return html`\n <div class=\"router-section\">\n <h3>Router Configuration</h3>\n ${nodeConfig?.router\n ? this.renderRouterConfig()\n : html`<p>Basic router (no advanced configuration)</p>`}\n </div>\n `;\n }\n\n private renderRouterConfig(): TemplateResult {\n const nodeConfig = this.getNodeConfig();\n if (!nodeConfig?.router) return html``;\n\n // Render router configuration based on node config\n // This is where you'd render rule and category editors\n return html`\n <div class=\"router-config\">\n <p><strong>Type:</strong> ${nodeConfig.router.type}</p>\n ${nodeConfig.router.rules\n ? html`\n <div class=\"rules-section\">\n <h4>Rules</h4>\n <!-- Future: Render rule editor based on nodeConfig.router.rules -->\n <p><em>Rule editing will be implemented here</em></p>\n </div>\n `\n : ''}\n </div>\n `;\n }\n\n render(): TemplateResult {\n if (!this.isOpen) {\n return html``;\n }\n\n const headerColor = this.getHeaderColor();\n const config = this.getConfig();\n const dialogSize = config?.dialogSize || 'medium'; // Default to 'large' if not specified\n\n return html`\n <temba-dialog\n header=\"${config?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n size=\"${dialogSize}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${this.getNodeConfig()?.router?.configurable\n ? this.renderRouterSection()\n : null}\n </div>\n\n <div slot=\"gutter\">${this.renderGutter()}</div>\n </temba-dialog>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NodeEditor.js","sourceRoot":"","sources":["../../../src/flow/NodeEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult, css } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { Node, NodeUI, Action } from '../store/flow-definition';\nimport {\n ValidationResult,\n NodeConfig,\n NODE_CONFIG,\n ACTION_CONFIG,\n FieldConfig,\n ActionConfig\n} from './config';\nimport {\n LayoutItem,\n RowLayoutConfig,\n GroupLayoutConfig,\n FormData,\n ACTION_GROUP_METADATA,\n SPLIT_GROUP_METADATA\n} from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\nimport { FieldRenderer } from '../form/FieldRenderer';\nimport { renderMarkdownInline } from '../markdown';\n\nexport class NodeEditor extends RapidElement {\n static get styles() {\n return css`\n .node-editor-form {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n min-width: 400px;\n\n --color-bubble-bg: rgba(var(--primary-rgb), 0.7);\n --color-bubble-border: rgba(0, 0, 0, 0.2);\n --color-bubble-text: #fff;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .form-field label {\n }\n\n .field-errors {\n color: var(--color-error, tomato);\n font-size: 12px;\n margin-left: 5px;\n margin-top: 15px;\n }\n\n .form-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n\n .action-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .action-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .router-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .router-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .form-row {\n display: grid;\n gap: 1rem;\n align-items: center;\n }\n\n .form-row-wrapper {\n display: flex;\n flex-direction: column;\n }\n\n .form-row-label {\n margin-bottom: 5px;\n margin-left: 4px;\n display: block;\n font-weight: 400;\n font-size: var(--label-size);\n letter-spacing: 0.05em;\n line-height: normal;\n color: var(--color-label, #777);\n }\n\n .form-row-help {\n font-size: 12px;\n color: #666;\n margin-top: 6px;\n }\n\n .form-group {\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .form-group.has-errors {\n border-color: var(--color-error, tomato);\n }\n\n .form-group.has-bubble {\n border-width: 2px;\n border-color: rgba(var(--primary-rgb), 0.5);\n }\n\n .form-group-header {\n background: #f8f9fa;\n padding: 8px 10px;\n border-bottom: 1px solid #e0e0e0;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n }\n\n .form-group.has-bubble .form-group-header {\n background: rgba(var(--primary-rgb), 0.1);\n }\n\n .collapsed .form-group-header {\n border: none;\n }\n\n .form-group-header:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .form-group-header.collapsible:hover {\n background: #f1f3f4;\n }\n\n .form-group-info {\n flex: 1;\n }\n\n .form-group-title {\n font-weight: 500;\n color: var(--color-label, #777);\n font-size: 14px;\n display: flex;\n }\n\n .form-group-help {\n font-size: 12px;\n color: #666;\n margin-top: 2px;\n }\n\n .form-group-toggle {\n color: #666;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n }\n\n .form-group-toggle.collapsed {\n transform: rotate(-90deg);\n }\n\n .form-group-content {\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: hidden;\n transition: all 0.2s ease-in-out;\n\n opacity: 1;\n }\n\n .form-group-content.collapsed {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n\n .group-toggle-icon {\n color: #666;\n transition: transform 0.3s ease, opacity 0.3s ease;\n cursor: pointer;\n transform: rotate(0deg);\n opacity: 1;\n }\n\n .group-toggle-icon.faded {\n opacity: 0;\n }\n\n .group-toggle-icon.expanded {\n transform: rotate(90deg);\n }\n\n .group-toggle-icon.collapsed {\n transform: rotate(0deg);\n }\n\n .group-toggle-icon:hover {\n color: #333;\n }\n\n .group-error-icon {\n color: var(--color-error, tomato);\n margin-right: 8px;\n }\n\n .group-count-bubble {\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 600;\n padding: 4px;\n min-width: 12px;\n min-height: 12px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n line-height: 0px;\n opacity: 1;\n transition: opacity 0.3s ease;\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n color: var(--color-bubble-text, #000);\n }\n\n .group-count-bubble.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-checkmark-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 1;\n transition: opacity 0.3s ease;\n border-radius: 50%;\n color: var(--color-bubble-text, #000);\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n padding: 0.2em;\n }\n\n .group-checkmark-icon.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-toggle-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .gutter-fields {\n display: flex;\n flex-direction: column;\n gap: 10px;\n align-items: flex-start;\n }\n\n .gutter-fields .form-row {\n margin: 0;\n }\n\n .gutter-fields temba-checkbox {\n align-self: flex-start;\n }\n\n .gutter-fields temba-select {\n min-width: 120px;\n }\n\n .optional-field-link {\n margin: 10px 0;\n }\n\n .optional-field-link a {\n color: var(--color-link-primary, #0066cc);\n text-decoration: none;\n font-size: 13px;\n cursor: pointer;\n }\n\n .optional-field-link a:hover {\n text-decoration: underline;\n }\n `;\n }\n\n @property({ type: Object })\n action?: Action;\n\n @property({ type: Object })\n node?: Node;\n\n @property({ type: Object })\n nodeUI?: NodeUI;\n\n @property({ type: Boolean })\n isOpen: boolean = false;\n\n @state()\n private formData: FormData = {};\n\n @state()\n private originalFormData: FormData = {};\n\n @state()\n private errors: { [key: string]: string } = {};\n\n @state()\n private groupCollapseState: { [key: string]: boolean } = {};\n\n @state()\n private groupHoverState: { [key: string]: boolean } = {};\n\n @state()\n private revealedOptionalFields: Set<string> = new Set();\n\n connectedCallback(): void {\n super.connectedCallback();\n this.initializeFormData();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n if (\n changedProperties.has('node') ||\n changedProperties.has('action') ||\n changedProperties.has('nodeUI')\n ) {\n // For action editing, we only need the action\n if (this.action && (!this.node || !this.nodeUI)) {\n this.openDialog();\n }\n // For node editing, we need both node and nodeUI\n else if (this.node && this.nodeUI) {\n this.openDialog();\n }\n // If we don't have the required data, close the dialog\n else if (!this.action && (!this.node || !this.nodeUI)) {\n this.isOpen = false;\n }\n }\n }\n\n private openDialog(): void {\n this.initializeFormData();\n this.errors = {};\n this.isOpen = true;\n }\n\n private initializeFormData(): void {\n const nodeConfig = this.getNodeConfig();\n\n if ((!nodeConfig || nodeConfig.type === 'execute_actions') && this.action) {\n // Action editing mode - use action config\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n if (actionConfig?.toFormData) {\n this.formData = actionConfig.toFormData(this.action);\n } else {\n this.formData = { ...this.action };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n } else if (this.node) {\n // Node editing mode - use node config\n const nodeConfig = this.getNodeConfig();\n if (nodeConfig?.toFormData) {\n this.formData = nodeConfig.toFormData(this.node, this.nodeUI);\n } else {\n this.formData = { ...this.node };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n }\n\n // enforce immutability of formData\n Object.keys(this.formData).forEach((key) => {\n const value = this.formData[key];\n if (Array.isArray(value)) {\n this.formData[key] = [...value];\n } else if (value && typeof value === 'object') {\n // If it's an object, ensure we don't mutate the original\n this.formData[key] = { ...value };\n }\n });\n }\n\n private processFormDataForEditing(): void {\n const processed = { ...this.formData };\n\n // Convert Record objects to key-value arrays for key-value editors\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Check if this field should be a key-value editor\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n // Convert Record to array format\n processed[key] = Object.entries(value).map(([k, v]) => ({\n key: k,\n value: v\n }));\n }\n }\n });\n\n // Convert select fields to array format\n const config = this.getConfig();\n if (config?.form) {\n this.processSelectFields(processed, config.form);\n }\n\n this.formData = processed;\n }\n\n private processSelectFields(data: any, formConfig: any): void {\n Object.entries(formConfig).forEach(\n ([fieldName, fieldConfig]: [string, any]) => {\n const value = data[fieldName];\n\n // Handle top-level select fields\n if (fieldConfig.type === 'select' && value) {\n data[fieldName] = this.convertToSelectArray(value);\n }\n\n // Handle select fields within array items\n if (\n fieldConfig.type === 'array' &&\n Array.isArray(value) &&\n fieldConfig.itemConfig\n ) {\n value.forEach((item: any) => {\n this.processSelectFields(item, fieldConfig.itemConfig);\n });\n }\n }\n );\n }\n\n private convertToSelectArray(value: any): any[] {\n if (Array.isArray(value)) {\n return value.map((v) =>\n typeof v === 'string' ? { name: v, value: v } : v\n );\n } else if (typeof value === 'string') {\n return [{ name: value, value: value }];\n } else {\n return [value];\n }\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n const config = this.getConfig();\n const fields = config?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n\n private getConfig(): ActionConfig | NodeConfig | null {\n // If we have a node and nodeUI, check if we should use node config\n if (this.node && this.nodeUI) {\n const nodeConfig = this.getNodeConfig();\n\n // For execute_actions nodes, defer to action editing if an action is selected\n if (this.nodeUI.type === 'execute_actions' && this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n // For all other nodes with a config, use the node config\n if (nodeConfig) {\n return nodeConfig;\n }\n }\n\n // Fall back to action config if no node config or for pure action editing\n if (this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n return null;\n }\n\n private getNodeConfig(): NodeConfig | null {\n if (!this.nodeUI) return null;\n // Get node config based on the nodeUI's type\n return this.nodeUI.type ? NODE_CONFIG[this.nodeUI.type] : null;\n }\n\n private getHeaderColor(): string {\n const config = this.getConfig();\n return config?.group\n ? ACTION_GROUP_METADATA[config.group]?.color ||\n SPLIT_GROUP_METADATA[config.group]?.color\n : '#aaaaaa';\n }\n\n private handleDialogButtonClick(event: CustomEvent): void {\n const button = event.detail.button;\n\n if (button.name === 'Save') {\n this.handleSave();\n } else if (button.name === 'Cancel') {\n this.handleCancel();\n }\n }\n\n private handleSave(): void {\n // Validate the form\n const validation = this.validateForm();\n if (!validation.valid) {\n this.errors = validation.errors;\n\n // Expand any groups that contain validation errors\n this.expandGroupsWithErrors(validation.errors);\n\n return;\n }\n\n // Process form data to convert key-value arrays to Records before saving\n const processedFormData = this.processFormDataForSave();\n\n // Determine whether to use node or action saving based on context\n // If we have a node with a router, always use node saving (even if action is set)\n // because router configuration is handled at the node level\n if (this.node && this.node.router) {\n // Node editing mode with router - use formDataToNode\n const updatedNode = this.formDataToNode(processedFormData);\n\n // Generate UI config if the node config provides a toUIConfig function\n const nodeConfig = this.getNodeConfig();\n const uiConfig = nodeConfig?.toUIConfig\n ? nodeConfig.toUIConfig(processedFormData)\n : undefined;\n\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode,\n uiConfig\n });\n } else if (this.action) {\n // Pure action editing mode (no router)\n const updatedAction = this.formDataToAction(processedFormData);\n this.fireCustomEvent(CustomEventType.ActionSaved, {\n action: updatedAction\n });\n } else if (this.node) {\n // Node editing mode without router\n const updatedNode = this.formDataToNode(processedFormData);\n\n // Generate UI config if the node config provides a toUIConfig function\n const nodeConfig = this.getNodeConfig();\n const uiConfig = nodeConfig?.toUIConfig\n ? nodeConfig.toUIConfig(processedFormData)\n : undefined;\n\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode,\n uiConfig\n });\n }\n }\n\n private processFormDataForSave(): FormData {\n const processed = { ...this.formData };\n\n // Convert key-value arrays to Records\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array, convert to Record\n const record: Record<string, string> = {};\n value.forEach(({ key: k, value: v }) => {\n if (k.trim() !== '' || v.trim() !== '') {\n record[k] = v;\n }\n });\n processed[key] = record;\n } else if (Array.isArray(value) && value.length === 0) {\n // Empty key-value array should become empty object\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n processed[key] = {};\n }\n }\n });\n\n return processed;\n }\n\n private handleCancel(): void {\n this.fireCustomEvent(CustomEventType.NodeEditCancelled, {});\n }\n\n private validateForm(): ValidationResult {\n const errors: { [key: string]: string } = {};\n const config = this.getConfig();\n\n if (config) {\n // Check if new field configuration system is available\n if (config.form) {\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n if (fieldConfig.type === 'select' && fieldConfig.allowCreate) {\n // check our values to see if any have arbitrary set\n let selected = this.formData[fieldName];\n selected = Array.isArray(selected)\n ? selected.find((v: any) => v.arbitrary)\n : null;\n\n if (selected && selected.arbitrary) {\n errors[fieldName] =\n 'There was an error creating' + ' \"' + selected.name + '\"';\n }\n }\n\n // Check required fields\n if (\n (fieldConfig as any).required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } is required.`;\n }\n\n // Check minLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).minLength &&\n value.length < (fieldConfig as any).minLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be at least ${(fieldConfig as any).minLength} characters`;\n }\n\n // Check maxLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).maxLength &&\n value.length > (fieldConfig as any).maxLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be no more than ${\n (fieldConfig as any).maxLength\n } characters`;\n }\n });\n }\n\n // Universal validation for category arrays to check for reserved names\n this.validateCategoryNames(errors);\n\n // Run custom validation if available\n if (config.validate) {\n if (config.sanitize) {\n config.sanitize(this.formData);\n }\n\n let customValidation;\n if (this.action) {\n customValidation = config.validate({\n ...this.action,\n ...this.formData\n });\n } else {\n customValidation = config.validate(this.formData);\n }\n Object.assign(errors, customValidation.errors);\n }\n }\n\n // Validate key-value fields for unique keys\n this.validateKeyValueUniqueness(errors);\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n }\n\n private validateKeyValueUniqueness(errors: { [key: string]: string }): void {\n // The individual key-value editors will show validation errors on duplicate keys and empty keys with values\n // We just need to prevent form submission when there are validation issues\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array\n let hasValidationErrors = false;\n\n // Check for empty keys with values\n value.forEach(({ key, value: itemValue }: any) => {\n if (key.trim() === '' && itemValue.trim() !== '') {\n hasValidationErrors = true;\n }\n });\n\n // Check for duplicate keys (only non-empty ones)\n const keys = value\n .filter(({ key }: any) => key.trim() !== '') // Only check non-empty keys\n .map(({ key }: any) => key.trim());\n\n const uniqueKeys = new Set(keys);\n\n if (keys.length !== uniqueKeys.size) {\n hasValidationErrors = true;\n }\n\n if (hasValidationErrors) {\n errors[fieldName] = `Please resolve validation errors to continue`;\n }\n }\n });\n }\n\n private validateCategoryNames(errors: { [key: string]: string }): void {\n // Universal validation for category names across all node types\n // Prevents use of reserved category names that have special meaning in the system\n // Define reserved category names (case-insensitive)\n const reservedNames = [\n 'other',\n 'failure',\n 'success',\n 'all responses',\n 'no response'\n ];\n\n // Check all form fields for category arrays\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (Array.isArray(value) && fieldName === 'categories') {\n const categories = value.filter(\n (item: any) => item?.name && item.name.trim() !== ''\n );\n\n // Check for reserved names\n const reservedUsed = categories\n .filter((item: any) => {\n const lowerName = item.name.trim().toLowerCase();\n return reservedNames.includes(lowerName);\n })\n .map((item: any) => item.name.trim()); // Preserve original case\n\n if (reservedUsed.length > 0) {\n errors[\n fieldName\n ] = `Reserved category names cannot be used: ${reservedUsed.join(\n ', '\n )}`;\n }\n }\n });\n }\n\n private formDataToNode(formData: FormData = this.formData): Node {\n if (!this.node) throw new Error('No node to update');\n let updatedNode: Node = { ...this.node };\n\n // Check if node config has fromFormData - if so, it handles the entire transformation\n const nodeConfig = this.getNodeConfig();\n const nodeHasFromFormData = nodeConfig?.fromFormData !== undefined;\n\n // Handle actions using action config transformations if available\n // Skip this if the node has its own fromFormData (which handles actions itself)\n if (\n !nodeHasFromFormData &&\n this.node.actions &&\n this.node.actions.length > 0\n ) {\n updatedNode.actions = this.node.actions.map((action) => {\n // If we're editing a specific action, only transform that one\n if (this.action && action.uuid === this.action.uuid) {\n const actionConfig = ACTION_CONFIG[action.type];\n if (actionConfig?.fromFormData) {\n // Use action-specific form data transformation\n return actionConfig.fromFormData(formData);\n } else {\n // Default transformation - merge form data with original action\n return { ...action, ...formData };\n }\n } else {\n // Keep other actions unchanged\n return action;\n }\n });\n }\n\n // Handle router configuration using node config\n if (nodeHasFromFormData) {\n // Use node-specific form data transformation\n // When a node has fromFormData, it's responsible for creating the entire\n // node structure including actions and router (regardless of whether router exists yet)\n updatedNode = nodeConfig.fromFormData!(formData, updatedNode);\n } else if (this.node.router) {\n // Default router handling when no nodeConfig.fromFormData\n updatedNode.router = { ...this.node.router };\n\n // Apply form data to router fields if they exist\n if (formData.result_name !== undefined) {\n updatedNode.router.result_name = formData.result_name;\n }\n\n // Handle preconfigured rules from node config\n if (nodeConfig?.router?.rules) {\n // Build a complete new set of categories and exits based on node config\n const existingCategories = updatedNode.router.categories || [];\n const existingExits = updatedNode.exits || [];\n\n const newCategories: any[] = [];\n const newExits: any[] = [];\n\n // Group rules by category name to handle multiple rules pointing to the same category\n const categoryNameToRules = new Map<\n string,\n typeof nodeConfig.router.rules\n >();\n nodeConfig.router.rules.forEach((rule) => {\n if (!categoryNameToRules.has(rule.categoryName)) {\n categoryNameToRules.set(rule.categoryName, []);\n }\n categoryNameToRules.get(rule.categoryName)!.push(rule);\n });\n\n // Create categories for all unique category names\n categoryNameToRules.forEach((rules, categoryName) => {\n // Check if category already exists to preserve its UUID and exit_uuid\n const existingCategory = existingCategories.find(\n (cat) => cat.name === categoryName\n );\n\n if (existingCategory) {\n // Preserve existing category and its associated exit\n newCategories.push(existingCategory);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === existingCategory.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: categoryName,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n });\n\n // Add default category if specified\n if (nodeConfig.router.defaultCategory) {\n // Check if default category already exists in our new list\n const existingDefault = newCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (!existingDefault) {\n // Check if it exists in the original categories\n const originalDefault = existingCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (originalDefault) {\n // Preserve existing default category and its exit\n newCategories.push(originalDefault);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === originalDefault.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new default category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: nodeConfig.router.defaultCategory,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n }\n }\n\n // Replace the entire categories and exits lists with our complete new sets\n updatedNode.router.categories = newCategories;\n updatedNode.exits = newExits;\n }\n } else {\n // If no router, just apply form data to node properties\n Object.keys(formData).forEach((key) => {\n if (\n key !== 'uuid' &&\n key !== 'actions' &&\n key !== 'exits' &&\n key !== 'router'\n ) {\n (updatedNode as any)[key] = formData[key];\n }\n });\n }\n\n return updatedNode;\n }\n\n private formDataToAction(formData: FormData = this.formData): Action {\n if (!this.action) throw new Error('No action to update');\n\n // Use action config transformation if available\n const actionConfig = ACTION_CONFIG[this.action.type];\n if (actionConfig?.fromFormData) {\n return actionConfig.fromFormData(formData);\n } else {\n // Default 1:1 mapping\n return { ...this.action, ...formData };\n }\n }\n\n private handleFormFieldChange(propertyName: string, event: Event): void {\n const target = event.target as any;\n let value: any;\n\n // Handle different component types like ActionEditor does\n if (target.tagName === 'TEMBA-CHECKBOX') {\n value = target.checked;\n } else if (target.values !== undefined) {\n value = target.values;\n } else {\n value = target.value;\n }\n\n this.formData = {\n ...this.formData,\n [propertyName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[propertyName]) {\n const newErrors = { ...this.errors };\n delete newErrors[propertyName];\n this.errors = newErrors;\n }\n\n // Check for computed values in dependent fields\n this.updateComputedFields(propertyName);\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render to handle conditional field visibility\n this.requestUpdate();\n }\n\n private updateGroupCollapseStates(): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n this.updateGroupCollapseStatesRecursive(config.layout);\n }\n\n private updateGroupCollapseStatesRecursive(items: LayoutItem[]): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const { label, collapsed, collapsible } = item;\n\n // Only update if the group is collapsible and has a function-based collapsed property\n if (collapsible && typeof collapsed === 'function') {\n const newCollapsedState = collapsed(this.formData);\n\n // Only update if the state has changed to avoid unnecessary re-renders\n if (this.groupCollapseState[label] !== newCollapsedState) {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: newCollapsedState\n };\n }\n }\n\n // Recursively check nested items\n this.updateGroupCollapseStatesRecursive(item.items);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.updateGroupCollapseStatesRecursive(item.items);\n }\n });\n }\n\n private updateComputedFields(changedFieldName: string): void {\n const config = this.getConfig();\n if (!config?.form) return;\n\n // Check all fields to see if any depend on the changed field\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n if (fieldConfig.dependsOn?.includes(changedFieldName)) {\n if (fieldConfig.computeValue) {\n const currentValue = this.formData[fieldName];\n\n const computedValue = fieldConfig.computeValue(\n this.formData,\n currentValue,\n this.originalFormData\n );\n\n // Update the form data with the computed value\n this.formData = {\n ...this.formData,\n [fieldName]: computedValue\n };\n }\n }\n });\n }\n\n /**\n * Helper method to check if a field is visible based on its conditions\n */\n private isFieldVisible(fieldName: string, config: FieldConfig): boolean {\n if (config.conditions?.visible) {\n try {\n return config.conditions.visible(this.formData);\n } catch (error) {\n console.error(`Error checking visibility for ${fieldName}:`, error);\n // If there's an error, show the field by default\n return true;\n }\n }\n return true;\n }\n\n private renderNewField(\n fieldName: string,\n config: FieldConfig,\n value: any\n ): TemplateResult {\n // Check visibility condition\n if (!this.isFieldVisible(fieldName, config)) {\n return html``;\n }\n\n const errors = this.errors[fieldName] ? [this.errors[fieldName]] : [];\n\n // Build container style with maxWidth if specified\n const containerStyle = config.maxWidth\n ? `max-width: ${config.maxWidth};`\n : '';\n\n const fieldContent = this.renderFieldContent(\n fieldName,\n config,\n value,\n errors\n );\n\n // Wrap in container with style if maxWidth is specified\n if (containerStyle) {\n return html`<div style=\"${containerStyle}\">${fieldContent}</div>`;\n }\n\n return fieldContent;\n }\n\n private renderOptionalField(\n fieldName: string,\n config: FieldConfig,\n value: any\n ): TemplateResult {\n // If the field has a value or has been revealed, show it\n const hasValue = value && value.toString().trim() !== '';\n const isRevealed = this.revealedOptionalFields.has(fieldName);\n\n if (hasValue || isRevealed) {\n // Render the field normally\n return this.renderNewField(fieldName, config, value);\n }\n\n // Show the \"Save as...\" link\n return html`\n <div class=\"optional-field-link\">\n <a\n href=\"#\"\n @click=\"${(e: Event) => {\n e.preventDefault();\n this.revealOptionalField(fieldName);\n }}\"\n >\n ${config.optionalLink}\n </a>\n </div>\n `;\n }\n\n private revealOptionalField(fieldName: string): void {\n this.revealedOptionalFields = new Set([\n ...this.revealedOptionalFields,\n fieldName\n ]);\n }\n\n private renderFieldContent(\n fieldName: string,\n config: FieldConfig,\n value: any,\n errors: string[]\n ): TemplateResult {\n // Use FieldRenderer for consistent field rendering\n return FieldRenderer.renderField(fieldName, config, value, {\n errors,\n onChange: (e: Event) => {\n // Handle different change event types\n if (fieldName && config.type === 'key-value') {\n // Special handling for key-value editor\n const customEvent = e as CustomEvent;\n if (customEvent.detail) {\n this.handleNewFieldChange(fieldName, customEvent.detail.value);\n }\n } else if (fieldName && config.type === 'array') {\n // Special handling for array editor\n this.handleNewFieldChange(fieldName, (e.target as any).value);\n } else if (fieldName && config.type === 'message-editor') {\n // Special handling for message editor\n this.handleMessageEditorChange(fieldName, e);\n } else {\n // Default handling for most field types\n this.handleFormFieldChange(fieldName, e);\n }\n },\n showLabel: true,\n formData: this.formData,\n additionalData: {\n attachments: this.formData.attachments || []\n }\n });\n }\n\n private handleGroupToggle(groupLabel: string): void {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [groupLabel]: !this.groupCollapseState[groupLabel]\n };\n }\n\n private handleGroupMouseEnter(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: true\n };\n }\n\n private handleGroupMouseLeave(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: false\n };\n }\n\n private expandGroupsWithErrors(errors: { [key: string]: string }): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n const errorFields = new Set(Object.keys(errors));\n this.expandGroupsWithErrorsRecursive(config.layout, errorFields);\n }\n\n private expandGroupsWithErrorsRecursive(\n items: LayoutItem[],\n errorFields: Set<string>\n ): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const fieldsInGroup = this.collectFieldsFromItems(item.items);\n const groupHasErrors = fieldsInGroup.some((fieldName) =>\n errorFields.has(fieldName)\n );\n\n if (groupHasErrors) {\n // Expand this group\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [item.label]: false\n };\n }\n\n // Recursively check nested items\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n }\n });\n }\n\n private renderLayoutItem(\n item: LayoutItem,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n if (typeof item === 'string') {\n // String shorthand for field\n return this.renderLayoutItem(\n { type: 'field', field: item },\n config,\n renderedFields\n );\n }\n\n switch (item.type) {\n case 'field':\n if (config.form![item.field] && !renderedFields.has(item.field)) {\n renderedFields.add(item.field);\n const fieldConfig = config.form![item.field] as FieldConfig;\n\n // Handle optional link fields\n if (fieldConfig.optionalLink) {\n return this.renderOptionalField(\n item.field,\n fieldConfig,\n this.formData[item.field]\n );\n }\n\n return this.renderNewField(\n item.field,\n fieldConfig,\n this.formData[item.field]\n );\n }\n return html``;\n\n case 'row':\n return this.renderRow(item, config, renderedFields);\n\n case 'group':\n return this.renderGroup(item, config, renderedFields);\n\n default:\n return html``;\n }\n }\n\n private renderRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const { items, gap = '1rem', label, helpText } = rowConfig;\n\n // Collect all fields from this row for width calculations\n const fieldsInRow = this.collectFieldsFromItems(items);\n const validFields = fieldsInRow.filter(\n (fieldName) => config.form?.[fieldName]\n );\n\n // Filter for visible fields only to handle conditional visibility\n const visibleFields = validFields.filter((fieldName) => {\n const fieldConfig = config.form![fieldName];\n return this.isFieldVisible(fieldName, fieldConfig);\n });\n\n if (visibleFields.length === 0) {\n return html``;\n }\n\n // Build a map of field flex styles\n // Fields with maxWidth get flex: 0 0 {maxWidth} (fixed)\n // Fields without maxWidth get flex: 1 1 0 (grow to fill space)\n const fieldFlexStyles = new Map<string, string>();\n visibleFields.forEach((fieldName) => {\n const fieldConfig = config.form![fieldName];\n if (fieldConfig.maxWidth) {\n // Fixed width field: no grow, no shrink, basis = maxWidth\n fieldFlexStyles.set(fieldName, `flex: 0 0 ${fieldConfig.maxWidth};`);\n } else {\n // Flexible field: grow to fill remaining space\n fieldFlexStyles.set(fieldName, `flex: 1 1 0;`);\n }\n });\n\n const rowContent = html`\n <div class=\"form-row\" style=\"display: flex; gap: ${gap};\">\n ${items.map((item) => {\n // Get the field name from the item\n const fieldName =\n typeof item === 'string'\n ? item\n : item.type === 'field'\n ? item.field\n : null;\n\n // Get flex style for this field if it's a visible field\n const flexStyle =\n fieldName && fieldFlexStyles.has(fieldName)\n ? fieldFlexStyles.get(fieldName)\n : '';\n\n const itemContent = this.renderLayoutItem(\n item,\n config,\n renderedFields\n );\n\n // Wrap in a div with flex style if we have a flex style\n return flexStyle\n ? html`<div style=\"${flexStyle}\">${itemContent}</div>`\n : itemContent;\n })}\n </div>\n `;\n\n // If no label or helpText, return just the row content\n if (!label && !helpText) {\n return rowContent;\n }\n\n // Otherwise, wrap with label on top, content, then helpText below (matching field pattern)\n return html`\n <div class=\"form-row-wrapper\">\n ${label ? html`<label class=\"form-row-label\">${label}</label>` : ''}\n ${rowContent}\n ${helpText\n ? html`<div class=\"form-row-help\">\n ${renderMarkdownInline(helpText)}\n </div>`\n : ''}\n </div>\n `;\n }\n\n private renderGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const {\n label,\n items,\n collapsible = false,\n collapsed = false,\n helpText,\n getGroupValueCount\n } = groupConfig;\n\n // Initialize collapse state if not set\n if (collapsible && !(label in this.groupCollapseState)) {\n // Evaluate collapsed property - can be boolean or function\n const initialCollapsed =\n typeof collapsed === 'function' ? collapsed(this.formData) : collapsed;\n\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: initialCollapsed\n };\n }\n\n const isCollapsed = collapsible\n ? this.groupCollapseState[label] ??\n (typeof collapsed === 'function' ? collapsed(this.formData) : collapsed)\n : false;\n\n // Check if any field in this group has errors\n const fieldsInGroup = this.collectFieldsFromItems(items);\n const groupHasErrors = fieldsInGroup.some(\n (fieldName) => this.errors[fieldName]\n );\n\n // Calculate count for bubble display\n let valueCount = 0;\n let showBubble = false;\n let showCheckmark = false;\n let hasValue = false;\n const isHovered = this.groupHoverState[label] ?? false;\n\n if (getGroupValueCount && collapsible) {\n try {\n const result = getGroupValueCount(this.formData);\n\n if (typeof result === 'boolean') {\n // Boolean result - show checkmark when true\n showCheckmark = result && isCollapsed && !isHovered;\n hasValue = result;\n } else if (typeof result === 'number') {\n // Numeric result - show count bubble\n valueCount = result;\n showBubble = valueCount > 0 && isCollapsed && !isHovered;\n hasValue = valueCount > 0;\n }\n } catch (error) {\n console.error(\n `Error calculating group value count for ${label}:`,\n error\n );\n }\n }\n\n return html`\n <div\n class=\"form-group ${collapsible ? 'collapsible' : ''} ${groupHasErrors\n ? 'has-errors'\n : ''} ${isCollapsed ? 'collapsed' : 'expanded'} ${hasValue\n ? 'has-bubble'\n : ''}\"\n >\n <div\n class=\"form-group-header ${collapsible ? 'clickable' : ''}\"\n @click=${collapsible\n ? () => this.handleGroupToggle(label)\n : undefined}\n @mouseenter=${collapsible\n ? () => this.handleGroupMouseEnter(label)\n : undefined}\n @mouseleave=${collapsible\n ? () => this.handleGroupMouseLeave(label)\n : undefined}\n >\n <div class=\"form-group-info\">\n <div class=\"form-group-title\">${label}</div>\n ${helpText\n ? html`<div class=\"form-group-help\">\n ${renderMarkdownInline(helpText)}\n </div>`\n : ''}\n </div>\n ${groupHasErrors\n ? html`<temba-icon\n name=\"alert_warning\"\n class=\"group-error-icon\"\n size=\"1.5\"\n ></temba-icon>`\n : ''}\n ${collapsible && !groupHasErrors\n ? html`<div class=\"group-toggle-container\">\n <temba-icon\n name=\"arrow_right\"\n size=\"1.5\"\n class=\"group-toggle-icon ${isCollapsed\n ? 'collapsed'\n : 'expanded'} ${showBubble || showCheckmark ? 'faded' : ''}\"\n ></temba-icon>\n ${showCheckmark\n ? html`<temba-icon\n name=\"check\"\n size=\"1\"\n class=\"group-checkmark-icon\"\n ></temba-icon>`\n : showBubble\n ? html`<div\n class=\"group-count-bubble ${!showBubble ? 'hidden' : ''}\"\n >\n ${valueCount}\n </div>`\n : ''}\n </div>`\n : ''}\n </div>\n <div\n class=\"form-group-content ${isCollapsed ? 'collapsed' : 'expanded'}\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n </div>\n `;\n }\n\n private collectFieldsFromItems(items: LayoutItem[]): string[] {\n const fields: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === 'string') {\n fields.push(item);\n } else if (item.type === 'field') {\n fields.push(item.field);\n } else if (item.type === 'row') {\n fields.push(...this.collectFieldsFromItems(item.items));\n } else if (item.type === 'group') {\n fields.push(...this.collectFieldsFromItems(item.items));\n }\n });\n\n return fields;\n }\n\n private renderFieldRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderRow instead\n return this.renderRow(rowConfig, config, new Set());\n }\n\n private renderFieldGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderGroup instead\n return this.renderGroup(groupConfig, config, new Set());\n }\n\n private handleNewFieldChange(fieldName: string, value: any) {\n this.formData = {\n ...this.formData,\n [fieldName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n this.errors = newErrors;\n }\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render\n this.requestUpdate();\n }\n private handleMessageEditorChange(fieldName: string, event: Event): void {\n const target = event.target as any;\n\n // Update both text and attachments from the message editor\n this.formData = {\n ...this.formData,\n [fieldName]: target.value,\n attachments: target.attachments || []\n };\n\n // Clear any existing errors for both fields\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n delete newErrors.attachments;\n this.errors = newErrors;\n }\n\n // Trigger re-render\n this.requestUpdate();\n }\n\n private renderFields(): TemplateResult {\n const config = this.getConfig();\n if (!config) {\n return html` <div>No configuration available</div> `;\n }\n\n // Use the new fields configuration system\n if (config.form) {\n // If layout is specified, use it\n if (config.layout) {\n const renderedFields = new Set<string>();\n\n // Also collect fields from gutter to avoid rendering them in main form\n const gutterFields = new Set<string>();\n if (config.gutter) {\n const gutterFieldNames = this.collectFieldsFromItems(config.gutter);\n gutterFieldNames.forEach((field) => gutterFields.add(field));\n }\n\n return html`\n ${config.layout.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n ${\n /* Render any fields not explicitly placed in layout or gutter */\n Object.entries(config.form).map(([fieldName, fieldConfig]) => {\n if (\n !renderedFields.has(fieldName) &&\n !gutterFields.has(fieldName)\n ) {\n return this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n );\n }\n return html``;\n })\n }\n `;\n } else {\n // Default rendering without layout\n return html`\n ${Object.entries(config.form).map(([fieldName, fieldConfig]) =>\n this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n )\n )}\n `;\n }\n }\n\n // Fallback for configs without form configuration\n if (this.action) {\n return html` <div>No form configuration available for this action</div> `;\n } else {\n return html` <div>No form configuration available for this node</div> `;\n }\n }\n\n private renderGutter(): TemplateResult {\n const config = this.getConfig();\n if (!config?.gutter || config.gutter.length === 0) {\n return html``;\n }\n\n // Use the same layout rendering system for gutter fields\n const renderedFields = new Set<string>();\n\n return html`\n <div class=\"gutter-fields\">\n ${config.gutter.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderActionSection(): TemplateResult {\n if (!this.node || this.node.actions.length === 0) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n // If node has an action config, defer to ActionEditor\n if (nodeConfig?.action) {\n const action = this.node.actions[0]; // Assume single action for now\n\n return html`\n <div class=\"action-section\">\n <h3>Action Configuration</h3>\n <div class=\"action-preview\">\n <p><strong>Type:</strong> ${action.type}</p>\n <p><em>Action details will be editable here</em></p>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private renderRouterSection(): TemplateResult {\n if (!this.node?.router) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n return html`\n <div class=\"router-section\">\n <h3>Router Configuration</h3>\n ${nodeConfig?.router\n ? this.renderRouterConfig()\n : html`<p>Basic router (no advanced configuration)</p>`}\n </div>\n `;\n }\n\n private renderRouterConfig(): TemplateResult {\n const nodeConfig = this.getNodeConfig();\n if (!nodeConfig?.router) return html``;\n\n // Render router configuration based on node config\n // This is where you'd render rule and category editors\n return html`\n <div class=\"router-config\">\n <p><strong>Type:</strong> ${nodeConfig.router.type}</p>\n ${nodeConfig.router.rules\n ? html`\n <div class=\"rules-section\">\n <h4>Rules</h4>\n <!-- Future: Render rule editor based on nodeConfig.router.rules -->\n <p><em>Rule editing will be implemented here</em></p>\n </div>\n `\n : ''}\n </div>\n `;\n }\n\n render(): TemplateResult {\n if (!this.isOpen) {\n return html``;\n }\n\n const headerColor = this.getHeaderColor();\n const config = this.getConfig();\n const dialogSize = config?.dialogSize || 'medium'; // Default to 'large' if not specified\n\n return html`\n <temba-dialog\n header=\"${config?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n size=\"${dialogSize}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${this.getNodeConfig()?.router?.configurable\n ? this.renderRouterSection()\n : null}\n </div>\n\n <div slot=\"gutter\">${this.renderGutter()}</div>\n </temba-dialog>\n `;\n }\n}\n"]}
|