@nyaruka/temba-components 0.130.1 → 0.130.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/DEV_DATA.md +89 -0
- package/demo/data/flows/food-order.json +4 -4
- package/demo/data/flows/sample-flow.json +132 -147
- package/dist/temba-components.js +787 -659
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/display/Chat.js +5 -3
- package/out-tsc/src/display/Chat.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +83 -78
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +1 -0
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +47 -3
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +3 -1
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +17 -14
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm.js +12 -12
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +609 -6
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/operators.js +194 -0
- package/out-tsc/src/flow/operators.js.map +1 -0
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +84 -19
- package/out-tsc/src/form/ArrayEditor.js.map +1 -1
- package/out-tsc/src/form/Checkbox.js +12 -0
- package/out-tsc/src/form/Checkbox.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +13 -3
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/form/TextInput.js +20 -1
- package/out-tsc/src/form/TextInput.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +7 -0
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/layout/Dialog.js +3 -4
- package/out-tsc/src/layout/Dialog.js.map +1 -1
- package/out-tsc/src/list/RunList.js +2 -2
- package/out-tsc/src/list/RunList.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +101 -44
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/live/ContactDetails.js +7 -0
- package/out-tsc/src/live/ContactDetails.js.map +1 -1
- package/out-tsc/src/live/ContactNameFetch.js +1 -1
- package/out-tsc/src/live/ContactNameFetch.js.map +1 -1
- package/out-tsc/src/webchat/index.js +0 -11
- package/out-tsc/src/webchat/index.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +25 -27
- package/out-tsc/test/NodeHelper.js.map +1 -1
- package/out-tsc/test/nodes/split_by_llm.test.js +12 -4
- package/out-tsc/test/nodes/split_by_llm.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js +101 -91
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_random.test.js +120 -112
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_digits.test.js +131 -111
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
- package/out-tsc/test/nodes/wait_for_response.test.js +549 -85
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
- package/out-tsc/test/temba-checkbox.test.js +32 -32
- package/out-tsc/test/temba-checkbox.test.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +2 -1
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-dropdown.test.js +0 -4
- package/out-tsc/test/temba-dropdown.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor-node.test.js +9 -4
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-integration-markdown.test.js +13 -15
- package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +5 -38
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-run-list.test.js +2 -2
- package/out-tsc/test/temba-run-list.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -1
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +6 -2
- package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/checkbox/checkbox-label-background-hover.png +0 -0
- package/screenshots/truth/checkbox/checkbox-whitespace-label-no-background-hover.png +0 -0
- package/screenshots/truth/checkbox/checkbox-with-help-text.png +0 -0
- package/screenshots/truth/checkbox/checked.png +0 -0
- package/screenshots/truth/checkbox/default.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/integration/textinput-markdown-errors.png +0 -0
- package/screenshots/truth/lightbox/img-zoomed.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/screenshots/truth/run-list/basic.png +0 -0
- package/screenshots/truth/templates/default.png +0 -0
- package/screenshots/truth/wait-for-response/rules-editor.png +0 -0
- package/screenshots/truth/wait-for-response/timeout-editor-unchecked.png +0 -0
- package/screenshots/truth/wait-for-response/timeout-editor.png +0 -0
- package/scripts/dev-data-sync.mjs +182 -0
- package/src/display/Chat.ts +6 -4
- package/src/events.ts +6 -6
- package/src/flow/CanvasNode.ts +89 -79
- package/src/flow/Editor.ts +1 -0
- package/src/flow/NodeEditor.ts +55 -3
- package/src/flow/actions/add_contact_urn.ts +1 -1
- package/src/flow/actions/set_contact_channel.ts +1 -1
- package/src/flow/actions/set_contact_field.ts +2 -1
- package/src/flow/actions/set_contact_language.ts +3 -1
- package/src/flow/actions/set_contact_name.ts +1 -1
- package/src/flow/actions/set_contact_status.ts +18 -18
- package/src/flow/actions/set_run_result.ts +1 -1
- package/src/flow/nodes/split_by_llm.ts +14 -13
- package/src/flow/nodes/wait_for_response.ts +717 -5
- package/src/flow/operators.ts +215 -0
- package/src/flow/types.ts +10 -2
- package/src/form/ArrayEditor.ts +117 -37
- package/src/form/Checkbox.ts +12 -0
- package/src/form/FieldRenderer.ts +24 -3
- package/src/form/TextInput.ts +19 -1
- package/src/form/select/Select.ts +7 -0
- package/src/interfaces.ts +1 -1
- package/src/layout/Dialog.ts +4 -4
- package/src/list/RunList.ts +2 -2
- package/src/live/ContactChat.ts +128 -67
- package/src/live/ContactDetails.ts +7 -0
- package/src/live/ContactNameFetch.ts +1 -1
- package/src/webchat/index.ts +0 -16
- package/static/api/labels.json +6 -1
- package/test/NodeHelper.ts +38 -40
- package/test/nodes/split_by_llm.test.ts +43 -32
- package/test/nodes/split_by_llm_categorize.test.ts +130 -120
- package/test/nodes/split_by_random.test.ts +136 -128
- package/test/nodes/wait_for_digits.test.ts +147 -127
- package/test/nodes/wait_for_response.test.ts +657 -104
- package/test/temba-checkbox.test.ts +36 -32
- package/test/temba-contact-chat.test.ts +2 -1
- package/test/temba-dropdown.test.ts +0 -12
- package/test/temba-flow-editor-node.test.ts +11 -4
- package/test/temba-integration-markdown.test.ts +16 -17
- package/test/temba-node-editor.test.ts +5 -43
- package/test/temba-run-list.test.ts +2 -2
- package/test/utils.test.ts +2 -1
- package/test-assets/contacts/history.json +4 -7
- package/test-assets/list/runs.json +8 -8
- package/web-dev-mock.mjs +86 -30
- package/web-dev-server.config.mjs +272 -31
- package/screenshots/truth/dropdown/bottom-edge-collision.png +0 -0
- package/screenshots/truth/dropdown/right-edge-collision.png +0 -0
- package/screenshots/truth/editor/send_msg.png +0 -0
- package/screenshots/truth/editor/set_contact_language.png +0 -0
- package/screenshots/truth/editor/set_contact_name.png +0 -0
- package/screenshots/truth/editor/set_run_result.png +0 -0
- package/screenshots/truth/integration/checkbox-markdown-errors.png +0 -0
|
@@ -85,7 +85,7 @@ export class NodeEditor extends RapidElement {
|
|
|
85
85
|
.form-row {
|
|
86
86
|
display: grid;
|
|
87
87
|
gap: 1rem;
|
|
88
|
-
align-items:
|
|
88
|
+
align-items: center;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
.form-group {
|
|
@@ -257,6 +257,25 @@ export class NodeEditor extends RapidElement {
|
|
|
257
257
|
display: flex;
|
|
258
258
|
align-items: center;
|
|
259
259
|
}
|
|
260
|
+
|
|
261
|
+
.gutter-fields {
|
|
262
|
+
display: flex;
|
|
263
|
+
flex-direction: column;
|
|
264
|
+
gap: 10px;
|
|
265
|
+
align-items: flex-start;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.gutter-fields .form-row {
|
|
269
|
+
margin: 0;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.gutter-fields temba-checkbox {
|
|
273
|
+
align-self: flex-start;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.gutter-fields temba-select {
|
|
277
|
+
min-width: 120px;
|
|
278
|
+
}
|
|
260
279
|
`;
|
|
261
280
|
}
|
|
262
281
|
connectedCallback() {
|
|
@@ -897,6 +916,7 @@ export class NodeEditor extends RapidElement {
|
|
|
897
916
|
}
|
|
898
917
|
},
|
|
899
918
|
showLabel: true,
|
|
919
|
+
formData: this.formData,
|
|
900
920
|
additionalData: {
|
|
901
921
|
attachments: this.formData.attachments || []
|
|
902
922
|
}
|
|
@@ -1171,12 +1191,19 @@ export class NodeEditor extends RapidElement {
|
|
|
1171
1191
|
// If layout is specified, use it
|
|
1172
1192
|
if (config.layout) {
|
|
1173
1193
|
const renderedFields = new Set();
|
|
1194
|
+
// Also collect fields from gutter to avoid rendering them in main form
|
|
1195
|
+
const gutterFields = new Set();
|
|
1196
|
+
if (config.gutter) {
|
|
1197
|
+
const gutterFieldNames = this.collectFieldsFromItems(config.gutter);
|
|
1198
|
+
gutterFieldNames.forEach((field) => gutterFields.add(field));
|
|
1199
|
+
}
|
|
1174
1200
|
return html `
|
|
1175
1201
|
${config.layout.map((item) => this.renderLayoutItem(item, config, renderedFields))}
|
|
1176
1202
|
${
|
|
1177
|
-
/* Render any fields not explicitly placed in layout */
|
|
1203
|
+
/* Render any fields not explicitly placed in layout or gutter */
|
|
1178
1204
|
Object.entries(config.form).map(([fieldName, fieldConfig]) => {
|
|
1179
|
-
if (!renderedFields.has(fieldName)
|
|
1205
|
+
if (!renderedFields.has(fieldName) &&
|
|
1206
|
+
!gutterFields.has(fieldName)) {
|
|
1180
1207
|
return this.renderNewField(fieldName, fieldConfig, this.formData[fieldName]);
|
|
1181
1208
|
}
|
|
1182
1209
|
return html ``;
|
|
@@ -1198,6 +1225,19 @@ export class NodeEditor extends RapidElement {
|
|
|
1198
1225
|
return html ` <div>No form configuration available for this node</div> `;
|
|
1199
1226
|
}
|
|
1200
1227
|
}
|
|
1228
|
+
renderGutter() {
|
|
1229
|
+
const config = this.getConfig();
|
|
1230
|
+
if (!(config === null || config === void 0 ? void 0 : config.gutter) || config.gutter.length === 0) {
|
|
1231
|
+
return html ``;
|
|
1232
|
+
}
|
|
1233
|
+
// Use the same layout rendering system for gutter fields
|
|
1234
|
+
const renderedFields = new Set();
|
|
1235
|
+
return html `
|
|
1236
|
+
<div class="gutter-fields">
|
|
1237
|
+
${config.gutter.map((item) => this.renderLayoutItem(item, config, renderedFields))}
|
|
1238
|
+
</div>
|
|
1239
|
+
`;
|
|
1240
|
+
}
|
|
1201
1241
|
renderActionSection() {
|
|
1202
1242
|
if (!this.node || this.node.actions.length === 0) {
|
|
1203
1243
|
return html ``;
|
|
@@ -1261,6 +1301,7 @@ export class NodeEditor extends RapidElement {
|
|
|
1261
1301
|
}
|
|
1262
1302
|
const headerColor = this.getHeaderColor();
|
|
1263
1303
|
const config = this.getConfig();
|
|
1304
|
+
const dialogSize = (config === null || config === void 0 ? void 0 : config.dialogSize) || 'medium'; // Default to 'large' if not specified
|
|
1264
1305
|
return html `
|
|
1265
1306
|
<temba-dialog
|
|
1266
1307
|
header="${(config === null || config === void 0 ? void 0 : config.name) || 'Edit'}"
|
|
@@ -1269,6 +1310,7 @@ export class NodeEditor extends RapidElement {
|
|
|
1269
1310
|
primaryButtonName="Save"
|
|
1270
1311
|
cancelButtonName="Cancel"
|
|
1271
1312
|
style="--header-bg: ${headerColor}"
|
|
1313
|
+
size="${dialogSize}"
|
|
1272
1314
|
>
|
|
1273
1315
|
<div class="node-editor-form">
|
|
1274
1316
|
${this.renderFields()}
|
|
@@ -1276,6 +1318,8 @@ export class NodeEditor extends RapidElement {
|
|
|
1276
1318
|
? this.renderRouterSection()
|
|
1277
1319
|
: null}
|
|
1278
1320
|
</div>
|
|
1321
|
+
|
|
1322
|
+
<div slot="gutter">${this.renderGutter()}</div>
|
|
1279
1323
|
</temba-dialog>
|
|
1280
1324
|
`;
|
|
1281
1325
|
}
|
|
@@ -1 +1 @@
|
|
|
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 { LayoutItem, RowLayoutConfig, GroupLayoutConfig } from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\nimport { FieldRenderer } from '../form/FieldRenderer';\nimport { renderMarkdownInline } from '../markdown';\n\nexport class NodeEditor extends RapidElement {\n static get styles() {\n return css`\n .node-editor-form {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n min-width: 400px;\n padding-bottom: 40px;\n\n --color-bubble-bg: rgba(var(--primary-rgb), 0.7);\n --color-bubble-border: rgba(0, 0, 0, 0.2);\n --color-bubble-text: #fff;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .form-field label {\n }\n\n .field-errors {\n color: var(--color-error, tomato);\n font-size: 12px;\n margin-left: 5px;\n margin-top: 15px;\n }\n\n .form-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n\n .action-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .action-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .router-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .router-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .form-row {\n display: grid;\n gap: 1rem;\n align-items: 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: 2px;\n border-color: rgba(var(--primary-rgb), 0.5);\n }\n\n .form-group-header {\n background: #f8f9fa;\n padding: 8px 10px;\n border-bottom: 1px solid #e0e0e0;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n }\n\n .form-group.has-bubble .form-group-header {\n background: rgba(var(--primary-rgb), 0.1);\n }\n\n .collapsed .form-group-header {\n border: none;\n }\n\n .form-group-header:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .form-group-header.collapsible:hover {\n background: #f1f3f4;\n }\n\n .form-group-info {\n flex: 1;\n }\n\n .form-group-title {\n font-weight: 500;\n color: var(--color-label, #777);\n font-size: 14px;\n display: flex;\n }\n\n .form-group-help {\n font-size: 12px;\n color: #666;\n margin-top: 2px;\n }\n\n .form-group-toggle {\n color: #666;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n }\n\n .form-group-toggle.collapsed {\n transform: rotate(-90deg);\n }\n\n .form-group-content {\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: hidden;\n transition: all 0.2s ease-in-out;\n\n opacity: 1;\n }\n\n .form-group-content.collapsed {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n\n .group-toggle-icon {\n color: #666;\n transition: transform 0.3s ease, opacity 0.3s ease;\n cursor: pointer;\n transform: rotate(0deg);\n opacity: 1;\n }\n\n .group-toggle-icon.faded {\n opacity: 0;\n }\n\n .group-toggle-icon.expanded {\n transform: rotate(90deg);\n }\n\n .group-toggle-icon.collapsed {\n transform: rotate(0deg);\n }\n\n .group-toggle-icon:hover {\n color: #333;\n }\n\n .group-error-icon {\n color: var(--color-error, tomato);\n margin-right: 8px;\n }\n\n .group-count-bubble {\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 600;\n padding: 4px;\n min-width: 12px;\n min-height: 12px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n line-height: 0px;\n opacity: 1;\n transition: opacity 0.3s ease;\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n color: var(--color-bubble-text, #000);\n }\n\n .group-count-bubble.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-checkmark-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 1;\n transition: opacity 0.3s ease;\n border-radius: 50%;\n color: var(--color-bubble-text, #000);\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n padding: 0.2em;\n }\n\n .group-checkmark-icon.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-toggle-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n `;\n }\n\n @property({ type: Object })\n action?: Action;\n\n @property({ type: Object })\n node?: Node;\n\n @property({ type: Object })\n nodeUI?: NodeUI;\n\n @property({ type: Boolean })\n isOpen: boolean = false;\n\n @state()\n private formData: any = {};\n\n @state()\n private originalFormData: any = {};\n\n @state()\n private errors: { [key: string]: string } = {};\n\n @state()\n private groupCollapseState: { [key: string]: boolean } = {};\n\n @state()\n private groupHoverState: { [key: string]: boolean } = {};\n\n connectedCallback(): void {\n super.connectedCallback();\n this.initializeFormData();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n if (\n changedProperties.has('node') ||\n changedProperties.has('action') ||\n changedProperties.has('nodeUI')\n ) {\n // For action editing, we only need the action\n if (this.action && (!this.node || !this.nodeUI)) {\n this.openDialog();\n }\n // For node editing, we need both node and nodeUI\n else if (this.node && this.nodeUI) {\n this.openDialog();\n }\n // If we don't have the required data, close the dialog\n else if (!this.action && (!this.node || !this.nodeUI)) {\n this.isOpen = false;\n }\n }\n }\n\n private openDialog(): void {\n this.initializeFormData();\n this.errors = {};\n this.isOpen = true;\n }\n\n private initializeFormData(): void {\n const nodeConfig = this.getNodeConfig();\n\n if ((!nodeConfig || nodeConfig.type === 'execute_actions') && this.action) {\n // Action editing mode - use action config\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n if (actionConfig?.toFormData) {\n this.formData = actionConfig.toFormData(this.action);\n } else {\n this.formData = { ...this.action };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n } else if (this.node) {\n // Node editing mode - use node config\n const nodeConfig = this.getNodeConfig();\n if (nodeConfig?.toFormData) {\n this.formData = nodeConfig.toFormData(this.node);\n } else {\n this.formData = { ...this.node };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n }\n\n // enforce immutability of formData\n Object.keys(this.formData).forEach((key) => {\n const value = this.formData[key];\n if (Array.isArray(value)) {\n this.formData[key] = [...value];\n } else if (value && typeof value === 'object') {\n // If it's an object, ensure we don't mutate the original\n this.formData[key] = { ...value };\n }\n });\n }\n\n private processFormDataForEditing(): void {\n const processed = { ...this.formData };\n\n // Convert Record objects to key-value arrays for key-value editors\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Check if this field should be a key-value editor\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n // Convert Record to array format\n processed[key] = Object.entries(value).map(([k, v]) => ({\n key: k,\n value: v\n }));\n }\n }\n });\n\n // Convert select fields to array format\n const config = this.getConfig();\n if (config?.form) {\n this.processSelectFields(processed, config.form);\n }\n\n this.formData = processed;\n }\n\n private processSelectFields(data: any, formConfig: any): void {\n Object.entries(formConfig).forEach(\n ([fieldName, fieldConfig]: [string, any]) => {\n const value = data[fieldName];\n\n // Handle top-level select fields\n if (fieldConfig.type === 'select' && value) {\n data[fieldName] = this.convertToSelectArray(value);\n }\n\n // Handle select fields within array items\n if (\n fieldConfig.type === 'array' &&\n Array.isArray(value) &&\n fieldConfig.itemConfig\n ) {\n value.forEach((item: any) => {\n this.processSelectFields(item, fieldConfig.itemConfig);\n });\n }\n }\n );\n }\n\n private convertToSelectArray(value: any): any[] {\n if (Array.isArray(value)) {\n return value.map((v) =>\n typeof v === 'string' ? { name: v, value: v } : v\n );\n } else if (typeof value === 'string') {\n return [{ name: value, value: value }];\n } else {\n return [value];\n }\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n const config = this.getConfig();\n const fields = config?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n\n private getConfig(): ActionConfig | NodeConfig | null {\n // If we have a node and nodeUI, check if we should use node config\n if (this.node && this.nodeUI) {\n const nodeConfig = this.getNodeConfig();\n\n // For execute_actions nodes, defer to action editing if an action is selected\n if (this.nodeUI.type === 'execute_actions' && this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n // For all other nodes with a config, use the node config\n if (nodeConfig) {\n return nodeConfig;\n }\n }\n\n // Fall back to action config if no node config or for pure action editing\n if (this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n return null;\n }\n\n private getNodeConfig(): NodeConfig | null {\n if (!this.nodeUI) return null;\n // Get node config based on the nodeUI's type\n return this.nodeUI.type ? NODE_CONFIG[this.nodeUI.type] : null;\n }\n\n private getHeaderColor(): string {\n const config = this.getConfig();\n return config?.color || '#666666';\n }\n\n private handleDialogButtonClick(event: CustomEvent): void {\n const button = event.detail.button;\n\n if (button.name === 'Save') {\n this.handleSave();\n } else if (button.name === 'Cancel') {\n this.handleCancel();\n }\n }\n\n private handleSave(): void {\n // Validate the form\n const validation = this.validateForm();\n if (!validation.valid) {\n this.errors = validation.errors;\n\n // Expand any groups that contain validation errors\n this.expandGroupsWithErrors(validation.errors);\n\n return;\n }\n\n // Process form data to convert key-value arrays to Records before saving\n const processedFormData = this.processFormDataForSave();\n\n // Determine whether to use node or action saving based on context\n // If we have a node with a router, always use node saving (even if action is set)\n // because router configuration is handled at the node level\n if (this.node && this.node.router) {\n // Node editing mode with router - use formDataToNode\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n } else if (this.action) {\n // Pure action editing mode (no router)\n const updatedAction = this.formDataToAction(processedFormData);\n this.fireCustomEvent(CustomEventType.ActionSaved, {\n action: updatedAction\n });\n } else if (this.node) {\n // Node editing mode without router\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n }\n }\n\n private processFormDataForSave(): any {\n const processed = { ...this.formData };\n\n // Convert key-value arrays to Records\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array, convert to Record\n const record: Record<string, string> = {};\n value.forEach(({ key: k, value: v }) => {\n if (k.trim() !== '' || v.trim() !== '') {\n record[k] = v;\n }\n });\n processed[key] = record;\n } else if (Array.isArray(value) && value.length === 0) {\n // Empty key-value array should become empty object\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n processed[key] = {};\n }\n }\n });\n\n return processed;\n }\n\n private handleCancel(): void {\n this.fireCustomEvent(CustomEventType.NodeEditCancelled, {});\n }\n\n private validateForm(): ValidationResult {\n const errors: { [key: string]: string } = {};\n const config = this.getConfig();\n\n if (config) {\n // Check if new field configuration system is available\n if (config.form) {\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n if (fieldConfig.type === 'select' && fieldConfig.allowCreate) {\n // check our values to see if any have arbitrary set\n let selected = this.formData[fieldName];\n selected = Array.isArray(selected)\n ? selected.find((v: any) => v.arbitrary)\n : null;\n\n if (selected && selected.arbitrary) {\n errors[fieldName] =\n 'There was an error creating' + ' \"' + selected.name + '\"';\n }\n }\n\n // Check required fields\n if (\n (fieldConfig as any).required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } is required.`;\n }\n\n // Check minLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).minLength &&\n value.length < (fieldConfig as any).minLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be at least ${(fieldConfig as any).minLength} characters`;\n }\n\n // Check maxLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).maxLength &&\n value.length > (fieldConfig as any).maxLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be no more than ${\n (fieldConfig as any).maxLength\n } characters`;\n }\n });\n }\n\n // Universal validation for category arrays to check for reserved names\n this.validateCategoryNames(errors);\n\n // Run custom validation if available\n if (config.validate) {\n if (config.sanitize) {\n config.sanitize(this.formData);\n }\n\n let customValidation;\n if (this.action) {\n customValidation = config.validate({\n ...this.action,\n ...this.formData\n });\n } else {\n customValidation = config.validate(this.formData);\n }\n Object.assign(errors, customValidation.errors);\n }\n }\n\n // Validate key-value fields for unique keys\n this.validateKeyValueUniqueness(errors);\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n }\n\n private validateKeyValueUniqueness(errors: { [key: string]: string }): void {\n // The individual key-value editors will show validation errors on duplicate keys and empty keys with values\n // We just need to prevent form submission when there are validation issues\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array\n let hasValidationErrors = false;\n\n // Check for empty keys with values\n value.forEach(({ key, value: itemValue }: any) => {\n if (key.trim() === '' && itemValue.trim() !== '') {\n hasValidationErrors = true;\n }\n });\n\n // Check for duplicate keys (only non-empty ones)\n const keys = value\n .filter(({ key }: any) => key.trim() !== '') // Only check non-empty keys\n .map(({ key }: any) => key.trim());\n\n const uniqueKeys = new Set(keys);\n\n if (keys.length !== uniqueKeys.size) {\n hasValidationErrors = true;\n }\n\n if (hasValidationErrors) {\n errors[fieldName] = `Please resolve validation errors to continue`;\n }\n }\n });\n }\n\n private validateCategoryNames(errors: { [key: string]: string }): void {\n // Universal validation for category names across all node types\n // Prevents use of reserved category names that have special meaning in the system\n // Define reserved category names (case-insensitive)\n const reservedNames = [\n 'other',\n 'failure',\n 'success',\n 'all responses',\n 'no response'\n ];\n\n // Check all form fields for category arrays\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (Array.isArray(value) && fieldName === 'categories') {\n const categories = value.filter(\n (item: any) => item?.name && item.name.trim() !== ''\n );\n\n // Check for reserved names\n const reservedUsed = categories\n .filter((item: any) => {\n const lowerName = item.name.trim().toLowerCase();\n return reservedNames.includes(lowerName);\n })\n .map((item: any) => item.name.trim()); // Preserve original case\n\n if (reservedUsed.length > 0) {\n errors[\n fieldName\n ] = `Reserved category names cannot be used: ${reservedUsed.join(\n ', '\n )}`;\n }\n }\n });\n }\n\n private formDataToNode(formData: any = this.formData): Node {\n if (!this.node) throw new Error('No node to update');\n let updatedNode: Node = { ...this.node };\n\n // Handle actions using action config transformations if available\n if (this.node.actions && this.node.actions.length > 0) {\n updatedNode.actions = this.node.actions.map((action) => {\n // If we're editing a specific action, only transform that one\n if (this.action && action.uuid === this.action.uuid) {\n const actionConfig = ACTION_CONFIG[action.type];\n if (actionConfig?.fromFormData) {\n // Use action-specific form data transformation\n return actionConfig.fromFormData(formData);\n } else {\n // Default transformation - merge form data with original action\n return { ...action, ...formData };\n }\n } else {\n // Keep other actions unchanged\n return action;\n }\n });\n }\n\n // Handle router configuration using node config\n if (this.node.router) {\n const nodeConfig = this.getNodeConfig();\n\n if (nodeConfig?.fromFormData) {\n // Use node-specific form data transformation\n updatedNode = nodeConfig.fromFormData(formData, updatedNode);\n } else {\n // Default router handling\n updatedNode.router = { ...this.node.router };\n\n // Apply form data to router fields if they exist\n if (formData.result_name !== undefined) {\n updatedNode.router.result_name = formData.result_name;\n }\n\n // Handle preconfigured rules from node config\n if (nodeConfig?.router?.rules) {\n // Build a complete new set of categories and exits based on node config\n const existingCategories = updatedNode.router.categories || [];\n const existingExits = updatedNode.exits || [];\n\n const newCategories: any[] = [];\n const newExits: any[] = [];\n\n // Group rules by category name to handle multiple rules pointing to the same category\n const categoryNameToRules = new Map<\n string,\n typeof nodeConfig.router.rules\n >();\n nodeConfig.router.rules.forEach((rule) => {\n if (!categoryNameToRules.has(rule.categoryName)) {\n categoryNameToRules.set(rule.categoryName, []);\n }\n categoryNameToRules.get(rule.categoryName)!.push(rule);\n });\n\n // Create categories for all unique category names\n categoryNameToRules.forEach((rules, categoryName) => {\n // Check if category already exists to preserve its UUID and exit_uuid\n const existingCategory = existingCategories.find(\n (cat) => cat.name === categoryName\n );\n\n if (existingCategory) {\n // Preserve existing category and its associated exit\n newCategories.push(existingCategory);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === existingCategory.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: categoryName,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n });\n\n // Add default category if specified\n if (nodeConfig.router.defaultCategory) {\n // Check if default category already exists in our new list\n const existingDefault = newCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (!existingDefault) {\n // Check if it exists in the original categories\n const originalDefault = existingCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (originalDefault) {\n // Preserve existing default category and its exit\n newCategories.push(originalDefault);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === originalDefault.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new default category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: nodeConfig.router.defaultCategory,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n }\n }\n\n // Replace the entire categories and exits lists with our complete new sets\n updatedNode.router.categories = newCategories;\n updatedNode.exits = newExits;\n }\n }\n } else {\n // If no router, just apply form data to node properties\n Object.keys(formData).forEach((key) => {\n if (\n key !== 'uuid' &&\n key !== 'actions' &&\n key !== 'exits' &&\n key !== 'router'\n ) {\n (updatedNode as any)[key] = formData[key];\n }\n });\n }\n\n return updatedNode;\n }\n\n private formDataToAction(formData: any = this.formData): Action {\n if (!this.action) throw new Error('No action to update');\n\n // Use action config transformation if available\n const actionConfig = ACTION_CONFIG[this.action.type];\n if (actionConfig?.fromFormData) {\n return actionConfig.fromFormData(formData);\n } else {\n // Default 1:1 mapping\n return { ...this.action, ...formData };\n }\n }\n\n private handleFormFieldChange(propertyName: string, event: Event): void {\n const target = event.target as any;\n let value: any;\n\n // Handle different component types like ActionEditor does\n if (target.tagName === 'TEMBA-CHECKBOX') {\n value = target.checked;\n } else if (target.values !== undefined) {\n value = target.values;\n } else {\n value = target.value;\n }\n\n this.formData = {\n ...this.formData,\n [propertyName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[propertyName]) {\n const newErrors = { ...this.errors };\n delete newErrors[propertyName];\n this.errors = newErrors;\n }\n\n // Check for computed values in dependent fields\n this.updateComputedFields(propertyName);\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render to handle conditional field visibility\n this.requestUpdate();\n }\n\n private updateGroupCollapseStates(): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n this.updateGroupCollapseStatesRecursive(config.layout);\n }\n\n private updateGroupCollapseStatesRecursive(items: LayoutItem[]): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const { label, collapsed, collapsible } = item;\n\n // Only update if the group is collapsible and has a function-based collapsed property\n if (collapsible && typeof collapsed === 'function') {\n const newCollapsedState = collapsed(this.formData);\n\n // Only update if the state has changed to avoid unnecessary re-renders\n if (this.groupCollapseState[label] !== newCollapsedState) {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: newCollapsedState\n };\n }\n }\n\n // Recursively check nested items\n this.updateGroupCollapseStatesRecursive(item.items);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.updateGroupCollapseStatesRecursive(item.items);\n }\n });\n }\n\n private updateComputedFields(changedFieldName: string): void {\n const config = this.getConfig();\n if (!config?.form) return;\n\n // Check all fields to see if any depend on the changed field\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n if (fieldConfig.dependsOn?.includes(changedFieldName)) {\n if (fieldConfig.computeValue) {\n const currentValue = this.formData[fieldName];\n\n const computedValue = fieldConfig.computeValue(\n this.formData,\n currentValue,\n this.originalFormData\n );\n\n // Update the form data with the computed value\n this.formData = {\n ...this.formData,\n [fieldName]: computedValue\n };\n }\n }\n });\n }\n\n private renderNewField(\n fieldName: string,\n config: FieldConfig,\n value: any\n ): TemplateResult {\n // Check visibility condition\n if (config.conditions?.visible) {\n try {\n const isVisible = config.conditions.visible(this.formData);\n if (!isVisible) {\n return html``;\n }\n } catch (error) {\n console.error(`Error checking visibility for ${fieldName}:`, error);\n // If there's an error, show the field by default\n }\n }\n\n const errors = this.errors[fieldName] ? [this.errors[fieldName]] : [];\n\n // Build container style with maxWidth if specified\n const containerStyle = config.maxWidth\n ? `max-width: ${config.maxWidth};`\n : '';\n\n const fieldContent = this.renderFieldContent(\n fieldName,\n config,\n value,\n errors\n );\n\n // Wrap in container with style if maxWidth is specified\n if (containerStyle) {\n return html`<div style=\"${containerStyle}\">${fieldContent}</div>`;\n }\n\n return fieldContent;\n }\n\n private renderFieldContent(\n fieldName: string,\n config: FieldConfig,\n value: any,\n errors: string[]\n ): TemplateResult {\n // Use FieldRenderer for consistent field rendering\n return FieldRenderer.renderField(fieldName, config, value, {\n errors,\n onChange: (e: Event) => {\n // Handle different change event types\n if (fieldName && config.type === 'key-value') {\n // Special handling for key-value editor\n const customEvent = e as CustomEvent;\n if (customEvent.detail) {\n this.handleNewFieldChange(fieldName, customEvent.detail.value);\n }\n } else if (fieldName && config.type === 'array') {\n // Special handling for array editor\n this.handleNewFieldChange(fieldName, (e.target as any).value);\n } else if (fieldName && config.type === 'message-editor') {\n // Special handling for message editor\n this.handleMessageEditorChange(fieldName, e);\n } else {\n // Default handling for most field types\n this.handleFormFieldChange(fieldName, e);\n }\n },\n showLabel: true,\n additionalData: {\n attachments: this.formData.attachments || []\n }\n });\n }\n\n private handleGroupToggle(groupLabel: string): void {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [groupLabel]: !this.groupCollapseState[groupLabel]\n };\n }\n\n private handleGroupMouseEnter(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: true\n };\n }\n\n private handleGroupMouseLeave(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: false\n };\n }\n\n private expandGroupsWithErrors(errors: { [key: string]: string }): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n const errorFields = new Set(Object.keys(errors));\n this.expandGroupsWithErrorsRecursive(config.layout, errorFields);\n }\n\n private expandGroupsWithErrorsRecursive(\n items: LayoutItem[],\n errorFields: Set<string>\n ): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const fieldsInGroup = this.collectFieldsFromItems(item.items);\n const groupHasErrors = fieldsInGroup.some((fieldName) =>\n errorFields.has(fieldName)\n );\n\n if (groupHasErrors) {\n // Expand this group\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [item.label]: false\n };\n }\n\n // Recursively check nested items\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n }\n });\n }\n\n private renderLayoutItem(\n item: LayoutItem,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n if (typeof item === 'string') {\n // String shorthand for field\n return this.renderLayoutItem(\n { type: 'field', field: item },\n config,\n renderedFields\n );\n }\n\n switch (item.type) {\n case 'field':\n if (config.form![item.field] && !renderedFields.has(item.field)) {\n renderedFields.add(item.field);\n return this.renderNewField(\n item.field,\n config.form![item.field] as FieldConfig,\n this.formData[item.field]\n );\n }\n return html``;\n\n case 'row':\n return this.renderRow(item, config, renderedFields);\n\n case 'group':\n return this.renderGroup(item, config, renderedFields);\n\n default:\n return html``;\n }\n }\n\n private renderRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const { items, gap = '1rem' } = rowConfig;\n\n // Collect all fields from this row for width calculations\n const fieldsInRow = this.collectFieldsFromItems(items);\n const validFields = fieldsInRow.filter(\n (fieldName) => config.form?.[fieldName]\n );\n\n if (validFields.length === 0) {\n return html``;\n }\n\n // Calculate grid template columns based on field maxWidth constraints\n const columns = validFields.map((fieldName) => {\n const fieldConfig = config.form![fieldName];\n return fieldConfig.maxWidth || '1fr';\n });\n\n return html`\n <div\n class=\"form-row\"\n style=\"display: grid; grid-template-columns: ${columns.join(\n ' '\n )}; gap: ${gap};\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const {\n label,\n items,\n collapsible = false,\n collapsed = false,\n helpText,\n getGroupValueCount\n } = groupConfig;\n\n // Initialize collapse state if not set\n if (collapsible && !(label in this.groupCollapseState)) {\n // Evaluate collapsed property - can be boolean or function\n const initialCollapsed =\n typeof collapsed === 'function' ? collapsed(this.formData) : collapsed;\n\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: initialCollapsed\n };\n }\n\n const isCollapsed = collapsible\n ? this.groupCollapseState[label] ??\n (typeof collapsed === 'function' ? collapsed(this.formData) : collapsed)\n : false;\n\n // Check if any field in this group has errors\n const fieldsInGroup = this.collectFieldsFromItems(items);\n const groupHasErrors = fieldsInGroup.some(\n (fieldName) => this.errors[fieldName]\n );\n\n // Calculate count for bubble display\n let valueCount = 0;\n let showBubble = false;\n let showCheckmark = false;\n let hasValue = false;\n const isHovered = this.groupHoverState[label] ?? false;\n\n if (getGroupValueCount && collapsible) {\n try {\n const result = getGroupValueCount(this.formData);\n\n if (typeof result === 'boolean') {\n // Boolean result - show checkmark when true\n showCheckmark = result && isCollapsed && !isHovered;\n hasValue = result;\n } else if (typeof result === 'number') {\n // Numeric result - show count bubble\n valueCount = result;\n showBubble = valueCount > 0 && isCollapsed && !isHovered;\n hasValue = valueCount > 0;\n }\n } catch (error) {\n console.error(\n `Error calculating group value count for ${label}:`,\n error\n );\n }\n }\n\n return html`\n <div\n class=\"form-group ${collapsible ? 'collapsible' : ''} ${groupHasErrors\n ? 'has-errors'\n : ''} ${isCollapsed ? 'collapsed' : 'expanded'} ${hasValue\n ? 'has-bubble'\n : ''}\"\n >\n <div\n class=\"form-group-header ${collapsible ? 'clickable' : ''}\"\n @click=${collapsible\n ? () => this.handleGroupToggle(label)\n : undefined}\n @mouseenter=${collapsible\n ? () => this.handleGroupMouseEnter(label)\n : undefined}\n @mouseleave=${collapsible\n ? () => this.handleGroupMouseLeave(label)\n : undefined}\n >\n <div class=\"form-group-info\">\n <div class=\"form-group-title\">${label}</div>\n ${helpText\n ? html`<div class=\"form-group-help\">\n ${renderMarkdownInline(helpText)}\n </div>`\n : ''}\n </div>\n ${groupHasErrors\n ? html`<temba-icon\n name=\"alert_warning\"\n class=\"group-error-icon\"\n size=\"1.5\"\n ></temba-icon>`\n : ''}\n ${collapsible && !groupHasErrors\n ? html`<div class=\"group-toggle-container\">\n <temba-icon\n name=\"arrow_right\"\n size=\"1.5\"\n class=\"group-toggle-icon ${isCollapsed\n ? 'collapsed'\n : 'expanded'} ${showBubble || showCheckmark ? 'faded' : ''}\"\n ></temba-icon>\n ${showCheckmark\n ? html`<temba-icon\n name=\"check\"\n size=\"1\"\n class=\"group-checkmark-icon\"\n ></temba-icon>`\n : showBubble\n ? html`<div\n class=\"group-count-bubble ${!showBubble ? 'hidden' : ''}\"\n >\n ${valueCount}\n </div>`\n : ''}\n </div>`\n : ''}\n </div>\n <div\n class=\"form-group-content ${isCollapsed ? 'collapsed' : 'expanded'}\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n </div>\n `;\n }\n\n private collectFieldsFromItems(items: LayoutItem[]): string[] {\n const fields: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === 'string') {\n fields.push(item);\n } else if (item.type === 'field') {\n fields.push(item.field);\n } else if (item.type === 'row') {\n fields.push(...this.collectFieldsFromItems(item.items));\n } else if (item.type === 'group') {\n fields.push(...this.collectFieldsFromItems(item.items));\n }\n });\n\n return fields;\n }\n\n private renderFieldRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderRow instead\n return this.renderRow(rowConfig, config, new Set());\n }\n\n private renderFieldGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderGroup instead\n return this.renderGroup(groupConfig, config, new Set());\n }\n\n private handleNewFieldChange(fieldName: string, value: any) {\n this.formData = {\n ...this.formData,\n [fieldName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n this.errors = newErrors;\n }\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render\n this.requestUpdate();\n }\n private handleMessageEditorChange(fieldName: string, event: Event): void {\n const target = event.target as any;\n\n // Update both text and attachments from the message editor\n this.formData = {\n ...this.formData,\n [fieldName]: target.value,\n attachments: target.attachments || []\n };\n\n // Clear any existing errors for both fields\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n delete newErrors.attachments;\n this.errors = newErrors;\n }\n\n // Trigger re-render\n this.requestUpdate();\n }\n\n private renderFields(): TemplateResult {\n const config = this.getConfig();\n if (!config) {\n return html` <div>No configuration available</div> `;\n }\n\n // Use the new fields configuration system\n if (config.form) {\n // If layout is specified, use it\n if (config.layout) {\n const renderedFields = new Set<string>();\n\n 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 // Fallback for configs without form configuration\n if (this.action) {\n return html` <div>No form configuration available for this action</div> `;\n } else {\n return html` <div>No form configuration available for this node</div> `;\n }\n }\n\n private renderActionSection(): TemplateResult {\n if (!this.node || this.node.actions.length === 0) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n // If node has an action config, defer to ActionEditor\n if (nodeConfig?.action) {\n const action = this.node.actions[0]; // Assume single action for now\n\n return html`\n <div class=\"action-section\">\n <h3>Action Configuration</h3>\n <div class=\"action-preview\">\n <p><strong>Type:</strong> ${action.type}</p>\n <p><em>Action details will be editable here</em></p>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private renderRouterSection(): TemplateResult {\n if (!this.node?.router) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n return html`\n <div class=\"router-section\">\n <h3>Router Configuration</h3>\n ${nodeConfig?.router\n ? this.renderRouterConfig()\n : html`<p>Basic router (no advanced configuration)</p>`}\n </div>\n `;\n }\n\n private renderRouterConfig(): TemplateResult {\n const nodeConfig = this.getNodeConfig();\n if (!nodeConfig?.router) return html``;\n\n // Render router configuration based on node config\n // This is where you'd render rule and category editors\n return html`\n <div class=\"router-config\">\n <p><strong>Type:</strong> ${nodeConfig.router.type}</p>\n ${nodeConfig.router.rules\n ? html`\n <div class=\"rules-section\">\n <h4>Rules</h4>\n <!-- Future: Render rule editor based on nodeConfig.router.rules -->\n <p><em>Rule editing will be implemented here</em></p>\n </div>\n `\n : ''}\n </div>\n `;\n }\n\n render(): TemplateResult {\n if (!this.isOpen) {\n return html``;\n }\n\n const headerColor = this.getHeaderColor();\n const config = this.getConfig();\n\n return html`\n <temba-dialog\n header=\"${config?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${this.getNodeConfig()?.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 { LayoutItem, RowLayoutConfig, GroupLayoutConfig } from './types';\nimport { CustomEventType } from '../interfaces';\nimport { generateUUID } from '../utils';\nimport { FieldRenderer } from '../form/FieldRenderer';\nimport { renderMarkdownInline } from '../markdown';\n\nexport class NodeEditor extends RapidElement {\n static get styles() {\n return css`\n .node-editor-form {\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n min-width: 400px;\n padding-bottom: 40px;\n\n --color-bubble-bg: rgba(var(--primary-rgb), 0.7);\n --color-bubble-border: rgba(0, 0, 0, 0.2);\n --color-bubble-text: #fff;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n }\n\n .form-field label {\n }\n\n .field-errors {\n color: var(--color-error, tomato);\n font-size: 12px;\n margin-left: 5px;\n margin-top: 15px;\n }\n\n .form-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n\n .action-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .action-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .router-section {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n padding: 15px;\n margin: 10px 0;\n }\n\n .router-section h3 {\n margin: 0 0 10px 0;\n color: #333;\n font-size: 14px;\n font-weight: 600;\n }\n\n .form-row {\n display: grid;\n gap: 1rem;\n align-items: center;\n }\n\n .form-group {\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .form-group.has-errors {\n border-color: var(--color-error, tomato);\n }\n\n .form-group.has-bubble {\n border-width: 2px;\n border-color: rgba(var(--primary-rgb), 0.5);\n }\n\n .form-group-header {\n background: #f8f9fa;\n padding: 8px 10px;\n border-bottom: 1px solid #e0e0e0;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n }\n\n .form-group.has-bubble .form-group-header {\n background: rgba(var(--primary-rgb), 0.1);\n }\n\n .collapsed .form-group-header {\n border: none;\n }\n\n .form-group-header:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .form-group-header.collapsible:hover {\n background: #f1f3f4;\n }\n\n .form-group-info {\n flex: 1;\n }\n\n .form-group-title {\n font-weight: 500;\n color: var(--color-label, #777);\n font-size: 14px;\n display: flex;\n }\n\n .form-group-help {\n font-size: 12px;\n color: #666;\n margin-top: 2px;\n }\n\n .form-group-toggle {\n color: #666;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n }\n\n .form-group-toggle.collapsed {\n transform: rotate(-90deg);\n }\n\n .form-group-content {\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: hidden;\n transition: all 0.2s ease-in-out;\n\n opacity: 1;\n }\n\n .form-group-content.collapsed {\n max-height: 0;\n padding-top: 0;\n padding-bottom: 0;\n opacity: 0;\n }\n\n .group-toggle-icon {\n color: #666;\n transition: transform 0.3s ease, opacity 0.3s ease;\n cursor: pointer;\n transform: rotate(0deg);\n opacity: 1;\n }\n\n .group-toggle-icon.faded {\n opacity: 0;\n }\n\n .group-toggle-icon.expanded {\n transform: rotate(90deg);\n }\n\n .group-toggle-icon.collapsed {\n transform: rotate(0deg);\n }\n\n .group-toggle-icon:hover {\n color: #333;\n }\n\n .group-error-icon {\n color: var(--color-error, tomato);\n margin-right: 8px;\n }\n\n .group-count-bubble {\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 600;\n padding: 4px;\n min-width: 12px;\n min-height: 12px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n line-height: 0px;\n opacity: 1;\n transition: opacity 0.3s ease;\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n color: var(--color-bubble-text, #000);\n }\n\n .group-count-bubble.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-checkmark-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n opacity: 1;\n transition: opacity 0.3s ease;\n border-radius: 50%;\n color: var(--color-bubble-text, #000);\n background: var(--color-bubble-bg, #fff);\n border: 1px solid var(--color-bubble-border, #777);\n padding: 0.2em;\n }\n\n .group-checkmark-icon.hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .group-toggle-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .gutter-fields {\n display: flex;\n flex-direction: column;\n gap: 10px;\n align-items: flex-start;\n }\n\n .gutter-fields .form-row {\n margin: 0;\n }\n\n .gutter-fields temba-checkbox {\n align-self: flex-start;\n }\n\n .gutter-fields temba-select {\n min-width: 120px;\n }\n `;\n }\n\n @property({ type: Object })\n action?: Action;\n\n @property({ type: Object })\n node?: Node;\n\n @property({ type: Object })\n nodeUI?: NodeUI;\n\n @property({ type: Boolean })\n isOpen: boolean = false;\n\n @state()\n private formData: any = {};\n\n @state()\n private originalFormData: any = {};\n\n @state()\n private errors: { [key: string]: string } = {};\n\n @state()\n private groupCollapseState: { [key: string]: boolean } = {};\n\n @state()\n private groupHoverState: { [key: string]: boolean } = {};\n\n connectedCallback(): void {\n super.connectedCallback();\n this.initializeFormData();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n if (\n changedProperties.has('node') ||\n changedProperties.has('action') ||\n changedProperties.has('nodeUI')\n ) {\n // For action editing, we only need the action\n if (this.action && (!this.node || !this.nodeUI)) {\n this.openDialog();\n }\n // For node editing, we need both node and nodeUI\n else if (this.node && this.nodeUI) {\n this.openDialog();\n }\n // If we don't have the required data, close the dialog\n else if (!this.action && (!this.node || !this.nodeUI)) {\n this.isOpen = false;\n }\n }\n }\n\n private openDialog(): void {\n this.initializeFormData();\n this.errors = {};\n this.isOpen = true;\n }\n\n private initializeFormData(): void {\n const nodeConfig = this.getNodeConfig();\n\n if ((!nodeConfig || nodeConfig.type === 'execute_actions') && this.action) {\n // Action editing mode - use action config\n const actionConfig = ACTION_CONFIG[this.action.type];\n\n if (actionConfig?.toFormData) {\n this.formData = actionConfig.toFormData(this.action);\n } else {\n this.formData = { ...this.action };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n } else if (this.node) {\n // Node editing mode - use node config\n const nodeConfig = this.getNodeConfig();\n if (nodeConfig?.toFormData) {\n this.formData = nodeConfig.toFormData(this.node);\n } else {\n this.formData = { ...this.node };\n }\n\n // Convert Record objects to array format for key-value editors\n this.processFormDataForEditing();\n\n // Store a copy of the original form data for computed field comparisons\n this.originalFormData = JSON.parse(JSON.stringify(this.formData));\n }\n\n // enforce immutability of formData\n Object.keys(this.formData).forEach((key) => {\n const value = this.formData[key];\n if (Array.isArray(value)) {\n this.formData[key] = [...value];\n } else if (value && typeof value === 'object') {\n // If it's an object, ensure we don't mutate the original\n this.formData[key] = { ...value };\n }\n });\n }\n\n private processFormDataForEditing(): void {\n const processed = { ...this.formData };\n\n // Convert Record objects to key-value arrays for key-value editors\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Check if this field should be a key-value editor\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n // Convert Record to array format\n processed[key] = Object.entries(value).map(([k, v]) => ({\n key: k,\n value: v\n }));\n }\n }\n });\n\n // Convert select fields to array format\n const config = this.getConfig();\n if (config?.form) {\n this.processSelectFields(processed, config.form);\n }\n\n this.formData = processed;\n }\n\n private processSelectFields(data: any, formConfig: any): void {\n Object.entries(formConfig).forEach(\n ([fieldName, fieldConfig]: [string, any]) => {\n const value = data[fieldName];\n\n // Handle top-level select fields\n if (fieldConfig.type === 'select' && value) {\n data[fieldName] = this.convertToSelectArray(value);\n }\n\n // Handle select fields within array items\n if (\n fieldConfig.type === 'array' &&\n Array.isArray(value) &&\n fieldConfig.itemConfig\n ) {\n value.forEach((item: any) => {\n this.processSelectFields(item, fieldConfig.itemConfig);\n });\n }\n }\n );\n }\n\n private convertToSelectArray(value: any): any[] {\n if (Array.isArray(value)) {\n return value.map((v) =>\n typeof v === 'string' ? { name: v, value: v } : v\n );\n } else if (typeof value === 'string') {\n return [{ name: value, value: value }];\n } else {\n return [value];\n }\n }\n\n private isKeyValueField(fieldName: string): boolean {\n // Check if this field is configured as a key-value type\n const config = this.getConfig();\n const fields = config?.form;\n return fields?.[fieldName]?.type === 'key-value';\n }\n\n private getConfig(): ActionConfig | NodeConfig | null {\n // If we have a node and nodeUI, check if we should use node config\n if (this.node && this.nodeUI) {\n const nodeConfig = this.getNodeConfig();\n\n // For execute_actions nodes, defer to action editing if an action is selected\n if (this.nodeUI.type === 'execute_actions' && this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n // For all other nodes with a config, use the node config\n if (nodeConfig) {\n return nodeConfig;\n }\n }\n\n // Fall back to action config if no node config or for pure action editing\n if (this.action) {\n return ACTION_CONFIG[this.action.type] || null;\n }\n\n return null;\n }\n\n private getNodeConfig(): NodeConfig | null {\n if (!this.nodeUI) return null;\n // Get node config based on the nodeUI's type\n return this.nodeUI.type ? NODE_CONFIG[this.nodeUI.type] : null;\n }\n\n private getHeaderColor(): string {\n const config = this.getConfig();\n return config?.color || '#666666';\n }\n\n private handleDialogButtonClick(event: CustomEvent): void {\n const button = event.detail.button;\n\n if (button.name === 'Save') {\n this.handleSave();\n } else if (button.name === 'Cancel') {\n this.handleCancel();\n }\n }\n\n private handleSave(): void {\n // Validate the form\n const validation = this.validateForm();\n if (!validation.valid) {\n this.errors = validation.errors;\n\n // Expand any groups that contain validation errors\n this.expandGroupsWithErrors(validation.errors);\n\n return;\n }\n\n // Process form data to convert key-value arrays to Records before saving\n const processedFormData = this.processFormDataForSave();\n\n // Determine whether to use node or action saving based on context\n // If we have a node with a router, always use node saving (even if action is set)\n // because router configuration is handled at the node level\n if (this.node && this.node.router) {\n // Node editing mode with router - use formDataToNode\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n } else if (this.action) {\n // Pure action editing mode (no router)\n const updatedAction = this.formDataToAction(processedFormData);\n this.fireCustomEvent(CustomEventType.ActionSaved, {\n action: updatedAction\n });\n } else if (this.node) {\n // Node editing mode without router\n const updatedNode = this.formDataToNode(processedFormData);\n this.fireCustomEvent(CustomEventType.NodeSaved, {\n node: updatedNode\n });\n }\n }\n\n private processFormDataForSave(): any {\n const processed = { ...this.formData };\n\n // Convert key-value arrays to Records\n Object.keys(processed).forEach((key) => {\n const value = processed[key];\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array, convert to Record\n const record: Record<string, string> = {};\n value.forEach(({ key: k, value: v }) => {\n if (k.trim() !== '' || v.trim() !== '') {\n record[k] = v;\n }\n });\n processed[key] = record;\n } else if (Array.isArray(value) && value.length === 0) {\n // Empty key-value array should become empty object\n const isKeyValueField = this.isKeyValueField(key);\n if (isKeyValueField) {\n processed[key] = {};\n }\n }\n });\n\n return processed;\n }\n\n private handleCancel(): void {\n this.fireCustomEvent(CustomEventType.NodeEditCancelled, {});\n }\n\n private validateForm(): ValidationResult {\n const errors: { [key: string]: string } = {};\n const config = this.getConfig();\n\n if (config) {\n // Check if new field configuration system is available\n if (config.form) {\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n const value = this.formData[fieldName];\n if (fieldConfig.type === 'select' && fieldConfig.allowCreate) {\n // check our values to see if any have arbitrary set\n let selected = this.formData[fieldName];\n selected = Array.isArray(selected)\n ? selected.find((v: any) => v.arbitrary)\n : null;\n\n if (selected && selected.arbitrary) {\n errors[fieldName] =\n 'There was an error creating' + ' \"' + selected.name + '\"';\n }\n }\n\n // Check required fields\n if (\n (fieldConfig as any).required &&\n (!value || (Array.isArray(value) && value.length === 0))\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } is required.`;\n }\n\n // Check minLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).minLength &&\n value.length < (fieldConfig as any).minLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be at least ${(fieldConfig as any).minLength} characters`;\n }\n\n // Check maxLength for text fields\n if (\n typeof value === 'string' &&\n (fieldConfig as any).maxLength &&\n value.length > (fieldConfig as any).maxLength\n ) {\n errors[fieldName] = `${\n (fieldConfig as any).label || fieldName\n } must be no more than ${\n (fieldConfig as any).maxLength\n } characters`;\n }\n });\n }\n\n // Universal validation for category arrays to check for reserved names\n this.validateCategoryNames(errors);\n\n // Run custom validation if available\n if (config.validate) {\n if (config.sanitize) {\n config.sanitize(this.formData);\n }\n\n let customValidation;\n if (this.action) {\n customValidation = config.validate({\n ...this.action,\n ...this.formData\n });\n } else {\n customValidation = config.validate(this.formData);\n }\n Object.assign(errors, customValidation.errors);\n }\n }\n\n // Validate key-value fields for unique keys\n this.validateKeyValueUniqueness(errors);\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n }\n\n private validateKeyValueUniqueness(errors: { [key: string]: string }): void {\n // The individual key-value editors will show validation errors on duplicate keys and empty keys with values\n // We just need to prevent form submission when there are validation issues\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'key' in value[0] &&\n 'value' in value[0]\n ) {\n // This is a key-value array\n let hasValidationErrors = false;\n\n // Check for empty keys with values\n value.forEach(({ key, value: itemValue }: any) => {\n if (key.trim() === '' && itemValue.trim() !== '') {\n hasValidationErrors = true;\n }\n });\n\n // Check for duplicate keys (only non-empty ones)\n const keys = value\n .filter(({ key }: any) => key.trim() !== '') // Only check non-empty keys\n .map(({ key }: any) => key.trim());\n\n const uniqueKeys = new Set(keys);\n\n if (keys.length !== uniqueKeys.size) {\n hasValidationErrors = true;\n }\n\n if (hasValidationErrors) {\n errors[fieldName] = `Please resolve validation errors to continue`;\n }\n }\n });\n }\n\n private validateCategoryNames(errors: { [key: string]: string }): void {\n // Universal validation for category names across all node types\n // Prevents use of reserved category names that have special meaning in the system\n // Define reserved category names (case-insensitive)\n const reservedNames = [\n 'other',\n 'failure',\n 'success',\n 'all responses',\n 'no response'\n ];\n\n // Check all form fields for category arrays\n Object.entries(this.formData).forEach(([fieldName, value]) => {\n if (Array.isArray(value) && fieldName === 'categories') {\n const categories = value.filter(\n (item: any) => item?.name && item.name.trim() !== ''\n );\n\n // Check for reserved names\n const reservedUsed = categories\n .filter((item: any) => {\n const lowerName = item.name.trim().toLowerCase();\n return reservedNames.includes(lowerName);\n })\n .map((item: any) => item.name.trim()); // Preserve original case\n\n if (reservedUsed.length > 0) {\n errors[\n fieldName\n ] = `Reserved category names cannot be used: ${reservedUsed.join(\n ', '\n )}`;\n }\n }\n });\n }\n\n private formDataToNode(formData: any = this.formData): Node {\n if (!this.node) throw new Error('No node to update');\n let updatedNode: Node = { ...this.node };\n\n // Handle actions using action config transformations if available\n if (this.node.actions && this.node.actions.length > 0) {\n updatedNode.actions = this.node.actions.map((action) => {\n // If we're editing a specific action, only transform that one\n if (this.action && action.uuid === this.action.uuid) {\n const actionConfig = ACTION_CONFIG[action.type];\n if (actionConfig?.fromFormData) {\n // Use action-specific form data transformation\n return actionConfig.fromFormData(formData);\n } else {\n // Default transformation - merge form data with original action\n return { ...action, ...formData };\n }\n } else {\n // Keep other actions unchanged\n return action;\n }\n });\n }\n\n // Handle router configuration using node config\n if (this.node.router) {\n const nodeConfig = this.getNodeConfig();\n\n if (nodeConfig?.fromFormData) {\n // Use node-specific form data transformation\n updatedNode = nodeConfig.fromFormData(formData, updatedNode);\n } else {\n // Default router handling\n updatedNode.router = { ...this.node.router };\n\n // Apply form data to router fields if they exist\n if (formData.result_name !== undefined) {\n updatedNode.router.result_name = formData.result_name;\n }\n\n // Handle preconfigured rules from node config\n if (nodeConfig?.router?.rules) {\n // Build a complete new set of categories and exits based on node config\n const existingCategories = updatedNode.router.categories || [];\n const existingExits = updatedNode.exits || [];\n\n const newCategories: any[] = [];\n const newExits: any[] = [];\n\n // Group rules by category name to handle multiple rules pointing to the same category\n const categoryNameToRules = new Map<\n string,\n typeof nodeConfig.router.rules\n >();\n nodeConfig.router.rules.forEach((rule) => {\n if (!categoryNameToRules.has(rule.categoryName)) {\n categoryNameToRules.set(rule.categoryName, []);\n }\n categoryNameToRules.get(rule.categoryName)!.push(rule);\n });\n\n // Create categories for all unique category names\n categoryNameToRules.forEach((rules, categoryName) => {\n // Check if category already exists to preserve its UUID and exit_uuid\n const existingCategory = existingCategories.find(\n (cat) => cat.name === categoryName\n );\n\n if (existingCategory) {\n // Preserve existing category and its associated exit\n newCategories.push(existingCategory);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === existingCategory.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: categoryName,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n });\n\n // Add default category if specified\n if (nodeConfig.router.defaultCategory) {\n // Check if default category already exists in our new list\n const existingDefault = newCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (!existingDefault) {\n // Check if it exists in the original categories\n const originalDefault = existingCategories.find(\n (cat) => cat.name === nodeConfig.router.defaultCategory\n );\n\n if (originalDefault) {\n // Preserve existing default category and its exit\n newCategories.push(originalDefault);\n const associatedExit = existingExits.find(\n (exit) => exit.uuid === originalDefault.exit_uuid\n );\n if (associatedExit) {\n newExits.push(associatedExit);\n }\n } else {\n // Create new default category and exit\n const categoryUuid = generateUUID();\n const exitUuid = generateUUID();\n\n newCategories.push({\n uuid: categoryUuid,\n name: nodeConfig.router.defaultCategory,\n exit_uuid: exitUuid\n });\n\n newExits.push({\n uuid: exitUuid,\n destination_uuid: null\n });\n }\n }\n }\n\n // Replace the entire categories and exits lists with our complete new sets\n updatedNode.router.categories = newCategories;\n updatedNode.exits = newExits;\n }\n }\n } else {\n // If no router, just apply form data to node properties\n Object.keys(formData).forEach((key) => {\n if (\n key !== 'uuid' &&\n key !== 'actions' &&\n key !== 'exits' &&\n key !== 'router'\n ) {\n (updatedNode as any)[key] = formData[key];\n }\n });\n }\n\n return updatedNode;\n }\n\n private formDataToAction(formData: any = this.formData): Action {\n if (!this.action) throw new Error('No action to update');\n\n // Use action config transformation if available\n const actionConfig = ACTION_CONFIG[this.action.type];\n if (actionConfig?.fromFormData) {\n return actionConfig.fromFormData(formData);\n } else {\n // Default 1:1 mapping\n return { ...this.action, ...formData };\n }\n }\n\n private handleFormFieldChange(propertyName: string, event: Event): void {\n const target = event.target as any;\n let value: any;\n\n // Handle different component types like ActionEditor does\n if (target.tagName === 'TEMBA-CHECKBOX') {\n value = target.checked;\n } else if (target.values !== undefined) {\n value = target.values;\n } else {\n value = target.value;\n }\n\n this.formData = {\n ...this.formData,\n [propertyName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[propertyName]) {\n const newErrors = { ...this.errors };\n delete newErrors[propertyName];\n this.errors = newErrors;\n }\n\n // Check for computed values in dependent fields\n this.updateComputedFields(propertyName);\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render to handle conditional field visibility\n this.requestUpdate();\n }\n\n private updateGroupCollapseStates(): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n this.updateGroupCollapseStatesRecursive(config.layout);\n }\n\n private updateGroupCollapseStatesRecursive(items: LayoutItem[]): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const { label, collapsed, collapsible } = item;\n\n // Only update if the group is collapsible and has a function-based collapsed property\n if (collapsible && typeof collapsed === 'function') {\n const newCollapsedState = collapsed(this.formData);\n\n // Only update if the state has changed to avoid unnecessary re-renders\n if (this.groupCollapseState[label] !== newCollapsedState) {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: newCollapsedState\n };\n }\n }\n\n // Recursively check nested items\n this.updateGroupCollapseStatesRecursive(item.items);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.updateGroupCollapseStatesRecursive(item.items);\n }\n });\n }\n\n private updateComputedFields(changedFieldName: string): void {\n const config = this.getConfig();\n if (!config?.form) return;\n\n // Check all fields to see if any depend on the changed field\n Object.entries(config.form).forEach(([fieldName, fieldConfig]) => {\n if (fieldConfig.dependsOn?.includes(changedFieldName)) {\n if (fieldConfig.computeValue) {\n const currentValue = this.formData[fieldName];\n\n const computedValue = fieldConfig.computeValue(\n this.formData,\n currentValue,\n this.originalFormData\n );\n\n // Update the form data with the computed value\n this.formData = {\n ...this.formData,\n [fieldName]: computedValue\n };\n }\n }\n });\n }\n\n private renderNewField(\n fieldName: string,\n config: FieldConfig,\n value: any\n ): TemplateResult {\n // Check visibility condition\n if (config.conditions?.visible) {\n try {\n const isVisible = config.conditions.visible(this.formData);\n if (!isVisible) {\n return html``;\n }\n } catch (error) {\n console.error(`Error checking visibility for ${fieldName}:`, error);\n // If there's an error, show the field by default\n }\n }\n\n const errors = this.errors[fieldName] ? [this.errors[fieldName]] : [];\n\n // Build container style with maxWidth if specified\n const containerStyle = config.maxWidth\n ? `max-width: ${config.maxWidth};`\n : '';\n\n const fieldContent = this.renderFieldContent(\n fieldName,\n config,\n value,\n errors\n );\n\n // Wrap in container with style if maxWidth is specified\n if (containerStyle) {\n return html`<div style=\"${containerStyle}\">${fieldContent}</div>`;\n }\n\n return fieldContent;\n }\n\n private renderFieldContent(\n fieldName: string,\n config: FieldConfig,\n value: any,\n errors: string[]\n ): TemplateResult {\n // Use FieldRenderer for consistent field rendering\n return FieldRenderer.renderField(fieldName, config, value, {\n errors,\n onChange: (e: Event) => {\n // Handle different change event types\n if (fieldName && config.type === 'key-value') {\n // Special handling for key-value editor\n const customEvent = e as CustomEvent;\n if (customEvent.detail) {\n this.handleNewFieldChange(fieldName, customEvent.detail.value);\n }\n } else if (fieldName && config.type === 'array') {\n // Special handling for array editor\n this.handleNewFieldChange(fieldName, (e.target as any).value);\n } else if (fieldName && config.type === 'message-editor') {\n // Special handling for message editor\n this.handleMessageEditorChange(fieldName, e);\n } else {\n // Default handling for most field types\n this.handleFormFieldChange(fieldName, e);\n }\n },\n showLabel: true,\n formData: this.formData,\n additionalData: {\n attachments: this.formData.attachments || []\n }\n });\n }\n\n private handleGroupToggle(groupLabel: string): void {\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [groupLabel]: !this.groupCollapseState[groupLabel]\n };\n }\n\n private handleGroupMouseEnter(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: true\n };\n }\n\n private handleGroupMouseLeave(groupLabel: string): void {\n this.groupHoverState = {\n ...this.groupHoverState,\n [groupLabel]: false\n };\n }\n\n private expandGroupsWithErrors(errors: { [key: string]: string }): void {\n const config = this.getConfig();\n if (!config?.layout) return;\n\n const errorFields = new Set(Object.keys(errors));\n this.expandGroupsWithErrorsRecursive(config.layout, errorFields);\n }\n\n private expandGroupsWithErrorsRecursive(\n items: LayoutItem[],\n errorFields: Set<string>\n ): void {\n items.forEach((item) => {\n if (typeof item === 'object' && item.type === 'group') {\n const fieldsInGroup = this.collectFieldsFromItems(item.items);\n const groupHasErrors = fieldsInGroup.some((fieldName) =>\n errorFields.has(fieldName)\n );\n\n if (groupHasErrors) {\n // Expand this group\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [item.label]: false\n };\n }\n\n // Recursively check nested items\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n } else if (typeof item === 'object' && item.type === 'row') {\n // Recursively check items in rows\n this.expandGroupsWithErrorsRecursive(item.items, errorFields);\n }\n });\n }\n\n private renderLayoutItem(\n item: LayoutItem,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n if (typeof item === 'string') {\n // String shorthand for field\n return this.renderLayoutItem(\n { type: 'field', field: item },\n config,\n renderedFields\n );\n }\n\n switch (item.type) {\n case 'field':\n if (config.form![item.field] && !renderedFields.has(item.field)) {\n renderedFields.add(item.field);\n return this.renderNewField(\n item.field,\n config.form![item.field] as FieldConfig,\n this.formData[item.field]\n );\n }\n return html``;\n\n case 'row':\n return this.renderRow(item, config, renderedFields);\n\n case 'group':\n return this.renderGroup(item, config, renderedFields);\n\n default:\n return html``;\n }\n }\n\n private renderRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const { items, gap = '1rem' } = rowConfig;\n\n // Collect all fields from this row for width calculations\n const fieldsInRow = this.collectFieldsFromItems(items);\n const validFields = fieldsInRow.filter(\n (fieldName) => config.form?.[fieldName]\n );\n\n if (validFields.length === 0) {\n return html``;\n }\n\n // Calculate grid template columns based on field maxWidth constraints\n const columns = validFields.map((fieldName) => {\n const fieldConfig = config.form![fieldName];\n return fieldConfig.maxWidth || '1fr';\n });\n\n return html`\n <div\n class=\"form-row\"\n style=\"display: grid; grid-template-columns: ${columns.join(\n ' '\n )}; gap: ${gap};\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig,\n renderedFields: Set<string>\n ): TemplateResult {\n const {\n label,\n items,\n collapsible = false,\n collapsed = false,\n helpText,\n getGroupValueCount\n } = groupConfig;\n\n // Initialize collapse state if not set\n if (collapsible && !(label in this.groupCollapseState)) {\n // Evaluate collapsed property - can be boolean or function\n const initialCollapsed =\n typeof collapsed === 'function' ? collapsed(this.formData) : collapsed;\n\n this.groupCollapseState = {\n ...this.groupCollapseState,\n [label]: initialCollapsed\n };\n }\n\n const isCollapsed = collapsible\n ? this.groupCollapseState[label] ??\n (typeof collapsed === 'function' ? collapsed(this.formData) : collapsed)\n : false;\n\n // Check if any field in this group has errors\n const fieldsInGroup = this.collectFieldsFromItems(items);\n const groupHasErrors = fieldsInGroup.some(\n (fieldName) => this.errors[fieldName]\n );\n\n // Calculate count for bubble display\n let valueCount = 0;\n let showBubble = false;\n let showCheckmark = false;\n let hasValue = false;\n const isHovered = this.groupHoverState[label] ?? false;\n\n if (getGroupValueCount && collapsible) {\n try {\n const result = getGroupValueCount(this.formData);\n\n if (typeof result === 'boolean') {\n // Boolean result - show checkmark when true\n showCheckmark = result && isCollapsed && !isHovered;\n hasValue = result;\n } else if (typeof result === 'number') {\n // Numeric result - show count bubble\n valueCount = result;\n showBubble = valueCount > 0 && isCollapsed && !isHovered;\n hasValue = valueCount > 0;\n }\n } catch (error) {\n console.error(\n `Error calculating group value count for ${label}:`,\n error\n );\n }\n }\n\n return html`\n <div\n class=\"form-group ${collapsible ? 'collapsible' : ''} ${groupHasErrors\n ? 'has-errors'\n : ''} ${isCollapsed ? 'collapsed' : 'expanded'} ${hasValue\n ? 'has-bubble'\n : ''}\"\n >\n <div\n class=\"form-group-header ${collapsible ? 'clickable' : ''}\"\n @click=${collapsible\n ? () => this.handleGroupToggle(label)\n : undefined}\n @mouseenter=${collapsible\n ? () => this.handleGroupMouseEnter(label)\n : undefined}\n @mouseleave=${collapsible\n ? () => this.handleGroupMouseLeave(label)\n : undefined}\n >\n <div class=\"form-group-info\">\n <div class=\"form-group-title\">${label}</div>\n ${helpText\n ? html`<div class=\"form-group-help\">\n ${renderMarkdownInline(helpText)}\n </div>`\n : ''}\n </div>\n ${groupHasErrors\n ? html`<temba-icon\n name=\"alert_warning\"\n class=\"group-error-icon\"\n size=\"1.5\"\n ></temba-icon>`\n : ''}\n ${collapsible && !groupHasErrors\n ? html`<div class=\"group-toggle-container\">\n <temba-icon\n name=\"arrow_right\"\n size=\"1.5\"\n class=\"group-toggle-icon ${isCollapsed\n ? 'collapsed'\n : 'expanded'} ${showBubble || showCheckmark ? 'faded' : ''}\"\n ></temba-icon>\n ${showCheckmark\n ? html`<temba-icon\n name=\"check\"\n size=\"1\"\n class=\"group-checkmark-icon\"\n ></temba-icon>`\n : showBubble\n ? html`<div\n class=\"group-count-bubble ${!showBubble ? 'hidden' : ''}\"\n >\n ${valueCount}\n </div>`\n : ''}\n </div>`\n : ''}\n </div>\n <div\n class=\"form-group-content ${isCollapsed ? 'collapsed' : 'expanded'}\"\n >\n ${items.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n </div>\n `;\n }\n\n private collectFieldsFromItems(items: LayoutItem[]): string[] {\n const fields: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === 'string') {\n fields.push(item);\n } else if (item.type === 'field') {\n fields.push(item.field);\n } else if (item.type === 'row') {\n fields.push(...this.collectFieldsFromItems(item.items));\n } else if (item.type === 'group') {\n fields.push(...this.collectFieldsFromItems(item.items));\n }\n });\n\n return fields;\n }\n\n private renderFieldRow(\n rowConfig: RowLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderRow instead\n return this.renderRow(rowConfig, config, new Set());\n }\n\n private renderFieldGroup(\n groupConfig: GroupLayoutConfig,\n config: ActionConfig | NodeConfig\n ): TemplateResult {\n // This method is deprecated - use renderGroup instead\n return this.renderGroup(groupConfig, config, new Set());\n }\n\n private handleNewFieldChange(fieldName: string, value: any) {\n this.formData = {\n ...this.formData,\n [fieldName]: value\n };\n\n // Clear any existing error for this field\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n this.errors = newErrors;\n }\n\n // Re-evaluate group collapse states that depend on form data\n this.updateGroupCollapseStates();\n\n // Trigger re-render\n this.requestUpdate();\n }\n private handleMessageEditorChange(fieldName: string, event: Event): void {\n const target = event.target as any;\n\n // Update both text and attachments from the message editor\n this.formData = {\n ...this.formData,\n [fieldName]: target.value,\n attachments: target.attachments || []\n };\n\n // Clear any existing errors for both fields\n if (this.errors[fieldName]) {\n const newErrors = { ...this.errors };\n delete newErrors[fieldName];\n delete newErrors.attachments;\n this.errors = newErrors;\n }\n\n // Trigger re-render\n this.requestUpdate();\n }\n\n private renderFields(): TemplateResult {\n const config = this.getConfig();\n if (!config) {\n return html` <div>No configuration available</div> `;\n }\n\n // Use the new fields configuration system\n if (config.form) {\n // If layout is specified, use it\n if (config.layout) {\n const renderedFields = new Set<string>();\n\n // Also collect fields from gutter to avoid rendering them in main form\n const gutterFields = new Set<string>();\n if (config.gutter) {\n const gutterFieldNames = this.collectFieldsFromItems(config.gutter);\n gutterFieldNames.forEach((field) => gutterFields.add(field));\n }\n\n return html`\n ${config.layout.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n ${\n /* Render any fields not explicitly placed in layout or gutter */\n Object.entries(config.form).map(([fieldName, fieldConfig]) => {\n if (\n !renderedFields.has(fieldName) &&\n !gutterFields.has(fieldName)\n ) {\n return this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n );\n }\n return html``;\n })\n }\n `;\n } else {\n // Default rendering without layout\n return html`\n ${Object.entries(config.form).map(([fieldName, fieldConfig]) =>\n this.renderNewField(\n fieldName,\n fieldConfig as FieldConfig,\n this.formData[fieldName]\n )\n )}\n `;\n }\n }\n\n // Fallback for configs without form configuration\n if (this.action) {\n return html` <div>No form configuration available for this action</div> `;\n } else {\n return html` <div>No form configuration available for this node</div> `;\n }\n }\n\n private renderGutter(): TemplateResult {\n const config = this.getConfig();\n if (!config?.gutter || config.gutter.length === 0) {\n return html``;\n }\n\n // Use the same layout rendering system for gutter fields\n const renderedFields = new Set<string>();\n\n return html`\n <div class=\"gutter-fields\">\n ${config.gutter.map((item) =>\n this.renderLayoutItem(item, config, renderedFields)\n )}\n </div>\n `;\n }\n\n private renderActionSection(): TemplateResult {\n if (!this.node || this.node.actions.length === 0) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n // If node has an action config, defer to ActionEditor\n if (nodeConfig?.action) {\n const action = this.node.actions[0]; // Assume single action for now\n\n return html`\n <div class=\"action-section\">\n <h3>Action Configuration</h3>\n <div class=\"action-preview\">\n <p><strong>Type:</strong> ${action.type}</p>\n <p><em>Action details will be editable here</em></p>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private renderRouterSection(): TemplateResult {\n if (!this.node?.router) {\n return html``;\n }\n\n const nodeConfig = this.getNodeConfig();\n\n return html`\n <div class=\"router-section\">\n <h3>Router Configuration</h3>\n ${nodeConfig?.router\n ? this.renderRouterConfig()\n : html`<p>Basic router (no advanced configuration)</p>`}\n </div>\n `;\n }\n\n private renderRouterConfig(): TemplateResult {\n const nodeConfig = this.getNodeConfig();\n if (!nodeConfig?.router) return html``;\n\n // Render router configuration based on node config\n // This is where you'd render rule and category editors\n return html`\n <div class=\"router-config\">\n <p><strong>Type:</strong> ${nodeConfig.router.type}</p>\n ${nodeConfig.router.rules\n ? html`\n <div class=\"rules-section\">\n <h4>Rules</h4>\n <!-- Future: Render rule editor based on nodeConfig.router.rules -->\n <p><em>Rule editing will be implemented here</em></p>\n </div>\n `\n : ''}\n </div>\n `;\n }\n\n render(): TemplateResult {\n if (!this.isOpen) {\n return html``;\n }\n\n const headerColor = this.getHeaderColor();\n const config = this.getConfig();\n const dialogSize = config?.dialogSize || 'medium'; // Default to 'large' if not specified\n\n return html`\n <temba-dialog\n header=\"${config?.name || 'Edit'}\"\n .open=\"${this.isOpen}\"\n @temba-button-clicked=${this.handleDialogButtonClick}\n primaryButtonName=\"Save\"\n cancelButtonName=\"Cancel\"\n style=\"--header-bg: ${headerColor}\"\n size=\"${dialogSize}\"\n >\n <div class=\"node-editor-form\">\n ${this.renderFields()}\n ${this.getNodeConfig()?.router?.configurable\n ? this.renderRouterSection()\n : null}\n </div>\n\n <div slot=\"gutter\">${this.renderGutter()}</div>\n </temba-dialog>\n `;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add_contact_urn.js","sourceRoot":"","sources":["../../../../src/flow/actions/add_contact_urn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAqB,EAAE,EAAE;QAC7C,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;QACpE,OAAO,IAAI,CAAA;;;YAGH,cAAc,
|
|
1
|
+
{"version":3,"file":"add_contact_urn.js","sourceRoot":"","sources":["../../../../src/flow/actions/add_contact_urn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAqB,EAAE,EAAE;QAC7C,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;QACpE,OAAO,IAAI,CAAA;;;YAGH,cAAc,YAAY,MAAM,CAAC,IAAI;WACtC,CAAC;IACV,CAAC;CACF,CAAC","sourcesContent":["import { html } from 'lit-html';\nimport { ActionConfig, COLORS } from '../types';\nimport { Node, AddContactUrn } from '../../store/flow-definition';\nimport { urnSchemeMap } from '../utils';\n\nexport const add_contact_urn: ActionConfig = {\n name: 'Add URN',\n color: COLORS.update,\n render: (_node: Node, action: AddContactUrn) => {\n const friendlyScheme = urnSchemeMap[action.scheme] || action.scheme;\n return html`<div\n style=\"word-wrap: break-word; overflow-wrap: break-word; hyphens: auto;\"\n >\n Add ${friendlyScheme} <strong>${action.path}</strong>\n </div>`;\n }\n};\n"]}
|
|
@@ -4,7 +4,7 @@ export const set_contact_channel = {
|
|
|
4
4
|
name: 'Update Channel',
|
|
5
5
|
color: COLORS.update,
|
|
6
6
|
render: (_node, action) => {
|
|
7
|
-
return html `<div>Set to <
|
|
7
|
+
return html `<div>Set to <strong>${action.channel.name}</strong></div>`;
|
|
8
8
|
},
|
|
9
9
|
form: {
|
|
10
10
|
channel: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set_contact_channel.js","sourceRoot":"","sources":["../../../../src/flow/actions/set_contact_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAoB,MAAM,UAAU,CAAC;AAGlE,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAyB,EAAE,EAAE;QACjD,OAAO,IAAI,CAAA,
|
|
1
|
+
{"version":3,"file":"set_contact_channel.js","sourceRoot":"","sources":["../../../../src/flow/actions/set_contact_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAoB,MAAM,UAAU,CAAC;AAGlE,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAyB,EAAE,EAAE;QACjD,OAAO,IAAI,CAAA,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAAC;IACzE,CAAC;IACD,IAAI,EAAE;QACJ,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,uBAAuB;YACjC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,2CAA2C;SACtD;KACF;IACD,QAAQ,EAAE,CAAC,QAA2B,EAAoB,EAAE;QAC1D,MAAM,MAAM,GAA8B,EAAE,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAC;QACzC,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACvC,MAAM;SACP,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["import { html } from 'lit-html';\nimport { ActionConfig, COLORS, ValidationResult } from '../types';\nimport { Node, SetContactChannel } from '../../store/flow-definition';\n\nexport const set_contact_channel: ActionConfig = {\n name: 'Update Channel',\n color: COLORS.update,\n render: (_node: Node, action: SetContactChannel) => {\n return html`<div>Set to <strong>${action.channel.name}</strong></div>`;\n },\n form: {\n channel: {\n type: 'select',\n label: 'Channel',\n required: true,\n searchable: true,\n clearable: false,\n endpoint: '/api/v2/channels.json',\n valueKey: 'uuid',\n nameKey: 'name',\n helpText: 'Select the channel to set for the contact'\n }\n },\n validate: (formData: SetContactChannel): ValidationResult => {\n const errors: { [key: string]: string } = {};\n\n if (!formData.channel) {\n errors.channel = 'Channel is required';\n }\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n }\n};\n"]}
|
|
@@ -5,7 +5,8 @@ export const set_contact_field = {
|
|
|
5
5
|
color: COLORS.update,
|
|
6
6
|
render: (_node, action) => {
|
|
7
7
|
return html `<div>
|
|
8
|
-
Set <
|
|
8
|
+
Set <strong>${action.field.name}</strong> to
|
|
9
|
+
<strong>${action.value}</strong>
|
|
9
10
|
</div>`;
|
|
10
11
|
},
|
|
11
12
|
form: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set_contact_field.js","sourceRoot":"","sources":["../../../../src/flow/actions/set_contact_field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAoB,MAAM,UAAU,CAAC;AAGlE,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAuB,EAAE,EAAE;QAC/C,OAAO,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"set_contact_field.js","sourceRoot":"","sources":["../../../../src/flow/actions/set_contact_field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAgB,MAAM,EAAoB,MAAM,UAAU,CAAC;AAGlE,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,CAAC,KAAW,EAAE,MAAuB,EAAE,EAAE;QAC/C,OAAO,IAAI,CAAA;oBACK,MAAM,CAAC,KAAK,CAAC,IAAI;gBACrB,MAAM,CAAC,KAAK;WACjB,CAAC;IACV,CAAC;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,qBAAqB;YAC/B,QAAQ,EAAE,oCAAoC;YAC9C,WAAW,EAAE,IAAI;YACjB,qBAAqB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACxE;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EACN,iFAAiF;SACpF;KACF;IACD,YAAY,EAAE,CAAC,QAAyB,EAAmB,EAAE;QAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;YAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IACD,QAAQ,EAAE,CAAC,QAAyB,EAAoB,EAAE;QACxD,MAAM,MAAM,GAA8B,EAAE,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,GAAG,mBAAmB,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,KAAK,GAAG,yBAAyB,CAAC;QAC3C,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACvC,MAAM;SACP,CAAC;IACJ,CAAC;IACD,QAAQ,EAAE,CAAC,QAAyB,EAAQ,EAAE;QAC5C,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzD,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { html } from 'lit-html';\nimport { ActionConfig, COLORS, ValidationResult } from '../types';\nimport { Node, SetContactField } from '../../store/flow-definition';\n\nexport const set_contact_field: ActionConfig = {\n name: 'Update Field',\n color: COLORS.update,\n render: (_node: Node, action: SetContactField) => {\n return html`<div>\n Set <strong>${action.field.name}</strong> to\n <strong>${action.value}</strong>\n </div>`;\n },\n form: {\n field: {\n type: 'select',\n label: 'Field',\n required: true,\n searchable: true,\n clearable: false,\n nameKey: 'name',\n valueKey: 'key',\n endpoint: '/api/v2/fields.json',\n helpText: 'Select the contact field to update',\n allowCreate: true,\n createArbitraryOption: (input: string) => ({ key: input, name: input })\n },\n value: {\n type: 'text',\n label: 'Value',\n placeholder: 'Enter field value...',\n required: true,\n evaluated: true,\n helpText:\n 'The new value for the contact field. You can use expressions like @contact.name'\n }\n },\n fromFormData: (formData: SetContactField): SetContactField => {\n const field = formData.field[0];\n return {\n uuid: formData.uuid,\n type: 'set_contact_field',\n field: { name: field.name, key: field.key },\n value: formData.value\n };\n },\n validate: (formData: SetContactField): ValidationResult => {\n const errors: { [key: string]: string } = {};\n\n if (!formData.field) {\n errors.field = 'Field is required';\n }\n\n if (!formData.value || formData.value.trim() === '') {\n errors.value = 'Field value is required';\n }\n\n return {\n valid: Object.keys(errors).length === 0,\n errors\n };\n },\n sanitize: (formData: SetContactField): void => {\n if (formData.value && typeof formData.value === 'string') {\n formData.value = formData.value.trim();\n }\n }\n};\n"]}
|
|
@@ -8,7 +8,9 @@ export const set_contact_language = {
|
|
|
8
8
|
const languageNames = new Intl.DisplayNames(['en'], {
|
|
9
9
|
type: 'language'
|
|
10
10
|
});
|
|
11
|
-
return html `<div>
|
|
11
|
+
return html `<div>
|
|
12
|
+
Set to <strong>${languageNames.of(action.language)}</strong>
|
|
13
|
+
</div>`;
|
|
12
14
|
},
|
|
13
15
|
form: {
|
|
14
16
|
language: {
|