@nyaruka/temba-components 0.129.6 → 0.129.8
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/.devcontainer/Dockerfile +11 -4
- package/.devcontainer/devcontainer.json +3 -2
- package/.github/workflows/build.yml +4 -14
- package/CHANGELOG.md +25 -1
- package/demo/components/flow/example.html +9 -2
- package/demo/components/flow/index.html +206 -0
- package/demo/components/message-editor/example.html +125 -0
- package/demo/components/textinput/completion.html +1 -0
- package/demo/data/flows/food-order.json +132 -0
- package/demo/data/flows/sample-flow.json +40 -24
- package/demo/index.html +1 -1
- package/dist/temba-components.js +518 -220
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/display/Thumbnail.js +2 -1
- package/out-tsc/src/display/Thumbnail.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +10 -2
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +245 -22
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/StickyNote.js +1 -1
- package/out-tsc/src/flow/StickyNote.js.map +1 -1
- package/out-tsc/src/flow/actions/call_webhook.js +26 -17
- package/out-tsc/src/flow/actions/call_webhook.js.map +1 -1
- package/out-tsc/src/flow/actions/send_email.js +1 -2
- package/out-tsc/src/flow/actions/send_email.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +155 -7
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +111 -38
- package/out-tsc/src/form/ArrayEditor.js.map +1 -1
- package/out-tsc/src/form/BaseListEditor.js +19 -4
- package/out-tsc/src/form/BaseListEditor.js.map +1 -1
- package/out-tsc/src/form/FormField.js +1 -1
- package/out-tsc/src/form/FormField.js.map +1 -1
- package/out-tsc/src/form/KeyValueEditor.js +1 -1
- package/out-tsc/src/form/KeyValueEditor.js.map +1 -1
- package/out-tsc/src/form/MediaPicker.js +13 -1
- package/out-tsc/src/form/MediaPicker.js.map +1 -1
- package/out-tsc/src/form/MessageEditor.js +422 -0
- package/out-tsc/src/form/MessageEditor.js.map +1 -0
- package/out-tsc/src/form/TextInput.js +12 -5
- package/out-tsc/src/form/TextInput.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +4 -4
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +29 -4
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/temba-modules.js +2 -0
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/temba-field-config.test.js +4 -2
- package/out-tsc/test/temba-field-config.test.js.map +1 -1
- package/out-tsc/test/temba-message-editor.test.js +194 -0
- package/out-tsc/test/temba-message-editor.test.js.map +1 -0
- package/out-tsc/test/temba-node-editor.test.js +71 -0
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +1 -1
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/temba-textinput.test.js +16 -0
- package/out-tsc/test/temba-textinput.test.js.map +1 -1
- package/out-tsc/test/temba-webchat.test.js +4 -0
- package/out-tsc/test/temba-webchat.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -8
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +7 -4
- package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/editor/send_msg.png +0 -0
- package/screenshots/truth/editor/set_contact_language.png +0 -0
- package/screenshots/truth/editor/set_contact_name.png +0 -0
- package/screenshots/truth/editor/set_run_result.png +0 -0
- package/screenshots/truth/formfield/markdown-errors.png +0 -0
- package/screenshots/truth/formfield/no-errors.png +0 -0
- package/screenshots/truth/formfield/plain-text-errors.png +0 -0
- package/screenshots/truth/message-editor/autogrow-initial-content.png +0 -0
- package/screenshots/truth/message-editor/default.png +0 -0
- package/screenshots/truth/message-editor/drag-highlight.png +0 -0
- package/screenshots/truth/message-editor/filtered-attachments.png +0 -0
- package/screenshots/truth/message-editor/with-completion.png +0 -0
- package/screenshots/truth/message-editor/with-properties.png +0 -0
- package/screenshots/truth/sticky-note/blue-color.png +0 -0
- package/screenshots/truth/sticky-note/blue.png +0 -0
- package/screenshots/truth/sticky-note/color-picker-expanded.png +0 -0
- package/screenshots/truth/sticky-note/default.png +0 -0
- package/screenshots/truth/sticky-note/gray-color.png +0 -0
- package/screenshots/truth/sticky-note/gray.png +0 -0
- package/screenshots/truth/sticky-note/green-color.png +0 -0
- package/screenshots/truth/sticky-note/green.png +0 -0
- package/screenshots/truth/sticky-note/pink-color.png +0 -0
- package/screenshots/truth/sticky-note/pink.png +0 -0
- package/screenshots/truth/sticky-note/yellow-color.png +0 -0
- package/screenshots/truth/sticky-note/yellow.png +0 -0
- package/screenshots/truth/textinput/autogrow-initial.png +0 -0
- package/screenshots/truth/textinput/input-form.png +0 -0
- package/src/display/Thumbnail.ts +2 -1
- package/src/events.ts +6 -2
- package/src/flow/CanvasNode.ts +10 -2
- package/src/flow/NodeEditor.ts +269 -23
- package/src/flow/StickyNote.ts +1 -1
- package/src/flow/actions/call_webhook.ts +28 -18
- package/src/flow/actions/send_email.ts +1 -2
- package/src/flow/actions/send_msg.ts +178 -7
- package/src/flow/types.ts +21 -2
- package/src/form/ArrayEditor.ts +120 -42
- package/src/form/BaseListEditor.ts +22 -6
- package/src/form/FormField.ts +1 -1
- package/src/form/KeyValueEditor.ts +1 -1
- package/src/form/MediaPicker.ts +13 -1
- package/src/form/MessageEditor.ts +449 -0
- package/src/form/TextInput.ts +15 -7
- package/src/form/select/Select.ts +4 -4
- package/src/live/ContactChat.ts +32 -6
- package/src/store/flow-definition.d.ts +25 -4
- package/static/css/temba-components.css +2 -0
- package/static/mr/docs/en-us/editor.json +2588 -0
- package/stress-test.js +138 -0
- package/temba-modules.ts +2 -0
- package/test/temba-field-config.test.ts +4 -2
- package/test/temba-message-editor.test.ts +300 -0
- package/test/temba-node-editor.test.ts +94 -0
- package/test/temba-select.test.ts +1 -1
- package/test/temba-textinput.test.ts +26 -0
- package/test/temba-webchat.test.ts +5 -0
- package/test/utils.test.ts +2 -13
- package/test-assets/contacts/history.json +20 -2
- package/test-assets/style.css +2 -0
- package/web-dev-mock.mjs +433 -0
- package/web-dev-server.config.mjs +71 -6
- package/web-test-runner.config.mjs +9 -4
|
@@ -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;AASlB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,OAAO,UAAW,SAAQ,YAAY;IAA5C;;QAmLE,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;IAutC9D,CAAC;IAr5CC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoKT,CAAC;IACJ,CAAC;IA0BD,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,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,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,WAAW;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,kBAAkB;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,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;gBACnC,iFAAiF;gBACjF,IAAI,CAAC,+BAA+B,CAAC,YAAY,CAAC,CAAC;YACrD,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,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAEO,+BAA+B,CAAC,YAA0B;QAChE,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;YAC1D,IAAI,IAAI,CAAC,oCAAoC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACvC,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACpB,KAAK,CAAC,MAAM,GAAG,CAAC;oBAChB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAC5B,CAAC;oBACD,kDAAkD;oBAClD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;wBACtD,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oCAAoC,CAC1C,SAAiB,EACjB,WAAgB;;QAEhB,MAAM,YAAY,GAAG,WAAgC,CAAC;QACtD,OAAO,CACL,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ;YAC5B,CAAC,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;YACzC,0DAA0D;YAC1D,CAAC,IAAI,CAAC,MAAM,CAAC;YACf,CAAC,CAAA,MAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAAE,UAAU,CAAA,CAC7C,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,SAAiB;;QACvC,wDAAwD;QACxD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC;YAClC,OAAO,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,SAAS,CAAC,0CAAE,IAAI,MAAK,WAAW,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,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,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,sBAAsB;YACtB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,KAAI,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,OAAO,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,KAAI,SAAS,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,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;QAE7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,+CAA+C;YAC/C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAErD,uDAAuD;YACvD,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC,CAAC,OAAO,CACxC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;oBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAEvC,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,cAAc,CAAC;oBACjB,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,CACF,CAAC;YACJ,CAAC;YAED,qCAAqC;YACrC,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,QAAQ,EAAE,CAAC;gBAC3B,kDAAkD;gBAClD,IAAI,mBAA2B,CAAC;gBAChC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;oBAC9B,mBAAmB,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAY,CAAC;gBACvE,CAAC;gBAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACpE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,kBAAkB;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAExC,6CAA6C;YAC7C,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,CAC3C,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;oBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAEvC,wBAAwB;oBACxB,IACE,WAAW,CAAC,QAAQ;wBACpB,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,GAClB,WAAW,CAAC,KAAK,IAAI,SACvB,cAAc,CAAC;oBACjB,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,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,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,gFAAgF;YAChF,MAAM,iBAAiB,GAAG,IAAI,CAAC,iCAAiC,CAC9D,QAAQ,EACR,YAAY,CACb,CAAC;YACF,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,iCAAiC,CACvC,QAAa,EACb,YAA0B;QAE1B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC;QACzD,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAElC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;YACrE,IAAI,IAAI,CAAC,oCAAoC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;gBACnC,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACpB,KAAK,CAAC,MAAM,GAAG,CAAC;oBAChB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;oBAC5B,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EACnB,CAAC;oBACD,uDAAuD;oBACvD,SAAS,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAC9B,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAC/C,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,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,IACL,MAAM,CAAC,OAAO,KAAK,cAAc;YACjC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAC9B,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,2DAA2D;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,oBAAoB,CAAC,gBAAwB;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,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,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAA;kBACD,SAAS;mBACR,MAAM,CAAC,KAAK;uBACR,MAAM,CAAC,QAAQ;qBACjB,MAAM;oBACP,KAAK,IAAI,EAAE;yBACN,MAAM,CAAC,WAAW,IAAI,EAAE;uBAC1B,MAAM,CAAC,QAAQ,IAAI,EAAE;oBACxB,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC;4BAC9C,CAAC;YAEvB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,cAAc,GAAG,MAA6B,CAAC;gBACrD,MAAM,cAAc,GAAG,cAAc,CAAC,SAAS;oBAC7C,CAAC,CAAC,0BAA0B,cAAc,CAAC,SAAS,KAAK;oBACzD,CAAC,CAAC,EAAE,CAAC;gBAEP,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,OAAO,IAAI,CAAA;oBACD,SAAS;qBACR,MAAM,CAAC,KAAK;yBACR,MAAM,CAAC,QAAQ;uBACjB,MAAM;sBACP,KAAK,IAAI,EAAE;2BACN,MAAM,CAAC,WAAW,IAAI,EAAE;;;qBAG9B,cAAc;yBACV,MAAM,CAAC,QAAQ,IAAI,EAAE;sBACxB,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC;+BAC7C,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAA;oBACD,SAAS;qBACR,MAAM,CAAC,KAAK;yBACR,MAAM,CAAC,QAAQ;uBACjB,MAAM;sBACP,KAAK,IAAI,EAAE;2BACN,MAAM,CAAC,WAAW,IAAI,EAAE;;qBAE9B,cAAc,CAAC,IAAI,IAAI,CAAC;qBACxB,cAAc;yBACV,MAAM,CAAC,QAAQ,IAAI,EAAE;sBACxB,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC;8BAC9C,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,YAAY,GAAG,MAA2B,CAAC;gBACjD,OAAO,IAAI,CAAA;kBACD,SAAS;mBACR,MAAM,CAAC,KAAK;uBACR,MAAM,CAAC,QAAQ;qBACjB,MAAM;qBACN,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,YAAY,CAAC,KAAK;yBACb,YAAY,CAAC,UAAU;mBAC7B,YAAY,CAAC,IAAI;qBACf,YAAY,CAAC,MAAM;yBACf,YAAY,CAAC,WAAW,IAAI,EAAE;sBACjC,YAAY,CAAC,QAAQ,IAAI,CAAC;sBAC1B,YAAY,CAAC,QAAQ,IAAI,OAAO;qBACjC,YAAY,CAAC,OAAO,IAAI,MAAM;sBAC7B,YAAY,CAAC,QAAQ,IAAI,EAAE;uBAC1B,MAAM,CAAC,QAAQ,IAAI,EAAE;qBACvB,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC;;YAE/D,MAAA,YAAY,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,MAAW,EAAE,EAAE;oBAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC/B,OAAO,IAAI,CAAA;wBACD,MAAM;yBACL,MAAM;+BACA,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAA;wBACD,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;yBAC1B,MAAM,CAAC,KAAK;+BACN,CAAC;oBACpB,CAAC;gBACH,CAAC,CAAC;wBACY,CAAC;YACnB,CAAC;YAED,KAAK,WAAW;gBACd,OAAO,IAAI,CAAA;mBACA,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;;oBAEzC,SAAS;sBACP,KAAK,IAAI,EAAE;yBACR,MAAM,CAAC,QAAQ;+BACT,MAAM,CAAC,cAAc,IAAI,KAAK;iCAC5B,MAAM,CAAC,gBAAgB,IAAI,OAAO;wBAC3C,MAAM,CAAC,OAAO,IAAI,CAAC;uBACpB,CAAC,CAAc,EAAE,EAAE;oBAC5B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;wBACb,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;;YAED,MAAM,CAAC,MAAM;oBACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAC5D,CAAC,CAAC,EAAE;eACD,CAAC;YAEV,KAAK,OAAO;gBACV,OAAO,IAAI,CAAA;mBACA,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;;sBAEvC,KAAK,IAAI,EAAE;2BACN,MAAM,CAAC,UAAU;yBACnB,MAAM,CAAC,QAAQ;0BACd,MAAM,CAAC,SAAS,IAAI,MAAM;yBAC3B,MAAM,CAAC,QAAQ,IAAI,CAAC;6BAChB,MAAM,CAAC,YAAY;uBACzB,CAAC,CAAc,EAAE,EAAE,CAC5B,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;YAEtD,MAAM,CAAC,MAAM;oBACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAC5D,CAAC,CAAC,EAAE;eACD,CAAC;YAEV,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,cAAc,GAAG,MAA6B,CAAC;gBACrD,OAAO,IAAI,CAAA;;oBAEC,SAAS;qBACR,MAAM,CAAC,KAAK;yBACR,MAAM,CAAC,QAAQ,IAAI,EAAE;yBACrB,MAAM,CAAC,QAAQ;uBACjB,MAAM;wBACL,KAAK,IAAI,KAAK;oBAClB,cAAc,CAAC,IAAI,IAAI,GAAG;6BACjB,cAAc,CAAC,aAAa,IAAI,OAAO;uBAC7C,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC;;YAEjE,MAAM,CAAC,MAAM;oBACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAC5D,CAAC,CAAC,EAAE;eACD,CAAC;YACV,CAAC;YAED;gBACE,OAAO,IAAI,CAAA,gCAAiC,MAAc,CAAC,IAAI,QAAQ,CAAC;QAC5E,CAAC;IACH,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,sBAAsB,CAAC,MAAiC;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,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,MAAoB,EACpB,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,MAAoB,EACpB,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,MAAoB,EACpB,cAA2B;;QAE3B,MAAM,EACJ,KAAK,EACL,KAAK,EACL,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,QAAQ,EACT,GAAG,WAAW,CAAC;QAEhB,uCAAuC;QACvC,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,kBAAkB,GAAG;gBACxB,GAAG,IAAI,CAAC,kBAAkB;gBAC1B,CAAC,KAAK,CAAC,EAAE,SAAS;aACnB,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW;YAC7B,CAAC,CAAC,MAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,mCAAI,SAAS;YAC7C,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,OAAO,IAAI,CAAA;;4BAEa,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,cAAc;YACpE,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;;;4CAGqB,KAAK;cACnC,QAAQ;YACR,CAAC,CAAC,IAAI,CAAA,gCAAgC,QAAQ,QAAQ;YACtD,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;;;2CAGyB,WAAW;gBACpC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,UAAU;6BACD;YACjB,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,MAAoB;QAEpB,oDAAoD;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,gBAAgB,CACtB,WAA8B,EAC9B,MAAoB;QAEpB,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,oBAAoB;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA,iCAAiC,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAA,yDAAyD,CAAC;QACvE,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,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,uDAAuD;gBACvD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;oBAC3D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;wBACnC,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,OAAO,IAAI,CAAA,8CAA8C,CAAC;IAC5D,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,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAA;;kBAEG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,MAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAA,IAAI,MAAM;iBACjD,IAAI,CAAC,MAAM;gCACI,IAAI,CAAC,uBAAuB;;;8BAG9B,WAAW;;;YAG7B,IAAI,CAAC,YAAY,EAAE;YACnB,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,YAAY;YAChC,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC5B,CAAC,CAAC,IAAI;;;KAGb,CAAC;IACJ,CAAC;CACF;AA5uCC;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","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 SelectFieldConfig,\n CheckboxFieldConfig,\n TextareaFieldConfig,\n LayoutItem,\n RowLayoutConfig,\n GroupLayoutConfig\n} from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\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\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .form-field label {\n font-weight: 500;\n margin-bottom: 6px;\n color: #333;\n font-size: 14px;\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: end;\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-header {\n background: #f8f9fa;\n padding: 12px 15px;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\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: #333;\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: 15px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: hidden;\n transition: all 0.3s ease;\n max-height: 1000px; /* Large enough to accommodate most content */\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;\n cursor: pointer;\n transform: rotate(0deg);\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 }\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 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 (changedProperties.has('node') || changedProperties.has('action')) {\n if (this.node || this.action) {\n this.openDialog();\n } else {\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 closeDialog(): void {\n this.isOpen = false;\n this.formData = {};\n this.errors = {};\n this.groupCollapseState = {};\n }\n\n private initializeFormData(): void {\n if (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 // Apply smart transformations for select fields that expect {name, value} format\n this.applySmartSelectTransformations(actionConfig);\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 this.formData = processed;\n }\n\n private applySmartSelectTransformations(actionConfig: ActionConfig): void {\n if (!actionConfig) return;\n\n const fields = actionConfig.form;\n if (!fields) return;\n\n Object.entries(fields).forEach(([fieldName, fieldConfig]) => {\n if (this.shouldApplySmartSelectTransformation(fieldName, fieldConfig)) {\n const value = this.formData[fieldName];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n ) {\n // Transform string array to select options format\n this.formData[fieldName] = value.map((item: string) => ({\n name: item,\n value: item\n }));\n }\n }\n });\n }\n\n private shouldApplySmartSelectTransformation(\n fieldName: string,\n fieldConfig: any\n ): boolean {\n const selectConfig = fieldConfig as SelectFieldConfig;\n return (\n (fieldConfig.type === 'select' &&\n (selectConfig.multi || selectConfig.tags) &&\n // Don't transform if already has explicit transformations\n !this.action) ||\n !ACTION_CONFIG[this.action.type]?.toFormData\n );\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n if (this.action) {\n const actionConfig = ACTION_CONFIG[this.action.type];\n const fields = actionConfig?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n return false;\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 if (this.action) {\n // Action editing mode\n const actionConfig = ACTION_CONFIG[this.action.type];\n return actionConfig?.color || '#666666';\n } else if (this.node) {\n // Node editing mode\n const nodeConfig = this.getNodeConfig();\n return nodeConfig?.color || '#666666';\n }\n return '#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\n if (this.action) {\n // Action validation using fields configuration\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n // Check if new field configuration system is available\n if (actionConfig?.form) {\n Object.entries(actionConfig?.form).forEach(\n ([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\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\n // Run custom validation if available\n if (actionConfig?.validate) {\n // Convert form data back to action for validation\n let actionForValidation: Action;\n if (actionConfig.fromFormData) {\n actionForValidation = actionConfig.fromFormData(this.formData);\n } else {\n actionForValidation = { ...this.action, ...this.formData } as Action;\n }\n\n const customValidation = actionConfig.validate(actionForValidation);\n Object.assign(errors, customValidation.errors);\n }\n } else if (this.node) {\n // Node validation\n const nodeConfig = this.getNodeConfig();\n\n // Check required fields from node properties\n if (nodeConfig?.properties) {\n Object.entries(nodeConfig.properties).forEach(\n ([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n\n // Check required fields\n if (\n fieldConfig.required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n fieldConfig.label || fieldName\n } is required`;\n }\n }\n );\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 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 // Apply smart select transformations in reverse and provide default 1:1 mapping\n const processedFormData = this.reverseSmartSelectTransformations(\n formData,\n actionConfig\n );\n return { ...this.action, ...processedFormData };\n }\n }\n\n private reverseSmartSelectTransformations(\n formData: any,\n actionConfig: ActionConfig\n ): any {\n if (!actionConfig || !actionConfig.form) return formData;\n const processed = { ...formData };\n\n Object.entries(actionConfig.form).forEach(([fieldName, fieldConfig]) => {\n if (this.shouldApplySmartSelectTransformation(fieldName, fieldConfig)) {\n const value = processed[fieldName];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'value' in value[0]\n ) {\n // Transform select options format back to string array\n processed[fieldName] = value.map(\n (item: any) => item.value || item.name || item\n );\n }\n }\n });\n\n return processed;\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 (\n target.tagName === 'TEMBA-SELECT' &&\n (target.multi || target.emails || target.tags)\n ) {\n value = target.values || [];\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 // Trigger re-render to handle conditional field visibility\n this.requestUpdate();\n }\n\n private updateComputedFields(changedFieldName: string): void {\n if (!this.action) return;\n\n const config = ACTION_CONFIG[this.action.type];\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 switch (config.type) {\n case 'text':\n return html`<temba-textinput\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-textinput>`;\n\n case 'textarea': {\n const textareaConfig = config as TextareaFieldConfig;\n const minHeightStyle = textareaConfig.minHeight\n ? `--textarea-min-height: ${textareaConfig.minHeight}px;`\n : '';\n\n if (config.evaluated) {\n return html`<temba-completion\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n textarea\n expressions=\"session\"\n style=\"${minHeightStyle}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-completion>`;\n } else {\n return html`<temba-textinput\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n textarea\n .rows=\"${textareaConfig.rows || 3}\"\n style=\"${minHeightStyle}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-textinput>`;\n }\n }\n\n case 'select': {\n const selectConfig = config as SelectFieldConfig;\n return html`<temba-select\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .values=\"${value || (selectConfig.multi ? [] : '')}\"\n ?multi=\"${selectConfig.multi}\"\n ?searchable=\"${selectConfig.searchable}\"\n ?tags=\"${selectConfig.tags}\"\n ?emails=\"${selectConfig.emails}\"\n placeholder=\"${selectConfig.placeholder || ''}\"\n maxItems=\"${selectConfig.maxItems || 0}\"\n valueKey=\"${selectConfig.valueKey || 'value'}\"\n nameKey=\"${selectConfig.nameKey || 'name'}\"\n endpoint=\"${selectConfig.endpoint || ''}\"\n .helpText=\"${config.helpText || ''}\"\n @change=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n >\n ${selectConfig.options?.map((option: any) => {\n if (typeof option === 'string') {\n return html`<temba-option\n name=\"${option}\"\n value=\"${option}\"\n ></temba-option>`;\n } else {\n return html`<temba-option\n name=\"${option.label || option.name}\"\n value=\"${option.value}\"\n ></temba-option>`;\n }\n })}\n </temba-select>`;\n }\n\n case 'key-value':\n return html`<div class=\"form-field\">\n <label>${config.label}${config.required ? ' *' : ''}</label>\n <temba-key-value-editor\n name=\"${fieldName}\"\n .value=\"${value || []}\"\n .sortable=\"${config.sortable}\"\n .keyPlaceholder=\"${config.keyPlaceholder || 'Key'}\"\n .valuePlaceholder=\"${config.valuePlaceholder || 'Value'}\"\n .minRows=\"${config.minRows || 0}\"\n @change=\"${(e: CustomEvent) => {\n if (e.detail) {\n this.handleNewFieldChange(fieldName, e.detail.value);\n }\n }}\"\n ></temba-key-value-editor>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n\n case 'array':\n return html`<div class=\"form-field\">\n <label>${config.label}${config.required ? ' *' : ''}</label>\n <temba-array-editor\n .value=\"${value || []}\"\n .itemConfig=\"${config.itemConfig}\"\n .sortable=\"${config.sortable}\"\n .itemLabel=\"${config.itemLabel || 'Item'}\"\n .minItems=\"${config.minItems || 0}\"\n .onItemChange=\"${config.onItemChange}\"\n @change=\"${(e: CustomEvent) =>\n this.handleNewFieldChange(fieldName, e.detail.value)}\"\n ></temba-array-editor>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n\n case 'checkbox': {\n const checkboxConfig = config as CheckboxFieldConfig;\n return html`<div class=\"form-field\">\n <temba-checkbox\n name=\"${fieldName}\"\n label=\"${config.label}\"\n .helpText=\"${config.helpText || ''}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n ?checked=\"${value || false}\"\n size=\"${checkboxConfig.size || 1.2}\"\n animateChange=\"${checkboxConfig.animateChange || 'pulse'}\"\n @change=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-checkbox>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n }\n\n default:\n return html`<div>Unsupported field type: ${(config as any).type}</div>`;\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 expandGroupsWithErrors(errors: { [key: string]: string }): void {\n if (!this.action) return;\n\n const config = ACTION_CONFIG[this.action.type];\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,\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,\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,\n renderedFields: Set<string>\n ): TemplateResult {\n const {\n label,\n items,\n collapsible = false,\n collapsed = false,\n helpText\n } = groupConfig;\n\n // Initialize collapse state if not set\n if (collapsible && !(label in this.groupCollapseState)) {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: collapsed\n };\n }\n\n const isCollapsed = collapsible\n ? this.groupCollapseState[label] ?? 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 return html`\n <div\n class=\"form-group ${collapsible ? 'collapsible' : ''} ${groupHasErrors\n ? 'has-errors'\n : ''}\"\n >\n <div\n class=\"form-group-header ${collapsible ? 'clickable' : ''}\"\n @click=${collapsible\n ? () => this.handleGroupToggle(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\">${helpText}</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`<temba-icon\n name=\"arrow_right\"\n size=\"1.5\"\n class=\"group-toggle-icon ${isCollapsed\n ? 'collapsed'\n : 'expanded'}\"\n ></temba-icon>`\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\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\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 // Trigger re-render\n this.requestUpdate();\n }\n\n private renderFields(): TemplateResult {\n if (!this.action) {\n return html` <div>No action selected</div> `;\n }\n\n const config = ACTION_CONFIG[this.action.type];\n if (!config) {\n return html` <div>No configuration available for this action</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 return html`\n ${config.layout.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n ${\n /* Render any fields not explicitly placed in layout */\n Object.entries(config.form).map(([fieldName, fieldConfig]) => {\n if (!renderedFields.has(fieldName)) {\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 return html` <div>No form configuration available</div> `;\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 nodeConfig = this.getNodeConfig();\n const actionConfig = ACTION_CONFIG[this.action?.type];\n\n return html`\n <temba-dialog\n header=\"${actionConfig?.name || nodeConfig?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${nodeConfig?.router?.configurable\n ? this.renderRouterSection()\n : null}\n </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 SelectFieldConfig,\n CheckboxFieldConfig,\n TextareaFieldConfig,\n MessageEditorFieldConfig,\n LayoutItem,\n RowLayoutConfig,\n GroupLayoutConfig\n} from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\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(255, 255, 255, 0.8);\n --color-bubble-border: #999;\n --color-bubble-text: #777;\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: end;\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: 1px;\n border-color: var(--color-bubble-border, #aaa);\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 }\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 }\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 (changedProperties.has('node') || changedProperties.has('action')) {\n if (this.node || this.action) {\n this.openDialog();\n } else {\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 closeDialog(): void {\n this.isOpen = false;\n this.formData = {};\n this.errors = {};\n this.groupCollapseState = {};\n this.groupHoverState = {};\n }\n\n private initializeFormData(): void {\n if (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 // Apply smart transformations for select fields that expect {name, value} format\n this.applySmartSelectTransformations(actionConfig);\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 this.formData = processed;\n }\n\n private applySmartSelectTransformations(actionConfig: ActionConfig): void {\n if (!actionConfig) return;\n\n const fields = actionConfig.form;\n if (!fields) return;\n\n Object.entries(fields).forEach(([fieldName, fieldConfig]) => {\n if (this.shouldApplySmartSelectTransformation(fieldName, fieldConfig)) {\n const value = this.formData[fieldName];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n ) {\n // Transform string array to select options format\n this.formData[fieldName] = value.map((item: string) => ({\n name: item,\n value: item\n }));\n }\n }\n });\n }\n\n private shouldApplySmartSelectTransformation(\n fieldName: string,\n fieldConfig: any\n ): boolean {\n const selectConfig = fieldConfig as SelectFieldConfig;\n return (\n (fieldConfig.type === 'select' &&\n (selectConfig.multi || selectConfig.tags) &&\n // Don't transform if already has explicit transformations\n !this.action) ||\n !ACTION_CONFIG[this.action.type]?.toFormData\n );\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n if (this.action) {\n const actionConfig = ACTION_CONFIG[this.action.type];\n const fields = actionConfig?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n return false;\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 if (this.action) {\n // Action editing mode\n const actionConfig = ACTION_CONFIG[this.action.type];\n return actionConfig?.color || '#666666';\n } else if (this.node) {\n // Node editing mode\n const nodeConfig = this.getNodeConfig();\n return nodeConfig?.color || '#666666';\n }\n return '#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\n if (this.action) {\n // Action validation using fields configuration\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n // Check if new field configuration system is available\n if (actionConfig?.form) {\n Object.entries(actionConfig?.form).forEach(\n ([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\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\n // Run custom validation if available\n if (actionConfig?.validate) {\n // Convert form data back to action for validation\n let actionForValidation: Action;\n\n if (actionConfig.sanitize) {\n actionConfig.sanitize(this.formData);\n }\n\n if (actionConfig.fromFormData) {\n actionForValidation = actionConfig.fromFormData(this.formData);\n } else {\n actionForValidation = { ...this.action, ...this.formData } as Action;\n }\n\n const customValidation = actionConfig.validate(actionForValidation);\n Object.assign(errors, customValidation.errors);\n }\n } else if (this.node) {\n // Node validation\n const nodeConfig = this.getNodeConfig();\n\n // Check required fields from node properties\n if (nodeConfig?.properties) {\n Object.entries(nodeConfig.properties).forEach(\n ([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n\n // Check required fields\n if (\n fieldConfig.required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n fieldConfig.label || fieldName\n } is required`;\n }\n }\n );\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 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 // Apply smart select transformations in reverse and provide default 1:1 mapping\n const processedFormData = this.reverseSmartSelectTransformations(\n formData,\n actionConfig\n );\n return { ...this.action, ...processedFormData };\n }\n }\n\n private reverseSmartSelectTransformations(\n formData: any,\n actionConfig: ActionConfig\n ): any {\n if (!actionConfig || !actionConfig.form) return formData;\n const processed = { ...formData };\n\n Object.entries(actionConfig.form).forEach(([fieldName, fieldConfig]) => {\n if (this.shouldApplySmartSelectTransformation(fieldName, fieldConfig)) {\n const value = processed[fieldName];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'value' in value[0]\n ) {\n // Transform select options format back to string array\n processed[fieldName] = value.map(\n (item: any) => item.value || item.name || item\n );\n }\n }\n });\n\n return processed;\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 (\n target.tagName === 'TEMBA-SELECT' &&\n (target.multi || target.emails || target.tags)\n ) {\n value = target.values || [];\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 if (!this.action) return;\n\n const config = ACTION_CONFIG[this.action.type];\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 if (!this.action) return;\n\n const config = ACTION_CONFIG[this.action.type];\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 switch (config.type) {\n case 'text':\n return html`<temba-textinput\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-textinput>`;\n\n case 'textarea': {\n const textareaConfig = config as TextareaFieldConfig;\n const minHeightStyle = textareaConfig.minHeight\n ? `--textarea-min-height: ${textareaConfig.minHeight}px;`\n : '';\n\n if (config.evaluated) {\n return html`<temba-completion\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n textarea\n expressions=\"session\"\n style=\"${minHeightStyle}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-completion>`;\n } else {\n return html`<temba-textinput\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n placeholder=\"${config.placeholder || ''}\"\n textarea\n .rows=\"${textareaConfig.rows || 3}\"\n style=\"${minHeightStyle}\"\n .helpText=\"${config.helpText || ''}\"\n @input=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-textinput>`;\n }\n }\n\n case 'select': {\n const selectConfig = config as SelectFieldConfig;\n return html`<temba-select\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .values=\"${value || (selectConfig.multi ? [] : '')}\"\n ?multi=\"${selectConfig.multi}\"\n ?searchable=\"${selectConfig.searchable}\"\n ?tags=\"${selectConfig.tags}\"\n ?emails=\"${selectConfig.emails}\"\n placeholder=\"${selectConfig.placeholder || ''}\"\n maxItems=\"${selectConfig.maxItems || 0}\"\n valueKey=\"${selectConfig.valueKey || 'value'}\"\n nameKey=\"${selectConfig.nameKey || 'name'}\"\n endpoint=\"${selectConfig.endpoint || ''}\"\n .helpText=\"${config.helpText || ''}\"\n flavor=\"${selectConfig.flavor || 'small'}\"\n @change=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n >\n ${selectConfig.options?.map((option: any) => {\n if (typeof option === 'string') {\n return html`<temba-option\n name=\"${option}\"\n value=\"${option}\"\n ></temba-option>`;\n } else {\n return html`<temba-option\n name=\"${option.label || option.name}\"\n value=\"${option.value}\"\n ></temba-option>`;\n }\n })}\n </temba-select>`;\n }\n\n case 'key-value':\n return html`<div class=\"form-field\">\n <label>${config.label}${config.required ? ' *' : ''}</label>\n <temba-key-value-editor\n name=\"${fieldName}\"\n .value=\"${value || []}\"\n .sortable=\"${config.sortable}\"\n .keyPlaceholder=\"${config.keyPlaceholder || 'Key'}\"\n .valuePlaceholder=\"${config.valuePlaceholder || 'Value'}\"\n .minRows=\"${config.minRows || 0}\"\n @change=\"${(e: CustomEvent) => {\n if (e.detail) {\n this.handleNewFieldChange(fieldName, e.detail.value);\n }\n }}\"\n ></temba-key-value-editor>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n\n case 'array':\n return html`<div class=\"form-field\">\n <label>${config.label}${config.required ? ' *' : ''}</label>\n <temba-array-editor\n .value=\"${value || []}\"\n .itemConfig=\"${config.itemConfig}\"\n .sortable=\"${config.sortable}\"\n .itemLabel=\"${config.itemLabel || 'Item'}\"\n .minItems=\"${config.minItems || 0}\"\n .maxItems=\"${config.maxItems || 0}\"\n .onItemChange=\"${config.onItemChange}\"\n .isEmptyItemFn=\"${config.isEmptyItem}\"\n @change=\"${(e: Event) =>\n this.handleNewFieldChange(fieldName, (e.target as any).value)}\"\n ></temba-array-editor>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n\n case 'checkbox': {\n const checkboxConfig = config as CheckboxFieldConfig;\n return html`<div class=\"form-field\">\n <temba-checkbox\n name=\"${fieldName}\"\n label=\"${config.label}\"\n .helpText=\"${config.helpText || ''}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n ?checked=\"${value || false}\"\n size=\"${checkboxConfig.size || 1.2}\"\n animateChange=\"${checkboxConfig.animateChange || 'pulse'}\"\n @change=\"${(e: Event) => this.handleFormFieldChange(fieldName, e)}\"\n ></temba-checkbox>\n ${errors.length\n ? html`<div class=\"field-errors\">${errors.join(', ')}</div>`\n : ''}\n </div>`;\n }\n\n case 'message-editor': {\n const messageConfig = config as MessageEditorFieldConfig;\n return html`<temba-message-editor\n name=\"${fieldName}\"\n label=\"${config.label}\"\n ?required=\"${config.required}\"\n .errors=\"${errors}\"\n .value=\"${value || ''}\"\n .attachments=\"${this.formData.attachments || []}\"\n placeholder=\"${messageConfig.placeholder || ''}\"\n .helpText=\"${config.helpText || ''}\"\n ?autogrow=\"${messageConfig.autogrow}\"\n ?gsm=\"${messageConfig.gsm}\"\n ?disableCompletion=\"${messageConfig.disableCompletion}\"\n counter=\"${messageConfig.counter || ''}\"\n accept=\"${messageConfig.accept || ''}\"\n endpoint=\"${messageConfig.endpoint || ''}\"\n max-attachments=\"${messageConfig.maxAttachments || 3}\"\n minHeight=\"${messageConfig.minHeight || 60}\"\n @change=\"${(e: Event) =>\n this.handleMessageEditorChange(fieldName, e)}\"\n ></temba-message-editor>`;\n }\n\n default:\n return html`<div>Unsupported field type: ${(config as any).type}</div>`;\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 if (!this.action) return;\n\n const config = ACTION_CONFIG[this.action.type];\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,\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,\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,\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\">${helpText}</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\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\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 if (!this.action) {\n return html` <div>No action selected</div> `;\n }\n\n const config = ACTION_CONFIG[this.action.type];\n if (!config) {\n return html` <div>No configuration available for this action</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 return html`\n ${config.layout.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n ${\n /* Render any fields not explicitly placed in layout */\n Object.entries(config.form).map(([fieldName, fieldConfig]) => {\n if (!renderedFields.has(fieldName)) {\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 return html` <div>No form configuration available</div> `;\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 nodeConfig = this.getNodeConfig();\n const actionConfig = ACTION_CONFIG[this.action?.type];\n\n return html`\n <temba-dialog\n header=\"${actionConfig?.name || nodeConfig?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${nodeConfig?.router?.configurable\n ? this.renderRouterSection()\n : null}\n </div>\n </temba-dialog>\n `;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StickyNote.js","sourceRoot":"","sources":["../../../src/flow/StickyNote.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { StickyNote as StickyNoteData } from '../store/flow-definition';\nimport { getStore } from '../store/Store';\n\nexport class StickyNote extends RapidElement {\n @property({ type: String })\n public uuid: string;\n\n @property({ type: Object })\n public data: StickyNoteData;\n\n @property({ type: Boolean })\n private dragging = false;\n\n @property({ type: Boolean })\n public selected = false;\n\n @property({ type: Boolean })\n private colorPickerExpanded = false;\n\n static get styles() {\n return css`\n :host {\n --sticky-color: #fef08a;\n --sticky-border-color: #facc15;\n --sticky-text-color: #451a03;\n --curvature: 8px;\n }\n\n .sticky-note {\n width: 200px;\n background-color: var(--sticky-color);\n border: 1px solid var(--sticky-border-color);\n border-radius: var(--curvature);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n font-size: 12px;\n overflow: hidden;\n transition: transform 0.1s ease, box-shadow 0.2s ease;\n color: var(--sticky-text-color);\n opacity: 0.85;\n }\n\n .sticky-note.dragging {\n opacity: 0.7;\n z-index: 1000;\n transform: rotate(0deg);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);\n }\n\n .sticky-note:hover {\n transform: translateY(0px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n }\n\n /* Color themes */\n .sticky-note.yellow {\n --sticky-color: #fef08a;\n --sticky-border-color: #facc15;\n --sticky-text-color: #451a03;\n }\n .sticky-note.blue {\n --sticky-color: #bfdbfe;\n --sticky-border-color: #3b82f6;\n --sticky-text-color: #1e3a8a;\n }\n .sticky-note.pink {\n --sticky-color: #fce7f3;\n --sticky-border-color: #ec4899;\n --sticky-text-color: #831843;\n }\n .sticky-note.green {\n --sticky-color: #d1fae5;\n --sticky-border-color: #10b981;\n --sticky-text-color: #064e3b;\n }\n .sticky-note.gray {\n --sticky-color: #f3f4f6;\n --sticky-border-color: #6b7280;\n --sticky-text-color: #374151;\n }\n\n /* Title and body containers */\n .sticky-title-container {\n position: relative;\n border-bottom: 1px solid var(--sticky-border-color);\n background-color: rgba(255, 255, 255, 0.5);\n display: flex;\n align-items: center;\n }\n .sticky-body-container {\n position: relative;\n }\n\n /* Editable fields */\n [contenteditable='true'] {\n margin: 2px;\n padding: 4px 8px;\n outline: none;\n border-radius: var(--curvature);\n transition: background 0.2s;\n }\n [contenteditable='true']:focus {\n background-color: rgba(255, 255, 255, 0.8);\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n outline-color: var(--sticky-border-color);\n }\n\n /* Title */\n .sticky-title {\n font-weight: 600;\n font-size: 13px;\n color: var(--sticky-text-color);\n min-height: 20px;\n line-height: 20px;\n border-top-left-radius: var(--curvature);\n border-top-right-radius: var(--curvature);\n flex-grow: 1;\n padding-left: 8px;\n }\n .sticky-title:empty::before {\n content: 'Click to add title';\n opacity: 0.5;\n font-style: italic;\n }\n .sticky-title:focus {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n /* Body */\n .sticky-body {\n padding: 8px 10px;\n color: var(--sticky-text-color);\n line-height: 1.4;\n min-height: 48px;\n word-wrap: break-word;\n white-space: pre-wrap;\n }\n .sticky-body:empty::before {\n content: 'Click to add note';\n opacity: 0.5;\n font-style: italic;\n }\n .sticky-body:focus {\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n }\n\n /* Drag icon */\n .sticky-title-container > .drag-handle {\n --icon-color: var(--sticky-border-color);\n cursor: move;\n max-width: 20px;\n padding-left: 8px;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n\n .sticky-note:hover .drag-handle {\n }\n\n .sticky-note:focus-within .sticky-title-container > .drag-handle {\n }\n\n /* Focus/active states */\n .sticky-note:focus-within {\n box-shadow: 0 0 0 1px var(--sticky-border-color),\n 0 10px 20px rgba(0, 0, 0, 0.3);\n }\n\n .sticky-note:focus-within .drag-handle {\n max-width: 0px;\n padding-left: 0px;\n }\n\n /* Color picker */\n .color-picker {\n position: absolute;\n bottom: 4px;\n right: 4px;\n width: 8px;\n height: 8px;\n border: 1px solid rgba(0, 0, 0, 0.2);\n\n border-radius: 3px;\n background-color: var(--sticky-color);\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n\n .color-picker:hover {\n transform: scale(1.1);\n }\n\n .color-options {\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n gap: 4px;\n background-color: rgba(255, 255, 255, 0.9);\n border: 1px solid #ccc;\n border-radius: 6px;\n padding: 3px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform-origin: bottom right;\n transform: scale(0);\n opacity: 0;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: 1000;\n }\n\n .color-options.expanded {\n transform: scale(1);\n opacity: 1;\n }\n\n .color-option {\n width: 12px;\n height: 12px;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n cursor: pointer;\n transition: transform 0.15s ease, border-color 0.15s ease;\n }\n\n .color-option:hover {\n transform: scale(1.1);\n border-color: rgba(0, 0, 0, 0.4);\n }\n\n .color-option.yellow {\n background-color: #fef08a;\n }\n\n .color-option.blue {\n background-color: #bfdbfe;\n }\n\n .color-option.pink {\n background-color: #fce7f3;\n }\n\n .color-option.green {\n background-color: #d1fae5;\n }\n\n .color-option.gray {\n background-color: #f3f4f6;\n }\n `;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('data') || changes.has('uuid')) {\n this.updateCanvasSize();\n }\n }\n\n private updateCanvasSize(): void {\n if (!this.data) {\n return;\n }\n\n const element = this.querySelector('.sticky-note');\n if (element) {\n const rect = element.getBoundingClientRect();\n getStore()\n .getState()\n .expandCanvas(\n this.data.position.left + rect.width,\n this.data.position.top + rect.height\n );\n }\n }\n\n private handleTitleBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n const newTitle = target.textContent || '';\n\n if (this.data && newTitle !== this.data.title) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n title: newTitle\n });\n }\n this.requestUpdate();\n }\n\n private handleBodyBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n const newBody = target.textContent || '';\n\n if (this.data && newBody !== this.data.body) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n body: newBody\n });\n }\n this.requestUpdate();\n }\n\n private handleContentMouseDown(event: MouseEvent): void {\n // If this sticky note is selected, don't stop propagation\n // so that group dragging can work\n if (this.selected) {\n return;\n }\n // Otherwise, stop propagation to enable editing\n event.stopPropagation();\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n (event.target as HTMLElement).blur();\n }\n if (event.key === 'Escape') {\n (event.target as HTMLElement).blur();\n }\n }\n\n private handleColorPickerMouseEnter(): void {\n this.colorPickerExpanded = true;\n }\n\n private handleColorPickerMouseLeave(): void {\n this.colorPickerExpanded = false;\n }\n\n private handleColorOptionClick(\n event: MouseEvent,\n color: 'yellow' | 'blue' | 'pink' | 'green' | 'gray'\n ): void {\n event.stopPropagation();\n\n if (this.data && color !== this.data.color) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n color: color\n });\n }\n\n this.colorPickerExpanded = false;\n this.requestUpdate();\n }\n\n public render(): TemplateResult {\n if (!this.data) {\n return html`<div class=\"sticky-note\" style=\"display: none;\"></div>`;\n }\n\n const style = `left: ${this.data.position.left}px; top: ${this.data.position.top}px;`;\n\n return html`\n <div\n class=\"sticky-note ${this.data.color} ${this.dragging\n ? 'dragging'\n : ''}\"\n style=\"${style}\"\n data-uuid=\"${this.uuid}\"\n >\n <div class=\"sticky-title-container\">\n <temba-icon name=\"drag\" class=\"drag-handle\"></temba-icon>\n <div\n class=\"sticky-title\"\n contenteditable=\"true\"\n @blur=\"${this.handleTitleBlur}\"\n @keydown=\"${this.handleKeyDown}\"\n @mousedown=\"${this.handleContentMouseDown}\"\n .textContent=\"${this.data.title}\"\n ></div>\n </div>\n <div class=\"sticky-body-container\">\n <div\n class=\"sticky-body\"\n contenteditable=\"true\"\n @blur=\"${this.handleBodyBlur}\"\n @keydown=\"${this.handleKeyDown}\"\n @mousedown=\"${this.handleContentMouseDown}\"\n .textContent=\"${this.data.body}\"\n ></div>\n <div class=\"edit-icon\" title=\"Edit note\"></div>\n\n <!-- Color picker -->\n <div\n class=\"color-picker\"\n @mouseenter=\"${this.handleColorPickerMouseEnter}\"\n @mouseleave=\"${this.handleColorPickerMouseLeave}\"\n >\n <div\n class=\"color-options ${this.colorPickerExpanded\n ? 'expanded'\n : ''}\"\n >\n <div\n class=\"color-option yellow\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'yellow')}\"\n ></div>\n <div\n class=\"color-option blue\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'blue')}\"\n ></div>\n <div\n class=\"color-option pink\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'pink')}\"\n ></div>\n <div\n class=\"color-option green\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'green')}\"\n ></div>\n <div\n class=\"color-option gray\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'gray')}\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"StickyNote.js","sourceRoot":"","sources":["../../../src/flow/StickyNote.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { StickyNote as StickyNoteData } from '../store/flow-definition';\nimport { getStore } from '../store/Store';\n\nexport class StickyNote extends RapidElement {\n @property({ type: String })\n public uuid: string;\n\n @property({ type: Object })\n public data: StickyNoteData;\n\n @property({ type: Boolean })\n private dragging = false;\n\n @property({ type: Boolean })\n public selected = false;\n\n @property({ type: Boolean })\n private colorPickerExpanded = false;\n\n static get styles() {\n return css`\n :host {\n --sticky-color: #fef08a;\n --sticky-border-color: #facc15;\n --sticky-text-color: #451a03;\n --curvature: 8px;\n }\n\n .sticky-note {\n width: 182px;\n background-color: var(--sticky-color);\n border: 1px solid var(--sticky-border-color);\n border-radius: var(--curvature);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n font-size: 12px;\n overflow: hidden;\n transition: transform 0.1s ease, box-shadow 0.2s ease;\n color: var(--sticky-text-color);\n opacity: 0.85;\n }\n\n .sticky-note.dragging {\n opacity: 0.7;\n z-index: 1000;\n transform: rotate(0deg);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);\n }\n\n .sticky-note:hover {\n transform: translateY(0px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n }\n\n /* Color themes */\n .sticky-note.yellow {\n --sticky-color: #fef08a;\n --sticky-border-color: #facc15;\n --sticky-text-color: #451a03;\n }\n .sticky-note.blue {\n --sticky-color: #bfdbfe;\n --sticky-border-color: #3b82f6;\n --sticky-text-color: #1e3a8a;\n }\n .sticky-note.pink {\n --sticky-color: #fce7f3;\n --sticky-border-color: #ec4899;\n --sticky-text-color: #831843;\n }\n .sticky-note.green {\n --sticky-color: #d1fae5;\n --sticky-border-color: #10b981;\n --sticky-text-color: #064e3b;\n }\n .sticky-note.gray {\n --sticky-color: #f3f4f6;\n --sticky-border-color: #6b7280;\n --sticky-text-color: #374151;\n }\n\n /* Title and body containers */\n .sticky-title-container {\n position: relative;\n border-bottom: 1px solid var(--sticky-border-color);\n background-color: rgba(255, 255, 255, 0.5);\n display: flex;\n align-items: center;\n }\n .sticky-body-container {\n position: relative;\n }\n\n /* Editable fields */\n [contenteditable='true'] {\n margin: 2px;\n padding: 4px 8px;\n outline: none;\n border-radius: var(--curvature);\n transition: background 0.2s;\n }\n [contenteditable='true']:focus {\n background-color: rgba(255, 255, 255, 0.8);\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n outline-color: var(--sticky-border-color);\n }\n\n /* Title */\n .sticky-title {\n font-weight: 600;\n font-size: 13px;\n color: var(--sticky-text-color);\n min-height: 20px;\n line-height: 20px;\n border-top-left-radius: var(--curvature);\n border-top-right-radius: var(--curvature);\n flex-grow: 1;\n padding-left: 8px;\n }\n .sticky-title:empty::before {\n content: 'Click to add title';\n opacity: 0.5;\n font-style: italic;\n }\n .sticky-title:focus {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n /* Body */\n .sticky-body {\n padding: 8px 10px;\n color: var(--sticky-text-color);\n line-height: 1.4;\n min-height: 48px;\n word-wrap: break-word;\n white-space: pre-wrap;\n }\n .sticky-body:empty::before {\n content: 'Click to add note';\n opacity: 0.5;\n font-style: italic;\n }\n .sticky-body:focus {\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n }\n\n /* Drag icon */\n .sticky-title-container > .drag-handle {\n --icon-color: var(--sticky-border-color);\n cursor: move;\n max-width: 20px;\n padding-left: 8px;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n\n .sticky-note:hover .drag-handle {\n }\n\n .sticky-note:focus-within .sticky-title-container > .drag-handle {\n }\n\n /* Focus/active states */\n .sticky-note:focus-within {\n box-shadow: 0 0 0 1px var(--sticky-border-color),\n 0 10px 20px rgba(0, 0, 0, 0.3);\n }\n\n .sticky-note:focus-within .drag-handle {\n max-width: 0px;\n padding-left: 0px;\n }\n\n /* Color picker */\n .color-picker {\n position: absolute;\n bottom: 4px;\n right: 4px;\n width: 8px;\n height: 8px;\n border: 1px solid rgba(0, 0, 0, 0.2);\n\n border-radius: 3px;\n background-color: var(--sticky-color);\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n\n .color-picker:hover {\n transform: scale(1.1);\n }\n\n .color-options {\n position: absolute;\n bottom: 0;\n right: 0;\n display: flex;\n gap: 4px;\n background-color: rgba(255, 255, 255, 0.9);\n border: 1px solid #ccc;\n border-radius: 6px;\n padding: 3px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform-origin: bottom right;\n transform: scale(0);\n opacity: 0;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: 1000;\n }\n\n .color-options.expanded {\n transform: scale(1);\n opacity: 1;\n }\n\n .color-option {\n width: 12px;\n height: 12px;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 3px;\n cursor: pointer;\n transition: transform 0.15s ease, border-color 0.15s ease;\n }\n\n .color-option:hover {\n transform: scale(1.1);\n border-color: rgba(0, 0, 0, 0.4);\n }\n\n .color-option.yellow {\n background-color: #fef08a;\n }\n\n .color-option.blue {\n background-color: #bfdbfe;\n }\n\n .color-option.pink {\n background-color: #fce7f3;\n }\n\n .color-option.green {\n background-color: #d1fae5;\n }\n\n .color-option.gray {\n background-color: #f3f4f6;\n }\n `;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('data') || changes.has('uuid')) {\n this.updateCanvasSize();\n }\n }\n\n private updateCanvasSize(): void {\n if (!this.data) {\n return;\n }\n\n const element = this.querySelector('.sticky-note');\n if (element) {\n const rect = element.getBoundingClientRect();\n getStore()\n .getState()\n .expandCanvas(\n this.data.position.left + rect.width,\n this.data.position.top + rect.height\n );\n }\n }\n\n private handleTitleBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n const newTitle = target.textContent || '';\n\n if (this.data && newTitle !== this.data.title) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n title: newTitle\n });\n }\n this.requestUpdate();\n }\n\n private handleBodyBlur(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n const newBody = target.textContent || '';\n\n if (this.data && newBody !== this.data.body) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n body: newBody\n });\n }\n this.requestUpdate();\n }\n\n private handleContentMouseDown(event: MouseEvent): void {\n // If this sticky note is selected, don't stop propagation\n // so that group dragging can work\n if (this.selected) {\n return;\n }\n // Otherwise, stop propagation to enable editing\n event.stopPropagation();\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n (event.target as HTMLElement).blur();\n }\n if (event.key === 'Escape') {\n (event.target as HTMLElement).blur();\n }\n }\n\n private handleColorPickerMouseEnter(): void {\n this.colorPickerExpanded = true;\n }\n\n private handleColorPickerMouseLeave(): void {\n this.colorPickerExpanded = false;\n }\n\n private handleColorOptionClick(\n event: MouseEvent,\n color: 'yellow' | 'blue' | 'pink' | 'green' | 'gray'\n ): void {\n event.stopPropagation();\n\n if (this.data && color !== this.data.color) {\n getStore()\n .getState()\n .updateStickyNote(this.uuid, {\n ...this.data,\n color: color\n });\n }\n\n this.colorPickerExpanded = false;\n this.requestUpdate();\n }\n\n public render(): TemplateResult {\n if (!this.data) {\n return html`<div class=\"sticky-note\" style=\"display: none;\"></div>`;\n }\n\n const style = `left: ${this.data.position.left}px; top: ${this.data.position.top}px;`;\n\n return html`\n <div\n class=\"sticky-note ${this.data.color} ${this.dragging\n ? 'dragging'\n : ''}\"\n style=\"${style}\"\n data-uuid=\"${this.uuid}\"\n >\n <div class=\"sticky-title-container\">\n <temba-icon name=\"drag\" class=\"drag-handle\"></temba-icon>\n <div\n class=\"sticky-title\"\n contenteditable=\"true\"\n @blur=\"${this.handleTitleBlur}\"\n @keydown=\"${this.handleKeyDown}\"\n @mousedown=\"${this.handleContentMouseDown}\"\n .textContent=\"${this.data.title}\"\n ></div>\n </div>\n <div class=\"sticky-body-container\">\n <div\n class=\"sticky-body\"\n contenteditable=\"true\"\n @blur=\"${this.handleBodyBlur}\"\n @keydown=\"${this.handleKeyDown}\"\n @mousedown=\"${this.handleContentMouseDown}\"\n .textContent=\"${this.data.body}\"\n ></div>\n <div class=\"edit-icon\" title=\"Edit note\"></div>\n\n <!-- Color picker -->\n <div\n class=\"color-picker\"\n @mouseenter=\"${this.handleColorPickerMouseEnter}\"\n @mouseleave=\"${this.handleColorPickerMouseLeave}\"\n >\n <div\n class=\"color-options ${this.colorPickerExpanded\n ? 'expanded'\n : ''}\"\n >\n <div\n class=\"color-option yellow\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'yellow')}\"\n ></div>\n <div\n class=\"color-option blue\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'blue')}\"\n ></div>\n <div\n class=\"color-option pink\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'pink')}\"\n ></div>\n <div\n class=\"color-option green\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'green')}\"\n ></div>\n <div\n class=\"color-option gray\"\n @click=\"${(e: MouseEvent) =>\n this.handleColorOptionClick(e, 'gray')}\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n"]}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { html } from 'lit-html';
|
|
2
2
|
import { COLORS } from '../types';
|
|
3
|
+
const defaultPost = `@(json(object(
|
|
4
|
+
"contact", object(
|
|
5
|
+
"uuid", contact.uuid,
|
|
6
|
+
"name", contact.name,
|
|
7
|
+
"urn", contact.urn
|
|
8
|
+
),
|
|
9
|
+
"flow", object(
|
|
10
|
+
"uuid", run.flow.uuid,
|
|
11
|
+
"name", run.flow.name
|
|
12
|
+
),
|
|
13
|
+
"results", foreach_value(results, extract_object, "value", "category")
|
|
14
|
+
)))`;
|
|
3
15
|
export const call_webhook = {
|
|
4
16
|
name: 'Call Webhook',
|
|
5
17
|
color: COLORS.call,
|
|
@@ -17,7 +29,7 @@ export const call_webhook = {
|
|
|
17
29
|
required: true,
|
|
18
30
|
options: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH'],
|
|
19
31
|
maxWidth: '120px',
|
|
20
|
-
searchable:
|
|
32
|
+
searchable: false
|
|
21
33
|
},
|
|
22
34
|
url: {
|
|
23
35
|
type: 'text',
|
|
@@ -43,22 +55,10 @@ export const call_webhook = {
|
|
|
43
55
|
const method = Array.isArray(values.method) && values.method.length > 0
|
|
44
56
|
? values.method[0].value || values.method[0].name
|
|
45
57
|
: values.method;
|
|
46
|
-
const defaultTemplate = `@(json(object(
|
|
47
|
-
"contact", object(
|
|
48
|
-
"uuid", contact.uuid,
|
|
49
|
-
"name", contact.name,
|
|
50
|
-
"urn", contact.urn
|
|
51
|
-
),
|
|
52
|
-
"flow", object(
|
|
53
|
-
"uuid", run.flow.uuid,
|
|
54
|
-
"name", run.flow.name
|
|
55
|
-
),
|
|
56
|
-
"results", foreach_value(results, extract_object, "value", "category")
|
|
57
|
-
)))`;
|
|
58
58
|
if (method === 'POST') {
|
|
59
59
|
// For POST, provide the template if body is empty or was never set by user
|
|
60
60
|
if (!currentValue || currentValue.trim() === '') {
|
|
61
|
-
return
|
|
61
|
+
return defaultPost;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
else {
|
|
@@ -70,7 +70,7 @@ export const call_webhook = {
|
|
|
70
70
|
if (isOriginallyEmpty ||
|
|
71
71
|
!currentValue ||
|
|
72
72
|
currentValue.trim() === '' ||
|
|
73
|
-
currentValue.trim() ===
|
|
73
|
+
currentValue.trim() === defaultPost.trim()) {
|
|
74
74
|
return '';
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -88,7 +88,11 @@ export const call_webhook = {
|
|
|
88
88
|
items: ['headers'],
|
|
89
89
|
collapsible: true,
|
|
90
90
|
collapsed: true,
|
|
91
|
-
helpText: 'Configure authentication or custom headers'
|
|
91
|
+
helpText: 'Configure authentication or custom headers',
|
|
92
|
+
getGroupValueCount: (formData) => {
|
|
93
|
+
var _a;
|
|
94
|
+
return ((_a = formData.headers) === null || _a === void 0 ? void 0 : _a.length) + 10 || 0;
|
|
95
|
+
}
|
|
92
96
|
},
|
|
93
97
|
{
|
|
94
98
|
type: 'group',
|
|
@@ -96,7 +100,12 @@ export const call_webhook = {
|
|
|
96
100
|
items: ['body'],
|
|
97
101
|
collapsible: true,
|
|
98
102
|
collapsed: true,
|
|
99
|
-
helpText: 'Configure the request payload'
|
|
103
|
+
helpText: 'Configure the request payload',
|
|
104
|
+
getGroupValueCount: (formData) => {
|
|
105
|
+
return !!(formData.body &&
|
|
106
|
+
formData.body.trim() !== '' &&
|
|
107
|
+
formData.body !== defaultPost);
|
|
108
|
+
}
|
|
100
109
|
}
|
|
101
110
|
],
|
|
102
111
|
toFormData: (action) => {
|