@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
@@ -0,0 +1,273 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+ import { stub } from 'sinon';
3
+ import { RapidElement } from '../src/RapidElement';
4
+ import { CustomEventType } from '../src/interfaces';
5
+ // Create a test implementation of RapidElement
6
+ class TestRapidElement extends RapidElement {
7
+ render() {
8
+ return html `<div>test</div>`;
9
+ }
10
+ }
11
+ customElements.define('test-rapid-element', TestRapidElement);
12
+ describe('RapidElement', () => {
13
+ let element;
14
+ beforeEach(async () => {
15
+ element = await fixture(html `<test-rapid-element></test-rapid-element>`);
16
+ });
17
+ describe('getHeaders', () => {
18
+ it('returns empty object when no service is set', () => {
19
+ element.service = '';
20
+ const headers = element.getHeaders();
21
+ expect(headers).to.deep.equal({});
22
+ });
23
+ it('returns X-Temba-Service-Org header when service is set', () => {
24
+ element.service = 'test-service';
25
+ const headers = element.getHeaders();
26
+ expect(headers).to.deep.equal({
27
+ 'X-Temba-Service-Org': 'test-service'
28
+ });
29
+ });
30
+ it('returns empty object when service is undefined', () => {
31
+ element.service = undefined;
32
+ const headers = element.getHeaders();
33
+ expect(headers).to.deep.equal({});
34
+ });
35
+ });
36
+ describe('swallowEvent', () => {
37
+ it('stops propagation and prevents default on event', () => {
38
+ const mockEvent = {
39
+ stopPropagation: stub(),
40
+ preventDefault: stub()
41
+ };
42
+ element.swallowEvent(mockEvent);
43
+ expect(mockEvent.stopPropagation.calledOnce).to.be.true;
44
+ expect(mockEvent.preventDefault.calledOnce).to.be.true;
45
+ });
46
+ it('handles null event gracefully', () => {
47
+ expect(() => element.swallowEvent(null)).to.not.throw;
48
+ });
49
+ });
50
+ describe('stopEvent', () => {
51
+ it('stops propagation and prevents default on event', () => {
52
+ const mockEvent = {
53
+ stopPropagation: stub(),
54
+ preventDefault: stub()
55
+ };
56
+ element.stopEvent(mockEvent);
57
+ expect(mockEvent.stopPropagation.calledOnce).to.be.true;
58
+ expect(mockEvent.preventDefault.calledOnce).to.be.true;
59
+ });
60
+ it('handles null event gracefully', () => {
61
+ expect(() => element.stopEvent(null)).to.not.throw;
62
+ });
63
+ it('handles undefined event gracefully', () => {
64
+ expect(() => element.stopEvent(undefined)).to.not.throw;
65
+ });
66
+ });
67
+ describe('isMobile', () => {
68
+ let originalIsMobile;
69
+ beforeEach(() => {
70
+ originalIsMobile = window.isMobile;
71
+ });
72
+ afterEach(() => {
73
+ window.isMobile = originalIsMobile;
74
+ });
75
+ it('returns true when window.isMobile returns true', () => {
76
+ window.isMobile = () => true;
77
+ expect(element.isMobile()).to.be.true;
78
+ });
79
+ it('returns false when window.isMobile returns false', () => {
80
+ window.isMobile = () => false;
81
+ expect(element.isMobile()).to.be.false;
82
+ });
83
+ it('returns false when window.isMobile is not defined', () => {
84
+ window.isMobile = undefined;
85
+ expect(element.isMobile()).to.be.false;
86
+ });
87
+ });
88
+ describe('closestElement', () => {
89
+ it('finds closest element with given selector', () => {
90
+ // Create a test structure
91
+ const container = document.createElement('div');
92
+ container.className = 'container';
93
+ const child = document.createElement('span');
94
+ child.className = 'child';
95
+ container.appendChild(child);
96
+ document.body.appendChild(container);
97
+ // Test finding closest element
98
+ const result = element.closestElement('.container', child);
99
+ expect(result).to.equal(container);
100
+ // Cleanup
101
+ document.body.removeChild(container);
102
+ });
103
+ it('returns null when no matching element is found', () => {
104
+ const child = document.createElement('span');
105
+ document.body.appendChild(child);
106
+ const result = element.closestElement('.nonexistent', child);
107
+ expect(result).to.be.null;
108
+ document.body.removeChild(child);
109
+ });
110
+ it('handles shadow root traversal', () => {
111
+ // Create a shadow root scenario
112
+ const host = document.createElement('div');
113
+ host.className = 'shadow-host';
114
+ const shadow = host.attachShadow({ mode: 'open' });
115
+ const shadowChild = document.createElement('span');
116
+ shadow.appendChild(shadowChild);
117
+ document.body.appendChild(host);
118
+ const result = element.closestElement('.shadow-host', shadowChild);
119
+ expect(result).to.equal(host);
120
+ document.body.removeChild(host);
121
+ });
122
+ });
123
+ describe('getDiv', () => {
124
+ it('returns cached element if already retrieved', () => {
125
+ // Setup shadow root with a div
126
+ const testDiv = document.createElement('div');
127
+ testDiv.className = 'test-div';
128
+ element.shadowRoot.appendChild(testDiv);
129
+ // First call should cache the element
130
+ const result1 = element.getDiv('.test-div');
131
+ expect(result1).to.equal(testDiv);
132
+ // Second call should return cached version
133
+ const result2 = element.getDiv('.test-div');
134
+ expect(result2).to.equal(testDiv);
135
+ expect(result1).to.equal(result2);
136
+ });
137
+ it('returns null when element is not found', () => {
138
+ const result = element.getDiv('.nonexistent');
139
+ expect(result).to.be.null;
140
+ });
141
+ it('queries shadow root for new elements', () => {
142
+ const testDiv = document.createElement('div');
143
+ testDiv.className = 'new-test-div';
144
+ element.shadowRoot.appendChild(testDiv);
145
+ const result = element.getDiv('.new-test-div');
146
+ expect(result).to.equal(testDiv);
147
+ });
148
+ });
149
+ describe('dispatchEvent edge cases', () => {
150
+ it('handles events with dash-prefixed event handler properties', () => {
151
+ // Create an element with a dash-prefixed event handler property
152
+ const targetElement = document.createElement('div');
153
+ const handlerStub = stub().returns(true);
154
+ targetElement['-custom-event'] = handlerStub;
155
+ // Mock the target element being the event target
156
+ const customEvent = new CustomEvent('custom-event', {
157
+ bubbles: true,
158
+ composed: true
159
+ });
160
+ // Set the target to our test element
161
+ Object.defineProperty(customEvent, 'target', {
162
+ value: targetElement,
163
+ writable: false
164
+ });
165
+ // This should call the handler
166
+ element.dispatchEvent(customEvent);
167
+ expect(handlerStub.calledOnce).to.be.true;
168
+ expect(handlerStub.calledWith(customEvent)).to.be.true;
169
+ });
170
+ it('handles events with function handlers on target element', () => {
171
+ const targetElement = document.createElement('div');
172
+ const handlerStub = stub();
173
+ targetElement['-test-event'] = handlerStub;
174
+ const customEvent = new CustomEvent('test-event', {
175
+ bubbles: true,
176
+ composed: true
177
+ });
178
+ Object.defineProperty(customEvent, 'target', {
179
+ value: targetElement,
180
+ writable: false
181
+ });
182
+ element.dispatchEvent(customEvent);
183
+ expect(handlerStub.calledOnce).to.be.true;
184
+ expect(handlerStub.calledWith(customEvent)).to.be.true;
185
+ });
186
+ it('handles events with inline handler attributes via Function constructor', () => {
187
+ const targetElement = document.createElement('div');
188
+ targetElement.setAttribute('data-custom-event', 'console.log("test")'); // Use data- instead of dash-prefix
189
+ const customEvent = new CustomEvent('custom-event', {
190
+ bubbles: true,
191
+ composed: true
192
+ });
193
+ Object.defineProperty(customEvent, 'target', {
194
+ value: targetElement,
195
+ writable: false
196
+ });
197
+ // This should not throw an error even if no handler is found
198
+ expect(() => element.dispatchEvent(customEvent)).to.not.throw;
199
+ });
200
+ });
201
+ describe('DEBUG functionality', () => {
202
+ it('logs updates when DEBUG_UPDATES is enabled', () => {
203
+ const consoleStub = stub(console, 'log');
204
+ element.DEBUG_UPDATES = true;
205
+ // Trigger an update
206
+ element.requestUpdate();
207
+ // We can't easily test the exact log content, but we can verify
208
+ // that the debug functionality is accessible
209
+ element.DEBUG_UPDATES = false;
210
+ consoleStub.restore();
211
+ });
212
+ it('logs events when DEBUG_EVENTS is enabled', () => {
213
+ element.DEBUG_EVENTS = true;
214
+ // Fire a custom event
215
+ element.fireCustomEvent(CustomEventType.Loading);
216
+ // Reset debug flag
217
+ element.DEBUG_EVENTS = false;
218
+ });
219
+ it('logs events when DEBUG is enabled', () => {
220
+ element.DEBUG = true;
221
+ // Fire a regular event
222
+ element.fireEvent('test-event');
223
+ // Reset debug flag
224
+ element.DEBUG = false;
225
+ });
226
+ });
227
+ describe('event handlers', () => {
228
+ it('handles elements with getEventHandlers returning handlers', () => {
229
+ // Create a test element with event handlers
230
+ class TestElementWithHandlers extends RapidElement {
231
+ constructor() {
232
+ super(...arguments);
233
+ this.testMethodCalled = false;
234
+ }
235
+ testMethod() {
236
+ this.testMethodCalled = true;
237
+ }
238
+ getEventHandlers() {
239
+ return [
240
+ {
241
+ event: 'test-event',
242
+ method: this.testMethod.bind(this)
243
+ },
244
+ {
245
+ event: 'document-event',
246
+ method: this.testMethod.bind(this),
247
+ isDocument: true
248
+ },
249
+ {
250
+ event: 'window-event',
251
+ method: this.testMethod.bind(this),
252
+ isWindow: true
253
+ }
254
+ ];
255
+ }
256
+ render() {
257
+ return html `<div>test with handlers</div>`;
258
+ }
259
+ }
260
+ customElements.define('test-element-with-handlers', TestElementWithHandlers);
261
+ // Test that the element can be created without errors
262
+ const elementWithHandlers = new TestElementWithHandlers();
263
+ document.body.appendChild(elementWithHandlers);
264
+ // Test that handlers are properly registered/unregistered
265
+ expect(() => {
266
+ elementWithHandlers.connectedCallback();
267
+ elementWithHandlers.disconnectedCallback();
268
+ }).to.not.throw;
269
+ document.body.removeChild(elementWithHandlers);
270
+ });
271
+ });
272
+ });
273
+ //# sourceMappingURL=temba-rapid-element.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temba-rapid-element.test.js","sourceRoot":"","sources":["../../test/temba-rapid-element.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { stub } from 'sinon';\nimport { RapidElement } from '../src/RapidElement';\nimport { CustomEventType } from '../src/interfaces';\n\n// Create a test implementation of RapidElement\nclass TestRapidElement extends RapidElement {\n render() {\n return html`<div>test</div>`;\n }\n}\n\ncustomElements.define('test-rapid-element', TestRapidElement);\n\ndescribe('RapidElement', () => {\n let element: TestRapidElement;\n\n beforeEach(async () => {\n element = await fixture(html`<test-rapid-element></test-rapid-element>`);\n });\n\n describe('getHeaders', () => {\n it('returns empty object when no service is set', () => {\n element.service = '';\n const headers = element.getHeaders();\n expect(headers).to.deep.equal({});\n });\n\n it('returns X-Temba-Service-Org header when service is set', () => {\n element.service = 'test-service';\n const headers = element.getHeaders();\n expect(headers).to.deep.equal({\n 'X-Temba-Service-Org': 'test-service'\n });\n });\n\n it('returns empty object when service is undefined', () => {\n element.service = undefined;\n const headers = element.getHeaders();\n expect(headers).to.deep.equal({});\n });\n });\n\n describe('swallowEvent', () => {\n it('stops propagation and prevents default on event', () => {\n const mockEvent = {\n stopPropagation: stub(),\n preventDefault: stub()\n };\n\n element.swallowEvent(mockEvent as any);\n\n expect(mockEvent.stopPropagation.calledOnce).to.be.true;\n expect(mockEvent.preventDefault.calledOnce).to.be.true;\n });\n\n it('handles null event gracefully', () => {\n expect(() => element.swallowEvent(null)).to.not.throw;\n });\n });\n\n describe('stopEvent', () => {\n it('stops propagation and prevents default on event', () => {\n const mockEvent = {\n stopPropagation: stub(),\n preventDefault: stub()\n };\n\n element.stopEvent(mockEvent as any);\n\n expect(mockEvent.stopPropagation.calledOnce).to.be.true;\n expect(mockEvent.preventDefault.calledOnce).to.be.true;\n });\n\n it('handles null event gracefully', () => {\n expect(() => element.stopEvent(null)).to.not.throw;\n });\n\n it('handles undefined event gracefully', () => {\n expect(() => element.stopEvent(undefined)).to.not.throw;\n });\n });\n\n describe('isMobile', () => {\n let originalIsMobile: any;\n\n beforeEach(() => {\n originalIsMobile = (window as any).isMobile;\n });\n\n afterEach(() => {\n (window as any).isMobile = originalIsMobile;\n });\n\n it('returns true when window.isMobile returns true', () => {\n (window as any).isMobile = () => true;\n expect(element.isMobile()).to.be.true;\n });\n\n it('returns false when window.isMobile returns false', () => {\n (window as any).isMobile = () => false;\n expect(element.isMobile()).to.be.false;\n });\n\n it('returns false when window.isMobile is not defined', () => {\n (window as any).isMobile = undefined;\n expect(element.isMobile()).to.be.false;\n });\n });\n\n describe('closestElement', () => {\n it('finds closest element with given selector', () => {\n // Create a test structure\n const container = document.createElement('div');\n container.className = 'container';\n const child = document.createElement('span');\n child.className = 'child';\n container.appendChild(child);\n document.body.appendChild(container);\n\n // Test finding closest element\n const result = element.closestElement('.container', child);\n expect(result).to.equal(container);\n\n // Cleanup\n document.body.removeChild(container);\n });\n\n it('returns null when no matching element is found', () => {\n const child = document.createElement('span');\n document.body.appendChild(child);\n\n const result = element.closestElement('.nonexistent', child);\n expect(result).to.be.null;\n\n document.body.removeChild(child);\n });\n\n it('handles shadow root traversal', () => {\n // Create a shadow root scenario\n const host = document.createElement('div');\n host.className = 'shadow-host';\n const shadow = host.attachShadow({ mode: 'open' });\n const shadowChild = document.createElement('span');\n shadow.appendChild(shadowChild);\n document.body.appendChild(host);\n\n const result = element.closestElement('.shadow-host', shadowChild);\n expect(result).to.equal(host);\n\n document.body.removeChild(host);\n });\n });\n\n describe('getDiv', () => {\n it('returns cached element if already retrieved', () => {\n // Setup shadow root with a div\n const testDiv = document.createElement('div');\n testDiv.className = 'test-div';\n element.shadowRoot.appendChild(testDiv);\n\n // First call should cache the element\n const result1 = element.getDiv('.test-div');\n expect(result1).to.equal(testDiv);\n\n // Second call should return cached version\n const result2 = element.getDiv('.test-div');\n expect(result2).to.equal(testDiv);\n expect(result1).to.equal(result2);\n });\n\n it('returns null when element is not found', () => {\n const result = element.getDiv('.nonexistent');\n expect(result).to.be.null;\n });\n\n it('queries shadow root for new elements', () => {\n const testDiv = document.createElement('div');\n testDiv.className = 'new-test-div';\n element.shadowRoot.appendChild(testDiv);\n\n const result = element.getDiv('.new-test-div');\n expect(result).to.equal(testDiv);\n });\n });\n\n describe('dispatchEvent edge cases', () => {\n it('handles events with dash-prefixed event handler properties', () => {\n // Create an element with a dash-prefixed event handler property\n const targetElement = document.createElement('div');\n const handlerStub = stub().returns(true);\n (targetElement as any)['-custom-event'] = handlerStub;\n\n // Mock the target element being the event target\n const customEvent = new CustomEvent('custom-event', {\n bubbles: true,\n composed: true\n });\n\n // Set the target to our test element\n Object.defineProperty(customEvent, 'target', {\n value: targetElement,\n writable: false\n });\n\n // This should call the handler\n element.dispatchEvent(customEvent);\n\n expect(handlerStub.calledOnce).to.be.true;\n expect(handlerStub.calledWith(customEvent)).to.be.true;\n });\n\n it('handles events with function handlers on target element', () => {\n const targetElement = document.createElement('div');\n const handlerStub = stub();\n (targetElement as any)['-test-event'] = handlerStub;\n\n const customEvent = new CustomEvent('test-event', {\n bubbles: true,\n composed: true\n });\n\n Object.defineProperty(customEvent, 'target', {\n value: targetElement,\n writable: false\n });\n\n element.dispatchEvent(customEvent);\n\n expect(handlerStub.calledOnce).to.be.true;\n expect(handlerStub.calledWith(customEvent)).to.be.true;\n });\n\n it('handles events with inline handler attributes via Function constructor', () => {\n const targetElement = document.createElement('div');\n targetElement.setAttribute('data-custom-event', 'console.log(\"test\")'); // Use data- instead of dash-prefix\n\n const customEvent = new CustomEvent('custom-event', {\n bubbles: true,\n composed: true\n });\n\n Object.defineProperty(customEvent, 'target', {\n value: targetElement,\n writable: false\n });\n\n // This should not throw an error even if no handler is found\n expect(() => element.dispatchEvent(customEvent)).to.not.throw;\n });\n });\n\n describe('DEBUG functionality', () => {\n it('logs updates when DEBUG_UPDATES is enabled', () => {\n const consoleStub = stub(console, 'log');\n element.DEBUG_UPDATES = true;\n\n // Trigger an update\n element.requestUpdate();\n\n // We can't easily test the exact log content, but we can verify\n // that the debug functionality is accessible\n element.DEBUG_UPDATES = false;\n\n consoleStub.restore();\n });\n\n it('logs events when DEBUG_EVENTS is enabled', () => {\n element.DEBUG_EVENTS = true;\n\n // Fire a custom event\n element.fireCustomEvent(CustomEventType.Loading);\n\n // Reset debug flag\n element.DEBUG_EVENTS = false;\n });\n\n it('logs events when DEBUG is enabled', () => {\n element.DEBUG = true;\n\n // Fire a regular event\n element.fireEvent('test-event');\n\n // Reset debug flag\n element.DEBUG = false;\n });\n });\n\n describe('event handlers', () => {\n it('handles elements with getEventHandlers returning handlers', () => {\n // Create a test element with event handlers\n class TestElementWithHandlers extends RapidElement {\n testMethodCalled = false;\n\n testMethod() {\n this.testMethodCalled = true;\n }\n\n getEventHandlers() {\n return [\n {\n event: 'test-event',\n method: this.testMethod.bind(this)\n },\n {\n event: 'document-event',\n method: this.testMethod.bind(this),\n isDocument: true\n },\n {\n event: 'window-event',\n method: this.testMethod.bind(this),\n isWindow: true\n }\n ];\n }\n\n render() {\n return html`<div>test with handlers</div>`;\n }\n }\n\n customElements.define(\n 'test-element-with-handlers',\n TestElementWithHandlers\n );\n\n // Test that the element can be created without errors\n const elementWithHandlers = new TestElementWithHandlers();\n document.body.appendChild(elementWithHandlers);\n\n // Test that handlers are properly registered/unregistered\n expect(() => {\n elementWithHandlers.connectedCallback();\n elementWithHandlers.disconnectedCallback();\n }).to.not.throw;\n\n document.body.removeChild(elementWithHandlers);\n });\n });\n});\n"]}
@@ -0,0 +1,85 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+ import { ResizeElement } from '../src/ResizeElement';
3
+ // Create a test implementation of ResizeElement
4
+ class TestResizeElement extends ResizeElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.updateRequestCount = 0;
8
+ }
9
+ requestUpdate() {
10
+ this.updateRequestCount++;
11
+ return super.requestUpdate();
12
+ }
13
+ render() {
14
+ return html `<div>resize test</div>`;
15
+ }
16
+ }
17
+ customElements.define('test-resize-element', TestResizeElement);
18
+ describe('ResizeElement', () => {
19
+ let element;
20
+ beforeEach(async () => {
21
+ element = await fixture(html `<test-resize-element></test-resize-element>`);
22
+ });
23
+ describe('handleResize', () => {
24
+ it('calls requestUpdate when handleResize is called', () => {
25
+ const initialCount = element.updateRequestCount;
26
+ element.handleResize();
27
+ expect(element.updateRequestCount).to.equal(initialCount + 1);
28
+ });
29
+ it('is throttled when called multiple times rapidly', (done) => {
30
+ const initialCount = element.updateRequestCount;
31
+ // Get a reference to the throttled handler
32
+ const handlers = element.getEventHandlers();
33
+ const throttledHandler = handlers[0].method;
34
+ // Call the throttled handler multiple times
35
+ throttledHandler.call(element);
36
+ throttledHandler.call(element);
37
+ throttledHandler.call(element);
38
+ // Due to throttling, should only execute once initially
39
+ setTimeout(() => {
40
+ expect(element.updateRequestCount).to.be.greaterThan(initialCount);
41
+ expect(element.updateRequestCount).to.be.at.most(initialCount + 1);
42
+ done();
43
+ }, 25);
44
+ });
45
+ });
46
+ describe('getEventHandlers', () => {
47
+ it('returns resize event handler for window', () => {
48
+ const handlers = element.getEventHandlers();
49
+ expect(handlers).to.be.an('array');
50
+ expect(handlers.length).to.equal(1);
51
+ const resizeHandler = handlers[0];
52
+ expect(resizeHandler.event).to.equal('resize');
53
+ expect(resizeHandler.isWindow).to.be.true;
54
+ expect(typeof resizeHandler.method).to.equal('function');
55
+ });
56
+ it('resize handler is properly throttled', () => {
57
+ const handlers = element.getEventHandlers();
58
+ const resizeHandler = handlers[0];
59
+ // The method should be a throttled version of handleResize
60
+ expect(typeof resizeHandler.method).to.equal('function');
61
+ // Test that the throttled method can be called
62
+ expect(() => resizeHandler.method()).to.not.throw;
63
+ });
64
+ });
65
+ describe('window resize integration', () => {
66
+ it('responds to window resize events when connected', (done) => {
67
+ const initialCount = element.updateRequestCount;
68
+ // Simulate window resize event
69
+ const resizeEvent = new Event('resize');
70
+ window.dispatchEvent(resizeEvent);
71
+ // Give some time for the throttled event to be processed
72
+ setTimeout(() => {
73
+ expect(element.updateRequestCount).to.be.greaterThan(initialCount);
74
+ done();
75
+ }, 75);
76
+ });
77
+ it('handles disconnection properly', () => {
78
+ // Test that disconnecting doesn't cause errors
79
+ expect(() => {
80
+ element.disconnectedCallback();
81
+ }).to.not.throw;
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=temba-resize-element.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temba-resize-element.test.js","sourceRoot":"","sources":["../../test/temba-resize-element.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { ResizeElement } from '../src/ResizeElement';\n\n// Create a test implementation of ResizeElement\nclass TestResizeElement extends ResizeElement {\n updateRequestCount = 0;\n\n requestUpdate() {\n this.updateRequestCount++;\n return super.requestUpdate();\n }\n\n render() {\n return html`<div>resize test</div>`;\n }\n}\n\ncustomElements.define('test-resize-element', TestResizeElement);\n\ndescribe('ResizeElement', () => {\n let element: TestResizeElement;\n\n beforeEach(async () => {\n element = await fixture(html`<test-resize-element></test-resize-element>`);\n });\n\n describe('handleResize', () => {\n it('calls requestUpdate when handleResize is called', () => {\n const initialCount = element.updateRequestCount;\n\n element.handleResize();\n\n expect(element.updateRequestCount).to.equal(initialCount + 1);\n });\n\n it('is throttled when called multiple times rapidly', (done) => {\n const initialCount = element.updateRequestCount;\n\n // Get a reference to the throttled handler\n const handlers = element.getEventHandlers();\n const throttledHandler = handlers[0].method;\n\n // Call the throttled handler multiple times\n throttledHandler.call(element);\n throttledHandler.call(element);\n throttledHandler.call(element);\n\n // Due to throttling, should only execute once initially\n setTimeout(() => {\n expect(element.updateRequestCount).to.be.greaterThan(initialCount);\n expect(element.updateRequestCount).to.be.at.most(initialCount + 1);\n done();\n }, 25);\n });\n });\n\n describe('getEventHandlers', () => {\n it('returns resize event handler for window', () => {\n const handlers = element.getEventHandlers();\n\n expect(handlers).to.be.an('array');\n expect(handlers.length).to.equal(1);\n\n const resizeHandler = handlers[0];\n expect(resizeHandler.event).to.equal('resize');\n expect(resizeHandler.isWindow).to.be.true;\n expect(typeof resizeHandler.method).to.equal('function');\n });\n\n it('resize handler is properly throttled', () => {\n const handlers = element.getEventHandlers();\n const resizeHandler = handlers[0];\n\n // The method should be a throttled version of handleResize\n expect(typeof resizeHandler.method).to.equal('function');\n\n // Test that the throttled method can be called\n expect(() => resizeHandler.method()).to.not.throw;\n });\n });\n\n describe('window resize integration', () => {\n it('responds to window resize events when connected', (done) => {\n const initialCount = element.updateRequestCount;\n\n // Simulate window resize event\n const resizeEvent = new Event('resize');\n window.dispatchEvent(resizeEvent);\n\n // Give some time for the throttled event to be processed\n setTimeout(() => {\n expect(element.updateRequestCount).to.be.greaterThan(initialCount);\n done();\n }, 75);\n });\n\n it('handles disconnection properly', () => {\n // Test that disconnecting doesn't cause errors\n expect(() => {\n element.disconnectedCallback();\n }).to.not.throw;\n });\n });\n});\n"]}
@@ -1,8 +1,8 @@
1
1
  import * as sinon from 'sinon';
2
2
  import { fixture, expect, assert } from '@open-wc/testing';
3
3
  import { useFakeTimers } from 'sinon';
4
- import { Options } from '../src/options/Options';
5
- import { Select } from '../src/select/Select';
4
+ import { Options } from '../src/display/Options';
5
+ import { Select } from '../src/form/select/Select';
6
6
  import { assertScreenshot, getClip, getOptions, loadStore, openAndClick, openSelect, waitForSelectPagination } from './utils.test';
7
7
  const colors = [
8
8
  { name: 'Red', value: '0' },