@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,11 +1,24 @@
1
1
  /* eslint-disable @typescript-eslint/no-this-alias */
2
2
  import { css, html, PropertyValueMap, TemplateResult } from 'lit';
3
3
  import { property } from 'lit/decorators.js';
4
- import { Contact, CustomEventType, Ticket } from '../interfaces';
5
- import { fetchResults, oxford, oxfordFn, postJSON } from '../utils';
4
+ import {
5
+ Contact,
6
+ CustomEventType,
7
+ NamedUser,
8
+ Ticket,
9
+ User
10
+ } from '../interfaces';
11
+ import {
12
+ fetchResults,
13
+ getUrl,
14
+ oxford,
15
+ oxfordFn,
16
+ postJSON,
17
+ postUrl,
18
+ WebResponse
19
+ } from '../utils';
6
20
  import { ContactStoreElement } from './ContactStoreElement';
7
- import { Compose, ComposeValue } from '../compose/Compose';
8
- import { fetchContactHistory, getDisplayName } from './helpers';
21
+ import { Compose, ComposeValue } from '../form/Compose';
9
22
  import {
10
23
  AirtimeTransferredEvent,
11
24
  CampaignFiredEvent,
@@ -26,12 +39,21 @@ import {
26
39
  UpdateResultEvent,
27
40
  URNsChangedEvent,
28
41
  WebhookEvent
29
- } from './events';
30
- import { Chat, ChatEvent, MessageType } from '../chat/Chat';
42
+ } from '../events';
43
+ import { Chat, ChatEvent, MessageType } from '../display/Chat';
31
44
  import { getUserDisplay } from '../webchat';
32
45
  import { DEFAULT_AVATAR } from '../webchat/assets';
33
- import { UserSelect } from '../select/UserSelect';
34
- import { Select } from '../select/Select';
46
+ import { UserSelect } from '../form/select/UserSelect';
47
+ import { Select } from '../form/select/Select';
48
+ import { Store } from '../store/Store';
49
+
50
+ /*
51
+ export const SCROLL_THRESHOLD = 100;
52
+ export const SIMULATED_WEB_SLOWNESS = 0;
53
+ export const MAX_CHAT_REFRESH = 10000;
54
+ export const MIN_CHAT_REFRESH = 500;
55
+ export const BODY_SNIPPET_LENGTH = 250;
56
+ */
35
57
 
36
58
  export enum Events {
37
59
  MESSAGE_CREATED = 'msg_created',
@@ -1196,3 +1218,91 @@ export class ContactChat extends ContactStoreElement {
1196
1218
  </div>`;
1197
1219
  }
1198
1220
  }
1221
+ export const closeTicket = (uuid: string): Promise<WebResponse> => {
1222
+ const formData = new FormData();
1223
+ formData.append('status', 'C');
1224
+ return postUrl(`/ticket/update/${uuid}/?_format=json`, formData);
1225
+ };
1226
+ export const fetchContact = (endpoint: string): Promise<Contact> => {
1227
+ return new Promise<Contact>((resolve, reject) => {
1228
+ fetchResults(endpoint).then((contacts: Contact[]) => {
1229
+ if (contacts && contacts.length === 1) {
1230
+ resolve(contacts[0]);
1231
+ } else {
1232
+ reject('No contact found');
1233
+ }
1234
+ });
1235
+ });
1236
+ };
1237
+ export const fetchContactHistory = (
1238
+ reset: boolean,
1239
+ endpoint: string,
1240
+ ticket: string,
1241
+ before: number = undefined,
1242
+ after: number = undefined
1243
+ ): Promise<ContactHistoryPage> => {
1244
+ if (reset) {
1245
+ pendingRequests.forEach((controller) => {
1246
+ controller.abort();
1247
+ });
1248
+ pendingRequests = [];
1249
+ }
1250
+
1251
+ return new Promise<ContactHistoryPage>((resolve) => {
1252
+ const controller = new AbortController();
1253
+ pendingRequests.push(controller);
1254
+
1255
+ let url = endpoint;
1256
+ if (before) {
1257
+ url += `&before=${before}`;
1258
+ }
1259
+
1260
+ if (after) {
1261
+ url += `&after=${after}`;
1262
+ }
1263
+
1264
+ if (ticket) {
1265
+ url += `&ticket=${ticket}`;
1266
+ }
1267
+
1268
+ const store = document.querySelector('temba-store') as Store;
1269
+
1270
+ getUrl(url, controller)
1271
+ .then((response: WebResponse) => {
1272
+ // on success, remove our abort controller
1273
+ pendingRequests = pendingRequests.filter(
1274
+ (controller: AbortController) => {
1275
+ return response.controller === controller;
1276
+ }
1277
+ );
1278
+
1279
+ const page = response.json as ContactHistoryPage;
1280
+ store.resolveUsers(page.events, ['created_by']).then(() => {
1281
+ resolve(page);
1282
+ });
1283
+ })
1284
+ .catch(() => {
1285
+ // canceled
1286
+ });
1287
+ });
1288
+ };
1289
+ export const getDisplayName = (user: User) => {
1290
+ if (!user) {
1291
+ return 'Somebody';
1292
+ }
1293
+
1294
+ if ((user as NamedUser).name) {
1295
+ return (user as NamedUser).name;
1296
+ }
1297
+
1298
+ if (user.first_name && user.last_name) {
1299
+ return `${user.first_name} ${user.last_name}`;
1300
+ }
1301
+
1302
+ if (user.first_name) {
1303
+ return user.first_name;
1304
+ }
1305
+
1306
+ return user.email;
1307
+ };
1308
+ export let pendingRequests: AbortController[] = [];
@@ -1,6 +1,6 @@
1
1
  import { css, html, TemplateResult } from 'lit';
2
2
  import { ContactStoreElement } from './ContactStoreElement';
3
- import { Icon } from '../vectoricon';
3
+ import { Icon } from '../Icons';
4
4
  import { capitalize } from '../utils';
5
5
 
6
6
  const STATUS = {
@@ -1,12 +1,12 @@
1
1
  import { css, html, TemplateResult } from 'lit';
2
2
  import { property } from 'lit/decorators.js';
3
- import { FormElement } from '../FormElement';
3
+ import { FormElement } from '../form/FormElement';
4
4
  import { CustomEventType } from '../interfaces';
5
5
  import { RapidElement } from '../RapidElement';
6
- import { InputType, TextInput } from '../textinput/TextInput';
7
- import { Icon } from '../vectoricon';
6
+ import { InputType, TextInput } from '../form/TextInput';
7
+ import { Icon } from '../Icons';
8
8
  import { getClasses, WebResponse } from '../utils';
9
- import { Select } from '../select/Select';
9
+ import { Select } from '../form/select/Select';
10
10
 
11
11
  enum Status {
12
12
  Success = 'success',
@@ -3,7 +3,7 @@ import { property } from 'lit/decorators.js';
3
3
  import { getClasses, postJSON } from '../utils';
4
4
  import { ContactFieldEditor } from './ContactFieldEditor';
5
5
  import { ContactStoreElement } from './ContactStoreElement';
6
- import { Checkbox } from '../checkbox/Checkbox';
6
+ import { Checkbox } from '../form/Checkbox';
7
7
  import { CustomEventType } from '../interfaces';
8
8
 
9
9
  const MIN_FOR_FILTER = 10;
@@ -1,7 +1,7 @@
1
1
  import { css, html, PropertyValueMap, TemplateResult } from 'lit';
2
2
  import { property } from 'lit/decorators.js';
3
3
  import { ContactStoreElement } from './ContactStoreElement';
4
- import { getDisplayName } from './helpers';
4
+ import { getDisplayName } from './ContactChat';
5
5
  import { ContactNote, CustomEventType } from '../interfaces';
6
6
 
7
7
  export class ContactNotepad extends ContactStoreElement {
@@ -6,7 +6,7 @@ import {
6
6
  ScheduledEventType
7
7
  } from '../interfaces';
8
8
  import { EndpointMonitorElement } from '../store/EndpointMonitorElement';
9
- import { Icon } from '../vectoricon';
9
+ import { Icon } from '../Icons';
10
10
 
11
11
  const ICONS = {
12
12
  [ScheduledEventType.CampaignEvent]: Icon.campaign,
@@ -2,7 +2,7 @@ import { RapidElement } from '../RapidElement';
2
2
  import { property, state } from 'lit/decorators.js';
3
3
  import { css, html, PropertyValueMap, TemplateResult } from 'lit';
4
4
 
5
- import { Select, SelectOption } from '../select/Select';
5
+ import { Select, SelectOption } from '../form/select/Select';
6
6
  import { darkenColor, getClasses } from '../utils';
7
7
  import { getStore } from '../store/Store';
8
8
 
@@ -334,6 +334,9 @@ export class TembaChart extends RapidElement {
334
334
  @property({ type: Boolean })
335
335
  showAll: boolean = false;
336
336
 
337
+ @property({ type: Boolean })
338
+ requireWindow: boolean = false;
339
+
337
340
  @property({ type: Number })
338
341
  colorIndex: number = 0;
339
342
 
@@ -455,7 +458,7 @@ export class TembaChart extends RapidElement {
455
458
  }
456
459
 
457
460
  if (changes.has('url') || changes.has('start') || changes.has('end')) {
458
- if (this.url) {
461
+ if (this.url && (!this.requireWindow || (this.start && this.end))) {
459
462
  const store = getStore();
460
463
  let fullUrl = this.url;
461
464
 
package/src/locales/es.ts CHANGED
@@ -1,18 +1,13 @@
1
-
2
- // Do not modify this file by hand!
3
- // Re-generate this file by running lit-localize
4
-
5
-
6
-
7
-
8
- /* eslint-disable no-irregular-whitespace */
9
- /* eslint-disable @typescript-eslint/no-explicit-any */
10
-
11
- export const templates = {
12
- 'scf1453991c986b25': `Tab para completar, enter para seleccionar`,
13
- 's73b4d70c02f4b4e0': `No options`,
14
- 's8f02e3a18ffc083a': `Are not currently in a flow`,
15
- 's638236250662c6b3': `Have sent a message in the last`,
16
- 's4788ee206c4570c7': `Have not started this flow in the last 90 days`,
17
- };
18
-
1
+ // Do not modify this file by hand!
2
+ // Re-generate this file by running lit-localize
3
+
4
+ /* eslint-disable no-irregular-whitespace */
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
6
+
7
+ export const templates = {
8
+ scf1453991c986b25: `Tab para completar, enter para seleccionar`,
9
+ s73b4d70c02f4b4e0: `No options`,
10
+ s8f02e3a18ffc083a: `Are not currently in a flow`,
11
+ s638236250662c6b3: `Have sent a message in the last`,
12
+ s4788ee206c4570c7: `Have not started this flow in the last 90 days`
13
+ };
package/src/locales/fr.ts CHANGED
@@ -1,18 +1,13 @@
1
-
2
- // Do not modify this file by hand!
3
- // Re-generate this file by running lit-localize
4
-
5
-
6
-
7
-
8
- /* eslint-disable no-irregular-whitespace */
9
- /* eslint-disable @typescript-eslint/no-explicit-any */
10
-
11
- export const templates = {
12
- 's73b4d70c02f4b4e0': `No options`,
13
- 'scf1453991c986b25': `Tab to complete, enter to select`,
14
- 's8f02e3a18ffc083a': `Are not currently in a flow`,
15
- 's638236250662c6b3': `Have sent a message in the last`,
16
- 's4788ee206c4570c7': `Have not started this flow in the last 90 days`,
17
- };
18
-
1
+ // Do not modify this file by hand!
2
+ // Re-generate this file by running lit-localize
3
+
4
+ /* eslint-disable no-irregular-whitespace */
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
6
+
7
+ export const templates = {
8
+ s73b4d70c02f4b4e0: `No options`,
9
+ scf1453991c986b25: `Tab to complete, enter to select`,
10
+ s8f02e3a18ffc083a: `Are not currently in a flow`,
11
+ s638236250662c6b3: `Have sent a message in the last`,
12
+ s4788ee206c4570c7: `Have not started this flow in the last 90 days`
13
+ };
@@ -10,18 +10,9 @@ export const sourceLocale = `en`;
10
10
  * The other locale codes that this application is localized into. Sorted
11
11
  * lexicographically.
12
12
  */
13
- export const targetLocales = [
14
- `es`,
15
- `fr`,
16
- `pt`,
17
- ] as const;
13
+ export const targetLocales = [`es`, `fr`, `pt`] as const;
18
14
 
19
15
  /**
20
16
  * All valid project locale codes. Sorted lexicographically.
21
17
  */
22
- export const allLocales = [
23
- `en`,
24
- `es`,
25
- `fr`,
26
- `pt`,
27
- ] as const;
18
+ export const allLocales = [`en`, `es`, `fr`, `pt`] as const;
package/src/locales/pt.ts CHANGED
@@ -1,18 +1,13 @@
1
-
2
- // Do not modify this file by hand!
3
- // Re-generate this file by running lit-localize
4
-
5
-
6
-
7
-
8
- /* eslint-disable no-irregular-whitespace */
9
- /* eslint-disable @typescript-eslint/no-explicit-any */
10
-
11
- export const templates = {
12
- 's73b4d70c02f4b4e0': `No options`,
13
- 'scf1453991c986b25': `Tab to complete, enter to select`,
14
- 's8f02e3a18ffc083a': `Are not currently in a flow`,
15
- 's638236250662c6b3': `Have sent a message in the last`,
16
- 's4788ee206c4570c7': `Have not started this flow in the last 90 days`,
17
- };
18
-
1
+ // Do not modify this file by hand!
2
+ // Re-generate this file by running lit-localize
3
+
4
+ /* eslint-disable no-irregular-whitespace */
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
6
+
7
+ export const templates = {
8
+ s73b4d70c02f4b4e0: `No options`,
9
+ scf1453991c986b25: `Tab to complete, enter to select`,
10
+ s8f02e3a18ffc083a: `Are not currently in a flow`,
11
+ s638236250662c6b3: `Have sent a message in the last`,
12
+ s4788ee206c4570c7: `Have not started this flow in the last 90 days`
13
+ };
@@ -1,5 +1,5 @@
1
1
  import { createStore, StoreApi } from 'zustand/vanilla';
2
- import { fetchResults } from '../utils';
2
+ import { fetchResults, generateUUID } from '../utils';
3
3
  import {
4
4
  Action,
5
5
  Exit,
@@ -12,6 +12,7 @@ import {
12
12
  import { immer } from 'zustand/middleware/immer';
13
13
  import { subscribeWithSelector } from 'zustand/middleware';
14
14
  import { property } from 'lit/decorators.js';
15
+ import { produce } from 'immer';
15
16
 
16
17
  export const FLOW_SPEC_VERSION = '14.3';
17
18
  const CANVAS_PADDING = 800;
@@ -94,12 +95,16 @@ export interface AppState {
94
95
  uuid: string,
95
96
  node: { actions: Action[]; uuid: string; exits: Exit[]; router?: Router }
96
97
  ): unknown;
98
+ updateConnection(
99
+ nodeUuid: string,
100
+ exitUuid: string,
101
+ destinationNodeUuid: string
102
+ ): unknown;
97
103
  updateCanvasPositions: (positions: CanvasPositions) => void;
98
- updateNodePosition(uuid: string, newPosition: FlowPosition): void;
99
104
  removeNodes: (uuids: string[]) => void;
100
-
101
- updateStickyPosition(uuid: string, newPosition: FlowPosition): void;
105
+ removeStickyNotes: (uuids: string[]) => void;
102
106
  updateStickyNote(uuid: string, sticky: StickyNote): void;
107
+ createStickyNote(position: FlowPosition): string;
103
108
  }
104
109
 
105
110
  export const zustand = createStore<AppState>()(
@@ -226,23 +231,13 @@ export const zustand = createStore<AppState>()(
226
231
  if (state.flowDefinition._ui.nodes[uuid]) {
227
232
  state.flowDefinition._ui.nodes[uuid].position = positions[uuid];
228
233
  }
229
- }
230
- });
231
- },
232
234
 
233
- updateNodePosition: (uuid: string, newPosition: FlowPosition) => {
234
- set((state: AppState) => {
235
- if (state.flowDefinition._ui.nodes[uuid]) {
236
- state.flowDefinition._ui.nodes[uuid].position = newPosition;
237
- } else {
238
- // If the node doesn't exist in _ui, we can add it
239
- state.flowDefinition._ui.nodes[uuid] = {
240
- position: newPosition,
241
- type: null,
242
- config: {}
243
- };
235
+ // otherwise, it might be a sticky
236
+ else if (state.flowDefinition._ui.stickies[uuid]) {
237
+ state.flowDefinition._ui.stickies[uuid].position =
238
+ positions[uuid];
239
+ }
244
240
  }
245
-
246
241
  state.dirtyDate = new Date();
247
242
  });
248
243
  },
@@ -253,21 +248,32 @@ export const zustand = createStore<AppState>()(
253
248
  delete state.flowDefinition._ui.nodes[uuid];
254
249
  }
255
250
 
256
- state.flowDefinition.nodes = state.flowDefinition.nodes.filter(
257
- (node) => !uuids.includes(node.uuid)
258
- );
251
+ state.flowDefinition = produce(state.flowDefinition, (draft) => {
252
+ draft.nodes = draft.nodes.filter(
253
+ (node) => !uuids.includes(node.uuid)
254
+ );
255
+
256
+ draft.nodes.forEach((node) => {
257
+ node.exits.forEach((exit) => {
258
+ if (uuids.includes(exit.destination_uuid)) {
259
+ exit.destination_uuid = null;
260
+ }
261
+ });
262
+ });
263
+ });
264
+
265
+ state.dirtyDate = new Date();
259
266
  });
260
267
  },
261
268
 
262
- updateStickyPosition: (uuid: string, newPosition: FlowPosition) => {
269
+ removeStickyNotes: (uuids: string[]) => {
263
270
  set((state: AppState) => {
264
- if (!state.flowDefinition._ui.stickies) {
265
- state.flowDefinition._ui.stickies = {};
266
- }
267
- if (state.flowDefinition._ui.stickies[uuid]) {
268
- state.flowDefinition._ui.stickies[uuid].position = newPosition;
269
- state.dirtyDate = new Date();
271
+ if (state.flowDefinition._ui?.stickies) {
272
+ for (const uuid of uuids) {
273
+ delete state.flowDefinition._ui.stickies[uuid];
274
+ }
270
275
  }
276
+ state.dirtyDate = new Date();
271
277
  });
272
278
  },
273
279
 
@@ -284,6 +290,26 @@ export const zustand = createStore<AppState>()(
284
290
  });
285
291
  },
286
292
 
293
+ updateConnection: (
294
+ nodeUuid: string,
295
+ exitUuid: string,
296
+ destinationNodeUuid: string
297
+ ) => {
298
+ set((state: AppState) => {
299
+ // Find the exit with this UUID
300
+ const node = state.flowDefinition.nodes.find(
301
+ (node) => node.uuid === nodeUuid
302
+ );
303
+
304
+ const exit = node?.exits.find((e) => e.uuid === exitUuid);
305
+ if (exit) {
306
+ // Update the destination
307
+ exit.destination_uuid = destinationNodeUuid;
308
+ state.dirtyDate = new Date();
309
+ }
310
+ });
311
+ },
312
+
287
313
  updateStickyNote: (uuid: string, sticky: StickyNote) => {
288
314
  set((state: AppState) => {
289
315
  if (!state.flowDefinition._ui.stickies) {
@@ -292,6 +318,26 @@ export const zustand = createStore<AppState>()(
292
318
  state.flowDefinition._ui.stickies[uuid] = sticky;
293
319
  state.dirtyDate = new Date();
294
320
  });
321
+ },
322
+
323
+ createStickyNote: (position: FlowPosition): string => {
324
+ const uuid = generateUUID();
325
+ set((state: AppState) => {
326
+ if (!state.flowDefinition._ui.stickies) {
327
+ state.flowDefinition._ui.stickies = {};
328
+ }
329
+
330
+ const newSticky: StickyNote = {
331
+ position,
332
+ title: '',
333
+ body: '',
334
+ color: 'yellow'
335
+ };
336
+
337
+ state.flowDefinition._ui.stickies[uuid] = newSticky;
338
+ state.dirtyDate = new Date();
339
+ });
340
+ return uuid;
295
341
  }
296
342
  }))
297
343
  )
@@ -27,7 +27,7 @@ import { css, html } from 'lit';
27
27
  import { configureLocalization } from '@lit/localize';
28
28
  import { sourceLocale, targetLocales } from '../locales/locale-codes';
29
29
  import { StoreMonitorElement } from './StoreMonitorElement';
30
- import { getFullName } from '../user/TembaUser';
30
+ import { getFullName } from '../display/TembaUser';
31
31
  import { AppState, zustand } from './AppState';
32
32
  import { StoreApi } from 'zustand/vanilla';
33
33
 
@@ -97,6 +97,131 @@ export interface AddToGroup extends Action {
97
97
  groups: Group[];
98
98
  }
99
99
 
100
+ export interface RemoveFromGroup extends Action {
101
+ groups: Group[];
102
+ }
103
+
104
+ export interface SetContactField extends Action {
105
+ field: NamedObject;
106
+ value: string;
107
+ }
108
+
109
+ export interface SetContactLanguage extends Action {
110
+ language: string;
111
+ }
112
+
113
+ export interface SetContactStatus extends Action {
114
+ status: 'active' | 'blocked' | 'stopped' | 'archived';
115
+ }
116
+
117
+ export interface SetContactChannel extends Action {
118
+ channel: NamedObject;
119
+ }
120
+
121
+ export interface AddContactUrn extends Action {
122
+ scheme: string;
123
+ path: string;
124
+ }
125
+
126
+ export interface SendEmail extends Action {
127
+ subject: string;
128
+ body: string;
129
+ addresses: string[];
130
+ }
131
+
132
+ export interface SendBroadcast extends Action {
133
+ text: string;
134
+ groups: Group[];
135
+ contacts: NamedObject[];
136
+ }
137
+
138
+ export interface EnterFlow extends Action {
139
+ flow: NamedObject;
140
+ }
141
+
142
+ export interface StartSession extends Action {
143
+ flow: NamedObject;
144
+ groups: Group[];
145
+ contacts: NamedObject[];
146
+ create_contact?: boolean;
147
+ }
148
+
149
+ export interface TransferAirtime extends Action {
150
+ amounts: number[];
151
+ result_name: string;
152
+ }
153
+
154
+ export interface CallClassifier extends Action {
155
+ classifier: NamedObject;
156
+ input: string;
157
+ result_name: string;
158
+ }
159
+
160
+ export interface CallResthook extends Action {
161
+ resthook: string;
162
+ result_name: string;
163
+ }
164
+
165
+ export interface CallLLM extends Action {
166
+ llm: NamedObject;
167
+ instructions: string;
168
+ result_name: string;
169
+ }
170
+
171
+ export interface OpenTicket extends Action {
172
+ subject: string;
173
+ body: string;
174
+ assignee?: NamedObject;
175
+ topic?: NamedObject;
176
+ }
177
+
178
+ export interface RequestOptin extends Action {
179
+ optin: NamedObject;
180
+ }
181
+
182
+ export interface AddInputLabels extends Action {
183
+ labels: NamedObject[];
184
+ }
185
+
186
+ export interface SayMsg extends Action {
187
+ text: string;
188
+ audio_url?: string;
189
+ }
190
+
191
+ export interface PlayAudio extends Action {
192
+ audio_url: string;
193
+ }
194
+
195
+ export interface WaitForResponse extends Action {
196
+ timeout?: number;
197
+ }
198
+
199
+ export interface WaitForMenu extends Action {
200
+ menu: NamedObject;
201
+ timeout?: number;
202
+ }
203
+
204
+ export interface WaitForDigits extends Action {
205
+ count: number;
206
+ timeout?: number;
207
+ }
208
+
209
+ export interface WaitForAudio extends Action {
210
+ timeout?: number;
211
+ }
212
+
213
+ export interface WaitForVideo extends Action {
214
+ timeout?: number;
215
+ }
216
+
217
+ export interface WaitForImage extends Action {
218
+ timeout?: number;
219
+ }
220
+
221
+ export interface WaitForLocation extends Action {
222
+ timeout?: number;
223
+ }
224
+
100
225
  export interface Exit {
101
226
  uuid: string;
102
227
  destination_uuid?: string;