@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.
Files changed (269) hide show
  1. package/.devcontainer/Dockerfile +11 -4
  2. package/.devcontainer/devcontainer.json +3 -2
  3. package/.github/workflows/build.yml +4 -14
  4. package/CHANGELOG.md +29 -0
  5. package/demo/components/flow/example.html +1 -1
  6. package/demo/components/message-editor/example.html +125 -0
  7. package/demo/components/textinput/completion.html +1 -0
  8. package/demo/data/flows/food-order.json +12 -21
  9. package/demo/data/flows/sample-flow.json +210 -104
  10. package/dist/temba-components.js +715 -364
  11. package/dist/temba-components.js.map +1 -1
  12. package/out-tsc/src/display/Thumbnail.js +2 -1
  13. package/out-tsc/src/display/Thumbnail.js.map +1 -1
  14. package/out-tsc/src/events.js.map +1 -1
  15. package/out-tsc/src/excellent/helpers.js +2 -2
  16. package/out-tsc/src/excellent/helpers.js.map +1 -1
  17. package/out-tsc/src/flow/CanvasNode.js +25 -7
  18. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  19. package/out-tsc/src/flow/Editor.js +11 -1
  20. package/out-tsc/src/flow/Editor.js.map +1 -1
  21. package/out-tsc/src/flow/NodeEditor.js +342 -276
  22. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  23. package/out-tsc/src/flow/actions/add_input_labels.js +40 -0
  24. package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
  25. package/out-tsc/src/flow/actions/call_llm.js +56 -3
  26. package/out-tsc/src/flow/actions/call_llm.js.map +1 -1
  27. package/out-tsc/src/flow/actions/call_webhook.js +26 -17
  28. package/out-tsc/src/flow/actions/call_webhook.js.map +1 -1
  29. package/out-tsc/src/flow/actions/open_ticket.js +65 -3
  30. package/out-tsc/src/flow/actions/open_ticket.js.map +1 -1
  31. package/out-tsc/src/flow/actions/send_msg.js +147 -6
  32. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  33. package/out-tsc/src/flow/actions/set_run_result.js +75 -0
  34. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  35. package/out-tsc/src/flow/config.js +4 -0
  36. package/out-tsc/src/flow/config.js.map +1 -1
  37. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +227 -0
  38. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -0
  39. package/out-tsc/src/flow/nodes/split_by_ticket.js +18 -0
  40. package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -0
  41. package/out-tsc/src/flow/nodes/wait_for_response.js +27 -1
  42. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  43. package/out-tsc/src/flow/types.js +0 -65
  44. package/out-tsc/src/flow/types.js.map +1 -1
  45. package/out-tsc/src/form/ArrayEditor.js +87 -57
  46. package/out-tsc/src/form/ArrayEditor.js.map +1 -1
  47. package/out-tsc/src/form/BaseListEditor.js +19 -4
  48. package/out-tsc/src/form/BaseListEditor.js.map +1 -1
  49. package/out-tsc/src/form/FieldRenderer.js +305 -0
  50. package/out-tsc/src/form/FieldRenderer.js.map +1 -0
  51. package/out-tsc/src/form/FormField.js +4 -4
  52. package/out-tsc/src/form/FormField.js.map +1 -1
  53. package/out-tsc/src/form/KeyValueEditor.js +1 -1
  54. package/out-tsc/src/form/KeyValueEditor.js.map +1 -1
  55. package/out-tsc/src/form/MediaPicker.js +13 -1
  56. package/out-tsc/src/form/MediaPicker.js.map +1 -1
  57. package/out-tsc/src/form/MessageEditor.js +422 -0
  58. package/out-tsc/src/form/MessageEditor.js.map +1 -0
  59. package/out-tsc/src/form/TextInput.js +13 -6
  60. package/out-tsc/src/form/TextInput.js.map +1 -1
  61. package/out-tsc/src/form/select/Select.js +52 -24
  62. package/out-tsc/src/form/select/Select.js.map +1 -1
  63. package/out-tsc/src/live/ContactChat.js +66 -15
  64. package/out-tsc/src/live/ContactChat.js.map +1 -1
  65. package/out-tsc/src/markdown.js +13 -11
  66. package/out-tsc/src/markdown.js.map +1 -1
  67. package/out-tsc/temba-modules.js +2 -0
  68. package/out-tsc/temba-modules.js.map +1 -1
  69. package/out-tsc/test/ActionHelper.js +2 -0
  70. package/out-tsc/test/ActionHelper.js.map +1 -1
  71. package/out-tsc/test/NodeHelper.js +148 -0
  72. package/out-tsc/test/NodeHelper.js.map +1 -0
  73. package/out-tsc/test/actions/call_llm.test.js +103 -0
  74. package/out-tsc/test/actions/call_llm.test.js.map +1 -0
  75. package/out-tsc/test/nodes/split_by_llm_categorize.test.js +532 -0
  76. package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -0
  77. package/out-tsc/test/nodes/split_by_random.test.js +150 -0
  78. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -0
  79. package/out-tsc/test/nodes/wait_for_digits.test.js +150 -0
  80. package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -0
  81. package/out-tsc/test/nodes/wait_for_response.test.js +171 -0
  82. package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -0
  83. package/out-tsc/test/temba-add-input-labels.test.js +70 -0
  84. package/out-tsc/test/temba-add-input-labels.test.js.map +1 -0
  85. package/out-tsc/test/temba-field-config.test.js +4 -2
  86. package/out-tsc/test/temba-field-config.test.js.map +1 -1
  87. package/out-tsc/test/temba-field-renderer.test.js +296 -0
  88. package/out-tsc/test/temba-field-renderer.test.js.map +1 -0
  89. package/out-tsc/test/temba-markdown.test.js +1 -1
  90. package/out-tsc/test/temba-markdown.test.js.map +1 -1
  91. package/out-tsc/test/temba-message-editor.test.js +194 -0
  92. package/out-tsc/test/temba-message-editor.test.js.map +1 -0
  93. package/out-tsc/test/temba-node-editor.test.js +471 -0
  94. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  95. package/out-tsc/test/temba-select.test.js +7 -4
  96. package/out-tsc/test/temba-select.test.js.map +1 -1
  97. package/out-tsc/test/temba-textinput.test.js +16 -0
  98. package/out-tsc/test/temba-textinput.test.js.map +1 -1
  99. package/out-tsc/test/temba-webchat.test.js +5 -1
  100. package/out-tsc/test/temba-webchat.test.js.map +1 -1
  101. package/out-tsc/test/utils.test.js +2 -8
  102. package/out-tsc/test/utils.test.js.map +1 -1
  103. package/package.json +7 -4
  104. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  105. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  106. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  107. package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
  108. package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
  109. package/screenshots/truth/actions/call_llm/editor/information-extraction.png +0 -0
  110. package/screenshots/truth/actions/call_llm/editor/sentiment-analysis.png +0 -0
  111. package/screenshots/truth/actions/call_llm/editor/summarization.png +0 -0
  112. package/screenshots/truth/actions/call_llm/editor/translation-task.png +0 -0
  113. package/screenshots/truth/actions/call_llm/render/information-extraction.png +0 -0
  114. package/screenshots/truth/actions/call_llm/render/sentiment-analysis.png +0 -0
  115. package/screenshots/truth/actions/call_llm/render/summarization.png +0 -0
  116. package/screenshots/truth/actions/call_llm/render/translation-task.png +0 -0
  117. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  118. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  119. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  120. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  121. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  122. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  123. package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
  124. package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
  125. package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
  126. package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
  127. package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
  128. package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
  129. package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
  130. package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
  131. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  132. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  133. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  134. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  135. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  136. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  137. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  138. package/screenshots/truth/editor/router.png +0 -0
  139. package/screenshots/truth/editor/send_msg.png +0 -0
  140. package/screenshots/truth/editor/set_contact_language.png +0 -0
  141. package/screenshots/truth/editor/set_contact_name.png +0 -0
  142. package/screenshots/truth/editor/set_run_result.png +0 -0
  143. package/screenshots/truth/editor/wait.png +0 -0
  144. package/screenshots/truth/field-renderer/checkbox-checked.png +0 -0
  145. package/screenshots/truth/field-renderer/checkbox-unchecked.png +0 -0
  146. package/screenshots/truth/field-renderer/checkbox-with-errors.png +0 -0
  147. package/screenshots/truth/field-renderer/context-comparison.png +0 -0
  148. package/screenshots/truth/field-renderer/key-value-with-label.png +0 -0
  149. package/screenshots/truth/field-renderer/message-editor-with-label.png +0 -0
  150. package/screenshots/truth/field-renderer/select-multi.png +0 -0
  151. package/screenshots/truth/field-renderer/select-no-label.png +0 -0
  152. package/screenshots/truth/field-renderer/select-with-label.png +0 -0
  153. package/screenshots/truth/field-renderer/text-evaluated.png +0 -0
  154. package/screenshots/truth/field-renderer/text-no-label.png +0 -0
  155. package/screenshots/truth/field-renderer/text-with-errors.png +0 -0
  156. package/screenshots/truth/field-renderer/text-with-label.png +0 -0
  157. package/screenshots/truth/field-renderer/textarea-evaluated.png +0 -0
  158. package/screenshots/truth/field-renderer/textarea-with-label.png +0 -0
  159. package/screenshots/truth/formfield/markdown-errors.png +0 -0
  160. package/screenshots/truth/formfield/no-errors.png +0 -0
  161. package/screenshots/truth/formfield/plain-text-errors.png +0 -0
  162. package/screenshots/truth/message-editor/autogrow-initial-content.png +0 -0
  163. package/screenshots/truth/message-editor/default.png +0 -0
  164. package/screenshots/truth/message-editor/drag-highlight.png +0 -0
  165. package/screenshots/truth/message-editor/filtered-attachments.png +0 -0
  166. package/screenshots/truth/message-editor/with-completion.png +0 -0
  167. package/screenshots/truth/message-editor/with-properties.png +0 -0
  168. package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
  169. package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
  170. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  171. package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
  172. package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
  173. package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
  174. package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
  175. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  176. package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
  177. package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
  178. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  179. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  180. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  181. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  182. package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
  183. package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
  184. package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
  185. package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
  186. package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
  187. package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
  188. package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
  189. package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
  190. package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
  191. package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
  192. package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
  193. package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
  194. package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
  195. package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
  196. package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
  197. package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
  198. package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
  199. package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
  200. package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
  201. package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
  202. package/screenshots/truth/omnibox/selected.png +0 -0
  203. package/screenshots/truth/select/functions.png +0 -0
  204. package/screenshots/truth/select/multi-with-endpoint.png +0 -0
  205. package/screenshots/truth/select/search-enabled.png +0 -0
  206. package/screenshots/truth/textinput/autogrow-initial.png +0 -0
  207. package/screenshots/truth/textinput/input-form.png +0 -0
  208. package/src/display/Thumbnail.ts +2 -1
  209. package/src/events.ts +13 -1
  210. package/src/excellent/helpers.ts +2 -2
  211. package/src/flow/CanvasNode.ts +22 -1
  212. package/src/flow/Editor.ts +12 -1
  213. package/src/flow/NodeEditor.ts +412 -354
  214. package/src/flow/actions/add_input_labels.ts +45 -0
  215. package/src/flow/actions/call_llm.ts +57 -3
  216. package/src/flow/actions/call_webhook.ts +28 -18
  217. package/src/flow/actions/open_ticket.ts +74 -3
  218. package/src/flow/actions/send_msg.ts +170 -6
  219. package/src/flow/actions/set_run_result.ts +83 -0
  220. package/src/flow/config.ts +4 -0
  221. package/src/flow/nodes/split_by_llm_categorize.ts +277 -0
  222. package/src/flow/nodes/split_by_ticket.ts +19 -0
  223. package/src/flow/nodes/wait_for_response.ts +28 -1
  224. package/src/flow/types.ts +46 -128
  225. package/src/form/ArrayEditor.ts +96 -66
  226. package/src/form/BaseListEditor.ts +22 -6
  227. package/src/form/FieldRenderer.ts +465 -0
  228. package/src/form/FormField.ts +4 -4
  229. package/src/form/KeyValueEditor.ts +1 -1
  230. package/src/form/MediaPicker.ts +13 -1
  231. package/src/form/MessageEditor.ts +449 -0
  232. package/src/form/TextInput.ts +16 -8
  233. package/src/form/select/Select.ts +55 -24
  234. package/src/live/ContactChat.ts +69 -19
  235. package/src/markdown.ts +19 -11
  236. package/src/store/flow-definition.d.ts +5 -2
  237. package/static/api/labels.json +31 -0
  238. package/static/api/topics.json +24 -9
  239. package/static/api/users.json +35 -16
  240. package/static/css/temba-components.css +5 -3
  241. package/static/mr/docs/en-us/editor.json +2588 -0
  242. package/stress-test.js +143 -0
  243. package/temba-modules.ts +2 -0
  244. package/test/ActionHelper.ts +2 -0
  245. package/test/NodeHelper.ts +184 -0
  246. package/test/actions/call_llm.test.ts +137 -0
  247. package/test/nodes/README.md +78 -0
  248. package/test/nodes/split_by_llm_categorize.test.ts +698 -0
  249. package/test/nodes/split_by_random.test.ts +177 -0
  250. package/test/nodes/wait_for_digits.test.ts +176 -0
  251. package/test/nodes/wait_for_response.test.ts +206 -0
  252. package/test/temba-add-input-labels.test.ts +87 -0
  253. package/test/temba-field-config.test.ts +4 -2
  254. package/test/temba-field-renderer.test.ts +482 -0
  255. package/test/temba-markdown.test.ts +1 -1
  256. package/test/temba-message-editor.test.ts +300 -0
  257. package/test/temba-node-editor.test.ts +590 -0
  258. package/test/temba-select.test.ts +7 -7
  259. package/test/temba-textinput.test.ts +26 -0
  260. package/test/temba-webchat.test.ts +6 -1
  261. package/test/utils.test.ts +2 -13
  262. package/test-assets/contacts/history.json +19 -0
  263. package/test-assets/select/llms.json +18 -0
  264. package/test-assets/style.css +2 -0
  265. package/web-dev-mock.mjs +523 -0
  266. package/web-dev-server.config.mjs +74 -6
  267. package/web-test-runner.config.mjs +9 -4
  268. package/test/temba-flow-editor.test.ts.backup +0 -563
  269. package/test/temba-utils-index.test.ts.backup +0 -1737
@@ -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
- OptinRequestedEvent,
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
- FLOW_ENTERED = 'flow_entered',
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
- OPTIN_REQUESTED = 'optin_requested'
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 renderOptinRequested = (event: OptinRequestedEvent): string => {
209
- return `Requested opt-in for ${event.optin.name}`;
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.CALL_STARTED:
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: renderCallStartedEvent()
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: renderOptinRequested(event as OptinRequestedEvent)
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
- // Class-based directive API
15
- export class RenderMarkdown extends Directive {
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('renderMarkdown only supports child expressions');
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
- // Do SSR-compatible rendering (arguments are passed from call site)
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: string;
181
- body: string;
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
+ }
@@ -3,19 +3,34 @@
3
3
  "previous": null,
4
4
  "results": [
5
5
  {
6
- "uuid": "topic-1",
7
- "name": "General Support",
8
- "created_on": "2024-01-01T00:00:00Z"
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": "topic-2",
12
- "name": "Technical Issues",
13
- "created_on": "2024-01-01T00:00:00Z"
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": "topic-3",
17
- "name": "Billing Questions",
18
- "created_on": "2024-01-01T00:00:00Z"
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
  }
@@ -3,24 +3,43 @@
3
3
  "previous": null,
4
4
  "results": [
5
5
  {
6
- "uuid": "user-1",
7
- "email": "admin@example.com",
8
- "first_name": "Admin",
9
- "last_name": "User",
10
- "username": "admin",
11
- "is_active": true,
12
- "is_staff": true,
13
- "date_joined": "2024-01-01T00:00:00Z"
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": "user-2",
17
- "email": "editor@example.com",
18
- "first_name": "Editor",
19
- "last_name": "User",
20
- "username": "editor",
21
- "is_active": true,
22
- "is_staff": false,
23
- "date_joined": "2024-01-01T00:00:00Z"
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: rgba(0, 0, 0, 0.35);
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: 13px;
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);