@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,5 +1,5 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
- import { renderSendMsg, renderSetContactName, renderSetRunResult, renderCallWebhook, renderAddToGroups } from '../src/flow/render';
2
+ import { renderAddContactUrn, renderAddInputLabels, renderAddToGroups, renderCallClassifier, renderCallLLM, renderCallResthook, renderCallWebhook, renderEnterFlow, renderOpenTicket, renderPlayAudio, renderRemoveFromGroups, renderRequestOptin, renderSayMsg, renderSendBroadcast, renderSendEmail, renderSendMsg, renderSetContactChannel, renderSetContactField, renderSetContactLanguage, renderSetContactName, renderSetContactStatus, renderSetRunResult, renderStartSession, renderTransferAirtime, renderWaitForAudio, renderWaitForDigits, renderWaitForImage, renderWaitForLocation, renderWaitForMenu, renderWaitForResponse, renderWaitForVideo } from '../src/flow/render';
3
3
  describe('Flow Render Functions', () => {
4
4
  const mockNode = {
5
5
  uuid: 'test-node-uuid',
@@ -166,6 +166,629 @@ describe('Flow Render Functions', () => {
166
166
  expect(container.innerHTML).to.contain('Test Group');
167
167
  expect(container.querySelectorAll('temba-icon')).to.have.length(0);
168
168
  });
169
+ it('renders groups with limit - shows +X more for 5+ items', async () => {
170
+ const action = {
171
+ type: 'add_contact_groups',
172
+ uuid: 'action-uuid-9b',
173
+ groups: [
174
+ {
175
+ uuid: 'group1',
176
+ name: 'Group 1',
177
+ status: 'active',
178
+ system: false,
179
+ query: '',
180
+ count: 1
181
+ },
182
+ {
183
+ uuid: 'group2',
184
+ name: 'Group 2',
185
+ status: 'active',
186
+ system: false,
187
+ query: '',
188
+ count: 1
189
+ },
190
+ {
191
+ uuid: 'group3',
192
+ name: 'Group 3',
193
+ status: 'active',
194
+ system: false,
195
+ query: '',
196
+ count: 1
197
+ },
198
+ {
199
+ uuid: 'group4',
200
+ name: 'Group 4',
201
+ status: 'active',
202
+ system: false,
203
+ query: '',
204
+ count: 1
205
+ },
206
+ {
207
+ uuid: 'group5',
208
+ name: 'Group 5',
209
+ status: 'active',
210
+ system: false,
211
+ query: '',
212
+ count: 1
213
+ }
214
+ ]
215
+ };
216
+ const result = renderAddToGroups(mockNode, action);
217
+ const container = await fixture(html `<div>${result}</div>`);
218
+ expect(container.textContent).to.contain('Group 1');
219
+ expect(container.textContent).to.contain('Group 2');
220
+ expect(container.textContent).to.contain('Group 3');
221
+ expect(container.textContent).to.contain('+2 more');
222
+ expect(container.textContent).to.not.contain('Group 4');
223
+ expect(container.textContent).to.not.contain('Group 5');
224
+ });
225
+ it('renders all 4 groups when exactly 4 items', async () => {
226
+ const action = {
227
+ type: 'add_contact_groups',
228
+ uuid: 'action-uuid-9c',
229
+ groups: [
230
+ {
231
+ uuid: 'group1',
232
+ name: 'Group 1',
233
+ status: 'active',
234
+ system: false,
235
+ query: '',
236
+ count: 1
237
+ },
238
+ {
239
+ uuid: 'group2',
240
+ name: 'Group 2',
241
+ status: 'active',
242
+ system: false,
243
+ query: '',
244
+ count: 1
245
+ },
246
+ {
247
+ uuid: 'group3',
248
+ name: 'Group 3',
249
+ status: 'active',
250
+ system: false,
251
+ query: '',
252
+ count: 1
253
+ },
254
+ {
255
+ uuid: 'group4',
256
+ name: 'Group 4',
257
+ status: 'active',
258
+ system: false,
259
+ query: '',
260
+ count: 1
261
+ }
262
+ ]
263
+ };
264
+ const result = renderAddToGroups(mockNode, action);
265
+ const container = await fixture(html `<div>${result}</div>`);
266
+ expect(container.textContent).to.contain('Group 1');
267
+ expect(container.textContent).to.contain('Group 2');
268
+ expect(container.textContent).to.contain('Group 3');
269
+ expect(container.textContent).to.contain('Group 4');
270
+ expect(container.textContent).to.not.contain('+');
271
+ });
272
+ });
273
+ describe('renderRemoveFromGroups', () => {
274
+ it('renders groups with icons for removal', async () => {
275
+ const action = {
276
+ type: 'remove_contact_groups',
277
+ uuid: 'action-uuid-10',
278
+ groups: [
279
+ {
280
+ uuid: 'group1',
281
+ name: 'VIP Customers',
282
+ status: 'active',
283
+ system: false,
284
+ query: '',
285
+ count: 10
286
+ }
287
+ ]
288
+ };
289
+ const result = renderRemoveFromGroups(mockNode, action);
290
+ const container = await fixture(html `<div>${result}</div>`);
291
+ expect(container.innerHTML).to.contain('VIP Customers');
292
+ expect(container.querySelectorAll('temba-icon')).to.have.length(1);
293
+ const icon = container.querySelector('temba-icon');
294
+ expect(icon === null || icon === void 0 ? void 0 : icon.getAttribute('name')).to.equal('group');
295
+ });
296
+ });
297
+ describe('renderSetContactField', () => {
298
+ it('renders contact field setting', async () => {
299
+ const action = {
300
+ type: 'set_contact_field',
301
+ uuid: 'action-uuid-11',
302
+ field: { uuid: 'field1', name: 'Favorite Color' },
303
+ value: 'Blue'
304
+ };
305
+ const result = renderSetContactField(mockNode, action);
306
+ const container = await fixture(html `<div>${result}</div>`);
307
+ expect(container.textContent).to.contain('Set');
308
+ expect(container.textContent).to.contain('Favorite Color');
309
+ expect(container.textContent).to.contain('to');
310
+ expect(container.textContent).to.contain('Blue');
311
+ expect(container.querySelectorAll('b')).to.have.length(2);
312
+ });
313
+ });
314
+ describe('renderSetContactLanguage', () => {
315
+ it('renders contact language setting', async () => {
316
+ const action = {
317
+ type: 'set_contact_language',
318
+ uuid: 'action-uuid-12',
319
+ language: 'Spanish'
320
+ };
321
+ const result = renderSetContactLanguage(mockNode, action);
322
+ const container = await fixture(html `<div>${result}</div>`);
323
+ expect(container.textContent).to.contain('Set contact language to');
324
+ expect(container.textContent).to.contain('Spanish');
325
+ expect(container.querySelector('b')).to.exist;
326
+ });
327
+ });
328
+ describe('renderSetContactStatus', () => {
329
+ it('renders contact status setting', async () => {
330
+ const action = {
331
+ type: 'set_contact_status',
332
+ uuid: 'action-uuid-13',
333
+ status: 'blocked'
334
+ };
335
+ const result = renderSetContactStatus(mockNode, action);
336
+ const container = await fixture(html `<div>${result}</div>`);
337
+ expect(container.textContent).to.contain('Set contact status to');
338
+ expect(container.textContent).to.contain('blocked');
339
+ expect(container.querySelector('b')).to.exist;
340
+ });
341
+ });
342
+ describe('renderAddContactUrn', () => {
343
+ it('renders URN addition with friendly scheme names', async () => {
344
+ var _a;
345
+ const action = {
346
+ type: 'add_contact_urn',
347
+ uuid: 'action-uuid-14',
348
+ scheme: 'tel',
349
+ path: '+1234567890'
350
+ };
351
+ const result = renderAddContactUrn(mockNode, action);
352
+ const container = await fixture(html `<div>${result}</div>`);
353
+ expect(container.textContent).to.contain('Add');
354
+ expect(container.textContent).to.contain('Phone Number');
355
+ expect(container.textContent).to.contain('+1234567890');
356
+ // Only the phone number should be bold, not the scheme
357
+ expect(container.querySelectorAll('b')).to.have.length(1);
358
+ expect((_a = container.querySelector('b')) === null || _a === void 0 ? void 0 : _a.textContent).to.equal('+1234567890');
359
+ });
360
+ it('renders URN addition with unmapped scheme', async () => {
361
+ var _a;
362
+ const action = {
363
+ type: 'add_contact_urn',
364
+ uuid: 'action-uuid-14b',
365
+ scheme: 'unknown',
366
+ path: 'test123'
367
+ };
368
+ const result = renderAddContactUrn(mockNode, action);
369
+ const container = await fixture(html `<div>${result}</div>`);
370
+ expect(container.textContent).to.contain('Add');
371
+ expect(container.textContent).to.contain('unknown');
372
+ expect(container.textContent).to.contain('test123');
373
+ // Only the URN path should be bold
374
+ expect(container.querySelectorAll('b')).to.have.length(1);
375
+ expect((_a = container.querySelector('b')) === null || _a === void 0 ? void 0 : _a.textContent).to.equal('test123');
376
+ });
377
+ });
378
+ describe('renderSendEmail', () => {
379
+ it('renders email with subject and body', async () => {
380
+ const action = {
381
+ type: 'send_email',
382
+ uuid: 'action-uuid-15',
383
+ subject: 'Welcome!',
384
+ body: 'Thanks for signing up',
385
+ addresses: ['user@example.com', 'admin@example.com']
386
+ };
387
+ const result = renderSendEmail(mockNode, action);
388
+ const container = await fixture(html `<div>${result}</div>`);
389
+ // No longer expects "Send email to" prefix
390
+ expect(container.textContent).to.contain('user@example.com, admin@example.com');
391
+ expect(container.textContent).to.contain('Welcome!');
392
+ });
393
+ });
394
+ describe('renderSendBroadcast', () => {
395
+ it('renders broadcast with groups and contacts', async () => {
396
+ const action = {
397
+ type: 'send_broadcast',
398
+ uuid: 'action-uuid-16',
399
+ text: 'Important announcement',
400
+ groups: [
401
+ {
402
+ uuid: 'group1',
403
+ name: 'VIP Customers',
404
+ status: 'active',
405
+ system: false,
406
+ query: '',
407
+ count: 10
408
+ }
409
+ ],
410
+ contacts: [{ uuid: 'contact1', name: 'John Doe' }]
411
+ };
412
+ const result = renderSendBroadcast(mockNode, action);
413
+ const container = await fixture(html `<div>${result}</div>`);
414
+ expect(container.textContent).to.contain('Important announcement');
415
+ expect(container.textContent).to.contain('Groups:');
416
+ expect(container.textContent).to.contain('VIP Customers');
417
+ expect(container.textContent).to.contain('Contacts:');
418
+ expect(container.textContent).to.contain('John Doe');
419
+ });
420
+ it('renders broadcast with text only', async () => {
421
+ const action = {
422
+ type: 'send_broadcast',
423
+ uuid: 'action-uuid-17',
424
+ text: 'Simple broadcast',
425
+ groups: [],
426
+ contacts: []
427
+ };
428
+ const result = renderSendBroadcast(mockNode, action);
429
+ const container = await fixture(html `<div>${result}</div>`);
430
+ expect(container.textContent).to.contain('Simple broadcast');
431
+ expect(container.textContent).to.not.contain('Groups:');
432
+ expect(container.textContent).to.not.contain('Contacts:');
433
+ });
434
+ });
435
+ describe('renderEnterFlow', () => {
436
+ it('renders flow entry', async () => {
437
+ const action = {
438
+ type: 'enter_flow',
439
+ uuid: 'action-uuid-18',
440
+ flow: { uuid: 'flow1', name: 'Registration Flow' }
441
+ };
442
+ const result = renderEnterFlow(mockNode, action);
443
+ const container = await fixture(html `<div>${result}</div>`);
444
+ expect(container.textContent).to.contain('Enter flow');
445
+ expect(container.textContent).to.contain('Registration Flow');
446
+ expect(container.querySelector('b')).to.exist;
447
+ });
448
+ });
449
+ describe('renderStartSession', () => {
450
+ it('renders session start with groups and contacts', async () => {
451
+ const action = {
452
+ type: 'start_session',
453
+ uuid: 'action-uuid-19',
454
+ flow: { uuid: 'flow1', name: 'Survey Flow' },
455
+ groups: [
456
+ {
457
+ uuid: 'group1',
458
+ name: 'Subscribers',
459
+ status: 'active',
460
+ system: false,
461
+ query: '',
462
+ count: 50
463
+ }
464
+ ],
465
+ contacts: [{ uuid: 'contact1', name: 'Jane Smith' }]
466
+ };
467
+ const result = renderStartSession(mockNode, action);
468
+ const container = await fixture(html `<div>${result}</div>`);
469
+ expect(container.textContent).to.contain('Subscribers');
470
+ expect(container.textContent).to.contain('Jane Smith');
471
+ expect(container.textContent).to.contain('Survey Flow');
472
+ });
473
+ });
474
+ describe('renderTransferAirtime', () => {
475
+ it('renders airtime transfer', async () => {
476
+ const action = {
477
+ type: 'transfer_airtime',
478
+ uuid: 'action-uuid-20',
479
+ amounts: [100, 200, 500],
480
+ result_name: 'airtime_result'
481
+ };
482
+ const result = renderTransferAirtime(mockNode, action);
483
+ const container = await fixture(html `<div>${result}</div>`);
484
+ expect(container.textContent).to.contain('Transfer airtime amounts:');
485
+ expect(container.textContent).to.contain('100, 200, 500');
486
+ expect(container.textContent).to.contain('Save result as');
487
+ expect(container.textContent).to.contain('airtime_result');
488
+ });
489
+ });
490
+ describe('renderCallClassifier', () => {
491
+ it('renders classifier call', async () => {
492
+ const action = {
493
+ type: 'call_classifier',
494
+ uuid: 'action-uuid-21',
495
+ classifier: { uuid: 'classifier1', name: 'Intent Classifier' },
496
+ input: 'User message text',
497
+ result_name: 'intent_result'
498
+ };
499
+ const result = renderCallClassifier(mockNode, action);
500
+ const container = await fixture(html `<div>${result}</div>`);
501
+ expect(container.textContent).to.contain('Call classifier');
502
+ expect(container.textContent).to.contain('Intent Classifier');
503
+ expect(container.textContent).to.contain('Input:');
504
+ expect(container.textContent).to.contain('User message text');
505
+ expect(container.textContent).to.contain('Save result as');
506
+ expect(container.textContent).to.contain('intent_result');
507
+ });
508
+ });
509
+ describe('renderCallResthook', () => {
510
+ it('renders resthook call', async () => {
511
+ const action = {
512
+ type: 'call_resthook',
513
+ uuid: 'action-uuid-22',
514
+ resthook: 'survey-complete',
515
+ result_name: 'webhook_result'
516
+ };
517
+ const result = renderCallResthook(mockNode, action);
518
+ const container = await fixture(html `<div>${result}</div>`);
519
+ expect(container.textContent).to.contain('Call resthook');
520
+ expect(container.textContent).to.contain('survey-complete');
521
+ expect(container.textContent).to.contain('Save result as');
522
+ expect(container.textContent).to.contain('webhook_result');
523
+ });
524
+ });
525
+ describe('renderCallLLM', () => {
526
+ it('renders LLM call', async () => {
527
+ const action = {
528
+ type: 'call_llm',
529
+ uuid: 'action-uuid-23',
530
+ llm: { uuid: 'llm1', name: 'GPT-4' },
531
+ instructions: 'Analyze this text',
532
+ result_name: 'ai_result'
533
+ };
534
+ const result = renderCallLLM(mockNode, action);
535
+ const container = await fixture(html `<div>${result}</div>`);
536
+ // No longer expects "Call AI" prefix
537
+ expect(container.textContent).to.contain('GPT-4');
538
+ expect(container.textContent).to.contain('Analyze this text');
539
+ });
540
+ });
541
+ describe('renderOpenTicket', () => {
542
+ it('renders ticket with assignee and topic', async () => {
543
+ const action = {
544
+ type: 'open_ticket',
545
+ uuid: 'action-uuid-24',
546
+ subject: 'Support Request',
547
+ body: 'Customer needs help',
548
+ assignee: { uuid: 'user1', name: 'Support Agent' },
549
+ topic: { uuid: 'topic1', name: 'Technical Support' }
550
+ };
551
+ const result = renderOpenTicket(mockNode, action);
552
+ const container = await fixture(html `<div>${result}</div>`);
553
+ // No longer expects subject
554
+ expect(container.textContent).to.contain('Customer needs help');
555
+ expect(container.textContent).to.contain('Support Agent');
556
+ expect(container.textContent).to.contain('Technical Support');
557
+ expect(container.querySelectorAll('temba-icon')).to.have.length(2);
558
+ });
559
+ it('renders ticket without assignee or topic', async () => {
560
+ const action = {
561
+ type: 'open_ticket',
562
+ uuid: 'action-uuid-25',
563
+ subject: 'Basic Ticket',
564
+ body: 'Simple ticket content'
565
+ };
566
+ const result = renderOpenTicket(mockNode, action);
567
+ const container = await fixture(html `<div>${result}</div>`);
568
+ // No longer expects subject
569
+ expect(container.textContent).to.contain('Simple ticket content');
570
+ expect(container.querySelectorAll('temba-icon')).to.have.length(0);
571
+ });
572
+ });
573
+ describe('renderRequestOptin', () => {
574
+ it('renders optin request', async () => {
575
+ const action = {
576
+ type: 'request_optin',
577
+ uuid: 'action-uuid-26',
578
+ optin: { uuid: 'optin1', name: 'Newsletter Subscription' }
579
+ };
580
+ const result = renderRequestOptin(mockNode, action);
581
+ const container = await fixture(html `<div>${result}</div>`);
582
+ expect(container.textContent).to.contain('Request opt-in for');
583
+ expect(container.textContent).to.contain('Newsletter Subscription');
584
+ expect(container.querySelector('b')).to.exist;
585
+ });
586
+ });
587
+ describe('renderAddInputLabels', () => {
588
+ it('renders input labels', async () => {
589
+ const action = {
590
+ type: 'add_input_labels',
591
+ uuid: 'action-uuid-27',
592
+ labels: [
593
+ { uuid: 'label1', name: 'Important' },
594
+ { uuid: 'label2', name: 'Customer Service' }
595
+ ]
596
+ };
597
+ const result = renderAddInputLabels(mockNode, action);
598
+ const container = await fixture(html `<div>${result}</div>`);
599
+ // No longer expects "Add labels to input:" prefix
600
+ expect(container.textContent).to.contain('Important');
601
+ expect(container.textContent).to.contain('Customer Service');
602
+ expect(container.querySelectorAll('temba-icon')).to.have.length(2);
603
+ });
604
+ });
605
+ describe('renderSayMsg', () => {
606
+ it('renders voice message with audio URL', async () => {
607
+ var _a;
608
+ const action = {
609
+ type: 'say_msg',
610
+ uuid: 'action-uuid-28',
611
+ text: 'Welcome to our service',
612
+ audio_url: 'https://example.com/audio.mp3'
613
+ };
614
+ const result = renderSayMsg(mockNode, action);
615
+ const container = await fixture(html `<div>${result}</div>`);
616
+ expect(container.textContent).to.contain('Welcome to our service');
617
+ expect(container.innerHTML).to.contain('https://example.com/audio.mp3');
618
+ expect(container.querySelector('temba-icon')).to.exist;
619
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('audio');
620
+ });
621
+ it('renders voice message without audio URL', async () => {
622
+ const action = {
623
+ type: 'say_msg',
624
+ uuid: 'action-uuid-29',
625
+ text: 'Text only message'
626
+ };
627
+ const result = renderSayMsg(mockNode, action);
628
+ const container = await fixture(html `<div>${result}</div>`);
629
+ expect(container.textContent).to.contain('Text only message');
630
+ expect(container.querySelector('temba-icon')).to.not.exist;
631
+ });
632
+ });
633
+ describe('renderPlayAudio', () => {
634
+ it('renders audio playback', async () => {
635
+ var _a;
636
+ const action = {
637
+ type: 'play_audio',
638
+ uuid: 'action-uuid-30',
639
+ audio_url: 'https://example.com/music.mp3'
640
+ };
641
+ const result = renderPlayAudio(mockNode, action);
642
+ const container = await fixture(html `<div>${result}</div>`);
643
+ expect(container.innerHTML).to.contain('https://example.com/music.mp3');
644
+ expect(container.querySelector('temba-icon')).to.exist;
645
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('audio');
646
+ });
647
+ });
648
+ describe('renderSetContactChannel', () => {
649
+ it('renders contact channel setting', async () => {
650
+ const action = {
651
+ type: 'set_contact_channel',
652
+ uuid: 'action-uuid-31',
653
+ channel: { uuid: 'channel1', name: 'WhatsApp Channel' }
654
+ };
655
+ const result = renderSetContactChannel(mockNode, action);
656
+ const container = await fixture(html `<div>${result}</div>`);
657
+ expect(container.textContent).to.contain('Set contact channel to');
658
+ expect(container.textContent).to.contain('WhatsApp Channel');
659
+ expect(container.querySelector('b')).to.exist;
660
+ });
661
+ });
662
+ describe('renderWaitForResponse', () => {
663
+ it('renders wait for response with timeout', async () => {
664
+ const action = {
665
+ type: 'wait_for_response',
666
+ uuid: 'action-uuid-32',
667
+ timeout: 300
668
+ };
669
+ const result = renderWaitForResponse(mockNode, action);
670
+ const container = await fixture(html `<div>${result}</div>`);
671
+ expect(container.textContent).to.contain('Wait for message response');
672
+ expect(container.textContent).to.contain('Timeout after');
673
+ expect(container.textContent).to.contain('300');
674
+ expect(container.textContent).to.contain('seconds');
675
+ });
676
+ it('renders wait for response without timeout', async () => {
677
+ const action = {
678
+ type: 'wait_for_response',
679
+ uuid: 'action-uuid-33'
680
+ };
681
+ const result = renderWaitForResponse(mockNode, action);
682
+ const container = await fixture(html `<div>${result}</div>`);
683
+ expect(container.textContent).to.contain('Wait for message response');
684
+ expect(container.textContent).to.not.contain('Timeout');
685
+ });
686
+ });
687
+ describe('renderWaitForMenu', () => {
688
+ it('renders wait for menu with timeout', async () => {
689
+ const action = {
690
+ type: 'wait_for_menu',
691
+ uuid: 'action-uuid-34',
692
+ menu: { uuid: 'menu1', name: 'Main Menu' },
693
+ timeout: 120
694
+ };
695
+ const result = renderWaitForMenu(mockNode, action);
696
+ const container = await fixture(html `<div>${result}</div>`);
697
+ expect(container.textContent).to.contain('Wait for menu selection:');
698
+ expect(container.textContent).to.contain('Main Menu');
699
+ expect(container.textContent).to.contain('Timeout after');
700
+ expect(container.textContent).to.contain('120');
701
+ });
702
+ });
703
+ describe('renderWaitForDigits', () => {
704
+ it('renders wait for single digit', async () => {
705
+ const action = {
706
+ type: 'wait_for_digits',
707
+ uuid: 'action-uuid-35',
708
+ count: 1,
709
+ timeout: 60
710
+ };
711
+ const result = renderWaitForDigits(mockNode, action);
712
+ const container = await fixture(html `<div>${result}</div>`);
713
+ expect(container.textContent).to.contain('Wait for');
714
+ expect(container.textContent).to.contain('1');
715
+ expect(container.textContent).to.contain('digit');
716
+ expect(container.textContent).to.not.contain('digits');
717
+ expect(container.textContent).to.contain('Timeout after 60');
718
+ });
719
+ it('renders wait for multiple digits', async () => {
720
+ const action = {
721
+ type: 'wait_for_digits',
722
+ uuid: 'action-uuid-36',
723
+ count: 4
724
+ };
725
+ const result = renderWaitForDigits(mockNode, action);
726
+ const container = await fixture(html `<div>${result}</div>`);
727
+ expect(container.textContent).to.contain('Wait for');
728
+ expect(container.textContent).to.contain('4');
729
+ expect(container.textContent).to.contain('digits');
730
+ expect(container.textContent).to.not.contain('Timeout');
731
+ });
732
+ });
733
+ describe('renderWaitForAudio', () => {
734
+ it('renders wait for audio with icon', async () => {
735
+ var _a;
736
+ const action = {
737
+ type: 'wait_for_audio',
738
+ uuid: 'action-uuid-37',
739
+ timeout: 180
740
+ };
741
+ const result = renderWaitForAudio(mockNode, action);
742
+ const container = await fixture(html `<div>${result}</div>`);
743
+ expect(container.textContent).to.contain('Wait for audio recording');
744
+ expect(container.textContent).to.contain('Timeout after 180');
745
+ expect(container.querySelector('temba-icon')).to.exist;
746
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('audio');
747
+ });
748
+ });
749
+ describe('renderWaitForVideo', () => {
750
+ it('renders wait for video with icon', async () => {
751
+ var _a;
752
+ const action = {
753
+ type: 'wait_for_video',
754
+ uuid: 'action-uuid-38'
755
+ };
756
+ const result = renderWaitForVideo(mockNode, action);
757
+ const container = await fixture(html `<div>${result}</div>`);
758
+ expect(container.textContent).to.contain('Wait for video recording');
759
+ expect(container.querySelector('temba-icon')).to.exist;
760
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('video');
761
+ });
762
+ });
763
+ describe('renderWaitForImage', () => {
764
+ it('renders wait for image with icon', async () => {
765
+ var _a;
766
+ const action = {
767
+ type: 'wait_for_image',
768
+ uuid: 'action-uuid-39',
769
+ timeout: 240
770
+ };
771
+ const result = renderWaitForImage(mockNode, action);
772
+ const container = await fixture(html `<div>${result}</div>`);
773
+ expect(container.textContent).to.contain('Wait for image');
774
+ expect(container.textContent).to.contain('Timeout after 240');
775
+ expect(container.querySelector('temba-icon')).to.exist;
776
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('image');
777
+ });
778
+ });
779
+ describe('renderWaitForLocation', () => {
780
+ it('renders wait for location with icon', async () => {
781
+ var _a;
782
+ const action = {
783
+ type: 'wait_for_location',
784
+ uuid: 'action-uuid-40'
785
+ };
786
+ const result = renderWaitForLocation(mockNode, action);
787
+ const container = await fixture(html `<div>${result}</div>`);
788
+ expect(container.textContent).to.contain('Wait for location');
789
+ expect(container.querySelector('temba-icon')).to.exist;
790
+ expect((_a = container.querySelector('temba-icon')) === null || _a === void 0 ? void 0 : _a.getAttribute('name')).to.equal('location');
791
+ });
169
792
  });
170
793
  });
171
794
  //# sourceMappingURL=temba-flow-render.test.js.map