@nyaruka/temba-components 0.129.1 → 0.129.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.
Files changed (583) hide show
  1. package/.github/workflows/build.yml +6 -5
  2. package/.github/workflows/coverage.yml +80 -0
  3. package/CHANGELOG.md +32 -0
  4. package/README.md +6 -0
  5. package/check-coverage.js +133 -0
  6. package/demo/components/alert/example.html +71 -0
  7. package/demo/components/button/example.html +167 -0
  8. package/demo/{chart → components/chart}/example.html +3 -3
  9. package/demo/components/chart/horizontal-demo.html +160 -0
  10. package/demo/components/checkbox/example.html +68 -0
  11. package/demo/components/compose/example.html +69 -0
  12. package/demo/components/datepicker/example.html +3 -3
  13. package/demo/components/datepicker/range-picker-demo.html +2 -2
  14. package/demo/{dialog → components/dialog}/example.html +3 -3
  15. package/demo/components/dropdown/example.html +95 -0
  16. package/demo/{flow → components/flow}/example.html +1 -1
  17. package/demo/{misc → components/misc}/example.html +3 -3
  18. package/demo/components/progress/example.html +62 -0
  19. package/demo/components/select/drag-and-drop.html +162 -0
  20. package/demo/components/select/example.html +76 -0
  21. package/demo/components/select/multi.html +72 -0
  22. package/demo/components/slider/example.html +55 -0
  23. package/demo/{sortable-list → components/sortable-list}/example.html +3 -3
  24. package/demo/components/tabs/example.html +91 -0
  25. package/demo/{textinput → components/textinput}/completion.html +3 -3
  26. package/demo/components/textinput/example.html +141 -0
  27. package/demo/{webchat → components/webchat}/example.html +3 -3
  28. package/demo/data/flows/sample-flow.json +107 -100
  29. package/demo/index.html +21 -21
  30. package/demo/static/css/styles.css +253 -0
  31. package/demo/sticky-note-demo.html +88 -85
  32. package/demo/styles.css +24 -0
  33. package/dist/locales/es.js +5 -5
  34. package/dist/locales/es.js.map +1 -1
  35. package/dist/locales/fr.js +5 -5
  36. package/dist/locales/fr.js.map +1 -1
  37. package/dist/locales/locale-codes.js +2 -11
  38. package/dist/locales/locale-codes.js.map +1 -1
  39. package/dist/locales/pt.js +5 -5
  40. package/dist/locales/pt.js.map +1 -1
  41. package/dist/temba-components.js +893 -476
  42. package/dist/temba-components.js.map +1 -1
  43. package/generate-coverage-badge.sh +69 -0
  44. package/out-tsc/src/{vectoricon/index.js → Icons.js} +1 -1
  45. package/out-tsc/src/Icons.js.map +1 -0
  46. package/out-tsc/src/display/Alert.js.map +1 -0
  47. package/out-tsc/src/display/Anchor.js.map +1 -0
  48. package/out-tsc/src/display/Button.js.map +1 -0
  49. package/out-tsc/src/{charcount → display}/CharCount.js +159 -2
  50. package/out-tsc/src/display/CharCount.js.map +1 -0
  51. package/out-tsc/src/display/Chat.js.map +1 -0
  52. package/out-tsc/src/display/ContactName.js.map +1 -0
  53. package/out-tsc/src/display/ContactUrn.js.map +1 -0
  54. package/out-tsc/src/display/Dropdown.js.map +1 -0
  55. package/out-tsc/src/{vectoricon/VectorIcon.js → display/Icon.js} +2 -2
  56. package/out-tsc/src/display/Icon.js.map +1 -0
  57. package/out-tsc/src/display/Label.js.map +1 -0
  58. package/out-tsc/src/{leafletmap → display}/LeafletMap.js +16 -1
  59. package/out-tsc/src/display/LeafletMap.js.map +1 -0
  60. package/out-tsc/src/display/Lightbox.js.map +1 -0
  61. package/out-tsc/src/{loading → display}/Loading.js.map +1 -1
  62. package/out-tsc/src/{options → display}/Options.js.map +1 -1
  63. package/out-tsc/src/display/ProgressBar.js.map +1 -0
  64. package/out-tsc/src/display/TembaDate.js.map +1 -0
  65. package/out-tsc/src/display/TembaUser.js.map +1 -0
  66. package/out-tsc/src/display/Thumbnail.js.map +1 -0
  67. package/out-tsc/src/{tip → display}/Tip.js +1 -2
  68. package/out-tsc/src/display/Tip.js.map +1 -0
  69. package/out-tsc/src/display/Toast.js.map +1 -0
  70. package/out-tsc/src/display/sms/gsmsplitter.js.map +1 -0
  71. package/out-tsc/src/display/sms/gsmvalidator.js.map +1 -0
  72. package/out-tsc/src/display/sms/index.js.map +1 -0
  73. package/out-tsc/src/display/sms/unicodesplitter.js.map +1 -0
  74. package/out-tsc/src/events.js +2 -0
  75. package/out-tsc/src/events.js.map +1 -0
  76. package/out-tsc/src/excellent/ExcellentParser.js.map +1 -0
  77. package/out-tsc/src/excellent/helpers.js.map +1 -0
  78. package/out-tsc/src/flow/Editor.js +533 -140
  79. package/out-tsc/src/flow/Editor.js.map +1 -1
  80. package/out-tsc/src/flow/EditorNode.js +287 -20
  81. package/out-tsc/src/flow/EditorNode.js.map +1 -1
  82. package/out-tsc/src/flow/Plumber.js +154 -74
  83. package/out-tsc/src/flow/Plumber.js.map +1 -1
  84. package/out-tsc/src/flow/StickyNote.js +153 -9
  85. package/out-tsc/src/flow/StickyNote.js.map +1 -1
  86. package/out-tsc/src/flow/config.js +88 -18
  87. package/out-tsc/src/flow/config.js.map +1 -1
  88. package/out-tsc/src/flow/render.js +327 -10
  89. package/out-tsc/src/flow/render.js.map +1 -1
  90. package/out-tsc/src/{checkbox → form}/Checkbox.js +2 -2
  91. package/out-tsc/src/form/Checkbox.js.map +1 -0
  92. package/out-tsc/src/{colorpicker → form}/ColorPicker.js +1 -1
  93. package/out-tsc/src/form/ColorPicker.js.map +1 -0
  94. package/out-tsc/src/{completion → form}/Completion.js +2 -2
  95. package/out-tsc/src/form/Completion.js.map +1 -0
  96. package/out-tsc/src/{compose → form}/Compose.js +1 -1
  97. package/out-tsc/src/form/Compose.js.map +1 -0
  98. package/out-tsc/src/{contactsearch → form}/ContactSearch.js +2 -2
  99. package/out-tsc/src/form/ContactSearch.js.map +1 -0
  100. package/out-tsc/src/form/CroppieCSS.js.map +1 -0
  101. package/out-tsc/src/{datepicker → form}/DatePicker.js +1 -1
  102. package/out-tsc/src/form/DatePicker.js.map +1 -0
  103. package/out-tsc/src/{FormElement.js → form/FormElement.js} +1 -1
  104. package/out-tsc/src/form/FormElement.js.map +1 -0
  105. package/out-tsc/src/form/FormField.js.map +1 -0
  106. package/out-tsc/src/{imagepicker → form}/ImagePicker.js +2 -2
  107. package/out-tsc/src/form/ImagePicker.js.map +1 -0
  108. package/out-tsc/src/{mediapicker → form}/MediaPicker.js +1 -1
  109. package/out-tsc/src/form/MediaPicker.js.map +1 -0
  110. package/out-tsc/src/{datepicker → form}/RangePicker.js +3 -2
  111. package/out-tsc/src/form/RangePicker.js.map +1 -0
  112. package/out-tsc/src/{slider → form}/TembaSlider.js +1 -1
  113. package/out-tsc/src/form/TembaSlider.js.map +1 -0
  114. package/out-tsc/src/{templates → form}/TemplateEditor.js +1 -1
  115. package/out-tsc/src/form/TemplateEditor.js.map +1 -0
  116. package/out-tsc/src/{textinput → form}/TextInput.js +3 -3
  117. package/out-tsc/src/form/TextInput.js.map +1 -0
  118. package/out-tsc/src/{omnibox → form/select}/Omnibox.js +2 -2
  119. package/out-tsc/src/form/select/Omnibox.js.map +1 -0
  120. package/out-tsc/src/{select → form/select}/PopupSelect.js +1 -1
  121. package/out-tsc/src/form/select/PopupSelect.js.map +1 -0
  122. package/out-tsc/src/{select → form/select}/Select.js +86 -87
  123. package/out-tsc/src/form/select/Select.js.map +1 -0
  124. package/out-tsc/src/{select → form/select}/UserSelect.js +1 -1
  125. package/out-tsc/src/form/select/UserSelect.js.map +1 -0
  126. package/out-tsc/src/{select → form/select}/WorkspaceSelect.js +1 -1
  127. package/out-tsc/src/form/select/WorkspaceSelect.js.map +1 -0
  128. package/out-tsc/src/interfaces.js +1 -0
  129. package/out-tsc/src/interfaces.js.map +1 -1
  130. package/out-tsc/src/layout/Dialog.js.map +1 -0
  131. package/out-tsc/src/layout/Mask.js.map +1 -0
  132. package/out-tsc/src/{dialog → layout}/Modax.js.map +1 -1
  133. package/out-tsc/src/layout/Resizer.js.map +1 -0
  134. package/out-tsc/src/layout/Tab.js.map +1 -0
  135. package/out-tsc/src/layout/TabPane.js.map +1 -0
  136. package/out-tsc/src/list/NotificationList.js +1 -1
  137. package/out-tsc/src/list/NotificationList.js.map +1 -1
  138. package/out-tsc/src/list/RunList.js +1 -1
  139. package/out-tsc/src/list/RunList.js.map +1 -1
  140. package/out-tsc/src/list/ShortcutList.js.map +1 -1
  141. package/out-tsc/src/list/TembaMenu.js +1 -1
  142. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  143. package/out-tsc/src/list/TicketList.js +1 -1
  144. package/out-tsc/src/list/TicketList.js.map +1 -1
  145. package/out-tsc/src/{aliaseditor → live}/AliasEditor.js +1 -1
  146. package/out-tsc/src/live/AliasEditor.js.map +1 -0
  147. package/out-tsc/src/{contacts → live}/ContactBadges.js +1 -1
  148. package/out-tsc/src/live/ContactBadges.js.map +1 -0
  149. package/out-tsc/src/{contacts → live}/ContactChat.js +79 -3
  150. package/out-tsc/src/live/ContactChat.js.map +1 -0
  151. package/out-tsc/src/{contacts → live}/ContactDetails.js +1 -1
  152. package/out-tsc/src/live/ContactDetails.js.map +1 -0
  153. package/out-tsc/src/{contacts → live}/ContactFieldEditor.js +2 -2
  154. package/out-tsc/src/live/ContactFieldEditor.js.map +1 -0
  155. package/out-tsc/src/live/ContactFields.js.map +1 -0
  156. package/out-tsc/src/live/ContactNameFetch.js.map +1 -0
  157. package/out-tsc/src/{contacts → live}/ContactNotepad.js +1 -1
  158. package/out-tsc/src/{contacts → live}/ContactNotepad.js.map +1 -1
  159. package/out-tsc/src/{contacts → live}/ContactPending.js +1 -1
  160. package/out-tsc/src/live/ContactPending.js.map +1 -0
  161. package/out-tsc/src/live/ContactStoreElement.js.map +1 -0
  162. package/out-tsc/src/live/FieldManager.js.map +1 -0
  163. package/out-tsc/src/live/StartProgress.js.map +1 -0
  164. package/out-tsc/src/{chart → live}/TembaChart.js +5 -1
  165. package/out-tsc/src/live/TembaChart.js.map +1 -0
  166. package/out-tsc/src/locales/es.js +5 -5
  167. package/out-tsc/src/locales/es.js.map +1 -1
  168. package/out-tsc/src/locales/fr.js +5 -5
  169. package/out-tsc/src/locales/fr.js.map +1 -1
  170. package/out-tsc/src/locales/locale-codes.js +2 -11
  171. package/out-tsc/src/locales/locale-codes.js.map +1 -1
  172. package/out-tsc/src/locales/pt.js +5 -5
  173. package/out-tsc/src/locales/pt.js.map +1 -1
  174. package/out-tsc/src/store/AppState.js +54 -24
  175. package/out-tsc/src/store/AppState.js.map +1 -1
  176. package/out-tsc/src/store/Store.js +1 -1
  177. package/out-tsc/src/store/Store.js.map +1 -1
  178. package/out-tsc/src/{utils/index.js → utils.js} +22 -1
  179. package/out-tsc/src/utils.js.map +1 -0
  180. package/out-tsc/src/webchat/WebChat.js +1 -1
  181. package/out-tsc/src/webchat/WebChat.js.map +1 -1
  182. package/out-tsc/temba-components.js +2 -2
  183. package/out-tsc/temba-components.js.map +1 -1
  184. package/out-tsc/temba-modules.js +54 -54
  185. package/out-tsc/temba-modules.js.map +1 -1
  186. package/out-tsc/temba-webchat.js +2 -2
  187. package/out-tsc/temba-webchat.js.map +1 -1
  188. package/out-tsc/test/temba-alert.test.js +1 -1
  189. package/out-tsc/test/temba-alert.test.js.map +1 -1
  190. package/out-tsc/test/temba-appstate-language.test.js +90 -0
  191. package/out-tsc/test/temba-appstate-language.test.js.map +1 -1
  192. package/out-tsc/test/temba-charcount.test.js.map +1 -1
  193. package/out-tsc/test/temba-chart.test.js +1 -1
  194. package/out-tsc/test/temba-chart.test.js.map +1 -1
  195. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  196. package/out-tsc/test/temba-color-picker.test.js +1 -1
  197. package/out-tsc/test/temba-color-picker.test.js.map +1 -1
  198. package/out-tsc/test/temba-completion.test.js +1 -1
  199. package/out-tsc/test/temba-completion.test.js.map +1 -1
  200. package/out-tsc/test/temba-compose.test.js +1 -1
  201. package/out-tsc/test/temba-compose.test.js.map +1 -1
  202. package/out-tsc/test/temba-contact-badges.test.js +1 -1
  203. package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
  204. package/out-tsc/test/temba-contact-chat.test.js +3 -1
  205. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  206. package/out-tsc/test/temba-contact-details.test.js +1 -1
  207. package/out-tsc/test/temba-contact-details.test.js.map +1 -1
  208. package/out-tsc/test/temba-contact-fields.test.js +1 -1
  209. package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
  210. package/out-tsc/test/temba-contact-search.test.js +1 -1
  211. package/out-tsc/test/temba-contact-search.test.js.map +1 -1
  212. package/out-tsc/test/temba-date.test.js +5 -1
  213. package/out-tsc/test/temba-date.test.js.map +1 -1
  214. package/out-tsc/test/temba-datepicker.test.js +1 -1
  215. package/out-tsc/test/temba-datepicker.test.js.map +1 -1
  216. package/out-tsc/test/temba-dialog.test.js +1 -1
  217. package/out-tsc/test/temba-dialog.test.js.map +1 -1
  218. package/out-tsc/test/temba-dropdown.test.js +1 -1
  219. package/out-tsc/test/temba-dropdown.test.js.map +1 -1
  220. package/out-tsc/test/temba-excellent-helpers.test.js +316 -0
  221. package/out-tsc/test/temba-excellent-helpers.test.js.map +1 -0
  222. package/out-tsc/test/temba-field-manager.test.js.map +1 -1
  223. package/out-tsc/test/temba-flow-editor-node.test.js +414 -1
  224. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
  225. package/out-tsc/test/temba-flow-editor.test.js +185 -0
  226. package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
  227. package/out-tsc/test/temba-flow-plumber-connections.test.js +113 -0
  228. package/out-tsc/test/temba-flow-plumber-connections.test.js.map +1 -0
  229. package/out-tsc/test/temba-flow-plumber.test.js +73 -93
  230. package/out-tsc/test/temba-flow-plumber.test.js.map +1 -1
  231. package/out-tsc/test/temba-flow-render.test.js +624 -1
  232. package/out-tsc/test/temba-flow-render.test.js.map +1 -1
  233. package/out-tsc/test/temba-flow-self-routing.test.js +172 -0
  234. package/out-tsc/test/temba-flow-self-routing.test.js.map +1 -0
  235. package/out-tsc/test/temba-formfield.test.js.map +1 -1
  236. package/out-tsc/test/temba-icon.test.js +1 -1
  237. package/out-tsc/test/temba-icon.test.js.map +1 -1
  238. package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
  239. package/out-tsc/test/temba-label.test.js +1 -1
  240. package/out-tsc/test/temba-label.test.js.map +1 -1
  241. package/out-tsc/test/temba-lightbox.test.js +1 -1
  242. package/out-tsc/test/temba-lightbox.test.js.map +1 -1
  243. package/out-tsc/test/temba-markdown.test.js +127 -0
  244. package/out-tsc/test/temba-markdown.test.js.map +1 -0
  245. package/out-tsc/test/temba-menu.test.js +1 -1
  246. package/out-tsc/test/temba-menu.test.js.map +1 -1
  247. package/out-tsc/test/temba-modax.test.js +1 -1
  248. package/out-tsc/test/temba-modax.test.js.map +1 -1
  249. package/out-tsc/test/temba-modules.test.js +47 -0
  250. package/out-tsc/test/temba-modules.test.js.map +1 -0
  251. package/out-tsc/test/temba-omnibox.test.js +1 -1
  252. package/out-tsc/test/temba-omnibox.test.js.map +1 -1
  253. package/out-tsc/test/temba-options.test.js.map +1 -1
  254. package/out-tsc/test/temba-range-picker.test.js +9 -2
  255. package/out-tsc/test/temba-range-picker.test.js.map +1 -1
  256. package/out-tsc/test/temba-rapid-element.test.js +273 -0
  257. package/out-tsc/test/temba-rapid-element.test.js.map +1 -0
  258. package/out-tsc/test/temba-resize-element.test.js +85 -0
  259. package/out-tsc/test/temba-resize-element.test.js.map +1 -0
  260. package/out-tsc/test/temba-select.test.js +2 -2
  261. package/out-tsc/test/temba-select.test.js.map +1 -1
  262. package/out-tsc/test/temba-slider.test.js.map +1 -1
  263. package/out-tsc/test/temba-sticky-note.test.js +194 -0
  264. package/out-tsc/test/temba-sticky-note.test.js.map +1 -0
  265. package/out-tsc/test/temba-template-editor.test.js.map +1 -1
  266. package/out-tsc/test/temba-textinput.test.js +1 -1
  267. package/out-tsc/test/temba-textinput.test.js.map +1 -1
  268. package/out-tsc/test/temba-tip.test.js +1 -1
  269. package/out-tsc/test/temba-tip.test.js.map +1 -1
  270. package/out-tsc/test/temba-toast.test.js +1 -1
  271. package/out-tsc/test/temba-toast.test.js.map +1 -1
  272. package/out-tsc/test/temba-utils-index.test.js +1 -1
  273. package/out-tsc/test/temba-utils-index.test.js.map +1 -1
  274. package/out-tsc/test/temba-utils-uuid.test.js +38 -0
  275. package/out-tsc/test/temba-utils-uuid.test.js.map +1 -0
  276. package/out-tsc/test/temba-webchat.test.js +28 -12
  277. package/out-tsc/test/temba-webchat.test.js.map +1 -1
  278. package/out-tsc/test/utils.test.js +2 -6
  279. package/out-tsc/test/utils.test.js.map +1 -1
  280. package/package.json +18 -9
  281. package/rollup.components.mjs +1 -1
  282. package/screenshots/truth/datepicker/range-picker-all.png +0 -0
  283. package/screenshots/truth/datepicker/range-picker-button-states.png +0 -0
  284. package/screenshots/truth/datepicker/range-picker-default.png +0 -0
  285. package/screenshots/truth/datepicker/range-picker-editing-start.png +0 -0
  286. package/screenshots/truth/datepicker/range-picker-initial-values.png +0 -0
  287. package/screenshots/truth/datepicker/range-picker-week.png +0 -0
  288. package/screenshots/truth/datepicker/range-picker-year.png +0 -0
  289. package/screenshots/truth/sticky-note/blue-color.png +0 -0
  290. package/screenshots/truth/sticky-note/blue.png +0 -0
  291. package/screenshots/truth/sticky-note/color-picker-expanded.png +0 -0
  292. package/screenshots/truth/sticky-note/default.png +0 -0
  293. package/screenshots/truth/sticky-note/gray-color.png +0 -0
  294. package/screenshots/truth/sticky-note/gray.png +0 -0
  295. package/screenshots/truth/sticky-note/green-color.png +0 -0
  296. package/screenshots/truth/sticky-note/green.png +0 -0
  297. package/screenshots/truth/sticky-note/pink-color.png +0 -0
  298. package/screenshots/truth/sticky-note/pink.png +0 -0
  299. package/screenshots/truth/sticky-note/yellow-color.png +0 -0
  300. package/screenshots/truth/sticky-note/yellow.png +0 -0
  301. package/src/{charcount → display}/CharCount.ts +164 -2
  302. package/src/{vectoricon/VectorIcon.ts → display/Icon.ts} +1 -1
  303. package/src/{leafletmap → display}/LeafletMap.ts +19 -1
  304. package/src/{thumbnail → display}/Thumbnail.ts +1 -1
  305. package/src/{tip → display}/Tip.ts +1 -2
  306. package/src/{contacts/events.ts → events.ts} +1 -64
  307. package/src/flow/Editor.ts +655 -165
  308. package/src/flow/EditorNode.ts +337 -22
  309. package/src/flow/Plumber.ts +186 -79
  310. package/src/flow/StickyNote.ts +165 -9
  311. package/src/flow/config.ts +114 -18
  312. package/src/flow/render.ts +398 -11
  313. package/src/{checkbox → form}/Checkbox.ts +2 -2
  314. package/src/{colorpicker → form}/ColorPicker.ts +2 -2
  315. package/src/{completion → form}/Completion.ts +3 -3
  316. package/src/{compose → form}/Compose.ts +7 -7
  317. package/src/{contactsearch → form}/ContactSearch.ts +6 -6
  318. package/src/{datepicker → form}/DatePicker.ts +1 -1
  319. package/src/{FormElement.ts → form/FormElement.ts} +1 -1
  320. package/src/{imagepicker → form}/ImagePicker.ts +2 -2
  321. package/src/{mediapicker → form}/MediaPicker.ts +1 -1
  322. package/src/{datepicker → form}/RangePicker.ts +3 -2
  323. package/src/{slider → form}/TembaSlider.ts +1 -1
  324. package/src/{templates → form}/TemplateEditor.ts +2 -2
  325. package/src/{textinput → form}/TextInput.ts +5 -5
  326. package/src/{omnibox → form/select}/Omnibox.ts +2 -2
  327. package/src/{select → form/select}/PopupSelect.ts +1 -1
  328. package/src/{select → form/select}/Select.ts +124 -126
  329. package/src/{select → form/select}/UserSelect.ts +1 -1
  330. package/src/{select → form/select}/WorkspaceSelect.ts +1 -1
  331. package/src/interfaces.ts +2 -1
  332. package/src/{dialog → layout}/Dialog.ts +1 -1
  333. package/src/list/NotificationList.ts +2 -2
  334. package/src/list/RunList.ts +3 -3
  335. package/src/list/ShortcutList.ts +1 -1
  336. package/src/list/TembaMenu.ts +2 -2
  337. package/src/list/TicketList.ts +1 -1
  338. package/src/{aliaseditor → live}/AliasEditor.ts +3 -3
  339. package/src/{contacts → live}/ContactBadges.ts +1 -1
  340. package/src/{contacts → live}/ContactChat.ts +118 -8
  341. package/src/{contacts → live}/ContactDetails.ts +1 -1
  342. package/src/{contacts → live}/ContactFieldEditor.ts +4 -4
  343. package/src/{contacts → live}/ContactFields.ts +1 -1
  344. package/src/{contacts → live}/ContactNotepad.ts +1 -1
  345. package/src/{contacts → live}/ContactPending.ts +1 -1
  346. package/src/{chart → live}/TembaChart.ts +5 -2
  347. package/src/locales/es.ts +13 -18
  348. package/src/locales/fr.ts +13 -18
  349. package/src/locales/locale-codes.ts +2 -11
  350. package/src/locales/pt.ts +13 -18
  351. package/src/store/AppState.ts +75 -29
  352. package/src/store/Store.ts +1 -1
  353. package/src/store/flow-definition.d.ts +125 -0
  354. package/src/{utils/index.ts → utils.ts} +26 -10
  355. package/src/webchat/WebChat.ts +1 -1
  356. package/static/css/temba-components.css +1 -0
  357. package/svg.js +1 -4
  358. package/temba-components.ts +2 -2
  359. package/temba-modules.ts +54 -54
  360. package/temba-webchat.ts +2 -2
  361. package/test/temba-alert.test.ts +1 -1
  362. package/test/temba-appstate-language.test.ts +108 -0
  363. package/test/temba-charcount.test.ts +1 -1
  364. package/test/temba-chart.test.ts +1 -1
  365. package/test/temba-checkbox.test.ts +1 -1
  366. package/test/temba-color-picker.test.ts +1 -1
  367. package/test/temba-completion.test.ts +1 -1
  368. package/test/temba-compose.test.ts +1 -1
  369. package/test/temba-contact-badges.test.ts +1 -1
  370. package/test/temba-contact-chat.test.ts +6 -4
  371. package/test/temba-contact-details.test.ts +1 -1
  372. package/test/temba-contact-fields.test.ts +1 -1
  373. package/test/temba-contact-search.test.ts +2 -2
  374. package/test/temba-date.test.ts +8 -3
  375. package/test/temba-datepicker.test.ts +1 -1
  376. package/test/temba-dialog.test.ts +1 -1
  377. package/test/temba-dropdown.test.ts +1 -1
  378. package/test/temba-excellent-helpers.test.ts +417 -0
  379. package/test/temba-field-manager.test.ts +2 -2
  380. package/test/temba-flow-editor-node.test.ts +536 -1
  381. package/test/temba-flow-editor.test.ts +224 -0
  382. package/test/temba-flow-editor.test.ts.backup +563 -0
  383. package/test/temba-flow-plumber-connections.test.ts +142 -0
  384. package/test/temba-flow-plumber.test.ts +83 -120
  385. package/test/temba-flow-render.test.ts +787 -4
  386. package/test/temba-flow-self-routing.test.ts +215 -0
  387. package/test/temba-formfield.test.ts +1 -1
  388. package/test/temba-icon.test.ts +1 -1
  389. package/test/temba-integration-markdown.test.ts +1 -1
  390. package/test/temba-label.test.ts +1 -1
  391. package/test/temba-lightbox.test.ts +1 -1
  392. package/test/temba-markdown.test.ts +162 -0
  393. package/test/temba-menu.test.ts +1 -1
  394. package/test/temba-modax.test.ts +2 -2
  395. package/test/temba-modules.test.ts +56 -0
  396. package/test/temba-omnibox.test.ts +1 -1
  397. package/test/temba-options.test.ts +1 -1
  398. package/test/temba-range-picker.test.ts +17 -2
  399. package/test/temba-rapid-element.test.ts +341 -0
  400. package/test/temba-resize-element.test.ts +104 -0
  401. package/test/temba-select.test.ts +2 -2
  402. package/test/temba-slider.test.ts +1 -1
  403. package/test/temba-sticky-note.test.ts +281 -0
  404. package/test/temba-template-editor.test.ts +1 -1
  405. package/test/temba-textinput.test.ts +1 -1
  406. package/test/temba-tip.test.ts +1 -1
  407. package/test/temba-toast.test.ts +1 -1
  408. package/test/temba-utils-index.test.ts +1 -1
  409. package/test/temba-utils-index.test.ts.backup +1737 -0
  410. package/test/temba-utils-uuid.test.ts +48 -0
  411. package/test/temba-webchat.test.ts +30 -12
  412. package/test/utils.test.ts +5 -9
  413. package/web-dev-server.config.mjs +1 -1
  414. package/demo/alert/example.html +0 -65
  415. package/demo/button/example.html +0 -71
  416. package/demo/chart/horizontal-demo.html +0 -81
  417. package/demo/checkbox/example.html +0 -72
  418. package/demo/compose/example.html +0 -72
  419. package/demo/dropdown/example.html +0 -99
  420. package/demo/progress/example.html +0 -59
  421. package/demo/select/drag-and-drop.html +0 -142
  422. package/demo/select/example.html +0 -82
  423. package/demo/select/multi.html +0 -73
  424. package/demo/slider/example.html +0 -59
  425. package/demo/tabs/example.html +0 -91
  426. package/demo/textinput/example.html +0 -61
  427. package/out-tsc/src/FormElement.js.map +0 -1
  428. package/out-tsc/src/alert/Alert.js.map +0 -1
  429. package/out-tsc/src/aliaseditor/AliasEditor.js.map +0 -1
  430. package/out-tsc/src/anchor/Anchor.js.map +0 -1
  431. package/out-tsc/src/button/Button.js.map +0 -1
  432. package/out-tsc/src/charcount/CharCount.js.map +0 -1
  433. package/out-tsc/src/charcount/helpers.js +0 -159
  434. package/out-tsc/src/charcount/helpers.js.map +0 -1
  435. package/out-tsc/src/chart/TembaChart.js.map +0 -1
  436. package/out-tsc/src/chat/Chat.js.map +0 -1
  437. package/out-tsc/src/checkbox/Checkbox.js.map +0 -1
  438. package/out-tsc/src/colorpicker/ColorPicker.js.map +0 -1
  439. package/out-tsc/src/completion/Completion.js.map +0 -1
  440. package/out-tsc/src/completion/ExcellentParser.js.map +0 -1
  441. package/out-tsc/src/completion/helpers.js.map +0 -1
  442. package/out-tsc/src/compose/Compose.js.map +0 -1
  443. package/out-tsc/src/contacts/ContactBadges.js.map +0 -1
  444. package/out-tsc/src/contacts/ContactChat.js.map +0 -1
  445. package/out-tsc/src/contacts/ContactDetails.js.map +0 -1
  446. package/out-tsc/src/contacts/ContactFieldEditor.js.map +0 -1
  447. package/out-tsc/src/contacts/ContactFields.js.map +0 -1
  448. package/out-tsc/src/contacts/ContactName.js.map +0 -1
  449. package/out-tsc/src/contacts/ContactNameFetch.js.map +0 -1
  450. package/out-tsc/src/contacts/ContactPending.js.map +0 -1
  451. package/out-tsc/src/contacts/ContactStoreElement.js.map +0 -1
  452. package/out-tsc/src/contacts/ContactUrn.js.map +0 -1
  453. package/out-tsc/src/contacts/events.js +0 -65
  454. package/out-tsc/src/contacts/events.js.map +0 -1
  455. package/out-tsc/src/contacts/helpers.js +0 -77
  456. package/out-tsc/src/contacts/helpers.js.map +0 -1
  457. package/out-tsc/src/contactsearch/ContactSearch.js.map +0 -1
  458. package/out-tsc/src/date/TembaDate.js.map +0 -1
  459. package/out-tsc/src/datepicker/DatePicker.js.map +0 -1
  460. package/out-tsc/src/datepicker/RangePicker.js.map +0 -1
  461. package/out-tsc/src/dialog/Dialog.js.map +0 -1
  462. package/out-tsc/src/dropdown/Dropdown.js.map +0 -1
  463. package/out-tsc/src/fields/FieldManager.js.map +0 -1
  464. package/out-tsc/src/formfield/FormField.js.map +0 -1
  465. package/out-tsc/src/imagepicker/CroppieCSS.js.map +0 -1
  466. package/out-tsc/src/imagepicker/ImagePicker.js.map +0 -1
  467. package/out-tsc/src/label/Label.js.map +0 -1
  468. package/out-tsc/src/leafletmap/LeafletMap.js.map +0 -1
  469. package/out-tsc/src/leafletmap/helpers.js +0 -17
  470. package/out-tsc/src/leafletmap/helpers.js.map +0 -1
  471. package/out-tsc/src/lightbox/Lightbox.js.map +0 -1
  472. package/out-tsc/src/mask/Mask.js.map +0 -1
  473. package/out-tsc/src/mediapicker/MediaPicker.js.map +0 -1
  474. package/out-tsc/src/omnibox/Omnibox.js.map +0 -1
  475. package/out-tsc/src/options/helpers.js +0 -28
  476. package/out-tsc/src/options/helpers.js.map +0 -1
  477. package/out-tsc/src/progress/ProgressBar.js.map +0 -1
  478. package/out-tsc/src/progress/StartProgress.js.map +0 -1
  479. package/out-tsc/src/resizer/Resizer.js.map +0 -1
  480. package/out-tsc/src/select/PopupSelect.js.map +0 -1
  481. package/out-tsc/src/select/Select.js.map +0 -1
  482. package/out-tsc/src/select/UserSelect.js.map +0 -1
  483. package/out-tsc/src/select/WorkspaceSelect.js.map +0 -1
  484. package/out-tsc/src/select/helpers.js +0 -1
  485. package/out-tsc/src/select/helpers.js.map +0 -1
  486. package/out-tsc/src/shadowless/Shadowless.js +0 -33
  487. package/out-tsc/src/shadowless/Shadowless.js.map +0 -1
  488. package/out-tsc/src/slider/TembaSlider.js.map +0 -1
  489. package/out-tsc/src/sms/gsmsplitter.js.map +0 -1
  490. package/out-tsc/src/sms/gsmvalidator.js.map +0 -1
  491. package/out-tsc/src/sms/index.js.map +0 -1
  492. package/out-tsc/src/sms/unicodesplitter.js.map +0 -1
  493. package/out-tsc/src/tabpane/Tab.js.map +0 -1
  494. package/out-tsc/src/tabpane/TabPane.js.map +0 -1
  495. package/out-tsc/src/templates/TemplateEditor.js.map +0 -1
  496. package/out-tsc/src/textinput/TextInput.js.map +0 -1
  497. package/out-tsc/src/textinput/helpers.js +0 -12
  498. package/out-tsc/src/textinput/helpers.js.map +0 -1
  499. package/out-tsc/src/thumbnail/Thumbnail.js.map +0 -1
  500. package/out-tsc/src/tip/Tip.js.map +0 -1
  501. package/out-tsc/src/tip/helpers.js +0 -7
  502. package/out-tsc/src/tip/helpers.js.map +0 -1
  503. package/out-tsc/src/toast/Toast.js.map +0 -1
  504. package/out-tsc/src/user/TembaUser.js.map +0 -1
  505. package/out-tsc/src/utils/index.js.map +0 -1
  506. package/out-tsc/src/vectoricon/VectorIcon.js.map +0 -1
  507. package/out-tsc/src/vectoricon/index.js.map +0 -1
  508. package/src/charcount/helpers.ts +0 -162
  509. package/src/contacts/helpers.ts +0 -103
  510. package/src/leafletmap/helpers.ts +0 -18
  511. package/src/options/helpers.ts +0 -37
  512. package/src/select/helpers.ts +0 -0
  513. package/src/shadowless/Shadowless.ts +0 -32
  514. package/src/textinput/helpers.ts +0 -11
  515. package/src/tip/helpers.ts +0 -7
  516. /package/out-tsc/src/{alert → display}/Alert.js +0 -0
  517. /package/out-tsc/src/{anchor → display}/Anchor.js +0 -0
  518. /package/out-tsc/src/{button → display}/Button.js +0 -0
  519. /package/out-tsc/src/{chat → display}/Chat.js +0 -0
  520. /package/out-tsc/src/{contacts → display}/ContactName.js +0 -0
  521. /package/out-tsc/src/{contacts → display}/ContactUrn.js +0 -0
  522. /package/out-tsc/src/{dropdown → display}/Dropdown.js +0 -0
  523. /package/out-tsc/src/{label → display}/Label.js +0 -0
  524. /package/out-tsc/src/{lightbox → display}/Lightbox.js +0 -0
  525. /package/out-tsc/src/{loading → display}/Loading.js +0 -0
  526. /package/out-tsc/src/{options → display}/Options.js +0 -0
  527. /package/out-tsc/src/{progress → display}/ProgressBar.js +0 -0
  528. /package/out-tsc/src/{date → display}/TembaDate.js +0 -0
  529. /package/out-tsc/src/{user → display}/TembaUser.js +0 -0
  530. /package/out-tsc/src/{thumbnail → display}/Thumbnail.js +0 -0
  531. /package/out-tsc/src/{toast → display}/Toast.js +0 -0
  532. /package/out-tsc/src/{sms → display/sms}/gsmsplitter.js +0 -0
  533. /package/out-tsc/src/{sms → display/sms}/gsmvalidator.js +0 -0
  534. /package/out-tsc/src/{sms → display/sms}/index.js +0 -0
  535. /package/out-tsc/src/{sms → display/sms}/unicodesplitter.js +0 -0
  536. /package/out-tsc/src/{completion → excellent}/ExcellentParser.js +0 -0
  537. /package/out-tsc/src/{completion → excellent}/helpers.js +0 -0
  538. /package/out-tsc/src/{imagepicker → form}/CroppieCSS.js +0 -0
  539. /package/out-tsc/src/{formfield → form}/FormField.js +0 -0
  540. /package/out-tsc/src/{dialog → layout}/Dialog.js +0 -0
  541. /package/out-tsc/src/{mask → layout}/Mask.js +0 -0
  542. /package/out-tsc/src/{dialog → layout}/Modax.js +0 -0
  543. /package/out-tsc/src/{resizer → layout}/Resizer.js +0 -0
  544. /package/out-tsc/src/{tabpane → layout}/Tab.js +0 -0
  545. /package/out-tsc/src/{tabpane → layout}/TabPane.js +0 -0
  546. /package/out-tsc/src/{contacts → live}/ContactFields.js +0 -0
  547. /package/out-tsc/src/{contacts → live}/ContactNameFetch.js +0 -0
  548. /package/out-tsc/src/{contacts → live}/ContactStoreElement.js +0 -0
  549. /package/out-tsc/src/{fields → live}/FieldManager.js +0 -0
  550. /package/out-tsc/src/{progress → live}/StartProgress.js +0 -0
  551. /package/src/{vectoricon/index.ts → Icons.ts} +0 -0
  552. /package/src/{alert → display}/Alert.ts +0 -0
  553. /package/src/{anchor → display}/Anchor.ts +0 -0
  554. /package/src/{button → display}/Button.ts +0 -0
  555. /package/src/{chat → display}/Chat.ts +0 -0
  556. /package/src/{contacts → display}/ContactName.ts +0 -0
  557. /package/src/{contacts → display}/ContactUrn.ts +0 -0
  558. /package/src/{dropdown → display}/Dropdown.ts +0 -0
  559. /package/src/{label → display}/Label.ts +0 -0
  560. /package/src/{lightbox → display}/Lightbox.ts +0 -0
  561. /package/src/{loading → display}/Loading.ts +0 -0
  562. /package/src/{options → display}/Options.ts +0 -0
  563. /package/src/{progress → display}/ProgressBar.ts +0 -0
  564. /package/src/{date → display}/TembaDate.ts +0 -0
  565. /package/src/{user → display}/TembaUser.ts +0 -0
  566. /package/src/{toast → display}/Toast.ts +0 -0
  567. /package/src/{sms → display/sms}/gsmsplitter.ts +0 -0
  568. /package/src/{sms → display/sms}/gsmvalidator.ts +0 -0
  569. /package/src/{sms → display/sms}/index.ts +0 -0
  570. /package/src/{sms → display/sms}/unicodesplitter.ts +0 -0
  571. /package/src/{completion → excellent}/ExcellentParser.ts +0 -0
  572. /package/src/{completion → excellent}/helpers.ts +0 -0
  573. /package/src/{imagepicker → form}/CroppieCSS.ts +0 -0
  574. /package/src/{formfield → form}/FormField.ts +0 -0
  575. /package/src/{mask → layout}/Mask.ts +0 -0
  576. /package/src/{dialog → layout}/Modax.ts +0 -0
  577. /package/src/{resizer → layout}/Resizer.ts +0 -0
  578. /package/src/{tabpane → layout}/Tab.ts +0 -0
  579. /package/src/{tabpane → layout}/TabPane.ts +0 -0
  580. /package/src/{contacts → live}/ContactNameFetch.ts +0 -0
  581. /package/src/{contacts → live}/ContactStoreElement.ts +0 -0
  582. /package/src/{fields → live}/FieldManager.ts +0 -0
  583. /package/src/{progress → live}/StartProgress.ts +0 -0
@@ -1,10 +1,36 @@
1
1
  import { TemplateResult } from 'lit-html';
2
2
  import {
3
+ renderAddContactUrn,
4
+ renderAddInputLabels,
3
5
  renderAddToGroups,
6
+ renderCallClassifier,
7
+ renderCallLLM,
8
+ renderCallResthook,
4
9
  renderCallWebhook,
10
+ renderEnterFlow,
11
+ renderOpenTicket,
12
+ renderPlayAudio,
13
+ renderRemoveFromGroups,
14
+ renderRequestOptin,
15
+ renderSayMsg,
16
+ renderSendBroadcast,
17
+ renderSendEmail,
5
18
  renderSendMsg,
19
+ renderSetContactChannel,
20
+ renderSetContactField,
21
+ renderSetContactLanguage,
6
22
  renderSetContactName,
7
- renderSetRunResult
23
+ renderSetContactStatus,
24
+ renderSetRunResult,
25
+ renderStartSession,
26
+ renderTransferAirtime,
27
+ renderWaitForAudio,
28
+ renderWaitForDigits,
29
+ renderWaitForImage,
30
+ renderWaitForLocation,
31
+ renderWaitForMenu,
32
+ renderWaitForResponse,
33
+ renderWaitForVideo
8
34
  } from './render';
9
35
 
10
36
  export interface UIConfig {
@@ -32,27 +58,38 @@ export const EDITOR_CONFIG: {
32
58
  } = {
33
59
  add_input_labels: {
34
60
  name: 'Add Labels',
35
- color: COLORS.update
61
+ color: COLORS.update,
62
+ render: renderAddInputLabels
36
63
  },
37
64
  add_contact_urn: {
38
65
  name: 'Add Contact URN',
39
- color: COLORS.update
66
+ color: COLORS.update,
67
+ render: renderAddContactUrn
40
68
  },
41
69
  set_contact_field: {
42
70
  name: 'Update Contact Field',
43
- color: COLORS.update
71
+ color: COLORS.update,
72
+ render: renderSetContactField
44
73
  },
45
74
  set_contact_channel: {
46
75
  name: 'Update Contact Channel',
47
- color: COLORS.update
76
+ color: COLORS.update,
77
+ render: renderSetContactChannel
48
78
  },
49
79
  set_contact_language: {
50
80
  name: 'Update Contact Language',
51
- color: COLORS.update
81
+ color: COLORS.update,
82
+ render: renderSetContactLanguage
83
+ },
84
+ set_contact_status: {
85
+ name: 'Update Contact Status',
86
+ color: COLORS.update,
87
+ render: renderSetContactStatus
52
88
  },
53
89
  send_broadcast: {
54
90
  name: 'Send Broadcast',
55
- color: COLORS.broadcast
91
+ color: COLORS.broadcast,
92
+ render: renderSendBroadcast
56
93
  },
57
94
  set_run_result: {
58
95
  name: 'Save Flow Result',
@@ -66,36 +103,83 @@ export const EDITOR_CONFIG: {
66
103
  },
67
104
  send_email: {
68
105
  name: 'Send Email',
69
- color: COLORS.broadcast
106
+ color: COLORS.broadcast,
107
+ render: renderSendEmail
70
108
  },
71
109
  start_session: {
72
110
  name: 'Start Somebody Else',
73
- color: COLORS.broadcast
111
+ color: COLORS.broadcast,
112
+ render: renderStartSession
74
113
  },
75
114
  open_ticket: {
76
115
  name: 'Open Ticket',
77
- color: COLORS.execute
116
+ color: COLORS.execute,
117
+ render: renderOpenTicket
78
118
  },
79
119
  call_webhook: {
80
120
  name: 'Call Webhook',
81
121
  color: COLORS.call,
82
122
  render: renderCallWebhook
83
123
  },
84
- enter_flow: {
85
- name: 'Enter Subflow',
86
- color: COLORS.execute
124
+ call_classifier: {
125
+ name: 'Call Classifier',
126
+ color: COLORS.call,
127
+ render: renderCallClassifier
128
+ },
129
+ call_resthook: {
130
+ name: 'Call Resthook',
131
+ color: COLORS.call,
132
+ render: renderCallResthook
87
133
  },
88
134
  call_llm: {
89
135
  name: 'Call AI',
90
- color: COLORS.call
136
+ color: COLORS.call,
137
+ render: renderCallLLM
138
+ },
139
+ enter_flow: {
140
+ name: 'Enter Subflow',
141
+ color: COLORS.execute,
142
+ render: renderEnterFlow
91
143
  },
92
144
  transfer_airtime: {
93
145
  name: 'Send Airtime',
94
- color: COLORS.call
146
+ color: COLORS.call,
147
+ render: renderTransferAirtime
95
148
  },
96
149
  wait_for_response: {
97
150
  name: 'Wait for Response',
98
- color: COLORS.wait
151
+ color: COLORS.wait,
152
+ render: renderWaitForResponse
153
+ },
154
+ wait_for_menu: {
155
+ name: 'Wait for Menu Selection',
156
+ color: COLORS.wait,
157
+ render: renderWaitForMenu
158
+ },
159
+ wait_for_digits: {
160
+ name: 'Wait for Digits',
161
+ color: COLORS.wait,
162
+ render: renderWaitForDigits
163
+ },
164
+ wait_for_audio: {
165
+ name: 'Wait for Audio',
166
+ color: COLORS.wait,
167
+ render: renderWaitForAudio
168
+ },
169
+ wait_for_video: {
170
+ name: 'Wait for Video',
171
+ color: COLORS.wait,
172
+ render: renderWaitForVideo
173
+ },
174
+ wait_for_image: {
175
+ name: 'Wait for Image',
176
+ color: COLORS.wait,
177
+ render: renderWaitForImage
178
+ },
179
+ wait_for_location: {
180
+ name: 'Wait for Location',
181
+ color: COLORS.wait,
182
+ render: renderWaitForLocation
99
183
  },
100
184
  set_contact_name: {
101
185
  name: 'Update Contact',
@@ -109,11 +193,23 @@ export const EDITOR_CONFIG: {
109
193
  },
110
194
  remove_contact_groups: {
111
195
  name: 'Remove from Group',
112
- color: COLORS.remove
196
+ color: COLORS.remove,
197
+ render: renderRemoveFromGroups
113
198
  },
114
199
  request_optin: {
115
200
  name: 'Request Opt-in',
116
- color: COLORS.send
201
+ color: COLORS.send,
202
+ render: renderRequestOptin
203
+ },
204
+ say_msg: {
205
+ name: 'Say Message',
206
+ color: COLORS.send,
207
+ render: renderSayMsg
208
+ },
209
+ play_audio: {
210
+ name: 'Play Audio',
211
+ color: COLORS.send,
212
+ render: renderPlayAudio
117
213
  },
118
214
  split_by_run_result: {
119
215
  name: 'Split by Flow Result',
@@ -2,27 +2,95 @@ import { html } from 'lit-html';
2
2
  import { unsafeHTML } from 'lit-html/directives/unsafe-html.js';
3
3
 
4
4
  import {
5
+ AddContactUrn,
6
+ AddInputLabels,
5
7
  AddToGroup,
8
+ CallClassifier,
9
+ CallLLM,
10
+ CallResthook,
6
11
  CallWebhook,
12
+ EnterFlow,
7
13
  Node,
8
14
  NamedObject,
15
+ OpenTicket,
16
+ PlayAudio,
17
+ RemoveFromGroup,
18
+ RequestOptin,
19
+ SayMsg,
20
+ SendBroadcast,
21
+ SendEmail,
9
22
  SendMsg,
23
+ SetContactChannel,
24
+ SetContactField,
25
+ SetContactLanguage,
10
26
  SetContactName,
11
- SetRunResult
27
+ SetContactStatus,
28
+ SetRunResult,
29
+ StartSession,
30
+ TransferAirtime,
31
+ WaitForAudio,
32
+ WaitForDigits,
33
+ WaitForImage,
34
+ WaitForLocation,
35
+ WaitForMenu,
36
+ WaitForResponse,
37
+ WaitForVideo
12
38
  } from '../store/flow-definition';
39
+ import { Icon } from '../Icons';
40
+
41
+ // URN scheme mapping for user-friendly display
42
+ const urnSchemeMap: Record<string, string> = {
43
+ tel: 'Phone Number',
44
+ email: 'Email',
45
+ twitter: 'Twitter',
46
+ facebook: 'Facebook',
47
+ telegram: 'Telegram',
48
+ whatsapp: 'WhatsApp',
49
+ viber: 'Viber',
50
+ line: 'Line',
51
+ discord: 'Discord',
52
+ slack: 'Slack',
53
+ external: 'External ID'
54
+ };
55
+
56
+ const renderLineItem = (name: string, icon?: string) => {
57
+ return html`<div style="display:flex;items-align:center">
58
+ ${icon
59
+ ? html`<temba-icon name=${icon} style="margin-right:0.5em"></temba-icon>`
60
+ : null}
61
+ <div
62
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
63
+ >
64
+ ${name}
65
+ </div>
66
+ </div>`;
67
+ };
13
68
 
14
69
  const renderNamedObjects = (assets: NamedObject[], icon?: string) => {
15
- return assets.map((asset) => {
16
- return html`<div style="display:flex;items-align:center">
70
+ const items = [];
71
+ const maxDisplay = 3;
72
+
73
+ // Show up to 3 items, or all 4 if exactly 4 items
74
+ const displayCount =
75
+ assets.length === 4 ? 4 : Math.min(maxDisplay, assets.length);
76
+
77
+ for (let i = 0; i < displayCount; i++) {
78
+ const asset = assets[i];
79
+ items.push(renderLineItem(asset.name, icon));
80
+ }
81
+
82
+ // Add "+X more" if there are more than 3 items (and not exactly 4)
83
+ if (assets.length > maxDisplay && assets.length !== 4) {
84
+ const remainingCount = assets.length - maxDisplay;
85
+ items.push(html`<div style="display:flex;items-align:center; color: #666;">
17
86
  ${icon
18
- ? html`<temba-icon
19
- name=${icon}
20
- style="margin-right:0.5em"
21
- ></temba-icon>`
87
+ ? html`<div style="margin-right:0.5em; width: 1em;"></div>` // spacing placeholder
22
88
  : null}
23
- <div>${asset.name}</div>
24
- </div>`;
25
- });
89
+ <div>+${remainingCount} more</div>
90
+ </div>`);
91
+ }
92
+
93
+ return items;
26
94
  };
27
95
 
28
96
  export const renderSendMsg = (node: Node, action: SendMsg) => {
@@ -48,9 +116,328 @@ export const renderSetRunResult = (node: Node, action: SetRunResult) => {
48
116
  };
49
117
 
50
118
  export const renderCallWebhook = (node: Node, action: CallWebhook) => {
51
- return html`<div style="word-break: break-all">${action.url}</div>`;
119
+ return html`<div
120
+ style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
121
+ >
122
+ ${action.url}
123
+ </div>`;
52
124
  };
53
125
 
54
126
  export const renderAddToGroups = (node: Node, action: AddToGroup) => {
55
127
  return html`<div>${renderNamedObjects(action.groups, 'group')}</div>`;
56
128
  };
129
+
130
+ export const renderRemoveFromGroups = (node: Node, action: RemoveFromGroup) => {
131
+ return html`<div>${renderNamedObjects(action.groups, 'group')}</div>`;
132
+ };
133
+
134
+ export const renderSetContactField = (node: Node, action: SetContactField) => {
135
+ return html`<div>
136
+ Set <b>${action.field.name}</b> to <b>${action.value}</b>
137
+ </div>`;
138
+ };
139
+
140
+ export const renderSetContactLanguage = (
141
+ node: Node,
142
+ action: SetContactLanguage
143
+ ) => {
144
+ return html`<div>Set contact language to <b>${action.language}</b></div>`;
145
+ };
146
+
147
+ export const renderSetContactStatus = (
148
+ node: Node,
149
+ action: SetContactStatus
150
+ ) => {
151
+ return html`<div>Set contact status to <b>${action.status}</b></div>`;
152
+ };
153
+
154
+ export const renderSetContactChannel = (
155
+ node: Node,
156
+ action: SetContactChannel
157
+ ) => {
158
+ return html`<div>Set contact channel to <b>${action.channel.name}</b></div>`;
159
+ };
160
+
161
+ export const renderAddContactUrn = (node: Node, action: AddContactUrn) => {
162
+ const friendlyScheme = urnSchemeMap[action.scheme] || action.scheme;
163
+ return html`<div
164
+ style="word-wrap: break-word; overflow: hidden; text-overflow: ellipsis;"
165
+ >
166
+ Add ${friendlyScheme} <b>${action.path}</b>
167
+ </div>`;
168
+ };
169
+
170
+ export const renderSendEmail = (node: Node, action: SendEmail) => {
171
+ const addressList = action.addresses.join(', ');
172
+ return html`<div>
173
+ <div
174
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
175
+ >
176
+ <b>${addressList}</b>
177
+ </div>
178
+ <div style="margin-top: 0.5em">
179
+ <div
180
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
181
+ >
182
+ ${action.subject}
183
+ </div>
184
+ <div
185
+ style="margin-top: 0.25em; word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
186
+ >
187
+ ${action.body}
188
+ </div>
189
+ </div>
190
+ </div>`;
191
+ };
192
+
193
+ export const renderSendBroadcast = (node: Node, action: SendBroadcast) => {
194
+ const hasGroups = action.groups && action.groups.length > 0;
195
+ const hasContacts = action.contacts && action.contacts.length > 0;
196
+
197
+ return html`<div>
198
+ <div style="word-wrap: break-word; margin-bottom: 0.5em">
199
+ ${action.text}
200
+ </div>
201
+ ${hasGroups
202
+ ? html`<div style="margin-bottom: 0.25em">
203
+ <div style="font-weight: bold; margin-bottom: 0.25em">Groups:</div>
204
+ ${renderNamedObjects(action.groups, 'group')}
205
+ </div>`
206
+ : null}
207
+ ${hasContacts
208
+ ? html`<div>
209
+ <div style="font-weight: bold; margin-bottom: 0.25em">Contacts:</div>
210
+ ${renderNamedObjects(action.contacts, 'contact')}
211
+ </div>`
212
+ : null}
213
+ </div>`;
214
+ };
215
+
216
+ export const renderEnterFlow = (node: Node, action: EnterFlow) => {
217
+ return html`<div>Enter flow <b>${action.flow.name}</b></div>`;
218
+ };
219
+
220
+ export const renderStartSession = (node: Node, action: StartSession) => {
221
+ const hasGroups = action.groups && action.groups.length > 0;
222
+ const hasContacts = action.contacts && action.contacts.length > 0;
223
+
224
+ return html`<div>
225
+ ${hasGroups
226
+ ? html`<div style="margin-top: 0.5em">
227
+ <div style="font-weight: bold; margin-bottom: 0.25em">Groups:</div>
228
+ ${renderNamedObjects(action.groups, 'group')}
229
+ </div>`
230
+ : null}
231
+ ${hasContacts
232
+ ? html`<div style="margin-top: 0.5em">
233
+ <div style="font-weight: bold; margin-bottom: 0.25em">Contacts:</div>
234
+ ${renderNamedObjects(action.contacts, 'contact')}
235
+ </div>`
236
+ : null}
237
+ ${action.create_contact
238
+ ? renderLineItem('Create contact', Icon.contact)
239
+ : null}
240
+ ${renderLineItem(action.flow.name, Icon.flow)}
241
+ </div>`;
242
+ };
243
+
244
+ export const renderTransferAirtime = (node: Node, action: TransferAirtime) => {
245
+ const amounts = action.amounts.join(', ');
246
+ return html`<div>
247
+ Transfer airtime amounts: <b>${amounts}</b>
248
+ <div>Save result as <b>${action.result_name}</b></div>
249
+ </div>`;
250
+ };
251
+
252
+ export const renderCallClassifier = (node: Node, action: CallClassifier) => {
253
+ return html`<div>
254
+ <div>Call classifier <b>${action.classifier.name}</b></div>
255
+ <div style="margin-top: 0.25em; word-wrap: break-word">
256
+ Input: <b>${action.input}</b>
257
+ </div>
258
+ <div style="margin-top: 0.25em">
259
+ Save result as <b>${action.result_name}</b>
260
+ </div>
261
+ </div>`;
262
+ };
263
+
264
+ export const renderCallResthook = (node: Node, action: CallResthook) => {
265
+ return html`<div>
266
+ <div>Call resthook <b>${action.resthook}</b></div>
267
+ <div style="margin-top: 0.25em">
268
+ Save result as <b>${action.result_name}</b>
269
+ </div>
270
+ </div>`;
271
+ };
272
+
273
+ export const renderCallLLM = (node: Node, action: CallLLM) => {
274
+ return html`<div>
275
+ <div style="margin-top: 0.25em; display: flex; align-items: center;">
276
+ <temba-icon name="ai" style="margin-right: 0.5em"></temba-icon>
277
+ <span
278
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
279
+ >
280
+ ${action.llm.name}
281
+ </span>
282
+ </div>
283
+ <div
284
+ style="margin-top: 0.25em; word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
285
+ >
286
+ ${action.instructions}
287
+ </div>
288
+ </div>`;
289
+ };
290
+
291
+ export const renderOpenTicket = (node: Node, action: OpenTicket) => {
292
+ return html`<div>
293
+ <div
294
+ style="word-wrap: break-word; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
295
+ >
296
+ ${action.body}
297
+ </div>
298
+ ${action.assignee
299
+ ? html`<div
300
+ style="margin-top: 0.25em; display: flex; align-items: center;"
301
+ >
302
+ <temba-icon name="user" style="margin-right: 0.5em"></temba-icon>
303
+ <span
304
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
305
+ >
306
+ ${action.assignee.name}
307
+ </span>
308
+ </div>`
309
+ : null}
310
+ ${action.topic
311
+ ? html`<div
312
+ style="margin-top: 0.25em; display: flex; align-items: center;"
313
+ >
314
+ <temba-icon name="topic" style="margin-right: 0.5em"></temba-icon>
315
+ <span
316
+ style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
317
+ >
318
+ ${action.topic.name}
319
+ </span>
320
+ </div>`
321
+ : null}
322
+ </div>`;
323
+ };
324
+
325
+ export const renderRequestOptin = (node: Node, action: RequestOptin) => {
326
+ return html`<div>Request opt-in for <b>${action.optin.name}</b></div>`;
327
+ };
328
+
329
+ export const renderAddInputLabels = (node: Node, action: AddInputLabels) => {
330
+ return html`<div>${renderNamedObjects(action.labels, 'label')}</div>`;
331
+ };
332
+
333
+ export const renderSayMsg = (node: Node, action: SayMsg) => {
334
+ return html`<div>
335
+ <div
336
+ style="word-wrap: break-word; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
337
+ >
338
+ ${action.text}
339
+ </div>
340
+ ${action.audio_url
341
+ ? html`<div
342
+ style="margin-top: 0.5em; display: flex; align-items: center;"
343
+ >
344
+ <temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
345
+ <span
346
+ style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
347
+ >${action.audio_url}</span
348
+ >
349
+ </div>`
350
+ : null}
351
+ </div>`;
352
+ };
353
+
354
+ export const renderPlayAudio = (node: Node, action: PlayAudio) => {
355
+ return html`<div style="display: flex; align-items: center;">
356
+ <temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
357
+ <span
358
+ style="word-break: break-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
359
+ >${action.audio_url}</span
360
+ >
361
+ </div>`;
362
+ };
363
+
364
+ export const renderWaitForResponse = (node: Node, action: WaitForResponse) => {
365
+ return html`<div>
366
+ Wait for message response
367
+ ${action.timeout
368
+ ? html`<div style="margin-top: 0.25em">
369
+ Timeout after <b>${action.timeout}</b> seconds
370
+ </div>`
371
+ : null}
372
+ </div>`;
373
+ };
374
+
375
+ export const renderWaitForMenu = (node: Node, action: WaitForMenu) => {
376
+ return html`<div>
377
+ Wait for menu selection: <b>${action.menu.name}</b>
378
+ ${action.timeout
379
+ ? html`<div style="margin-top: 0.25em">
380
+ Timeout after <b>${action.timeout}</b> seconds
381
+ </div>`
382
+ : null}
383
+ </div>`;
384
+ };
385
+
386
+ export const renderWaitForDigits = (node: Node, action: WaitForDigits) => {
387
+ return html`<div>
388
+ Wait for <b>${action.count}</b> digit${action.count !== 1 ? 's' : ''}
389
+ ${action.timeout
390
+ ? html`<div style="margin-top: 0.25em">
391
+ Timeout after <b>${action.timeout}</b> seconds
392
+ </div>`
393
+ : null}
394
+ </div>`;
395
+ };
396
+
397
+ export const renderWaitForAudio = (node: Node, action: WaitForAudio) => {
398
+ return html`<div>
399
+ <temba-icon name="audio" style="margin-right: 0.25em"></temba-icon>
400
+ Wait for audio recording
401
+ ${action.timeout
402
+ ? html`<div style="margin-top: 0.25em">
403
+ Timeout after <b>${action.timeout}</b> seconds
404
+ </div>`
405
+ : null}
406
+ </div>`;
407
+ };
408
+
409
+ export const renderWaitForVideo = (node: Node, action: WaitForVideo) => {
410
+ return html`<div>
411
+ <temba-icon name="video" style="margin-right: 0.25em"></temba-icon>
412
+ Wait for video recording
413
+ ${action.timeout
414
+ ? html`<div style="margin-top: 0.25em">
415
+ Timeout after <b>${action.timeout}</b> seconds
416
+ </div>`
417
+ : null}
418
+ </div>`;
419
+ };
420
+
421
+ export const renderWaitForImage = (node: Node, action: WaitForImage) => {
422
+ return html`<div>
423
+ <temba-icon name="image" style="margin-right: 0.25em"></temba-icon>
424
+ Wait for image
425
+ ${action.timeout
426
+ ? html`<div style="margin-top: 0.25em">
427
+ Timeout after <b>${action.timeout}</b> seconds
428
+ </div>`
429
+ : null}
430
+ </div>`;
431
+ };
432
+
433
+ export const renderWaitForLocation = (node: Node, action: WaitForLocation) => {
434
+ return html`<div>
435
+ <temba-icon name="location" style="margin-right: 0.25em"></temba-icon>
436
+ Wait for location
437
+ ${action.timeout
438
+ ? html`<div style="margin-top: 0.25em">
439
+ Timeout after <b>${action.timeout}</b> seconds
440
+ </div>`
441
+ : null}
442
+ </div>`;
443
+ };
@@ -1,7 +1,7 @@
1
1
  import { TemplateResult, html, css } from 'lit';
2
- import { FormElement } from '../FormElement';
2
+ import { FormElement } from './FormElement';
3
3
  import { property } from 'lit/decorators.js';
4
- import { Icon } from '../vectoricon';
4
+ import { Icon } from '../Icons';
5
5
 
6
6
  export class Checkbox extends FormElement {
7
7
  static get styles() {
@@ -1,8 +1,8 @@
1
1
  import { html, css, PropertyValueMap } from 'lit';
2
- import { FormElement } from '../FormElement';
2
+ import { FormElement } from './FormElement';
3
3
  import { property } from 'lit/decorators.js';
4
4
  import { getClasses, hslToHex } from '../utils';
5
- import { TextInput } from '../textinput/TextInput';
5
+ import { TextInput } from './TextInput';
6
6
 
7
7
  export class ColorPicker extends FormElement {
8
8
  @property({ type: Boolean })
@@ -1,14 +1,14 @@
1
1
  import { TemplateResult, css, html } from 'lit';
2
2
  import { property } from 'lit/decorators.js';
3
3
  import { ifDefined } from 'lit-html/directives/if-defined.js';
4
- import { TextInput } from '../textinput/TextInput';
4
+ import { TextInput } from './TextInput';
5
5
  import {
6
6
  renderCompletionOption,
7
7
  updateInputElementWithCompletion,
8
8
  executeCompletionQuery
9
- } from './helpers';
9
+ } from '../excellent/helpers';
10
10
 
11
- import { FormElement } from '../FormElement';
11
+ import { FormElement } from './FormElement';
12
12
  import { CompletionOption, Position } from '../interfaces';
13
13
  import { styleMap } from 'lit-html/directives/style-map.js';
14
14
  import { msg } from '@lit/localize';
@@ -1,14 +1,14 @@
1
1
  import { TemplateResult, html, css } from 'lit';
2
- import { FormElement } from '../FormElement';
2
+ import { FormElement } from './FormElement';
3
3
  import { property } from 'lit/decorators.js';
4
4
  import { Attachment, CustomEventType, Language, Shortcut } from '../interfaces';
5
5
  import { DEFAULT_MEDIA_ENDPOINT, getClasses } from '../utils';
6
- import { Completion } from '../completion/Completion';
7
- import { Select } from '../select/Select';
8
- import { TabPane } from '../tabpane/TabPane';
9
- import { MediaPicker } from '../mediapicker/MediaPicker';
10
- import { Tab } from '../tabpane/Tab';
11
- import { TextInput } from '../textinput/TextInput';
6
+ import { Completion } from './Completion';
7
+ import { Select } from './select/Select';
8
+ import { TabPane } from '../layout/TabPane';
9
+ import { MediaPicker } from './MediaPicker';
10
+ import { Tab } from '../layout/Tab';
11
+ import { TextInput } from './TextInput';
12
12
  import { ShortcutList } from '../list/ShortcutList';
13
13
 
14
14
  export interface ComposeValue {