@nyaruka/temba-components 0.129.7 → 0.129.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/Dockerfile +11 -4
- package/.devcontainer/devcontainer.json +3 -2
- package/.github/workflows/build.yml +4 -14
- package/CHANGELOG.md +29 -0
- package/demo/components/flow/example.html +1 -1
- package/demo/components/message-editor/example.html +125 -0
- package/demo/components/textinput/completion.html +1 -0
- package/demo/data/flows/food-order.json +12 -21
- package/demo/data/flows/sample-flow.json +210 -104
- package/dist/temba-components.js +715 -364
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/display/Thumbnail.js +2 -1
- package/out-tsc/src/display/Thumbnail.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/excellent/helpers.js +2 -2
- package/out-tsc/src/excellent/helpers.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +25 -7
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +11 -1
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +342 -276
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +40 -0
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/call_llm.js +56 -3
- package/out-tsc/src/flow/actions/call_llm.js.map +1 -1
- package/out-tsc/src/flow/actions/call_webhook.js +26 -17
- package/out-tsc/src/flow/actions/call_webhook.js.map +1 -1
- package/out-tsc/src/flow/actions/open_ticket.js +65 -3
- package/out-tsc/src/flow/actions/open_ticket.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +147 -6
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +75 -0
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/config.js +4 -0
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +227 -0
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -0
- package/out-tsc/src/flow/nodes/split_by_ticket.js +18 -0
- package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js +27 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/types.js +0 -65
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +87 -57
- package/out-tsc/src/form/ArrayEditor.js.map +1 -1
- package/out-tsc/src/form/BaseListEditor.js +19 -4
- package/out-tsc/src/form/BaseListEditor.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +305 -0
- package/out-tsc/src/form/FieldRenderer.js.map +1 -0
- package/out-tsc/src/form/FormField.js +4 -4
- package/out-tsc/src/form/FormField.js.map +1 -1
- package/out-tsc/src/form/KeyValueEditor.js +1 -1
- package/out-tsc/src/form/KeyValueEditor.js.map +1 -1
- package/out-tsc/src/form/MediaPicker.js +13 -1
- package/out-tsc/src/form/MediaPicker.js.map +1 -1
- package/out-tsc/src/form/MessageEditor.js +422 -0
- package/out-tsc/src/form/MessageEditor.js.map +1 -0
- package/out-tsc/src/form/TextInput.js +13 -6
- package/out-tsc/src/form/TextInput.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +52 -24
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +66 -15
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/markdown.js +13 -11
- package/out-tsc/src/markdown.js.map +1 -1
- package/out-tsc/temba-modules.js +2 -0
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/ActionHelper.js +2 -0
- package/out-tsc/test/ActionHelper.js.map +1 -1
- package/out-tsc/test/NodeHelper.js +148 -0
- package/out-tsc/test/NodeHelper.js.map +1 -0
- package/out-tsc/test/actions/call_llm.test.js +103 -0
- package/out-tsc/test/actions/call_llm.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js +532 -0
- package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_random.test.js +150 -0
- package/out-tsc/test/nodes/split_by_random.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js +150 -0
- package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_response.test.js +171 -0
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -0
- package/out-tsc/test/temba-add-input-labels.test.js +70 -0
- package/out-tsc/test/temba-add-input-labels.test.js.map +1 -0
- package/out-tsc/test/temba-field-config.test.js +4 -2
- package/out-tsc/test/temba-field-config.test.js.map +1 -1
- package/out-tsc/test/temba-field-renderer.test.js +296 -0
- package/out-tsc/test/temba-field-renderer.test.js.map +1 -0
- package/out-tsc/test/temba-markdown.test.js +1 -1
- package/out-tsc/test/temba-markdown.test.js.map +1 -1
- package/out-tsc/test/temba-message-editor.test.js +194 -0
- package/out-tsc/test/temba-message-editor.test.js.map +1 -0
- package/out-tsc/test/temba-node-editor.test.js +471 -0
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +7 -4
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/temba-textinput.test.js +16 -0
- package/out-tsc/test/temba-textinput.test.js.map +1 -1
- package/out-tsc/test/temba-webchat.test.js +5 -1
- package/out-tsc/test/temba-webchat.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -8
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +7 -4
- package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/summarization.png +0 -0
- package/screenshots/truth/actions/call_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/actions/call_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/actions/call_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/actions/call_llm/render/summarization.png +0 -0
- package/screenshots/truth/actions/call_llm/render/translation-task.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
- package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/editor/router.png +0 -0
- package/screenshots/truth/editor/send_msg.png +0 -0
- package/screenshots/truth/editor/set_contact_language.png +0 -0
- package/screenshots/truth/editor/set_contact_name.png +0 -0
- package/screenshots/truth/editor/set_run_result.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-checked.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-unchecked.png +0 -0
- package/screenshots/truth/field-renderer/checkbox-with-errors.png +0 -0
- package/screenshots/truth/field-renderer/context-comparison.png +0 -0
- package/screenshots/truth/field-renderer/key-value-with-label.png +0 -0
- package/screenshots/truth/field-renderer/message-editor-with-label.png +0 -0
- package/screenshots/truth/field-renderer/select-multi.png +0 -0
- package/screenshots/truth/field-renderer/select-no-label.png +0 -0
- package/screenshots/truth/field-renderer/select-with-label.png +0 -0
- package/screenshots/truth/field-renderer/text-evaluated.png +0 -0
- package/screenshots/truth/field-renderer/text-no-label.png +0 -0
- package/screenshots/truth/field-renderer/text-with-errors.png +0 -0
- package/screenshots/truth/field-renderer/text-with-label.png +0 -0
- package/screenshots/truth/field-renderer/textarea-evaluated.png +0 -0
- package/screenshots/truth/field-renderer/textarea-with-label.png +0 -0
- package/screenshots/truth/formfield/markdown-errors.png +0 -0
- package/screenshots/truth/formfield/no-errors.png +0 -0
- package/screenshots/truth/formfield/plain-text-errors.png +0 -0
- package/screenshots/truth/message-editor/autogrow-initial-content.png +0 -0
- package/screenshots/truth/message-editor/default.png +0 -0
- package/screenshots/truth/message-editor/drag-highlight.png +0 -0
- package/screenshots/truth/message-editor/filtered-attachments.png +0 -0
- package/screenshots/truth/message-editor/with-completion.png +0 -0
- package/screenshots/truth/message-editor/with-properties.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/screenshots/truth/omnibox/selected.png +0 -0
- package/screenshots/truth/select/functions.png +0 -0
- package/screenshots/truth/select/multi-with-endpoint.png +0 -0
- package/screenshots/truth/select/search-enabled.png +0 -0
- package/screenshots/truth/textinput/autogrow-initial.png +0 -0
- package/screenshots/truth/textinput/input-form.png +0 -0
- package/src/display/Thumbnail.ts +2 -1
- package/src/events.ts +13 -1
- package/src/excellent/helpers.ts +2 -2
- package/src/flow/CanvasNode.ts +22 -1
- package/src/flow/Editor.ts +12 -1
- package/src/flow/NodeEditor.ts +412 -354
- package/src/flow/actions/add_input_labels.ts +45 -0
- package/src/flow/actions/call_llm.ts +57 -3
- package/src/flow/actions/call_webhook.ts +28 -18
- package/src/flow/actions/open_ticket.ts +74 -3
- package/src/flow/actions/send_msg.ts +170 -6
- package/src/flow/actions/set_run_result.ts +83 -0
- package/src/flow/config.ts +4 -0
- package/src/flow/nodes/split_by_llm_categorize.ts +277 -0
- package/src/flow/nodes/split_by_ticket.ts +19 -0
- package/src/flow/nodes/wait_for_response.ts +28 -1
- package/src/flow/types.ts +46 -128
- package/src/form/ArrayEditor.ts +96 -66
- package/src/form/BaseListEditor.ts +22 -6
- package/src/form/FieldRenderer.ts +465 -0
- package/src/form/FormField.ts +4 -4
- package/src/form/KeyValueEditor.ts +1 -1
- package/src/form/MediaPicker.ts +13 -1
- package/src/form/MessageEditor.ts +449 -0
- package/src/form/TextInput.ts +16 -8
- package/src/form/select/Select.ts +55 -24
- package/src/live/ContactChat.ts +69 -19
- package/src/markdown.ts +19 -11
- package/src/store/flow-definition.d.ts +5 -2
- package/static/api/labels.json +31 -0
- package/static/api/topics.json +24 -9
- package/static/api/users.json +35 -16
- package/static/css/temba-components.css +5 -3
- package/static/mr/docs/en-us/editor.json +2588 -0
- package/stress-test.js +143 -0
- package/temba-modules.ts +2 -0
- package/test/ActionHelper.ts +2 -0
- package/test/NodeHelper.ts +184 -0
- package/test/actions/call_llm.test.ts +137 -0
- package/test/nodes/README.md +78 -0
- package/test/nodes/split_by_llm_categorize.test.ts +698 -0
- package/test/nodes/split_by_random.test.ts +177 -0
- package/test/nodes/wait_for_digits.test.ts +176 -0
- package/test/nodes/wait_for_response.test.ts +206 -0
- package/test/temba-add-input-labels.test.ts +87 -0
- package/test/temba-field-config.test.ts +4 -2
- package/test/temba-field-renderer.test.ts +482 -0
- package/test/temba-markdown.test.ts +1 -1
- package/test/temba-message-editor.test.ts +300 -0
- package/test/temba-node-editor.test.ts +590 -0
- package/test/temba-select.test.ts +7 -7
- package/test/temba-textinput.test.ts +26 -0
- package/test/temba-webchat.test.ts +6 -1
- package/test/utils.test.ts +2 -13
- package/test-assets/contacts/history.json +19 -0
- package/test-assets/select/llms.json +18 -0
- package/test-assets/style.css +2 -0
- package/web-dev-mock.mjs +523 -0
- package/web-dev-server.config.mjs +74 -6
- package/web-test-runner.config.mjs +9 -4
- package/test/temba-flow-editor.test.ts.backup +0 -563
- package/test/temba-utils-index.test.ts.backup +0 -1737
package/src/live/ContactChat.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { ContactStoreElement } from './ContactStoreElement';
|
|
|
20
20
|
import { Compose, ComposeValue } from '../form/Compose';
|
|
21
21
|
import {
|
|
22
22
|
AirtimeTransferredEvent,
|
|
23
|
+
CallEvent,
|
|
23
24
|
ChannelEvent,
|
|
24
25
|
ContactEvent,
|
|
25
26
|
ContactGroupsEvent,
|
|
@@ -28,7 +29,8 @@ import {
|
|
|
28
29
|
FlowEvent,
|
|
29
30
|
MsgEvent,
|
|
30
31
|
NameChangedEvent,
|
|
31
|
-
|
|
32
|
+
OptInEvent,
|
|
33
|
+
RunEvent,
|
|
32
34
|
TicketEvent,
|
|
33
35
|
UpdateFieldEvent,
|
|
34
36
|
URNsChangedEvent
|
|
@@ -53,9 +55,8 @@ export enum Events {
|
|
|
53
55
|
MESSAGE_RECEIVED = 'msg_received',
|
|
54
56
|
BROADCAST_CREATED = 'broadcast_created',
|
|
55
57
|
IVR_CREATED = 'ivr_created',
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
FLOW_EXITED = 'flow_exited',
|
|
58
|
+
CALL_CREATED = 'call_created',
|
|
59
|
+
CALL_RECEIVED = 'call_received',
|
|
59
60
|
CONTACT_FIELD_CHANGED = 'contact_field_changed',
|
|
60
61
|
CONTACT_GROUPS_CHANGED = 'contact_groups_changed',
|
|
61
62
|
CONTACT_NAME_CHANGED = 'contact_name_changed',
|
|
@@ -63,7 +64,6 @@ export enum Events {
|
|
|
63
64
|
CHANNEL_EVENT = 'channel_event',
|
|
64
65
|
CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',
|
|
65
66
|
AIRTIME_TRANSFERRED = 'airtime_transferred',
|
|
66
|
-
CALL_STARTED = 'call_started',
|
|
67
67
|
NOTE_CREATED = 'note_created',
|
|
68
68
|
TICKET_ASSIGNED = 'ticket_assigned',
|
|
69
69
|
TICKET_NOTE_ADDED = 'ticket_note_added',
|
|
@@ -71,7 +71,16 @@ export enum Events {
|
|
|
71
71
|
TICKET_OPENED = 'ticket_opened',
|
|
72
72
|
TICKET_REOPENED = 'ticket_reopened',
|
|
73
73
|
TICKET_TOPIC_CHANGED = 'ticket_topic_changed',
|
|
74
|
-
|
|
74
|
+
OPTIN_STARTED = 'optin_started',
|
|
75
|
+
OPTIN_STOPPED = 'optin_stopped',
|
|
76
|
+
OPTIN_REQUESTED = 'optin_requested',
|
|
77
|
+
RUN_STARTED = 'run_started',
|
|
78
|
+
RUN_ENDED = 'run_ended',
|
|
79
|
+
|
|
80
|
+
// deprecated
|
|
81
|
+
CALL_STARTED = 'call_started',
|
|
82
|
+
FLOW_ENTERED = 'flow_entered',
|
|
83
|
+
FLOW_EXITED = 'flow_exited'
|
|
75
84
|
}
|
|
76
85
|
|
|
77
86
|
const renderInfoList = (singular: string, plural: string, items: any[]) => {
|
|
@@ -104,13 +113,13 @@ const renderChannelEvent = (event: ChannelEvent): string => {
|
|
|
104
113
|
} else if (event.event.type === 'stop_contact') {
|
|
105
114
|
return 'Stopped';
|
|
106
115
|
} else if (event.event.type === 'mt_call') {
|
|
107
|
-
return 'Outgoing Phone Call';
|
|
116
|
+
return 'Outgoing Phone Call'; // deprecated
|
|
108
117
|
} else if (event.event.type == 'mo_call') {
|
|
109
|
-
return 'Incoming Phone call';
|
|
118
|
+
return 'Incoming Phone call'; // deprecated
|
|
110
119
|
} else if (event.event.type == 'optin') {
|
|
111
|
-
return `Opted in to **${event.event.optin?.name}**`;
|
|
120
|
+
return `Opted in to **${event.event.optin?.name}**`; // deprecated
|
|
112
121
|
} else if (event.event.type == 'optout') {
|
|
113
|
-
return `Opted out of **${event.event.optin?.name}**`;
|
|
122
|
+
return `Opted out of **${event.event.optin?.name}**`; // deprecated
|
|
114
123
|
}
|
|
115
124
|
};
|
|
116
125
|
|
|
@@ -126,6 +135,21 @@ const renderFlowEvent = (event: FlowEvent): string => {
|
|
|
126
135
|
return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;
|
|
127
136
|
};
|
|
128
137
|
|
|
138
|
+
const renderRunEvent = (event: RunEvent): string => {
|
|
139
|
+
let verb = 'Started';
|
|
140
|
+
if (event.type === Events.RUN_ENDED) {
|
|
141
|
+
if (event.status === 'completed') {
|
|
142
|
+
verb = 'Completed';
|
|
143
|
+
} else if (event.status === 'expired') {
|
|
144
|
+
verb = 'Expired from';
|
|
145
|
+
} else {
|
|
146
|
+
verb = 'Interrupted';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;
|
|
151
|
+
};
|
|
152
|
+
|
|
129
153
|
const renderUpdateEvent = (event: UpdateFieldEvent): string => {
|
|
130
154
|
return event.value
|
|
131
155
|
? `Updated **${event.field.name}** to **${event.value.text}**`
|
|
@@ -195,18 +219,28 @@ export const renderAirtimeTransferredEvent = (
|
|
|
195
219
|
return `Transferred **${event.amount}** ${event.currency} of airtime`;
|
|
196
220
|
};
|
|
197
221
|
|
|
198
|
-
export const renderCallStartedEvent = (): string => {
|
|
199
|
-
return `Call Started`;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
222
|
export const renderContactLanguageChangedEvent = (
|
|
203
223
|
event: ContactLanguageChangedEvent
|
|
204
224
|
): string => {
|
|
205
225
|
return `Language updated to **${event.language}**`;
|
|
206
226
|
};
|
|
207
227
|
|
|
208
|
-
export const
|
|
209
|
-
|
|
228
|
+
export const renderCallEvent = (event: CallEvent): string => {
|
|
229
|
+
if (event.type === Events.CALL_CREATED) {
|
|
230
|
+
return `Call Started`;
|
|
231
|
+
} else if (event.type === Events.CALL_RECEIVED) {
|
|
232
|
+
return `Call Answered`;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const renderOptInEvent = (event: OptInEvent): string => {
|
|
237
|
+
if (event.type === Events.OPTIN_REQUESTED) {
|
|
238
|
+
return `Requested opt-in for ${event.optin.name}`;
|
|
239
|
+
} else if (event.type === Events.OPTIN_STARTED) {
|
|
240
|
+
return `Opted in to **${event.optin.name}**`;
|
|
241
|
+
} else if (event.type === Events.OPTIN_STOPPED) {
|
|
242
|
+
return `Opted out of **${event.optin.name}**`;
|
|
243
|
+
}
|
|
210
244
|
};
|
|
211
245
|
|
|
212
246
|
export class ContactChat extends ContactStoreElement {
|
|
@@ -638,6 +672,13 @@ export class ContactChat extends ContactStoreElement {
|
|
|
638
672
|
text: renderFlowEvent(event as FlowEvent)
|
|
639
673
|
};
|
|
640
674
|
break;
|
|
675
|
+
case Events.RUN_STARTED:
|
|
676
|
+
case Events.RUN_ENDED:
|
|
677
|
+
message = {
|
|
678
|
+
type: MessageType.Inline,
|
|
679
|
+
text: renderRunEvent(event as RunEvent)
|
|
680
|
+
};
|
|
681
|
+
break;
|
|
641
682
|
case Events.CONTACT_FIELD_CHANGED:
|
|
642
683
|
message = {
|
|
643
684
|
type: MessageType.Inline,
|
|
@@ -668,10 +709,17 @@ export class ContactChat extends ContactStoreElement {
|
|
|
668
709
|
text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)
|
|
669
710
|
};
|
|
670
711
|
break;
|
|
671
|
-
case Events.
|
|
712
|
+
case Events.CALL_CREATED:
|
|
713
|
+
case Events.CALL_RECEIVED:
|
|
714
|
+
message = {
|
|
715
|
+
type: MessageType.Inline,
|
|
716
|
+
text: renderCallEvent(event as CallEvent)
|
|
717
|
+
};
|
|
718
|
+
break;
|
|
719
|
+
case Events.CALL_STARTED: // deprecated
|
|
672
720
|
message = {
|
|
673
721
|
type: MessageType.Inline,
|
|
674
|
-
text:
|
|
722
|
+
text: `Started Call`
|
|
675
723
|
};
|
|
676
724
|
break;
|
|
677
725
|
case Events.CHANNEL_EVENT:
|
|
@@ -689,9 +737,11 @@ export class ContactChat extends ContactStoreElement {
|
|
|
689
737
|
};
|
|
690
738
|
break;
|
|
691
739
|
case Events.OPTIN_REQUESTED:
|
|
740
|
+
case Events.OPTIN_STARTED:
|
|
741
|
+
case Events.OPTIN_STOPPED:
|
|
692
742
|
message = {
|
|
693
743
|
type: MessageType.Inline,
|
|
694
|
-
text:
|
|
744
|
+
text: renderOptInEvent(event as OptInEvent)
|
|
695
745
|
};
|
|
696
746
|
break;
|
|
697
747
|
}
|
package/src/markdown.ts
CHANGED
|
@@ -11,31 +11,39 @@ import { Remarkable } from 'remarkable';
|
|
|
11
11
|
|
|
12
12
|
export const markdown = new Remarkable();
|
|
13
13
|
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
// State stored in class field
|
|
17
|
-
// value: string | undefined;
|
|
14
|
+
// Base class for markdown rendering directives
|
|
15
|
+
abstract class BaseMarkdownDirective extends Directive {
|
|
18
16
|
constructor(partInfo: PartInfo) {
|
|
19
17
|
super(partInfo);
|
|
20
18
|
// When necessary, validate part in constructor using `part.type`
|
|
21
19
|
if (partInfo.type !== PartType.CHILD) {
|
|
22
|
-
throw new Error('
|
|
20
|
+
throw new Error('markdown directives only support child expressions');
|
|
23
21
|
}
|
|
24
22
|
}
|
|
23
|
+
|
|
25
24
|
// Optional: override update to perform any direct DOM manipulation
|
|
26
|
-
// DirectiveParameters<this>
|
|
27
25
|
update(part: Part, [initialValue]: any) {
|
|
28
26
|
/* Any imperative updates to DOM/parts would go here */
|
|
29
27
|
return this.render(initialValue);
|
|
30
28
|
}
|
|
31
|
-
|
|
29
|
+
|
|
30
|
+
// Abstract method to be implemented by subclasses
|
|
31
|
+
abstract render(initialValue: string): any;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Class-based directive for block markdown rendering
|
|
35
|
+
export class RenderMarkdown extends BaseMarkdownDirective {
|
|
32
36
|
render(initialValue: string) {
|
|
33
|
-
// Previous state available on class field
|
|
34
|
-
// if (this.value === undefined) {
|
|
35
|
-
// this.value = initialValue;
|
|
36
|
-
//}
|
|
37
37
|
return html`${unsafeHTML(markdown.render(initialValue))}`;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// Class-based directive for inline markdown rendering
|
|
42
|
+
export class RenderMarkdownInline extends BaseMarkdownDirective {
|
|
43
|
+
render(initialValue: string) {
|
|
44
|
+
return html`${unsafeHTML(markdown.renderInline(initialValue))}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
41
48
|
export const renderMarkdown = directive(RenderMarkdown);
|
|
49
|
+
export const renderMarkdownInline = directive(RenderMarkdownInline);
|
|
@@ -44,6 +44,7 @@ export type ActionType =
|
|
|
44
44
|
| 'split_by_subflow'
|
|
45
45
|
| 'split_by_webhook'
|
|
46
46
|
| 'split_by_llm'
|
|
47
|
+
| 'split_by_llm_categorize'
|
|
47
48
|
| 'wait_for_response'
|
|
48
49
|
| 'wait_for_menu'
|
|
49
50
|
| 'wait_for_dial'
|
|
@@ -173,12 +174,14 @@ export interface CallResthook extends Action {
|
|
|
173
174
|
export interface CallLLM extends Action {
|
|
174
175
|
llm: NamedObject;
|
|
175
176
|
instructions: string;
|
|
177
|
+
input: string;
|
|
176
178
|
result_name: string;
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
export interface OpenTicket extends Action {
|
|
180
|
-
subject
|
|
181
|
-
body
|
|
182
|
+
subject?: string;
|
|
183
|
+
body?: string;
|
|
184
|
+
note?: string;
|
|
182
185
|
assignee?: NamedObject;
|
|
183
186
|
topic?: NamedObject;
|
|
184
187
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"next": null,
|
|
3
|
+
"previous": null,
|
|
4
|
+
"results": [
|
|
5
|
+
{
|
|
6
|
+
"uuid": "61cae99b-56e1-4f3e-a2b9-07fb5cf2be9e",
|
|
7
|
+
"name": "Important",
|
|
8
|
+
"count": 234
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"uuid": "f80ed7b6-5e6a-49eb-94b6-4631a9677cd8",
|
|
12
|
+
"name": "Spam",
|
|
13
|
+
"count": 0
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"uuid": "76e7a094-22ea-441d-91c4-283d8168e8e3",
|
|
17
|
+
"name": "Follow Up",
|
|
18
|
+
"count": 128
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"uuid": "66e7a094-22ea-441d-91c4-283d8168e8e4",
|
|
22
|
+
"name": "Customer Service",
|
|
23
|
+
"count": 89
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"uuid": "a3f2990b-4096-452e-a586-dc06a9434dde",
|
|
27
|
+
"name": "Feedback",
|
|
28
|
+
"count": 42
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
package/static/api/topics.json
CHANGED
|
@@ -3,19 +3,34 @@
|
|
|
3
3
|
"previous": null,
|
|
4
4
|
"results": [
|
|
5
5
|
{
|
|
6
|
-
"uuid": "
|
|
7
|
-
"name": "General
|
|
8
|
-
"
|
|
6
|
+
"uuid": "1b1cb507-e079-4b30-818c-1898edcbd178",
|
|
7
|
+
"name": "General",
|
|
8
|
+
"counts": {
|
|
9
|
+
"open": 2,
|
|
10
|
+
"closed": 12
|
|
11
|
+
},
|
|
12
|
+
"system": true,
|
|
13
|
+
"created_on": "2021-08-25T22:50:51.381947Z"
|
|
9
14
|
},
|
|
10
15
|
{
|
|
11
|
-
"uuid": "
|
|
12
|
-
"name": "Technical
|
|
13
|
-
"
|
|
16
|
+
"uuid": "bf4b568d-97b8-4d20-aed5-ad8150270af8",
|
|
17
|
+
"name": "Technical Support",
|
|
18
|
+
"counts": {
|
|
19
|
+
"open": 5,
|
|
20
|
+
"closed": 23
|
|
21
|
+
},
|
|
22
|
+
"system": false,
|
|
23
|
+
"created_on": "2021-08-25T22:51:15.123456Z"
|
|
14
24
|
},
|
|
15
25
|
{
|
|
16
|
-
"uuid": "
|
|
17
|
-
"name": "Billing
|
|
18
|
-
"
|
|
26
|
+
"uuid": "a3f7e9d2-1c8b-4e5f-9a6b-7d4c2e8f1a3b",
|
|
27
|
+
"name": "Billing",
|
|
28
|
+
"counts": {
|
|
29
|
+
"open": 1,
|
|
30
|
+
"closed": 8
|
|
31
|
+
},
|
|
32
|
+
"system": false,
|
|
33
|
+
"created_on": "2021-08-25T22:52:30.789012Z"
|
|
19
34
|
}
|
|
20
35
|
]
|
|
21
36
|
}
|
package/static/api/users.json
CHANGED
|
@@ -3,24 +3,43 @@
|
|
|
3
3
|
"previous": null,
|
|
4
4
|
"results": [
|
|
5
5
|
{
|
|
6
|
-
"uuid": "
|
|
7
|
-
"email": "
|
|
8
|
-
"first_name": "
|
|
9
|
-
"last_name": "
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
6
|
+
"uuid": "c0f5b431-35e9-429c-9d57-5fee2fac46a3",
|
|
7
|
+
"email": "eric+marion+berry@textit.com",
|
|
8
|
+
"first_name": "Marion",
|
|
9
|
+
"last_name": "Berry",
|
|
10
|
+
"name": "Marion Berry",
|
|
11
|
+
"role": "agent",
|
|
12
|
+
"team": {
|
|
13
|
+
"uuid": "15236c1e-9375-4f84-bb48-ec64283d1eb9",
|
|
14
|
+
"name": "All Topics"
|
|
15
|
+
},
|
|
16
|
+
"created_on": "2023-04-05T21:11:31.909765Z",
|
|
17
|
+
"avatar": null
|
|
14
18
|
},
|
|
15
19
|
{
|
|
16
|
-
"uuid": "
|
|
17
|
-
"email": "
|
|
18
|
-
"first_name": "
|
|
19
|
-
"last_name": "
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
20
|
+
"uuid": "ae79dd5b-8c34-4602-a2c1-1e4db2419f0f",
|
|
21
|
+
"email": "eric@textit.com",
|
|
22
|
+
"first_name": "Eric",
|
|
23
|
+
"last_name": "Newcomer",
|
|
24
|
+
"name": "Eric Newcomer",
|
|
25
|
+
"role": "administrator",
|
|
26
|
+
"team": null,
|
|
27
|
+
"created_on": "2013-02-26T21:19:44Z",
|
|
28
|
+
"avatar": "https://dl-textit.s3.amazonaws.com/avatars/4/b6d756224c61435bb36b57ae03b83359.jpg"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"uuid": "f8e2a1b5-9c7d-4e6f-8a3b-1c5e9f2d4a6b",
|
|
32
|
+
"email": "sarah.smith@textit.com",
|
|
33
|
+
"first_name": "Sarah",
|
|
34
|
+
"last_name": "Smith",
|
|
35
|
+
"name": "Sarah Smith",
|
|
36
|
+
"role": "agent",
|
|
37
|
+
"team": {
|
|
38
|
+
"uuid": "15236c1e-9375-4f84-bb48-ec64283d1eb9",
|
|
39
|
+
"name": "All Topics"
|
|
40
|
+
},
|
|
41
|
+
"created_on": "2023-06-15T14:22:18.456789Z",
|
|
42
|
+
"avatar": null
|
|
24
43
|
}
|
|
25
44
|
]
|
|
26
45
|
}
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
--color-primary-light: #eee;
|
|
52
52
|
--color-secondary-light: #ccc;
|
|
53
53
|
|
|
54
|
+
--color-label: #333;
|
|
55
|
+
|
|
54
56
|
/* dark colors, nav bar, buttons, etc */
|
|
55
57
|
--color-primary-dark: rgb(var(--primary-rgb));
|
|
56
58
|
--color-secondary-dark: rgb(var(--secondary-rgb));
|
|
@@ -59,7 +61,7 @@
|
|
|
59
61
|
--color-text-light: rgba(255, 255, 255, 1);
|
|
60
62
|
--color-text-dark: rgba(0, 0, 0, 0.8);
|
|
61
63
|
--color-text-dark-secondary: rgba(0, 0, 0, 0.25);
|
|
62
|
-
--color-text-help:
|
|
64
|
+
--color-text-help: rgb(120, 120, 120);
|
|
63
65
|
--color-tertiary: rgb(var(--tertiary-rgb));
|
|
64
66
|
|
|
65
67
|
--help-text-size: 0.85em;
|
|
@@ -123,8 +125,8 @@
|
|
|
123
125
|
--header-bg: var(--color-primary-dark);
|
|
124
126
|
--header-text: var(--color-text-light);
|
|
125
127
|
|
|
126
|
-
--temba-textinput-padding: 9px;
|
|
127
|
-
--temba-textinput-font-size:
|
|
128
|
+
--temba-textinput-padding: 9px 14px;
|
|
129
|
+
--temba-textinput-font-size: 14px;
|
|
128
130
|
|
|
129
131
|
--options-block-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.03);
|
|
130
132
|
--options-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|