@nyaruka/temba-components 0.129.7 → 0.129.9
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 +29 -0
- package/demo/components/flow/example.html +1 -1
- package/demo/components/message-editor/example.html +125 -0
- package/demo/components/textinput/completion.html +1 -0
- package/demo/data/flows/food-order.json +12 -21
- package/demo/data/flows/sample-flow.json +210 -104
- package/dist/temba-components.js +715 -364
- 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/excellent/helpers.js +2 -2
- package/out-tsc/src/excellent/helpers.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +25 -7
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +11 -1
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +342 -276
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +40 -0
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/call_llm.js +56 -3
- package/out-tsc/src/flow/actions/call_llm.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/open_ticket.js +65 -3
- package/out-tsc/src/flow/actions/open_ticket.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +147 -6
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +75 -0
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/config.js +4 -0
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +227 -0
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_ticket.js +18 -0
- package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js +27 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/types.js +0 -65
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +87 -57
- 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/FieldRenderer.js +305 -0
- package/out-tsc/src/form/FieldRenderer.js.map +1 -0
- package/out-tsc/src/form/FormField.js +4 -4
- 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 +13 -6
- package/out-tsc/src/form/TextInput.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +52 -24
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +66 -15
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/markdown.js +13 -11
- package/out-tsc/src/markdown.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/ActionHelper.js +2 -0
- package/out-tsc/test/ActionHelper.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +148 -0
- package/out-tsc/test/NodeHelper.js.map +1 -0
- package/out-tsc/test/actions/call_llm.test.js +103 -0
- package/out-tsc/test/actions/call_llm.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js +532 -0
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_random.test.js +150 -0
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js +150 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_response.test.js +171 -0
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -0
- package/out-tsc/test/temba-add-input-labels.test.js +70 -0
- package/out-tsc/test/temba-add-input-labels.test.js.map +1 -0
- 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-field-renderer.test.js +296 -0
- package/out-tsc/test/temba-field-renderer.test.js.map +1 -0
- package/out-tsc/test/temba-markdown.test.js +1 -1
- package/out-tsc/test/temba-markdown.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 +471 -0
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +7 -4
- 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 +5 -1
- 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/call_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/summarization.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/actions/call_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/actions/call_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/actions/call_llm/render/summarization.png +0 -0
- package/screenshots/truth/actions/call_llm/render/translation-task.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/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_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/editor/router.png +0 -0
- package/screenshots/truth/editor/send_msg.png +0 -0
- package/screenshots/truth/editor/set_contact_language.png +0 -0
- package/screenshots/truth/editor/set_contact_name.png +0 -0
- package/screenshots/truth/editor/set_run_result.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-checked.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-unchecked.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-with-errors.png +0 -0
- package/screenshots/truth/field-renderer/context-comparison.png +0 -0
- package/screenshots/truth/field-renderer/key-value-with-label.png +0 -0
- package/screenshots/truth/field-renderer/message-editor-with-label.png +0 -0
- package/screenshots/truth/field-renderer/select-multi.png +0 -0
- package/screenshots/truth/field-renderer/select-no-label.png +0 -0
- package/screenshots/truth/field-renderer/select-with-label.png +0 -0
- package/screenshots/truth/field-renderer/text-evaluated.png +0 -0
- package/screenshots/truth/field-renderer/text-no-label.png +0 -0
- package/screenshots/truth/field-renderer/text-with-errors.png +0 -0
- package/screenshots/truth/field-renderer/text-with-label.png +0 -0
- package/screenshots/truth/field-renderer/textarea-evaluated.png +0 -0
- package/screenshots/truth/field-renderer/textarea-with-label.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/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/screenshots/truth/omnibox/selected.png +0 -0
- package/screenshots/truth/select/functions.png +0 -0
- package/screenshots/truth/select/multi-with-endpoint.png +0 -0
- package/screenshots/truth/select/search-enabled.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 +13 -1
- package/src/excellent/helpers.ts +2 -2
- package/src/flow/CanvasNode.ts +22 -1
- package/src/flow/Editor.ts +12 -1
- package/src/flow/NodeEditor.ts +412 -354
- package/src/flow/actions/add_input_labels.ts +45 -0
- package/src/flow/actions/call_llm.ts +57 -3
- package/src/flow/actions/call_webhook.ts +28 -18
- package/src/flow/actions/open_ticket.ts +74 -3
- package/src/flow/actions/send_msg.ts +170 -6
- package/src/flow/actions/set_run_result.ts +83 -0
- package/src/flow/config.ts +4 -0
- package/src/flow/nodes/split_by_llm_categorize.ts +277 -0
- package/src/flow/nodes/split_by_ticket.ts +19 -0
- package/src/flow/nodes/wait_for_response.ts +28 -1
- package/src/flow/types.ts +46 -128
- package/src/form/ArrayEditor.ts +96 -66
- package/src/form/BaseListEditor.ts +22 -6
- package/src/form/FieldRenderer.ts +465 -0
- package/src/form/FormField.ts +4 -4
- 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 +16 -8
- package/src/form/select/Select.ts +55 -24
- package/src/live/ContactChat.ts +69 -19
- package/src/markdown.ts +19 -11
- package/src/store/flow-definition.d.ts +5 -2
- package/static/api/labels.json +31 -0
- package/static/api/topics.json +24 -9
- package/static/api/users.json +35 -16
- package/static/css/temba-components.css +5 -3
- package/static/mr/docs/en-us/editor.json +2588 -0
- package/stress-test.js +143 -0
- package/temba-modules.ts +2 -0
- package/test/ActionHelper.ts +2 -0
- package/test/NodeHelper.ts +184 -0
- package/test/actions/call_llm.test.ts +137 -0
- package/test/nodes/README.md +78 -0
- package/test/nodes/split_by_llm_categorize.test.ts +698 -0
- package/test/nodes/split_by_random.test.ts +177 -0
- package/test/nodes/wait_for_digits.test.ts +176 -0
- package/test/nodes/wait_for_response.test.ts +206 -0
- package/test/temba-add-input-labels.test.ts +87 -0
- package/test/temba-field-config.test.ts +4 -2
- package/test/temba-field-renderer.test.ts +482 -0
- package/test/temba-markdown.test.ts +1 -1
- package/test/temba-message-editor.test.ts +300 -0
- package/test/temba-node-editor.test.ts +590 -0
- package/test/temba-select.test.ts +7 -7
- package/test/temba-textinput.test.ts +26 -0
- package/test/temba-webchat.test.ts +6 -1
- package/test/utils.test.ts +2 -13
- package/test-assets/contacts/history.json +19 -0
- package/test-assets/select/llms.json +18 -0
- package/test-assets/style.css +2 -0
- package/web-dev-mock.mjs +523 -0
- package/web-dev-server.config.mjs +74 -6
- package/web-test-runner.config.mjs +9 -4
- package/test/temba-flow-editor.test.ts.backup +0 -563
- package/test/temba-utils-index.test.ts.backup +0 -1737
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/flow/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit-html';\nimport { css, PropertyValueMap, unsafeCSS } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport {\n FlowDefinition,\n FlowPosition,\n Action,\n Node,\n NodeUI\n} from '../store/flow-definition';\nimport { getStore } from '../store/Store';\nimport { AppState, fromStore, zustand } from '../store/AppState';\nimport { RapidElement } from '../RapidElement';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { CustomEventType } from '../interfaces';\n\nimport { Plumber } from './Plumber';\nimport { CanvasNode } from './CanvasNode';\nimport { Dialog } from '../layout/Dialog';\nimport { Connection } from '@jsplumb/browser-ui';\n\nexport function snapToGrid(value: number): number {\n const snapped = Math.round(value / 20) * 20;\n return Math.max(snapped, 0);\n}\n\nexport function findNodeForExit(\n definition: FlowDefinition,\n exitUuid: string\n): string | null {\n for (const node of definition.nodes) {\n const exit = node.exits.find((e) => e.uuid === exitUuid);\n if (exit) {\n return node.uuid;\n }\n }\n return null;\n}\n\nconst SAVE_QUIET_TIME = 500;\n\nexport interface DraggableItem {\n uuid: string;\n position: FlowPosition;\n element: HTMLElement;\n type: 'node' | 'sticky';\n}\n\nexport interface SelectionBox {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nconst DRAG_THRESHOLD = 5;\n\nexport class Editor extends RapidElement {\n // unfortunately, jsplumb requires that we be in light DOM\n createRenderRoot() {\n return this;\n }\n\n // this is the master plumber\n private plumber: Plumber;\n\n // timer for debounced saving\n private saveTimer: number | null = null;\n\n @property({ type: String })\n public flow: string;\n\n @property({ type: String })\n public version: string;\n\n @fromStore(zustand, (state: AppState) => state.flowDefinition)\n private definition!: FlowDefinition;\n\n @fromStore(zustand, (state: AppState) => state.canvasSize)\n private canvasSize!: { width: number; height: number };\n\n @fromStore(zustand, (state: AppState) => state.dirtyDate)\n private dirtyDate!: Date;\n\n // Drag state\n @state()\n private isDragging = false;\n private isMouseDown = false;\n private dragStartPos = { x: 0, y: 0 };\n\n // Public getter for drag state\n public get dragging(): boolean {\n return this.isDragging;\n }\n\n @state()\n private currentDragItem: DraggableItem | null = null;\n private startPos = { left: 0, top: 0 };\n\n // Selection state\n @state()\n private selectedItems: Set<string> = new Set();\n\n @state()\n private isSelecting = false;\n\n @state()\n private selectionBox: SelectionBox | null = null;\n\n @state()\n private targetId: string | null = null;\n\n @state()\n private sourceId: string | null = null;\n\n @state()\n private dragFromNodeId: string | null = null;\n\n @state()\n private isValidTarget = true;\n\n // NodeEditor state - handles both node and action editing\n @state()\n private editingNode: Node | null = null;\n\n @state()\n private editingNodeUI: NodeUI | null = null;\n\n @state()\n private editingAction: Action | null = null;\n\n private canvasMouseDown = false;\n\n // Bound event handlers to maintain proper 'this' context\n private boundMouseMove = this.handleMouseMove.bind(this);\n private boundMouseUp = this.handleMouseUp.bind(this);\n private boundGlobalMouseDown = this.handleGlobalMouseDown.bind(this);\n private boundKeyDown = this.handleKeyDown.bind(this);\n private boundCanvasDoubleClick = this.handleCanvasDoubleClick.bind(this);\n\n static get styles() {\n return css`\n #editor {\n overflow: scroll;\n flex: 1;\n }\n\n #grid {\n position: relative;\n background-color: #f9f9f9;\n background-image: radial-gradient(\n circle,\n rgba(61, 177, 255, 0.3) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n background-position: 10px 10px;\n box-shadow: inset -5px 0 10px rgba(0, 0, 0, 0.05);\n border-top: 1px solid #e0e0e0;\n width: 100%;\n display: flex;\n }\n\n #canvas {\n position: relative;\n padding: 0px;\n flex-grow: 1;\n margin: 20px;\n }\n\n #canvas > .draggable {\n position: absolute;\n z-index: 100;\n }\n\n #canvas > .dragging {\n z-index: 99999 !important;\n }\n\n body .jtk-endpoint {\n width: initial;\n height: initial;\n }\n\n .jtk-endpoint {\n z-index: 600;\n opacity: 0;\n }\n\n .plumb-source {\n z-index: 600;\n cursor: pointer;\n opacity: 0;\n }\n\n .plumb-source.connected {\n border-radius: 50%;\n pointer-events: none;\n }\n\n .plumb-source circle {\n fill: purple;\n }\n\n .plumb-target {\n z-index: 600;\n opacity: 0;\n cursor: pointer;\n fill: transparent;\n }\n\n body svg.jtk-connector.plumb-connector path {\n stroke: var(--color-connectors) !important;\n stroke-width: 3px;\n }\n\n body .plumb-connector {\n z-index: 10 !important;\n }\n\n body .plumb-connector .plumb-arrow {\n fill: var(--color-connectors);\n stroke: var(--color-connectors);\n stroke-width: 0px !important;\n margin-top: 6px;\n z-index: 10;\n }\n\n body svg.jtk-connector.jtk-hover path {\n stroke: var(--color-success) !important;\n stroke-width: 3px;\n }\n\n body .plumb-connector.jtk-hover .plumb-arrow {\n fill: var(--color-success) !important;\n stroke-width: 0px;\n z-index: 10;\n }\n\n /* Connection dragging feedback */\n body svg.jtk-connector.jtk-dragging {\n z-index: 99999 !important;\n }\n\n .katavorio-drag-no-select svg.jtk-connector path,\n .katavorio-drag-no-select svg.jtk-endpoint path {\n pointer-events: none !important;\n border: 1px solid purple;\n }\n\n /* Connection target feedback */\n temba-flow-node.connection-target-valid {\n outline: 3px solid var(--color-success, #22c55e) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n temba-flow-node.connection-target-invalid {\n outline: 3px solid var(--color-error, #ef4444) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n /* Selection box styles */\n .selection-box {\n position: absolute;\n border: 2px dashed #6298f0ff;\n background-color: rgba(59, 130, 246, 0.1);\n z-index: 9999;\n pointer-events: none;\n }\n\n /* Selected item styles */\n .draggable.selected {\n outline: 3px solid #6298f0ff;\n outline-offset: 0px;\n border-radius: var(--curvature);\n }\n\n .jtk-floating-endpoint {\n pointer-events: none;\n }\n `;\n }\n\n constructor() {\n super();\n }\n\n protected firstUpdated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changes);\n this.plumber = new Plumber(this.querySelector('#canvas'));\n this.setupGlobalEventListeners();\n if (changes.has('flow')) {\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n this.plumber.on('connection:drag', (info: Connection) => {\n this.dragFromNodeId = document\n .getElementById(info.sourceId)\n .closest('.node').id;\n this.sourceId = info.sourceId;\n });\n\n this.plumber.on('connection:abort', () => {\n this.makeConnection();\n });\n\n this.plumber.on('connection:detach', () => {\n this.makeConnection();\n });\n }\n\n private makeConnection() {\n if (this.sourceId && this.targetId && this.isValidTarget) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.targetId\n );\n getStore()\n .getState()\n .updateConnection(this.dragFromNodeId, this.sourceId, this.targetId);\n\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 100);\n }\n\n // Clean up visual feedback\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n this.sourceId = null;\n this.targetId = null;\n this.dragFromNodeId = null;\n this.isValidTarget = true;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('canvasSize')) {\n // console.log('Setting canvas size', this.canvasSize);\n }\n\n if (changes.has('definition')) {\n this.updateCanvasSize();\n }\n\n if (changes.has('dirtyDate')) {\n if (this.dirtyDate) {\n this.debouncedSave();\n }\n }\n }\n\n private debouncedSave(): void {\n // Clear any existing timer\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = window.setTimeout(() => {\n const now = new Date();\n const timeSinceLastChange = now.getTime() - this.dirtyDate.getTime();\n\n if (timeSinceLastChange >= SAVE_QUIET_TIME) {\n this.saveChanges();\n this.saveTimer = null;\n } else {\n this.debouncedSave();\n }\n }, SAVE_QUIET_TIME);\n }\n\n private saveChanges(): void {\n // post the flow definition to the server\n getStore().postJSON(`/flow/revisions/${this.flow}`, this.definition);\n getStore().getState().setDirtyDate(null);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n document.removeEventListener('mousedown', this.boundGlobalMouseDown);\n document.removeEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.removeEventListener('dblclick', this.boundCanvasDoubleClick);\n }\n }\n\n private setupGlobalEventListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n document.addEventListener('mousedown', this.boundGlobalMouseDown);\n document.addEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.addEventListener('dblclick', this.boundCanvasDoubleClick);\n }\n\n // Listen for action edit requests from flow nodes\n this.addEventListener(\n CustomEventType.ActionEditRequested,\n this.handleActionEditRequested.bind(this)\n );\n\n // Listen for node edit requests from flow nodes\n this.addEventListener(\n CustomEventType.NodeEditRequested,\n this.handleNodeEditRequested.bind(this)\n );\n }\n\n private getPosition(uuid: string, type: 'node' | 'sticky'): FlowPosition {\n if (type === 'node') {\n return this.definition._ui.nodes[uuid]?.position;\n } else {\n return this.definition._ui.stickies?.[uuid]?.position;\n }\n }\n\n private handleMouseDown(event: MouseEvent): void {\n // ignore right clicks\n if (event.button !== 0) return;\n\n const element = event.currentTarget as HTMLElement;\n // Only start dragging if clicking on the element itself, not on exits or other interactive elements\n const target = event.target as HTMLElement;\n if (target.classList.contains('exit') || target.closest('.exit')) {\n return;\n }\n\n const uuid = element.getAttribute('uuid');\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n\n const position = this.getPosition(uuid, type);\n if (!position) return;\n\n // If clicking on a non-selected item, clear selection unless Ctrl/Cmd is held\n if (!this.selectedItems.has(uuid) && !event.ctrlKey && !event.metaKey) {\n this.selectedItems.clear();\n // Don't add single items to selection - single clicks just clear existing selection\n } else if (!this.selectedItems.has(uuid)) {\n // Add this item to selection only if Ctrl/Cmd is held\n this.selectedItems.add(uuid);\n }\n\n // Always set up drag state regardless of selection status\n // This allows single nodes to be dragged without being selected\n this.isMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n this.startPos = { left: position.left, top: position.top };\n this.currentDragItem = {\n uuid,\n position,\n element,\n type\n };\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleGlobalMouseDown(event: MouseEvent): void {\n // ignore right clicks\n if (event.button !== 0) return;\n\n // Check if the click is within our canvas\n const canvasRect = this.querySelector('#grid')?.getBoundingClientRect();\n\n if (!canvasRect) return;\n\n const isWithinCanvas =\n event.clientX >= canvasRect.left &&\n event.clientX <= canvasRect.right &&\n event.clientY >= canvasRect.top &&\n event.clientY <= canvasRect.bottom;\n\n if (!isWithinCanvas) return;\n\n // Check if we clicked on a draggable item (node or sticky)\n const target = event.target as HTMLElement;\n const clickedOnDraggable = target.closest('.draggable');\n\n if (clickedOnDraggable) {\n // This is handled by the individual item mousedown handlers\n return;\n }\n\n // We clicked on empty canvas space, start selection\n this.handleCanvasMouseDown(event);\n }\n\n private handleCanvasMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.id === 'canvas' || target.id === 'grid') {\n // Ignore clicks on exits\n\n // Start selection box\n this.canvasMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect) {\n // Clear current selection\n this.selectedItems.clear();\n\n const relativeX = event.clientX - canvasRect.left;\n const relativeY = event.clientY - canvasRect.top;\n\n this.selectionBox = {\n startX: relativeX,\n startY: relativeY,\n endX: relativeX,\n endY: relativeY\n };\n }\n\n event.preventDefault();\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.selectedItems.size > 0) {\n this.showDeleteConfirmation();\n }\n }\n if (event.key === 'Escape') {\n this.selectedItems.clear();\n this.requestUpdate();\n }\n }\n\n private showDeleteConfirmation(): void {\n const itemCount = this.selectedItems.size;\n const itemType = itemCount === 1 ? 'item' : 'items';\n\n // Create and show confirmation dialog\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Delete Items';\n dialog.primaryButtonName = 'Delete';\n dialog.cancelButtonName = 'Cancel';\n dialog.destructive = true;\n dialog.innerHTML = `<div style=\"padding: 20px;\">Are you sure you want to delete ${itemCount} ${itemType}?</div>`;\n\n dialog.addEventListener('temba-button-clicked', (event: any) => {\n if (event.detail.button.name === 'Delete') {\n this.deleteSelectedItems();\n dialog.open = false;\n }\n });\n\n // Add to document and show\n document.body.appendChild(dialog);\n dialog.open = true;\n\n // Clean up dialog when closed\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private deleteNodes(uuids: string[]): void {\n // Clean up jsPlumb connections for nodes before removing them\n uuids.forEach((uuid) => {\n this.plumber.removeNodeConnections(uuid);\n });\n\n // Now remove them from the definition\n if (uuids.length > 0 && this.plumber) {\n getStore().getState().removeNodes(uuids);\n }\n }\n\n private deleteSelectedItems(): void {\n const nodes = Array.from(this.selectedItems).filter((uuid) =>\n this.definition.nodes.some((node) => node.uuid === uuid)\n );\n this.deleteNodes(Array.from(nodes));\n\n const stickies = Array.from(this.selectedItems).filter(\n (uuid) => this.definition._ui?.stickies?.[uuid]\n );\n\n getStore().getState().removeStickyNotes(stickies);\n\n // Clear selection\n this.selectedItems.clear();\n }\n\n private updateSelectionBox(event: MouseEvent): void {\n if (!this.selectionBox || !this.canvasMouseDown) return;\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (!canvasRect) return;\n\n const relativeX = event.clientX - canvasRect.left;\n const relativeY = event.clientY - canvasRect.top;\n\n this.selectionBox = {\n ...this.selectionBox,\n endX: relativeX,\n endY: relativeY\n };\n\n // Update selected items based on selection box\n this.updateSelectedItemsFromBox();\n }\n\n private updateSelectedItemsFromBox(): void {\n if (!this.selectionBox) return;\n\n const newSelection = new Set<string>();\n\n const boxLeft = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const boxTop = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const boxRight = Math.max(this.selectionBox.startX, this.selectionBox.endX);\n const boxBottom = Math.max(\n this.selectionBox.startY,\n this.selectionBox.endY\n );\n\n // Check nodes\n this.definition?.nodes.forEach((node) => {\n const nodeElement = this.querySelector(`[id=\"${node.uuid}\"]`);\n if (nodeElement) {\n const position = this.definition._ui.nodes[node.uuid]?.position;\n if (position) {\n const rect = nodeElement.getBoundingClientRect();\n const canvasRect =\n this.querySelector('#canvas')?.getBoundingClientRect();\n\n if (canvasRect) {\n const nodeLeft = position.left;\n const nodeTop = position.top;\n const nodeRight = nodeLeft + rect.width;\n const nodeBottom = nodeTop + rect.height;\n\n // Check if selection box intersects with node\n if (\n boxLeft < nodeRight &&\n boxRight > nodeLeft &&\n boxTop < nodeBottom &&\n boxBottom > nodeTop\n ) {\n newSelection.add(node.uuid);\n }\n }\n }\n }\n });\n\n // Check sticky notes\n const stickies = this.definition?._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Use the canvas coordinates from the sticky's position\n const stickyLeft = sticky.position.left;\n const stickyTop = sticky.position.top;\n const stickyRight = stickyLeft + width;\n const stickyBottom = stickyTop + height;\n\n // Check if selection box intersects with sticky\n if (\n boxLeft < stickyRight &&\n boxRight > stickyLeft &&\n boxTop < stickyBottom &&\n boxBottom > stickyTop\n ) {\n newSelection.add(uuid);\n }\n }\n }\n });\n\n this.selectedItems = newSelection;\n }\n\n private renderSelectionBox(): TemplateResult | string {\n if (!this.selectionBox || !this.isSelecting) return '';\n\n const left = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const top = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const width = Math.abs(this.selectionBox.endX - this.selectionBox.startX);\n const height = Math.abs(this.selectionBox.endY - this.selectionBox.startY);\n\n return html`<div\n class=\"selection-box\"\n style=\"left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px;\"\n ></div>`;\n }\n\n private handleMouseMove(event: MouseEvent): void {\n // Handle selection box drawing\n if (this.canvasMouseDown && !this.isMouseDown) {\n this.isSelecting = true;\n this.updateSelectionBox(event);\n this.requestUpdate(); // Force re-render\n return;\n }\n\n if (this.plumber.connectionDragging) {\n const targetNode = document.querySelector('temba-flow-node:hover');\n\n // Clear previous target styles\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n // Check if target is different from source node (prevent self-targeting)\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n\n // Apply visual feedback based on validity\n if (this.isValidTarget) {\n targetNode.classList.add('connection-target-valid');\n } else {\n targetNode.classList.add('connection-target-invalid');\n }\n } else {\n this.targetId = null;\n this.isValidTarget = true;\n }\n }\n\n // Handle item dragging\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n const deltaX = event.clientX - this.dragStartPos.x;\n const deltaY = event.clientY - this.dragStartPos.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Only start dragging if we've moved beyond the threshold\n if (!this.isDragging && distance > DRAG_THRESHOLD) {\n this.isDragging = true;\n }\n\n // If we're actually dragging, update positions\n if (this.isDragging) {\n // Determine what items to move\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n itemsToMove.forEach((uuid) => {\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const type =\n element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Update the visual position during drag\n element.style.left = `${newLeft}px`;\n element.style.top = `${newTop}px`;\n\n // Add dragging class to ensure highest z-index\n element.classList.add('dragging');\n }\n }\n });\n\n this.plumber.revalidate(itemsToMove);\n }\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // Handle selection box completion\n if (this.canvasMouseDown && this.isSelecting) {\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n this.requestUpdate();\n return;\n }\n\n // Handle canvas click (clear selection)\n if (this.canvasMouseDown && !this.isSelecting) {\n this.canvasMouseDown = false;\n return;\n }\n\n // Handle item drag completion\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n // If we were actually dragging, handle the drag end\n if (this.isDragging) {\n const deltaX = event.clientX - this.dragStartPos.x;\n const deltaY = event.clientY - this.dragStartPos.y;\n\n // Determine what items were moved\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n // Update positions for all moved items\n const newPositions: { [uuid: string]: FlowPosition } = {};\n\n itemsToMove.forEach((uuid) => {\n const type = this.definition.nodes.find((node) => node.uuid === uuid)\n ? 'node'\n : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Snap to 20px grid for final position\n const snappedLeft = snapToGrid(newLeft);\n const snappedTop = snapToGrid(newTop);\n\n const newPosition = { left: snappedLeft, top: snappedTop };\n newPositions[uuid] = newPosition;\n\n // Remove dragging class\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n element.classList.remove('dragging');\n element.style.left = `${snappedLeft}px`;\n element.style.top = `${snappedTop}px`;\n }\n }\n });\n\n if (Object.keys(newPositions).length > 0) {\n getStore().getState().updateCanvasPositions(newPositions);\n\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 0);\n }\n\n this.selectedItems.clear();\n }\n\n // Reset all drag state\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.canvasMouseDown = false;\n }\n\n private updateCanvasSize(): void {\n if (!this.definition) return;\n\n const store = getStore();\n if (!store) return;\n\n // Calculate required canvas size based on all elements\n let maxWidth = 0;\n let maxHeight = 0;\n\n // Check node positions\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui.nodes[node.uuid];\n if (ui && ui.position) {\n const nodeElement = this.querySelector(`[id=\"${node.uuid}\"]`);\n if (nodeElement) {\n const rect = nodeElement.getBoundingClientRect();\n maxWidth = Math.max(maxWidth, ui.position.left + rect.width);\n maxHeight = Math.max(maxHeight, ui.position.top + rect.height);\n }\n }\n });\n\n // Check sticky note positions\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Both sticky.position and width/height are now in the same coordinate system\n maxWidth = Math.max(maxWidth, sticky.position.left + width);\n maxHeight = Math.max(maxHeight, sticky.position.top + height);\n } else {\n // Fallback to default sizes if element not found\n maxWidth = Math.max(maxWidth, sticky.position.left + 200);\n maxHeight = Math.max(maxHeight, sticky.position.top + 100);\n }\n }\n });\n\n // Update canvas size in store\n store.getState().expandCanvas(maxWidth, maxHeight);\n }\n\n private handleCanvasDoubleClick(event: MouseEvent): void {\n // Check if we double-clicked on empty canvas space\n const target = event.target as HTMLElement;\n if (target.id !== 'canvas') {\n return;\n }\n\n // Get canvas position\n const canvas = this.querySelector('#canvas');\n if (!canvas) {\n return;\n }\n\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = event.clientX - canvasRect.left - 10;\n const relativeY = event.clientY - canvasRect.top - 10;\n\n // Snap position to grid\n const snappedLeft = snapToGrid(relativeX);\n const snappedTop = snapToGrid(relativeY);\n\n // Create new sticky note\n const store = getStore();\n store.getState().createStickyNote({\n left: snappedLeft,\n top: snappedTop\n });\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleActionEditRequested(event: CustomEvent): void {\n // For action editing, we set the action and find the corresponding node\n this.editingAction = event.detail.action;\n\n // Find the node that contains this action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (node) {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[nodeUuid];\n }\n }\n private handleNodeEditRequested(event: CustomEvent): void {\n this.editingNode = event.detail.node;\n this.editingNodeUI = event.detail.nodeUI;\n }\n\n private handleActionSaved(updatedAction: Action): void {\n if (this.editingNode && this.editingAction) {\n // Update the specific action in the node\n const updatedActions = this.editingNode.actions.map((action) =>\n action.uuid === this.editingAction.uuid ? updatedAction : action\n );\n const updatedNode = { ...this.editingNode, actions: updatedActions };\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Repaint jsplumb connections in case node size changed\n if (this.plumber) {\n // Use requestAnimationFrame to ensure DOM has been updated first\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private closeNodeEditor(): void {\n this.editingNode = null;\n this.editingNodeUI = null;\n this.editingAction = null;\n }\n\n private handleActionEditCanceled(): void {\n this.closeNodeEditor();\n }\n\n private handleNodeSaved(updatedNode: Node): void {\n if (this.editingNode) {\n // Clean up jsPlumb connections for removed exits before updating the node\n if (this.plumber) {\n const oldExits = this.editingNode.exits || [];\n const newExits = updatedNode.exits || [];\n\n // Find exits that were removed\n const removedExits = oldExits.filter(\n (oldExit) =>\n !newExits.find((newExit) => newExit.uuid === oldExit.uuid)\n );\n\n // Remove jsPlumb connections for removed exits\n removedExits.forEach((exit) => {\n this.plumber.removeExitConnection(exit.uuid);\n });\n }\n\n this.plumber.revalidate([updatedNode.uuid]);\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Repaint jsplumb connections in case node size changed\n if (this.plumber) {\n // Use requestAnimationFrame to ensure DOM has been updated first\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private handleNodeEditCanceled(): void {\n this.closeNodeEditor();\n }\n\n public render(): TemplateResult {\n // we have to embed our own style since we are in light DOM\n const style = html`<style>\n ${unsafeCSS(Editor.styles.cssText)}\n ${unsafeCSS(CanvasNode.styles.cssText)}\n </style>`;\n\n const stickies = this.definition?._ui?.stickies || {};\n\n return html`${style}\n <div id=\"editor\">\n <div\n id=\"grid\"\n style=\"min-width:100%;width:${this.canvasSize.width}px; height:${this\n .canvasSize.height}px\"\n >\n <div id=\"canvas\">\n ${this.definition\n ? repeat(\n this.definition.nodes,\n (node) => node.uuid,\n (node) => {\n const position =\n this.definition._ui.nodes[node.uuid].position;\n\n const dragging =\n this.isDragging &&\n this.currentDragItem?.uuid === node.uuid;\n\n const selected = this.selectedItems.has(node.uuid);\n\n return html`<temba-flow-node\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n uuid=${node.uuid}\n style=\"left:${position.left}px; top:${position.top}px\"\n .plumber=${this.plumber}\n .node=${node}\n .ui=${this.definition._ui.nodes[node.uuid]}\n @temba-node-deleted=${(event) => {\n this.deleteNodes([event.detail.uuid]);\n }}\n ></temba-flow-node>`;\n }\n )\n : html`<temba-loading></temba-loading>`}\n ${repeat(\n Object.entries(stickies),\n ([uuid]) => uuid,\n ([uuid, sticky]) => {\n const position = sticky.position || { left: 0, top: 0 };\n const dragging =\n this.isDragging && this.currentDragItem?.uuid === uuid;\n const selected = this.selectedItems.has(uuid);\n return html`<temba-sticky-note\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n style=\"left:${position.left}px; top:${position.top}px; z-index: ${1000 +\n position.top}\"\n uuid=${uuid}\n .data=${sticky}\n .dragging=${dragging}\n .selected=${selected}\n ></temba-sticky-note>`;\n }\n )}\n ${this.renderSelectionBox()}\n </div>\n </div>\n </div>\n\n ${this.editingNode || this.editingAction\n ? html`<temba-node-editor\n .node=${this.editingNode}\n .nodeUI=${this.editingNodeUI}\n .action=${this.editingAction}\n @temba-node-saved=${(e: CustomEvent) =>\n this.handleNodeSaved(e.detail.node)}\n @temba-action-saved=${(e: CustomEvent) =>\n this.handleActionSaved(e.detail.action)}\n @temba-node-edit-cancelled=${this.handleNodeEditCanceled}\n ></temba-node-editor>`\n : ''} `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/flow/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit-html';\nimport { css, PropertyValueMap, unsafeCSS } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport {\n FlowDefinition,\n FlowPosition,\n Action,\n Node,\n NodeUI\n} from '../store/flow-definition';\nimport { getStore } from '../store/Store';\nimport { AppState, fromStore, zustand } from '../store/AppState';\nimport { RapidElement } from '../RapidElement';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { CustomEventType } from '../interfaces';\n\nimport { Plumber } from './Plumber';\nimport { CanvasNode } from './CanvasNode';\nimport { Dialog } from '../layout/Dialog';\nimport { Connection } from '@jsplumb/browser-ui';\n\nexport function snapToGrid(value: number): number {\n const snapped = Math.round(value / 20) * 20;\n return Math.max(snapped, 0);\n}\n\nexport function findNodeForExit(\n definition: FlowDefinition,\n exitUuid: string\n): string | null {\n for (const node of definition.nodes) {\n const exit = node.exits.find((e) => e.uuid === exitUuid);\n if (exit) {\n return node.uuid;\n }\n }\n return null;\n}\n\nconst SAVE_QUIET_TIME = 500;\n\nexport interface DraggableItem {\n uuid: string;\n position: FlowPosition;\n element: HTMLElement;\n type: 'node' | 'sticky';\n}\n\nexport interface SelectionBox {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nconst DRAG_THRESHOLD = 5;\n\nexport class Editor extends RapidElement {\n // unfortunately, jsplumb requires that we be in light DOM\n createRenderRoot() {\n return this;\n }\n\n // this is the master plumber\n private plumber: Plumber;\n\n // timer for debounced saving\n private saveTimer: number | null = null;\n\n @property({ type: String })\n public flow: string;\n\n @property({ type: String })\n public version: string;\n\n @fromStore(zustand, (state: AppState) => state.flowDefinition)\n private definition!: FlowDefinition;\n\n @fromStore(zustand, (state: AppState) => state.canvasSize)\n private canvasSize!: { width: number; height: number };\n\n @fromStore(zustand, (state: AppState) => state.dirtyDate)\n private dirtyDate!: Date;\n\n // Drag state\n @state()\n private isDragging = false;\n private isMouseDown = false;\n private dragStartPos = { x: 0, y: 0 };\n\n // Public getter for drag state\n public get dragging(): boolean {\n return this.isDragging;\n }\n\n @state()\n private currentDragItem: DraggableItem | null = null;\n private startPos = { left: 0, top: 0 };\n\n // Selection state\n @state()\n private selectedItems: Set<string> = new Set();\n\n @state()\n private isSelecting = false;\n\n @state()\n private selectionBox: SelectionBox | null = null;\n\n @state()\n private targetId: string | null = null;\n\n @state()\n private sourceId: string | null = null;\n\n @state()\n private dragFromNodeId: string | null = null;\n\n @state()\n private isValidTarget = true;\n\n // NodeEditor state - handles both node and action editing\n @state()\n private editingNode: Node | null = null;\n\n @state()\n private editingNodeUI: NodeUI | null = null;\n\n @state()\n private editingAction: Action | null = null;\n\n private canvasMouseDown = false;\n\n // Bound event handlers to maintain proper 'this' context\n private boundMouseMove = this.handleMouseMove.bind(this);\n private boundMouseUp = this.handleMouseUp.bind(this);\n private boundGlobalMouseDown = this.handleGlobalMouseDown.bind(this);\n private boundKeyDown = this.handleKeyDown.bind(this);\n private boundCanvasDoubleClick = this.handleCanvasDoubleClick.bind(this);\n\n static get styles() {\n return css`\n #editor {\n overflow: scroll;\n flex: 1;\n }\n\n #grid {\n position: relative;\n background-color: #f9f9f9;\n background-image: radial-gradient(\n circle,\n rgba(61, 177, 255, 0.3) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n background-position: 10px 10px;\n box-shadow: inset -5px 0 10px rgba(0, 0, 0, 0.05);\n border-top: 1px solid #e0e0e0;\n width: 100%;\n display: flex;\n }\n\n #canvas {\n position: relative;\n padding: 0px;\n flex-grow: 1;\n margin: 20px;\n }\n\n #canvas > .draggable {\n position: absolute;\n z-index: 100;\n }\n\n #canvas > .dragging {\n z-index: 99999 !important;\n }\n\n body .jtk-endpoint {\n width: initial;\n height: initial;\n }\n\n .jtk-endpoint {\n z-index: 600;\n opacity: 0;\n }\n\n .plumb-source {\n z-index: 600;\n cursor: pointer;\n opacity: 0;\n }\n\n .plumb-source.connected {\n border-radius: 50%;\n pointer-events: none;\n }\n\n .plumb-source circle {\n fill: purple;\n }\n\n .plumb-target {\n z-index: 600;\n opacity: 0;\n cursor: pointer;\n fill: transparent;\n }\n\n body svg.jtk-connector.plumb-connector path {\n stroke: var(--color-connectors) !important;\n stroke-width: 3px;\n }\n\n body .plumb-connector {\n z-index: 10 !important;\n }\n\n body .plumb-connector .plumb-arrow {\n fill: var(--color-connectors);\n stroke: var(--color-connectors);\n stroke-width: 0px !important;\n margin-top: 6px;\n z-index: 10;\n }\n\n body svg.jtk-connector.jtk-hover path {\n stroke: var(--color-success) !important;\n stroke-width: 3px;\n }\n\n body .plumb-connector.jtk-hover .plumb-arrow {\n fill: var(--color-success) !important;\n stroke-width: 0px;\n z-index: 10;\n }\n\n /* Connection dragging feedback */\n body svg.jtk-connector.jtk-dragging {\n z-index: 99999 !important;\n }\n\n .katavorio-drag-no-select svg.jtk-connector path,\n .katavorio-drag-no-select svg.jtk-endpoint path {\n pointer-events: none !important;\n border: 1px solid purple;\n }\n\n /* Connection target feedback */\n temba-flow-node.connection-target-valid {\n outline: 3px solid var(--color-success, #22c55e) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n temba-flow-node.connection-target-invalid {\n outline: 3px solid var(--color-error, #ef4444) !important;\n outline-offset: 2px;\n border-radius: var(--curvature);\n }\n\n /* Selection box styles */\n .selection-box {\n position: absolute;\n border: 2px dashed #6298f0ff;\n background-color: rgba(59, 130, 246, 0.1);\n z-index: 9999;\n pointer-events: none;\n }\n\n /* Selected item styles */\n .draggable.selected {\n outline: 3px solid #6298f0ff;\n outline-offset: 0px;\n border-radius: var(--curvature);\n }\n\n .jtk-floating-endpoint {\n pointer-events: none;\n }\n `;\n }\n\n constructor() {\n super();\n }\n\n protected firstUpdated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changes);\n this.plumber = new Plumber(this.querySelector('#canvas'));\n this.setupGlobalEventListeners();\n if (changes.has('flow')) {\n getStore().getState().fetchRevision(`/flow/revisions/${this.flow}`);\n }\n\n this.plumber.on('connection:drag', (info: Connection) => {\n this.dragFromNodeId = document\n .getElementById(info.sourceId)\n .closest('.node').id;\n this.sourceId = info.sourceId;\n });\n\n this.plumber.on('connection:abort', () => {\n this.makeConnection();\n });\n\n this.plumber.on('connection:detach', () => {\n this.makeConnection();\n });\n }\n\n private makeConnection() {\n if (this.sourceId && this.targetId && this.isValidTarget) {\n this.plumber.connectIds(\n this.dragFromNodeId,\n this.sourceId,\n this.targetId\n );\n getStore()\n .getState()\n .updateConnection(this.dragFromNodeId, this.sourceId, this.targetId);\n\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 100);\n }\n\n // Clean up visual feedback\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n this.sourceId = null;\n this.targetId = null;\n this.dragFromNodeId = null;\n this.isValidTarget = true;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('canvasSize')) {\n // console.log('Setting canvas size', this.canvasSize);\n }\n\n if (changes.has('definition')) {\n this.updateCanvasSize();\n }\n\n if (changes.has('dirtyDate')) {\n if (this.dirtyDate) {\n this.debouncedSave();\n }\n }\n }\n\n private debouncedSave(): void {\n // Clear any existing timer\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = window.setTimeout(() => {\n const now = new Date();\n const timeSinceLastChange = now.getTime() - this.dirtyDate.getTime();\n\n if (timeSinceLastChange >= SAVE_QUIET_TIME) {\n this.saveChanges();\n this.saveTimer = null;\n } else {\n this.debouncedSave();\n }\n }, SAVE_QUIET_TIME);\n }\n\n private saveChanges(): void {\n // post the flow definition to the server\n getStore()\n .postJSON(`/flow/revisions/${this.flow}`, this.definition)\n .then((response) => {\n // Update flow info with the response data\n if (response.json && response.json.info) {\n getStore().getState().setFlowInfo(response.json.info);\n }\n })\n .catch((error) => {\n console.error('Failed to save flow:', error);\n });\n\n getStore().getState().setDirtyDate(null);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.saveTimer !== null) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n document.removeEventListener('mousedown', this.boundGlobalMouseDown);\n document.removeEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.removeEventListener('dblclick', this.boundCanvasDoubleClick);\n }\n }\n\n private setupGlobalEventListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n document.addEventListener('mousedown', this.boundGlobalMouseDown);\n document.addEventListener('keydown', this.boundKeyDown);\n\n const canvas = this.querySelector('#canvas');\n if (canvas) {\n canvas.addEventListener('dblclick', this.boundCanvasDoubleClick);\n }\n\n // Listen for action edit requests from flow nodes\n this.addEventListener(\n CustomEventType.ActionEditRequested,\n this.handleActionEditRequested.bind(this)\n );\n\n // Listen for node edit requests from flow nodes\n this.addEventListener(\n CustomEventType.NodeEditRequested,\n this.handleNodeEditRequested.bind(this)\n );\n }\n\n private getPosition(uuid: string, type: 'node' | 'sticky'): FlowPosition {\n if (type === 'node') {\n return this.definition._ui.nodes[uuid]?.position;\n } else {\n return this.definition._ui.stickies?.[uuid]?.position;\n }\n }\n\n private handleMouseDown(event: MouseEvent): void {\n // ignore right clicks\n if (event.button !== 0) return;\n\n const element = event.currentTarget as HTMLElement;\n // Only start dragging if clicking on the element itself, not on exits or other interactive elements\n const target = event.target as HTMLElement;\n if (target.classList.contains('exit') || target.closest('.exit')) {\n return;\n }\n\n const uuid = element.getAttribute('uuid');\n const type = element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n\n const position = this.getPosition(uuid, type);\n if (!position) return;\n\n // If clicking on a non-selected item, clear selection unless Ctrl/Cmd is held\n if (!this.selectedItems.has(uuid) && !event.ctrlKey && !event.metaKey) {\n this.selectedItems.clear();\n // Don't add single items to selection - single clicks just clear existing selection\n } else if (!this.selectedItems.has(uuid)) {\n // Add this item to selection only if Ctrl/Cmd is held\n this.selectedItems.add(uuid);\n }\n\n // Always set up drag state regardless of selection status\n // This allows single nodes to be dragged without being selected\n this.isMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n this.startPos = { left: position.left, top: position.top };\n this.currentDragItem = {\n uuid,\n position,\n element,\n type\n };\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleGlobalMouseDown(event: MouseEvent): void {\n // ignore right clicks\n if (event.button !== 0) return;\n\n // Check if the click is within our canvas\n const canvasRect = this.querySelector('#grid')?.getBoundingClientRect();\n\n if (!canvasRect) return;\n\n const isWithinCanvas =\n event.clientX >= canvasRect.left &&\n event.clientX <= canvasRect.right &&\n event.clientY >= canvasRect.top &&\n event.clientY <= canvasRect.bottom;\n\n if (!isWithinCanvas) return;\n\n // Check if we clicked on a draggable item (node or sticky)\n const target = event.target as HTMLElement;\n const clickedOnDraggable = target.closest('.draggable');\n\n if (clickedOnDraggable) {\n // This is handled by the individual item mousedown handlers\n return;\n }\n\n // We clicked on empty canvas space, start selection\n this.handleCanvasMouseDown(event);\n }\n\n private handleCanvasMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.id === 'canvas' || target.id === 'grid') {\n // Ignore clicks on exits\n\n // Start selection box\n this.canvasMouseDown = true;\n this.dragStartPos = { x: event.clientX, y: event.clientY };\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (canvasRect) {\n // Clear current selection\n this.selectedItems.clear();\n\n const relativeX = event.clientX - canvasRect.left;\n const relativeY = event.clientY - canvasRect.top;\n\n this.selectionBox = {\n startX: relativeX,\n startY: relativeY,\n endX: relativeX,\n endY: relativeY\n };\n }\n\n event.preventDefault();\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.selectedItems.size > 0) {\n this.showDeleteConfirmation();\n }\n }\n if (event.key === 'Escape') {\n this.selectedItems.clear();\n this.requestUpdate();\n }\n }\n\n private showDeleteConfirmation(): void {\n const itemCount = this.selectedItems.size;\n const itemType = itemCount === 1 ? 'item' : 'items';\n\n // Create and show confirmation dialog\n const dialog = document.createElement('temba-dialog') as Dialog;\n dialog.header = 'Delete Items';\n dialog.primaryButtonName = 'Delete';\n dialog.cancelButtonName = 'Cancel';\n dialog.destructive = true;\n dialog.innerHTML = `<div style=\"padding: 20px;\">Are you sure you want to delete ${itemCount} ${itemType}?</div>`;\n\n dialog.addEventListener('temba-button-clicked', (event: any) => {\n if (event.detail.button.name === 'Delete') {\n this.deleteSelectedItems();\n dialog.open = false;\n }\n });\n\n // Add to document and show\n document.body.appendChild(dialog);\n dialog.open = true;\n\n // Clean up dialog when closed\n dialog.addEventListener('temba-dialog-hidden', () => {\n document.body.removeChild(dialog);\n });\n }\n\n private deleteNodes(uuids: string[]): void {\n // Clean up jsPlumb connections for nodes before removing them\n uuids.forEach((uuid) => {\n this.plumber.removeNodeConnections(uuid);\n });\n\n // Now remove them from the definition\n if (uuids.length > 0 && this.plumber) {\n getStore().getState().removeNodes(uuids);\n }\n }\n\n private deleteSelectedItems(): void {\n const nodes = Array.from(this.selectedItems).filter((uuid) =>\n this.definition.nodes.some((node) => node.uuid === uuid)\n );\n this.deleteNodes(Array.from(nodes));\n\n const stickies = Array.from(this.selectedItems).filter(\n (uuid) => this.definition._ui?.stickies?.[uuid]\n );\n\n getStore().getState().removeStickyNotes(stickies);\n\n // Clear selection\n this.selectedItems.clear();\n }\n\n private updateSelectionBox(event: MouseEvent): void {\n if (!this.selectionBox || !this.canvasMouseDown) return;\n\n const canvasRect = this.querySelector('#canvas')?.getBoundingClientRect();\n if (!canvasRect) return;\n\n const relativeX = event.clientX - canvasRect.left;\n const relativeY = event.clientY - canvasRect.top;\n\n this.selectionBox = {\n ...this.selectionBox,\n endX: relativeX,\n endY: relativeY\n };\n\n // Update selected items based on selection box\n this.updateSelectedItemsFromBox();\n }\n\n private updateSelectedItemsFromBox(): void {\n if (!this.selectionBox) return;\n\n const newSelection = new Set<string>();\n\n const boxLeft = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const boxTop = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const boxRight = Math.max(this.selectionBox.startX, this.selectionBox.endX);\n const boxBottom = Math.max(\n this.selectionBox.startY,\n this.selectionBox.endY\n );\n\n // Check nodes\n this.definition?.nodes.forEach((node) => {\n const nodeElement = this.querySelector(`[id=\"${node.uuid}\"]`);\n if (nodeElement) {\n const position = this.definition._ui.nodes[node.uuid]?.position;\n if (position) {\n const rect = nodeElement.getBoundingClientRect();\n const canvasRect =\n this.querySelector('#canvas')?.getBoundingClientRect();\n\n if (canvasRect) {\n const nodeLeft = position.left;\n const nodeTop = position.top;\n const nodeRight = nodeLeft + rect.width;\n const nodeBottom = nodeTop + rect.height;\n\n // Check if selection box intersects with node\n if (\n boxLeft < nodeRight &&\n boxRight > nodeLeft &&\n boxTop < nodeBottom &&\n boxBottom > nodeTop\n ) {\n newSelection.add(node.uuid);\n }\n }\n }\n }\n });\n\n // Check sticky notes\n const stickies = this.definition?._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Use the canvas coordinates from the sticky's position\n const stickyLeft = sticky.position.left;\n const stickyTop = sticky.position.top;\n const stickyRight = stickyLeft + width;\n const stickyBottom = stickyTop + height;\n\n // Check if selection box intersects with sticky\n if (\n boxLeft < stickyRight &&\n boxRight > stickyLeft &&\n boxTop < stickyBottom &&\n boxBottom > stickyTop\n ) {\n newSelection.add(uuid);\n }\n }\n }\n });\n\n this.selectedItems = newSelection;\n }\n\n private renderSelectionBox(): TemplateResult | string {\n if (!this.selectionBox || !this.isSelecting) return '';\n\n const left = Math.min(this.selectionBox.startX, this.selectionBox.endX);\n const top = Math.min(this.selectionBox.startY, this.selectionBox.endY);\n const width = Math.abs(this.selectionBox.endX - this.selectionBox.startX);\n const height = Math.abs(this.selectionBox.endY - this.selectionBox.startY);\n\n return html`<div\n class=\"selection-box\"\n style=\"left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px;\"\n ></div>`;\n }\n\n private handleMouseMove(event: MouseEvent): void {\n // Handle selection box drawing\n if (this.canvasMouseDown && !this.isMouseDown) {\n this.isSelecting = true;\n this.updateSelectionBox(event);\n this.requestUpdate(); // Force re-render\n return;\n }\n\n if (this.plumber.connectionDragging) {\n const targetNode = document.querySelector('temba-flow-node:hover');\n\n // Clear previous target styles\n document.querySelectorAll('temba-flow-node').forEach((node) => {\n node.classList.remove(\n 'connection-target-valid',\n 'connection-target-invalid'\n );\n });\n\n if (targetNode) {\n this.targetId = targetNode.getAttribute('uuid');\n // Check if target is different from source node (prevent self-targeting)\n this.isValidTarget = this.targetId !== this.dragFromNodeId;\n\n // Apply visual feedback based on validity\n if (this.isValidTarget) {\n targetNode.classList.add('connection-target-valid');\n } else {\n targetNode.classList.add('connection-target-invalid');\n }\n } else {\n this.targetId = null;\n this.isValidTarget = true;\n }\n }\n\n // Handle item dragging\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n const deltaX = event.clientX - this.dragStartPos.x;\n const deltaY = event.clientY - this.dragStartPos.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Only start dragging if we've moved beyond the threshold\n if (!this.isDragging && distance > DRAG_THRESHOLD) {\n this.isDragging = true;\n }\n\n // If we're actually dragging, update positions\n if (this.isDragging) {\n // Determine what items to move\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n itemsToMove.forEach((uuid) => {\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n const type =\n element.tagName === 'TEMBA-FLOW-NODE' ? 'node' : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Update the visual position during drag\n element.style.left = `${newLeft}px`;\n element.style.top = `${newTop}px`;\n\n // Add dragging class to ensure highest z-index\n element.classList.add('dragging');\n }\n }\n });\n\n this.plumber.revalidate(itemsToMove);\n }\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // Handle selection box completion\n if (this.canvasMouseDown && this.isSelecting) {\n this.isSelecting = false;\n this.selectionBox = null;\n this.canvasMouseDown = false;\n this.requestUpdate();\n return;\n }\n\n // Handle canvas click (clear selection)\n if (this.canvasMouseDown && !this.isSelecting) {\n this.canvasMouseDown = false;\n return;\n }\n\n // Handle item drag completion\n if (!this.isMouseDown || !this.currentDragItem) return;\n\n // If we were actually dragging, handle the drag end\n if (this.isDragging) {\n const deltaX = event.clientX - this.dragStartPos.x;\n const deltaY = event.clientY - this.dragStartPos.y;\n\n // Determine what items were moved\n const itemsToMove =\n this.selectedItems.has(this.currentDragItem.uuid) &&\n this.selectedItems.size > 1\n ? Array.from(this.selectedItems)\n : [this.currentDragItem.uuid];\n\n // Update positions for all moved items\n const newPositions: { [uuid: string]: FlowPosition } = {};\n\n itemsToMove.forEach((uuid) => {\n const type = this.definition.nodes.find((node) => node.uuid === uuid)\n ? 'node'\n : 'sticky';\n const position = this.getPosition(uuid, type);\n\n if (position) {\n const newLeft = position.left + deltaX;\n const newTop = position.top + deltaY;\n\n // Snap to 20px grid for final position\n const snappedLeft = snapToGrid(newLeft);\n const snappedTop = snapToGrid(newTop);\n\n const newPosition = { left: snappedLeft, top: snappedTop };\n newPositions[uuid] = newPosition;\n\n // Remove dragging class\n const element = this.querySelector(`[uuid=\"${uuid}\"]`) as HTMLElement;\n if (element) {\n element.classList.remove('dragging');\n element.style.left = `${snappedLeft}px`;\n element.style.top = `${snappedTop}px`;\n }\n }\n });\n\n if (Object.keys(newPositions).length > 0) {\n getStore().getState().updateCanvasPositions(newPositions);\n\n setTimeout(() => {\n this.plumber.repaintEverything();\n }, 0);\n }\n\n this.selectedItems.clear();\n }\n\n // Reset all drag state\n this.isDragging = false;\n this.isMouseDown = false;\n this.currentDragItem = null;\n this.canvasMouseDown = false;\n }\n\n private updateCanvasSize(): void {\n if (!this.definition) return;\n\n const store = getStore();\n if (!store) return;\n\n // Calculate required canvas size based on all elements\n let maxWidth = 0;\n let maxHeight = 0;\n\n // Check node positions\n this.definition.nodes.forEach((node) => {\n const ui = this.definition._ui.nodes[node.uuid];\n if (ui && ui.position) {\n const nodeElement = this.querySelector(`[id=\"${node.uuid}\"]`);\n if (nodeElement) {\n const rect = nodeElement.getBoundingClientRect();\n maxWidth = Math.max(maxWidth, ui.position.left + rect.width);\n maxHeight = Math.max(maxHeight, ui.position.top + rect.height);\n }\n }\n });\n\n // Check sticky note positions\n const stickies = this.definition._ui?.stickies || {};\n Object.entries(stickies).forEach(([uuid, sticky]) => {\n if (sticky.position) {\n const stickyElement = this.querySelector(\n `temba-sticky-note[uuid=\"${uuid}\"]`\n ) as HTMLElement;\n if (stickyElement) {\n // Use clientWidth/clientHeight instead of getBoundingClientRect() to get element dimensions\n // This avoids the coordinate system mismatch between viewport and canvas coordinates\n const width = stickyElement.clientWidth;\n const height = stickyElement.clientHeight;\n\n // Both sticky.position and width/height are now in the same coordinate system\n maxWidth = Math.max(maxWidth, sticky.position.left + width);\n maxHeight = Math.max(maxHeight, sticky.position.top + height);\n } else {\n // Fallback to default sizes if element not found\n maxWidth = Math.max(maxWidth, sticky.position.left + 200);\n maxHeight = Math.max(maxHeight, sticky.position.top + 100);\n }\n }\n });\n\n // Update canvas size in store\n store.getState().expandCanvas(maxWidth, maxHeight);\n }\n\n private handleCanvasDoubleClick(event: MouseEvent): void {\n // Check if we double-clicked on empty canvas space\n const target = event.target as HTMLElement;\n if (target.id !== 'canvas') {\n return;\n }\n\n // Get canvas position\n const canvas = this.querySelector('#canvas');\n if (!canvas) {\n return;\n }\n\n const canvasRect = canvas.getBoundingClientRect();\n const relativeX = event.clientX - canvasRect.left - 10;\n const relativeY = event.clientY - canvasRect.top - 10;\n\n // Snap position to grid\n const snappedLeft = snapToGrid(relativeX);\n const snappedTop = snapToGrid(relativeY);\n\n // Create new sticky note\n const store = getStore();\n store.getState().createStickyNote({\n left: snappedLeft,\n top: snappedTop\n });\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleActionEditRequested(event: CustomEvent): void {\n // For action editing, we set the action and find the corresponding node\n this.editingAction = event.detail.action;\n\n // Find the node that contains this action\n const nodeUuid = event.detail.nodeUuid;\n const node = this.definition.nodes.find((n) => n.uuid === nodeUuid);\n\n if (node) {\n this.editingNode = node;\n this.editingNodeUI = this.definition._ui.nodes[nodeUuid];\n }\n }\n private handleNodeEditRequested(event: CustomEvent): void {\n this.editingNode = event.detail.node;\n this.editingNodeUI = event.detail.nodeUI;\n }\n\n private handleActionSaved(updatedAction: Action): void {\n if (this.editingNode && this.editingAction) {\n // Update the specific action in the node\n const updatedActions = this.editingNode.actions.map((action) =>\n action.uuid === this.editingAction.uuid ? updatedAction : action\n );\n const updatedNode = { ...this.editingNode, actions: updatedActions };\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Repaint jsplumb connections in case node size changed\n if (this.plumber) {\n // Use requestAnimationFrame to ensure DOM has been updated first\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private closeNodeEditor(): void {\n this.editingNode = null;\n this.editingNodeUI = null;\n this.editingAction = null;\n }\n\n private handleActionEditCanceled(): void {\n this.closeNodeEditor();\n }\n\n private handleNodeSaved(updatedNode: Node): void {\n if (this.editingNode) {\n // Clean up jsPlumb connections for removed exits before updating the node\n if (this.plumber) {\n const oldExits = this.editingNode.exits || [];\n const newExits = updatedNode.exits || [];\n\n // Find exits that were removed\n const removedExits = oldExits.filter(\n (oldExit) =>\n !newExits.find((newExit) => newExit.uuid === oldExit.uuid)\n );\n\n // Remove jsPlumb connections for removed exits\n removedExits.forEach((exit) => {\n this.plumber.removeExitConnection(exit.uuid);\n });\n }\n\n this.plumber.revalidate([updatedNode.uuid]);\n\n // Update the node in the store\n getStore()?.getState().updateNode(this.editingNode.uuid, updatedNode);\n\n // Repaint jsplumb connections in case node size changed\n if (this.plumber) {\n // Use requestAnimationFrame to ensure DOM has been updated first\n requestAnimationFrame(() => {\n this.plumber.repaintEverything();\n });\n }\n }\n this.closeNodeEditor();\n }\n\n private handleNodeEditCanceled(): void {\n this.closeNodeEditor();\n }\n\n public render(): TemplateResult {\n // we have to embed our own style since we are in light DOM\n const style = html`<style>\n ${unsafeCSS(Editor.styles.cssText)}\n ${unsafeCSS(CanvasNode.styles.cssText)}\n </style>`;\n\n const stickies = this.definition?._ui?.stickies || {};\n\n return html`${style}\n <div id=\"editor\">\n <div\n id=\"grid\"\n style=\"min-width:100%;width:${this.canvasSize.width}px; height:${this\n .canvasSize.height}px\"\n >\n <div id=\"canvas\">\n ${this.definition\n ? repeat(\n this.definition.nodes,\n (node) => node.uuid,\n (node) => {\n const position =\n this.definition._ui.nodes[node.uuid].position;\n\n const dragging =\n this.isDragging &&\n this.currentDragItem?.uuid === node.uuid;\n\n const selected = this.selectedItems.has(node.uuid);\n\n return html`<temba-flow-node\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n uuid=${node.uuid}\n style=\"left:${position.left}px; top:${position.top}px\"\n .plumber=${this.plumber}\n .node=${node}\n .ui=${this.definition._ui.nodes[node.uuid]}\n @temba-node-deleted=${(event) => {\n this.deleteNodes([event.detail.uuid]);\n }}\n ></temba-flow-node>`;\n }\n )\n : html`<temba-loading></temba-loading>`}\n ${repeat(\n Object.entries(stickies),\n ([uuid]) => uuid,\n ([uuid, sticky]) => {\n const position = sticky.position || { left: 0, top: 0 };\n const dragging =\n this.isDragging && this.currentDragItem?.uuid === uuid;\n const selected = this.selectedItems.has(uuid);\n return html`<temba-sticky-note\n class=\"draggable ${dragging ? 'dragging' : ''} ${selected\n ? 'selected'\n : ''}\"\n @mousedown=${this.handleMouseDown.bind(this)}\n style=\"left:${position.left}px; top:${position.top}px; z-index: ${1000 +\n position.top}\"\n uuid=${uuid}\n .data=${sticky}\n .dragging=${dragging}\n .selected=${selected}\n ></temba-sticky-note>`;\n }\n )}\n ${this.renderSelectionBox()}\n </div>\n </div>\n </div>\n\n ${this.editingNode || this.editingAction\n ? html`<temba-node-editor\n .node=${this.editingNode}\n .nodeUI=${this.editingNodeUI}\n .action=${this.editingAction}\n @temba-node-saved=${(e: CustomEvent) =>\n this.handleNodeSaved(e.detail.node)}\n @temba-action-saved=${(e: CustomEvent) =>\n this.handleActionSaved(e.detail.action)}\n @temba-node-edit-cancelled=${this.handleNodeEditCanceled}\n ></temba-node-editor>`\n : ''} `;\n }\n}\n"]}
|