@nyaruka/temba-components 0.86.0 → 0.87.0

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 (285) hide show
  1. package/.eslintrc.js +3 -3
  2. package/.prettierrc +6 -0
  3. package/.storybook/main.js +3 -3
  4. package/.storybook/preview.js +2 -2
  5. package/CHANGELOG.md +14 -0
  6. package/CreateIncludesPlugin.js +2 -2
  7. package/demo/index.html +1 -0
  8. package/dist/locales/es.js +1 -1
  9. package/dist/locales/es.js.map +1 -1
  10. package/dist/locales/fr.js +1 -1
  11. package/dist/locales/fr.js.map +1 -1
  12. package/dist/locales/pt.js +1 -1
  13. package/dist/locales/pt.js.map +1 -1
  14. package/dist/temba-components.js +296 -277
  15. package/dist/temba-components.js.map +1 -1
  16. package/out-tsc/src/RapidElement.js +3 -3
  17. package/out-tsc/src/RapidElement.js.map +1 -1
  18. package/out-tsc/src/ResizeElement.js +2 -2
  19. package/out-tsc/src/ResizeElement.js.map +1 -1
  20. package/out-tsc/src/aliaseditor/AliasEditor.js +1 -1
  21. package/out-tsc/src/aliaseditor/AliasEditor.js.map +1 -1
  22. package/out-tsc/src/button/Button.js +1 -1
  23. package/out-tsc/src/button/Button.js.map +1 -1
  24. package/out-tsc/src/charcount/helpers.js +1 -1
  25. package/out-tsc/src/charcount/helpers.js.map +1 -1
  26. package/out-tsc/src/colorpicker/ColorPicker.js +4 -4
  27. package/out-tsc/src/colorpicker/ColorPicker.js.map +1 -1
  28. package/out-tsc/src/completion/Completion.js +2 -2
  29. package/out-tsc/src/completion/Completion.js.map +1 -1
  30. package/out-tsc/src/completion/ExcellentParser.js +1 -1
  31. package/out-tsc/src/completion/ExcellentParser.js.map +1 -1
  32. package/out-tsc/src/completion/helpers.js +8 -8
  33. package/out-tsc/src/completion/helpers.js.map +1 -1
  34. package/out-tsc/src/compose/Compose.js +14 -14
  35. package/out-tsc/src/compose/Compose.js.map +1 -1
  36. package/out-tsc/src/contacts/ContactBadges.js +2 -2
  37. package/out-tsc/src/contacts/ContactBadges.js.map +1 -1
  38. package/out-tsc/src/contacts/ContactChat.js +4 -4
  39. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  40. package/out-tsc/src/contacts/ContactDetails.js +4 -4
  41. package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
  42. package/out-tsc/src/contacts/ContactFieldEditor.js +3 -3
  43. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
  44. package/out-tsc/src/contacts/ContactFields.js +2 -2
  45. package/out-tsc/src/contacts/ContactFields.js.map +1 -1
  46. package/out-tsc/src/contacts/ContactHistory.js +21 -19
  47. package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
  48. package/out-tsc/src/contacts/ContactPending.js +4 -4
  49. package/out-tsc/src/contacts/ContactPending.js.map +1 -1
  50. package/out-tsc/src/contacts/ContactTickets.js +8 -8
  51. package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
  52. package/out-tsc/src/contacts/events.js +2 -2
  53. package/out-tsc/src/contacts/events.js.map +1 -1
  54. package/out-tsc/src/contacts/helpers.js +2 -2
  55. package/out-tsc/src/contacts/helpers.js.map +1 -1
  56. package/out-tsc/src/contactsearch/ContactSearch.js +7 -7
  57. package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
  58. package/out-tsc/src/date/TembaDate.js +1 -1
  59. package/out-tsc/src/date/TembaDate.js.map +1 -1
  60. package/out-tsc/src/datepicker/DatePicker.js +1 -1
  61. package/out-tsc/src/datepicker/DatePicker.js.map +1 -1
  62. package/out-tsc/src/dialog/Dialog.js +5 -5
  63. package/out-tsc/src/dialog/Dialog.js.map +1 -1
  64. package/out-tsc/src/dialog/Modax.js +8 -8
  65. package/out-tsc/src/dialog/Modax.js.map +1 -1
  66. package/out-tsc/src/dropdown/Dropdown.js +1 -1
  67. package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
  68. package/out-tsc/src/fields/FieldManager.js +6 -6
  69. package/out-tsc/src/fields/FieldManager.js.map +1 -1
  70. package/out-tsc/src/imagepicker/ImagePicker.js +4 -4
  71. package/out-tsc/src/imagepicker/ImagePicker.js.map +1 -1
  72. package/out-tsc/src/interfaces.js.map +1 -1
  73. package/out-tsc/src/label/Label.js +1 -1
  74. package/out-tsc/src/label/Label.js.map +1 -1
  75. package/out-tsc/src/leafletmap/LeafletMap.js +6 -6
  76. package/out-tsc/src/leafletmap/LeafletMap.js.map +1 -1
  77. package/out-tsc/src/leafletmap/helpers.js +2 -2
  78. package/out-tsc/src/leafletmap/helpers.js.map +1 -1
  79. package/out-tsc/src/lightbox/Lightbox.js +2 -2
  80. package/out-tsc/src/lightbox/Lightbox.js.map +1 -1
  81. package/out-tsc/src/list/ContentMenu.js +8 -8
  82. package/out-tsc/src/list/ContentMenu.js.map +1 -1
  83. package/out-tsc/src/list/NotificationList.js +7 -3
  84. package/out-tsc/src/list/NotificationList.js.map +1 -1
  85. package/out-tsc/src/list/RunList.js +1 -1
  86. package/out-tsc/src/list/RunList.js.map +1 -1
  87. package/out-tsc/src/list/SortableList.js +6 -6
  88. package/out-tsc/src/list/SortableList.js.map +1 -1
  89. package/out-tsc/src/list/TembaList.js +5 -5
  90. package/out-tsc/src/list/TembaList.js.map +1 -1
  91. package/out-tsc/src/list/TembaMenu.js +22 -22
  92. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  93. package/out-tsc/src/loading/Loading.js +1 -1
  94. package/out-tsc/src/loading/Loading.js.map +1 -1
  95. package/out-tsc/src/locales/es.js +1 -1
  96. package/out-tsc/src/locales/es.js.map +1 -1
  97. package/out-tsc/src/locales/fr.js +1 -1
  98. package/out-tsc/src/locales/fr.js.map +1 -1
  99. package/out-tsc/src/locales/pt.js +1 -1
  100. package/out-tsc/src/locales/pt.js.map +1 -1
  101. package/out-tsc/src/omnibox/Omnibox.js +1 -1
  102. package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
  103. package/out-tsc/src/options/Options.js +9 -9
  104. package/out-tsc/src/options/Options.js.map +1 -1
  105. package/out-tsc/src/remote/Remote.js +1 -1
  106. package/out-tsc/src/remote/Remote.js.map +1 -1
  107. package/out-tsc/src/select/Select.js +18 -18
  108. package/out-tsc/src/select/Select.js.map +1 -1
  109. package/out-tsc/src/sms/gsmsplitter.js +8 -8
  110. package/out-tsc/src/sms/gsmsplitter.js.map +1 -1
  111. package/out-tsc/src/sms/gsmvalidator.js +1 -1
  112. package/out-tsc/src/sms/gsmvalidator.js.map +1 -1
  113. package/out-tsc/src/sms/index.js +2 -2
  114. package/out-tsc/src/sms/index.js.map +1 -1
  115. package/out-tsc/src/sms/unicodesplitter.js +8 -8
  116. package/out-tsc/src/sms/unicodesplitter.js.map +1 -1
  117. package/out-tsc/src/store/Store.js +10 -10
  118. package/out-tsc/src/store/Store.js.map +1 -1
  119. package/out-tsc/src/store/StoreElement.js +2 -2
  120. package/out-tsc/src/store/StoreElement.js.map +1 -1
  121. package/out-tsc/src/tabpane/TabPane.js +4 -4
  122. package/out-tsc/src/tabpane/TabPane.js.map +1 -1
  123. package/out-tsc/src/templates/TemplateEditor.js +9 -9
  124. package/out-tsc/src/templates/TemplateEditor.js.map +1 -1
  125. package/out-tsc/src/textinput/TextInput.js +1 -1
  126. package/out-tsc/src/textinput/TextInput.js.map +1 -1
  127. package/out-tsc/src/thumbnail/Thumbnail.js +5 -5
  128. package/out-tsc/src/thumbnail/Thumbnail.js.map +1 -1
  129. package/out-tsc/src/tip/Tip.js +3 -3
  130. package/out-tsc/src/tip/Tip.js.map +1 -1
  131. package/out-tsc/src/utils/index.js +21 -21
  132. package/out-tsc/src/utils/index.js.map +1 -1
  133. package/out-tsc/src/vectoricon/VectorIcon.js +2 -2
  134. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  135. package/out-tsc/src/vectoricon/index.js +2 -0
  136. package/out-tsc/src/vectoricon/index.js.map +1 -1
  137. package/out-tsc/src/webchat/WebChat.js +234 -81
  138. package/out-tsc/src/webchat/WebChat.js.map +1 -1
  139. package/out-tsc/src/webchat/assets.js +2 -0
  140. package/out-tsc/src/webchat/assets.js.map +1 -0
  141. package/out-tsc/src/webchat/index.js.map +1 -1
  142. package/out-tsc/test/temba-alert.test.js +1 -1
  143. package/out-tsc/test/temba-alert.test.js.map +1 -1
  144. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  145. package/out-tsc/test/temba-color-picker.test.js +4 -4
  146. package/out-tsc/test/temba-color-picker.test.js.map +1 -1
  147. package/out-tsc/test/temba-compose.test.js +50 -54
  148. package/out-tsc/test/temba-compose.test.js.map +1 -1
  149. package/out-tsc/test/temba-contact-badges.test.js +2 -2
  150. package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
  151. package/out-tsc/test/temba-contact-chat.test.js +25 -38
  152. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  153. package/out-tsc/test/temba-contact-details.test.js +2 -2
  154. package/out-tsc/test/temba-contact-details.test.js.map +1 -1
  155. package/out-tsc/test/temba-contact-fields.test.js +4 -4
  156. package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
  157. package/out-tsc/test/temba-contact-history.test.js +3 -3
  158. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  159. package/out-tsc/test/temba-contact-search.test.js +7 -7
  160. package/out-tsc/test/temba-contact-search.test.js.map +1 -1
  161. package/out-tsc/test/temba-contact-tickets.test.js +3 -3
  162. package/out-tsc/test/temba-contact-tickets.test.js.map +1 -1
  163. package/out-tsc/test/temba-content-menu.test.js +7 -7
  164. package/out-tsc/test/temba-content-menu.test.js.map +1 -1
  165. package/out-tsc/test/temba-date.test.js +3 -3
  166. package/out-tsc/test/temba-date.test.js.map +1 -1
  167. package/out-tsc/test/temba-datepicker.test.js +1 -1
  168. package/out-tsc/test/temba-datepicker.test.js.map +1 -1
  169. package/out-tsc/test/temba-field-manager.test.js +1 -3
  170. package/out-tsc/test/temba-field-manager.test.js.map +1 -1
  171. package/out-tsc/test/temba-label.test.js +6 -6
  172. package/out-tsc/test/temba-label.test.js.map +1 -1
  173. package/out-tsc/test/temba-lightbox.test.js +2 -2
  174. package/out-tsc/test/temba-lightbox.test.js.map +1 -1
  175. package/out-tsc/test/temba-list.test.js +6 -6
  176. package/out-tsc/test/temba-list.test.js.map +1 -1
  177. package/out-tsc/test/temba-menu.test.js +4 -5
  178. package/out-tsc/test/temba-menu.test.js.map +1 -1
  179. package/out-tsc/test/temba-modax.test.js +3 -3
  180. package/out-tsc/test/temba-modax.test.js.map +1 -1
  181. package/out-tsc/test/temba-options.test.js +1 -1
  182. package/out-tsc/test/temba-options.test.js.map +1 -1
  183. package/out-tsc/test/temba-select.test.js +17 -17
  184. package/out-tsc/test/temba-select.test.js.map +1 -1
  185. package/out-tsc/test/temba-sortable-list.test.js +1 -1
  186. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  187. package/out-tsc/test/temba-textinput.test.js +2 -2
  188. package/out-tsc/test/temba-textinput.test.js.map +1 -1
  189. package/out-tsc/test/temba-tip.test.js +4 -4
  190. package/out-tsc/test/temba-tip.test.js.map +1 -1
  191. package/out-tsc/test/utils.test.js +8 -8
  192. package/out-tsc/test/utils.test.js.map +1 -1
  193. package/package.json +6 -15
  194. package/src/RapidElement.ts +3 -3
  195. package/src/ResizeElement.ts +2 -2
  196. package/src/aliaseditor/AliasEditor.ts +1 -2
  197. package/src/button/Button.ts +1 -1
  198. package/src/charcount/helpers.ts +1 -1
  199. package/src/colorpicker/ColorPicker.ts +4 -4
  200. package/src/completion/Completion.ts +2 -2
  201. package/src/completion/ExcellentParser.ts +1 -1
  202. package/src/completion/helpers.ts +9 -9
  203. package/src/compose/Compose.ts +18 -16
  204. package/src/contacts/ContactBadges.ts +2 -2
  205. package/src/contacts/ContactChat.ts +4 -4
  206. package/src/contacts/ContactDetails.ts +4 -4
  207. package/src/contacts/ContactFieldEditor.ts +4 -4
  208. package/src/contacts/ContactFields.ts +2 -2
  209. package/src/contacts/ContactHistory.ts +25 -22
  210. package/src/contacts/ContactPending.ts +4 -4
  211. package/src/contacts/ContactTickets.ts +9 -9
  212. package/src/contacts/events.ts +3 -3
  213. package/src/contacts/helpers.ts +2 -2
  214. package/src/contactsearch/ContactSearch.ts +9 -9
  215. package/src/date/TembaDate.ts +1 -1
  216. package/src/datepicker/DatePicker.ts +1 -1
  217. package/src/dialog/Dialog.ts +6 -6
  218. package/src/dialog/Modax.ts +8 -8
  219. package/src/dropdown/Dropdown.ts +1 -2
  220. package/src/emojis.json +1882 -1
  221. package/src/fields/FieldManager.ts +6 -7
  222. package/src/imagepicker/ImagePicker.ts +4 -4
  223. package/src/interfaces.ts +4 -4
  224. package/src/label/Label.ts +1 -1
  225. package/src/leafletmap/LeafletMap.ts +6 -6
  226. package/src/leafletmap/helpers.ts +2 -2
  227. package/src/lightbox/Lightbox.ts +2 -2
  228. package/src/list/ContentMenu.ts +9 -9
  229. package/src/list/NotificationList.ts +7 -3
  230. package/src/list/RunList.ts +1 -1
  231. package/src/list/SortableList.ts +6 -6
  232. package/src/list/TembaList.ts +5 -5
  233. package/src/list/TembaMenu.ts +23 -23
  234. package/src/loading/Loading.ts +1 -1
  235. package/src/locales/es.ts +1 -1
  236. package/src/locales/fr.ts +1 -1
  237. package/src/locales/pt.ts +1 -1
  238. package/src/omnibox/Omnibox.ts +2 -2
  239. package/src/options/Options.ts +9 -9
  240. package/src/remote/Remote.ts +1 -1
  241. package/src/select/Select.ts +19 -19
  242. package/src/sms/gsmsplitter.ts +8 -8
  243. package/src/sms/gsmvalidator.ts +1 -1
  244. package/src/sms/index.ts +2 -2
  245. package/src/sms/unicodesplitter.ts +8 -8
  246. package/src/store/Store.ts +10 -10
  247. package/src/store/StoreElement.ts +2 -2
  248. package/src/tabpane/TabPane.ts +4 -4
  249. package/src/templates/TemplateEditor.ts +9 -9
  250. package/src/textinput/TextInput.ts +2 -2
  251. package/src/thumbnail/Thumbnail.ts +5 -5
  252. package/src/tip/Tip.ts +3 -3
  253. package/src/utils/index.ts +24 -24
  254. package/src/vectoricon/VectorIcon.ts +2 -2
  255. package/src/vectoricon/index.ts +3 -1
  256. package/src/webchat/WebChat.ts +272 -87
  257. package/src/webchat/assets.ts +2 -0
  258. package/src/webchat/index.ts +1 -1
  259. package/svg.js +28 -29
  260. package/test/temba-alert.test.ts +1 -1
  261. package/test/temba-checkbox.test.ts +1 -1
  262. package/test/temba-color-picker.test.ts +4 -4
  263. package/test/temba-compose.test.ts +50 -55
  264. package/test/temba-contact-badges.test.ts +2 -2
  265. package/test/temba-contact-chat.test.ts +26 -46
  266. package/test/temba-contact-details.test.ts +2 -8
  267. package/test/temba-contact-fields.test.ts +4 -11
  268. package/test/temba-contact-history.test.ts +3 -3
  269. package/test/temba-contact-search.test.ts +7 -13
  270. package/test/temba-contact-tickets.test.ts +3 -3
  271. package/test/temba-content-menu.test.ts +7 -7
  272. package/test/temba-date.test.ts +3 -3
  273. package/test/temba-datepicker.test.ts +1 -1
  274. package/test/temba-field-manager.test.ts +1 -4
  275. package/test/temba-label.test.ts +6 -6
  276. package/test/temba-lightbox.test.ts +2 -2
  277. package/test/temba-list.test.ts +6 -6
  278. package/test/temba-menu.test.ts +4 -5
  279. package/test/temba-modax.test.ts +3 -3
  280. package/test/temba-options.test.ts +1 -1
  281. package/test/temba-select.test.ts +17 -17
  282. package/test/temba-sortable-list.test.ts +1 -1
  283. package/test/temba-textinput.test.ts +2 -2
  284. package/test/temba-tip.test.ts +5 -5
  285. package/test/utils.test.ts +8 -9
@@ -1 +1 @@
1
- {"version":3,"file":"temba-textinput.test.js","sourceRoot":"","sources":["../../test/temba-textinput.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { TextInput } from '../src/textinput/TextInput';\nimport { assertScreenshot, getAttributes, getClip } from './utils.test';\n\nexport const getInputHTML = (attrs: any = { value: 'hello world' }) => {\n return `<temba-textinput ${getAttributes(attrs)}></temba-textinput>`;\n};\n\nexport const createInput = async (def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 250px;');\n const input: TextInput = await fixture(def, { parentNode });\n return input;\n};\n\ndescribe('temba-textinput', () => {\n it('can be created', async () => {\n const input: TextInput = await createInput(getInputHTML());\n assert.instanceOf(input, TextInput);\n await assertScreenshot('textinput/input', getClip(input));\n });\n\n it('shows placeholder', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ placeholder: 'Enter some text' })\n );\n\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n\n expect(widget.placeholder).to.equal('Enter some text');\n await assertScreenshot('textinput/input-placeholder', getClip(input));\n });\n\n it('should focus inputs on click', async () => {\n const input: TextInput = await createInput(getInputHTML());\n await click('temba-textinput');\n await assertScreenshot('textinput/input-focused', getClip(input));\n });\n\n it('should render textarea', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n assert.instanceOf(input, TextInput);\n await assertScreenshot('textinput/textarea', getClip(input));\n });\n\n it('should focus textarea on click', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n await click('temba-textinput');\n await assertScreenshot('textinput/textarea-focused', getClip(input));\n });\n\n it('takes internal input changes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world' })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('INPUT');\n expect(widget.disabled).to.equal(false);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello to the world');\n });\n\n it('does not take internal input changes for disabled', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', disabled: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('INPUT');\n expect(widget.disabled).to.equal(true);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello world');\n await assertScreenshot('textinput/input-disabled', getClip(input));\n });\n\n it('takes internal textarea changes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('TEXTAREA');\n expect(widget.disabled).to.equal(false);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello to the world');\n });\n\n it('does not take internal textarea changes for disabled', async () => {\n const input: TextInput = await fixture(\n getInputHTML({ value: 'hello world', textarea: true, disabled: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('TEXTAREA');\n expect(widget.disabled).to.equal(true);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello world');\n });\n\n it(\"doesn't advance cursor on GSM character replacement\", async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true, gsm: true })\n );\n input.value = 'Let’s try some text with a funny tick.';\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('replaced ');\n\n expect(input.value).to.equal(\n \"Let's try some text with a funny replaced tick.\"\n );\n });\n\n it(\"doesn't move cursor to the end on insert in input\", async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world' })\n );\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('sad, sad ');\n\n expect(input.value).to.equal('hello sad, sad world');\n await assertScreenshot('textinput/input-inserted', getClip(input));\n });\n\n it('shows form attributes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({\n name: 'message',\n value: 'hello world',\n label: 'Your Message',\n help_text: 'Enter your message here',\n })\n );\n await assertScreenshot('textinput/input-form', getClip(input));\n });\n\n it('updates input value', async () => {\n const input: TextInput = await createInput(\n getInputHTML({\n value: 'hello world',\n })\n );\n\n input.value = 'Updated by attribute change';\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n\n await assertScreenshot('textinput/input-updated', getClip(input));\n expect(widget.value).to.equal('Updated by attribute change');\n });\n});\n"]}
1
+ {"version":3,"file":"temba-textinput.test.js","sourceRoot":"","sources":["../../test/temba-textinput.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { TextInput } from '../src/textinput/TextInput';\nimport { assertScreenshot, getAttributes, getClip } from './utils.test';\n\nexport const getInputHTML = (attrs: any = { value: 'hello world' }) => {\n return `<temba-textinput ${getAttributes(attrs)}></temba-textinput>`;\n};\n\nexport const createInput = async (def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 250px;');\n const input: TextInput = await fixture(def, { parentNode });\n return input;\n};\n\ndescribe('temba-textinput', () => {\n it('can be created', async () => {\n const input: TextInput = await createInput(getInputHTML());\n assert.instanceOf(input, TextInput);\n await assertScreenshot('textinput/input', getClip(input));\n });\n\n it('shows placeholder', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ placeholder: 'Enter some text' })\n );\n\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n\n expect(widget.placeholder).to.equal('Enter some text');\n await assertScreenshot('textinput/input-placeholder', getClip(input));\n });\n\n it('should focus inputs on click', async () => {\n const input: TextInput = await createInput(getInputHTML());\n await click('temba-textinput');\n await assertScreenshot('textinput/input-focused', getClip(input));\n });\n\n it('should render textarea', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n assert.instanceOf(input, TextInput);\n await assertScreenshot('textinput/textarea', getClip(input));\n });\n\n it('should focus textarea on click', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n await click('temba-textinput');\n await assertScreenshot('textinput/textarea-focused', getClip(input));\n });\n\n it('takes internal input changes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world' })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('INPUT');\n expect(widget.disabled).to.equal(false);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello to the world');\n });\n\n it('does not take internal input changes for disabled', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', disabled: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('INPUT');\n expect(widget.disabled).to.equal(true);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello world');\n await assertScreenshot('textinput/input-disabled', getClip(input));\n });\n\n it('takes internal textarea changes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('TEXTAREA');\n expect(widget.disabled).to.equal(false);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello to the world');\n });\n\n it('does not take internal textarea changes for disabled', async () => {\n const input: TextInput = await fixture(\n getInputHTML({ value: 'hello world', textarea: true, disabled: true })\n );\n\n // trigger a change on our internal widget\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n expect(widget.tagName).to.equal('TEXTAREA');\n expect(widget.disabled).to.equal(true);\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('to the ');\n\n // should be reflected on our main input\n expect(input.value).to.equal('hello world');\n });\n\n it(\"doesn't advance cursor on GSM character replacement\", async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world', textarea: true, gsm: true })\n );\n input.value = 'Let’s try some text with a funny tick.';\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('replaced ');\n\n expect(input.value).to.equal(\n \"Let's try some text with a funny replaced tick.\"\n );\n });\n\n it(\"doesn't move cursor to the end on insert in input\", async () => {\n const input: TextInput = await createInput(\n getInputHTML({ value: 'hello world' })\n );\n\n // focus our widget, move back a few spots and insert some text\n await click('temba-textinput');\n await pressKey('ArrowLeft', 5);\n await type('sad, sad ');\n\n expect(input.value).to.equal('hello sad, sad world');\n await assertScreenshot('textinput/input-inserted', getClip(input));\n });\n\n it('shows form attributes', async () => {\n const input: TextInput = await createInput(\n getInputHTML({\n name: 'message',\n value: 'hello world',\n label: 'Your Message',\n help_text: 'Enter your message here'\n })\n );\n await assertScreenshot('textinput/input-form', getClip(input));\n });\n\n it('updates input value', async () => {\n const input: TextInput = await createInput(\n getInputHTML({\n value: 'hello world'\n })\n );\n\n input.value = 'Updated by attribute change';\n const widget = input.shadowRoot.querySelector(\n '.textinput'\n ) as HTMLInputElement;\n\n await assertScreenshot('textinput/input-updated', getClip(input));\n expect(widget.value).to.equal('Updated by attribute change');\n });\n});\n"]}
@@ -49,7 +49,7 @@ describe(TAG, () => {
49
49
  const tip = await getTip({
50
50
  text: 'Hello!',
51
51
  visible: true,
52
- position: 'left',
52
+ position: 'left'
53
53
  });
54
54
  await assertScreenshot('tip/left', getLeftClip(tip));
55
55
  });
@@ -57,7 +57,7 @@ describe(TAG, () => {
57
57
  const tip = await getTip({
58
58
  text: 'Hello!',
59
59
  visible: true,
60
- position: 'right',
60
+ position: 'right'
61
61
  });
62
62
  await assertScreenshot('tip/right', getRightClip(tip));
63
63
  });
@@ -65,7 +65,7 @@ describe(TAG, () => {
65
65
  const tip = await getTip({
66
66
  text: 'Hello!',
67
67
  visible: true,
68
- position: 'top',
68
+ position: 'top'
69
69
  });
70
70
  await assertScreenshot('tip/top', getTopClip(tip));
71
71
  });
@@ -73,7 +73,7 @@ describe(TAG, () => {
73
73
  const tip = await getTip({
74
74
  text: 'Hello!',
75
75
  visible: true,
76
- position: 'bottom',
76
+ position: 'bottom'
77
77
  });
78
78
  await assertScreenshot('tip/bottom', getBottomClip(tip));
79
79
  });
@@ -1 +1 @@
1
- {"version":3,"file":"temba-tip.test.js","sourceRoot":"","sources":["../../test/temba-tip.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from '@open-wc/testing';\nimport { Tip } from '../src/tip/Tip';\nimport { assertScreenshot, delay, getClip, getComponent } from './utils.test';\n\nconst TAG = 'temba-tip';\n\nconst getTarget = () => {\n return \"<div style='line-height:0px;font-size:14px;background:green;display:flex'>👱‍♀️</div>\";\n};\n\nconst getTip = async (\n attrs: { text?: string; position?: string; visible?: boolean } = {},\n slot = getTarget()\n) => {\n const tip = (await getComponent(\n TAG,\n attrs,\n slot,\n 20,\n 0,\n 'margin:200px;'\n )) as Tip;\n await tip.updateComplete;\n return tip;\n};\n\nconst getRightClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.width += 78;\n clip.height += 10;\n clip.y -= 5;\n return clip;\n};\n\nconst getLeftClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.x -= 80;\n clip.width += 78;\n clip.height += 10;\n clip.y -= 5;\n return clip;\n};\n\nconst getTopClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.y -= 30;\n clip.height += 30;\n clip.width += 30;\n clip.x -= 15;\n return clip;\n};\n\nconst getBottomClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.height += 35;\n clip.width += 30;\n clip.x -= 15;\n return clip;\n};\n\ndescribe(TAG, () => {\n it('can be created', async () => {\n const icon = await getTip({ text: 'Resolve' });\n assert.instanceOf(icon, Tip);\n });\n\n it('shows on the left', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'left',\n });\n await assertScreenshot('tip/left', getLeftClip(tip));\n });\n\n it('shows on the right', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'right',\n });\n await assertScreenshot('tip/right', getRightClip(tip));\n });\n\n it('shows on top', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'top',\n });\n await assertScreenshot('tip/top', getTopClip(tip));\n });\n\n it('shows on bottom', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'bottom',\n });\n await assertScreenshot('tip/bottom', getBottomClip(tip));\n });\n});\n"]}
1
+ {"version":3,"file":"temba-tip.test.js","sourceRoot":"","sources":["../../test/temba-tip.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from '@open-wc/testing';\nimport { Tip } from '../src/tip/Tip';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\nconst TAG = 'temba-tip';\n\nconst getTarget = () => {\n return \"<div style='line-height:0px;font-size:14px;background:green;display:flex'>👱‍♀️</div>\";\n};\n\nconst getTip = async (\n attrs: { text?: string; position?: string; visible?: boolean } = {},\n slot = getTarget()\n) => {\n const tip = (await getComponent(\n TAG,\n attrs,\n slot,\n 20,\n 0,\n 'margin:200px;'\n )) as Tip;\n await tip.updateComplete;\n return tip;\n};\n\nconst getRightClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.width += 78;\n clip.height += 10;\n clip.y -= 5;\n return clip;\n};\n\nconst getLeftClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.x -= 80;\n clip.width += 78;\n clip.height += 10;\n clip.y -= 5;\n return clip;\n};\n\nconst getTopClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.y -= 30;\n clip.height += 30;\n clip.width += 30;\n clip.x -= 15;\n return clip;\n};\n\nconst getBottomClip = (ele: HTMLElement) => {\n const clip = getClip(ele);\n clip.height += 35;\n clip.width += 30;\n clip.x -= 15;\n return clip;\n};\n\ndescribe(TAG, () => {\n it('can be created', async () => {\n const icon = await getTip({ text: 'Resolve' });\n assert.instanceOf(icon, Tip);\n });\n\n it('shows on the left', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'left'\n });\n await assertScreenshot('tip/left', getLeftClip(tip));\n });\n\n it('shows on the right', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'right'\n });\n await assertScreenshot('tip/right', getRightClip(tip));\n });\n\n it('shows on top', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'top'\n });\n await assertScreenshot('tip/top', getTopClip(tip));\n });\n\n it('shows on bottom', async () => {\n const tip = await getTip({\n text: 'Hello!',\n visible: true,\n position: 'bottom'\n });\n await assertScreenshot('tip/bottom', getBottomClip(tip));\n });\n});\n"]}
@@ -31,30 +31,30 @@ export const getComponent = async (tag, attrs = {}, slot = '', width = 250, heig
31
31
  parentNode.setAttribute('style', styleAttribute);
32
32
  return await fixture(spec, { parentNode });
33
33
  };
34
- const createResponse = mocked => {
34
+ const createResponse = (mocked) => {
35
35
  const mockResponse = new window.Response(mocked.body, {
36
36
  status: mocked.status,
37
37
  headers: {
38
38
  'Content-type': 'text/html',
39
- ...mocked.headers,
40
- },
39
+ ...mocked.headers
40
+ }
41
41
  });
42
42
  return Promise.resolve(mockResponse);
43
43
  };
44
- const createJSONResponse = mocked => {
44
+ const createJSONResponse = (mocked) => {
45
45
  const mockResponse = new window.Response(JSON.stringify(mocked.body), {
46
46
  status: mocked.status,
47
47
  headers: {
48
48
  'Content-type': 'application/json',
49
- ...mocked.headers,
50
- },
49
+ ...mocked.headers
50
+ }
51
51
  });
52
52
  return Promise.resolve(mockResponse);
53
53
  };
54
54
  const getResponse = (endpoint, options) => {
55
55
  // check if our path has been mocked in code
56
56
  const mocks = options.method === 'GET' ? gets : posts;
57
- const codeMock = mocks.find(mock => mock.endpoint.test(endpoint));
57
+ const codeMock = mocks.find((mock) => mock.endpoint.test(endpoint));
58
58
  if (codeMock) {
59
59
  if (typeof codeMock.body === 'string') {
60
60
  // see if we are being mocked to a file
@@ -137,7 +137,7 @@ export const getClip = (ele) => {
137
137
  bottom: y + height,
138
138
  right: x + width,
139
139
  top: y,
140
- left: x,
140
+ left: x
141
141
  };
142
142
  return newClip;
143
143
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { DateTime } from 'luxon';\ninterface Clip {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nimport { expect, fixture, html, assert, waitUntil } from '@open-wc/testing';\nimport MouseHelper from './MouseHelper';\nimport { Store } from '../src/store/Store';\nimport { replace, stub } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\n\nexport interface CodeMock {\n endpoint: RegExp;\n body: string;\n headers: any;\n status: string;\n}\n\nconst gets: CodeMock[] = [];\nlet posts: CodeMock[] = [];\nlet normalFetch;\n\nexport const showMouse = async () => {\n const mouse = await fixture(html`<mouse-helper />`);\n assert.instanceOf(mouse, MouseHelper);\n};\n\nexport const getAttributes = (attrs: any = {}) => {\n return `${Object.keys(attrs)\n .map((name: string) => {\n if (typeof attrs[name] === 'boolean' && attrs[name]) {\n return name;\n }\n return `${name}='${attrs[name]}'`;\n })\n .join(' ')}`;\n};\n\nexport const getComponent = async (\n tag,\n attrs: any = {},\n slot = '',\n width = 250,\n height = 0,\n style = ''\n) => {\n const spec = `<${tag} ${getAttributes(attrs)}>${slot}</${tag}>`;\n const parentNode = document.createElement('div');\n const styleAttribute = `\n ${width > 0 ? `width:${width}px;` : ``} \n ${height > 0 ? `height:${height}px;` : ``}\n ${style ? style : ``}\n `;\n parentNode.setAttribute('style', styleAttribute);\n return await fixture(spec, { parentNode });\n};\n\nconst createResponse = mocked => {\n const mockResponse = new window.Response(mocked.body, {\n status: mocked.status,\n headers: {\n 'Content-type': 'text/html',\n ...mocked.headers,\n },\n });\n\n return Promise.resolve(mockResponse);\n};\n\nconst createJSONResponse = mocked => {\n const mockResponse = new window.Response(JSON.stringify(mocked.body), {\n status: mocked.status,\n headers: {\n 'Content-type': 'application/json',\n ...mocked.headers,\n },\n });\n\n return Promise.resolve(mockResponse);\n};\n\nconst getResponse = (endpoint: string, options) => {\n // check if our path has been mocked in code\n const mocks = options.method === 'GET' ? gets : posts;\n const codeMock = mocks.find(mock => mock.endpoint.test(endpoint));\n\n if (codeMock) {\n if (typeof codeMock.body === 'string') {\n // see if we are being mocked to a file\n if (codeMock.body.startsWith('/')) {\n endpoint = codeMock.body;\n } else {\n return createResponse(codeMock);\n }\n } else {\n return createJSONResponse(codeMock);\n }\n }\n\n // otherwise fetch over http\n return normalFetch(endpoint, options);\n};\n\nbefore(async () => {\n normalFetch = window.fetch;\n stub(window, 'fetch').callsFake(getResponse);\n await setViewport({ width: 1024, height: 768, deviceScaleFactor: 2 });\n});\n\nafter(() => {\n (window.fetch as any).restore();\n});\n\nexport const mockGET = (\n endpoint: RegExp,\n body: any,\n headers: any = {},\n status = '200'\n) => {\n gets.push({ endpoint, body, headers, status });\n};\n\nexport const mockPOST = (\n endpoint: RegExp,\n body: any,\n headers: any = {},\n status = '200'\n) => {\n posts.push({ endpoint, body, headers, status });\n};\n\nexport const clearMockPosts = () => {\n posts = [];\n};\n\nexport const checkTimers = (clock: any) => {\n expect(!!clock.timers).to.equal(true, 'Expected timers not found');\n expect(\n Object.keys(clock.timers).length,\n `Timers still to be run ${JSON.stringify(clock.timers)}`\n ).to.equal(0);\n};\n\nexport const delay = (millis: number) => {\n return new Promise(function (resolve) {\n window.setTimeout(resolve, millis);\n });\n};\n\nexport const assertScreenshot = async (\n filename: string,\n clip: Clip,\n waitFor?: { clock?: any; predicate?: () => boolean }\n) => {\n if (waitFor) {\n if (waitFor.clock) {\n waitFor.clock.restore();\n }\n await waitUntil(waitFor.predicate);\n }\n\n const threshold = 0.1;\n const exclude: Clip[] = [];\n\n try {\n await (window as any).matchPageSnapshot(\n `${filename}.png`,\n clip,\n exclude,\n threshold\n );\n } catch (error) {\n if (error.message) {\n throw new Error(\n `${error.message} ${\n error.expected\n ? `Expected ${error.expected} but got ${error.actual}`\n : ''\n } ${error.files ? `\\n${error.files.join('\\n')}` : ''}`\n );\n }\n throw new Error(error);\n }\n};\n\nexport const getClip = (ele: HTMLElement) => {\n let clip: any = ele.getBoundingClientRect();\n if (!clip.width || !clip.height) {\n clip = ele.shadowRoot.firstElementChild.getBoundingClientRect();\n }\n\n const padding = 10;\n const width = clip.width + padding * 2;\n const height = clip.height + padding * 2;\n const y = clip.y - padding;\n const x = clip.x - padding;\n\n const newClip = {\n x,\n y,\n width,\n height,\n bottom: y + height,\n right: x + width,\n top: y,\n left: x,\n };\n\n return newClip;\n};\n\nexport const getHTMLAttrs = (attrs: any = {}) => {\n return Object.keys(attrs)\n .map((name: string) => `${name}='${attrs[name]}'`)\n .join(' ');\n};\n\nexport const getHTML = (tag: string, attrs: any = {}) => {\n return `<${tag} ${getHTMLAttrs(attrs)}></${tag}>`;\n};\n\nexport const loadStore = async () => {\n const store: Store = await fixture(\n `<temba-store \n completion='/test-assets/store/editor.json'\n groups='/test-assets/store/groups.json'\n languages='/test-assets/store/languages.json'\n fields='/test-assets/store/fields.json'\n users='/test-assets/store/users.json'\n />`\n );\n await store.initialHttpComplete;\n await store.initialHttpComplete;\n\n return store;\n};\n\nexport const mockNow = (isodate: string) => {\n const now = DateTime.fromISO(isodate);\n // mock the current time\n replace(DateTime, 'now', () => {\n return now;\n });\n};\n"]}
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { DateTime } from 'luxon';\ninterface Clip {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nimport { expect, fixture, html, assert, waitUntil } from '@open-wc/testing';\nimport MouseHelper from './MouseHelper';\nimport { Store } from '../src/store/Store';\nimport { replace, stub } from 'sinon';\n\nexport interface CodeMock {\n endpoint: RegExp;\n body: string;\n headers: any;\n status: string;\n}\n\nconst gets: CodeMock[] = [];\nlet posts: CodeMock[] = [];\nlet normalFetch;\n\nexport const showMouse = async () => {\n const mouse = await fixture(html`<mouse-helper />`);\n assert.instanceOf(mouse, MouseHelper);\n};\n\nexport const getAttributes = (attrs: any = {}) => {\n return `${Object.keys(attrs)\n .map((name: string) => {\n if (typeof attrs[name] === 'boolean' && attrs[name]) {\n return name;\n }\n return `${name}='${attrs[name]}'`;\n })\n .join(' ')}`;\n};\n\nexport const getComponent = async (\n tag,\n attrs: any = {},\n slot = '',\n width = 250,\n height = 0,\n style = ''\n) => {\n const spec = `<${tag} ${getAttributes(attrs)}>${slot}</${tag}>`;\n const parentNode = document.createElement('div');\n const styleAttribute = `\n ${width > 0 ? `width:${width}px;` : ``} \n ${height > 0 ? `height:${height}px;` : ``}\n ${style ? style : ``}\n `;\n parentNode.setAttribute('style', styleAttribute);\n return await fixture(spec, { parentNode });\n};\n\nconst createResponse = (mocked) => {\n const mockResponse = new window.Response(mocked.body, {\n status: mocked.status,\n headers: {\n 'Content-type': 'text/html',\n ...mocked.headers\n }\n });\n\n return Promise.resolve(mockResponse);\n};\n\nconst createJSONResponse = (mocked) => {\n const mockResponse = new window.Response(JSON.stringify(mocked.body), {\n status: mocked.status,\n headers: {\n 'Content-type': 'application/json',\n ...mocked.headers\n }\n });\n\n return Promise.resolve(mockResponse);\n};\n\nconst getResponse = (endpoint: string, options) => {\n // check if our path has been mocked in code\n const mocks = options.method === 'GET' ? gets : posts;\n const codeMock = mocks.find((mock) => mock.endpoint.test(endpoint));\n\n if (codeMock) {\n if (typeof codeMock.body === 'string') {\n // see if we are being mocked to a file\n if (codeMock.body.startsWith('/')) {\n endpoint = codeMock.body;\n } else {\n return createResponse(codeMock);\n }\n } else {\n return createJSONResponse(codeMock);\n }\n }\n\n // otherwise fetch over http\n return normalFetch(endpoint, options);\n};\n\nbefore(async () => {\n normalFetch = window.fetch;\n stub(window, 'fetch').callsFake(getResponse);\n await setViewport({ width: 1024, height: 768, deviceScaleFactor: 2 });\n});\n\nafter(() => {\n (window.fetch as any).restore();\n});\n\nexport const mockGET = (\n endpoint: RegExp,\n body: any,\n headers: any = {},\n status = '200'\n) => {\n gets.push({ endpoint, body, headers, status });\n};\n\nexport const mockPOST = (\n endpoint: RegExp,\n body: any,\n headers: any = {},\n status = '200'\n) => {\n posts.push({ endpoint, body, headers, status });\n};\n\nexport const clearMockPosts = () => {\n posts = [];\n};\n\nexport const checkTimers = (clock: any) => {\n expect(!!clock.timers).to.equal(true, 'Expected timers not found');\n expect(\n Object.keys(clock.timers).length,\n `Timers still to be run ${JSON.stringify(clock.timers)}`\n ).to.equal(0);\n};\n\nexport const delay = (millis: number) => {\n return new Promise(function (resolve) {\n window.setTimeout(resolve, millis);\n });\n};\n\nexport const assertScreenshot = async (\n filename: string,\n clip: Clip,\n waitFor?: { clock?: any; predicate?: () => boolean }\n) => {\n if (waitFor) {\n if (waitFor.clock) {\n waitFor.clock.restore();\n }\n await waitUntil(waitFor.predicate);\n }\n\n const threshold = 0.1;\n const exclude: Clip[] = [];\n\n try {\n await (window as any).matchPageSnapshot(\n `${filename}.png`,\n clip,\n exclude,\n threshold\n );\n } catch (error) {\n if (error.message) {\n throw new Error(\n `${error.message} ${\n error.expected\n ? `Expected ${error.expected} but got ${error.actual}`\n : ''\n } ${error.files ? `\\n${error.files.join('\\n')}` : ''}`\n );\n }\n throw new Error(error);\n }\n};\n\nexport const getClip = (ele: HTMLElement) => {\n let clip: any = ele.getBoundingClientRect();\n if (!clip.width || !clip.height) {\n clip = ele.shadowRoot.firstElementChild.getBoundingClientRect();\n }\n\n const padding = 10;\n const width = clip.width + padding * 2;\n const height = clip.height + padding * 2;\n const y = clip.y - padding;\n const x = clip.x - padding;\n\n const newClip = {\n x,\n y,\n width,\n height,\n bottom: y + height,\n right: x + width,\n top: y,\n left: x\n };\n\n return newClip;\n};\n\nexport const getHTMLAttrs = (attrs: any = {}) => {\n return Object.keys(attrs)\n .map((name: string) => `${name}='${attrs[name]}'`)\n .join(' ');\n};\n\nexport const getHTML = (tag: string, attrs: any = {}) => {\n return `<${tag} ${getHTMLAttrs(attrs)}></${tag}>`;\n};\n\nexport const loadStore = async () => {\n const store: Store = await fixture(\n `<temba-store \n completion='/test-assets/store/editor.json'\n groups='/test-assets/store/groups.json'\n languages='/test-assets/store/languages.json'\n fields='/test-assets/store/fields.json'\n users='/test-assets/store/users.json'\n />`\n );\n await store.initialHttpComplete;\n await store.initialHttpComplete;\n\n return store;\n};\n\nexport const mockNow = (isodate: string) => {\n const now = DateTime.fromISO(isodate);\n // mock the current time\n replace(DateTime, 'now', () => {\n return now;\n });\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nyaruka/temba-components",
3
- "version": "0.86.0",
3
+ "version": "0.87.0",
4
4
  "description": "Web components to support rapidpro and related projects",
5
5
  "author": "Nyaruka <code@nyaruka.coim>",
6
6
  "main": "dist/index.js",
@@ -18,10 +18,10 @@
18
18
  "postversion": "git push --tags && git push origin main",
19
19
  "lint:eslint": "eslint --ext .ts . --ignore-path .gitignore",
20
20
  "format:eslint": "eslint --ext .ts . --fix --ignore-path .gitignore",
21
- "lint:prettier": "prettier \"**/*.js\" \"**/*.ts\" --check --ignore-path .gitignore",
22
- "format:prettier": "prettier \"**/*.js\" \"**/*.ts\" --write --ignore-path .gitignore",
23
- "lint": "lint:eslint && yarn lint:prettier",
24
- "format": "format:eslint && yarn format:prettier",
21
+ "lint:prettier": "prettier \"**/*.js\" \"**/*.ts\" --config .prettierrc --check --ignore-path .gitignore",
22
+ "format:prettier": "prettier \"**/*.js\" \"**/*.ts\" --config .prettierrc --write --ignore-path .gitignore",
23
+ "lint": "yarn lint:eslint && yarn lint:prettier",
24
+ "format": "yarn format:eslint && yarn format:prettier",
25
25
  "test-file": "rimraf out-tsc && tsc && web-test-runner --node-resolve --coverage",
26
26
  "test": "wtr --node-resolve --coverage",
27
27
  "test:watch": "wtr --node-resolve --watch",
@@ -88,15 +88,6 @@
88
88
  "tslib": "2.6.2",
89
89
  "typescript": "5.4.4"
90
90
  },
91
- "eslintConfig": {
92
- "extends": [
93
- "eslint-config-prettier"
94
- ]
95
- },
96
- "prettier": {
97
- "singleQuote": true,
98
- "arrowParens": "avoid"
99
- },
100
91
  "husky": {
101
92
  "hooks": {
102
93
  "pre-commit": "yarn locale:extract && yarn locale:build && yarn svg && git add ./src/vectoricon ./static/svg/index.svg ./xliff ./src/locales && lint-staged"
@@ -104,7 +95,7 @@
104
95
  },
105
96
  "lint-staged": {
106
97
  "*.ts": [
107
- "prettier --write",
98
+ "prettier --config .prettierrc --write",
108
99
  "eslint"
109
100
  ]
110
101
  },
@@ -16,7 +16,7 @@ const showUpdates = (
16
16
 
17
17
  log(ele.tagName, Color.PURPLE, [
18
18
  firstUpdated ? '<first-updated>' : '<updated>',
19
- fromto,
19
+ fromto
20
20
  ]);
21
21
  }
22
22
  }
@@ -96,7 +96,7 @@ export class RapidElement extends LitElement {
96
96
  return this.dispatchEvent(
97
97
  new Event(type, {
98
98
  bubbles: true,
99
- composed: true,
99
+ composed: true
100
100
  })
101
101
  );
102
102
  }
@@ -114,7 +114,7 @@ export class RapidElement extends LitElement {
114
114
  const event = new CustomEvent(type, {
115
115
  detail,
116
116
  bubbles: true,
117
- composed: true,
117
+ composed: true
118
118
  });
119
119
 
120
120
  return this.dispatchEvent(event);
@@ -11,8 +11,8 @@ export class ResizeElement extends RapidElement {
11
11
  {
12
12
  event: 'resize',
13
13
  method: throttle(this.handleResize, 50),
14
- isWindow: true,
15
- },
14
+ isWindow: true
15
+ }
16
16
  ];
17
17
  }
18
18
  }
@@ -3,7 +3,6 @@ import { FeatureProperties } from '../interfaces';
3
3
  import { getUrl, postJSON, WebResponse } from '../utils';
4
4
  import { TextInput } from '../textinput/TextInput';
5
5
  import { styleMap } from 'lit-html/directives/style-map.js';
6
- import { FormElement } from '../FormElement';
7
6
  import { Icon } from '../vectoricon';
8
7
 
9
8
  import { property } from 'lit/decorators.js';
@@ -349,7 +348,7 @@ export class AliasEditor extends LitElement {
349
348
  private renderOptionDetail(option: FeatureProperties): TemplateResult {
350
349
  const labelStyles = {
351
350
  marginTop: '3px',
352
- marginRight: '3px',
351
+ marginRight: '3px'
353
352
  };
354
353
 
355
354
  const aliasList = option.aliases.split('\n');
@@ -242,7 +242,7 @@ export class Button extends LitElement {
242
242
  'attention-button': this.attention,
243
243
  'destructive-button': this.destructive,
244
244
  'light-button': this.light,
245
- small: this.small,
245
+ small: this.small
246
246
  })}"
247
247
  tabindex="0"
248
248
  @mousedown=${this.handleMouseDown}
@@ -143,7 +143,7 @@ export const GSM: { [key: string]: number } = {
143
143
  Φ: 934,
144
144
  Ψ: 936,
145
145
  Ω: 937,
146
- '€': 8364,
146
+ '€': 8364
147
147
  };
148
148
 
149
149
  export const isGSM = (char: string): boolean => {
@@ -162,13 +162,13 @@ export class ColorPicker extends FormElement {
162
162
  }
163
163
  }
164
164
 
165
- private handleBlur(event: FocusEvent) {
165
+ private handleBlur() {
166
166
  if (this.expanded) {
167
167
  this.expanded = false;
168
168
  }
169
169
  }
170
170
 
171
- private handleMouseOut(event: MouseEvent) {
171
+ private handleMouseOut() {
172
172
  this.previewColor = this.value;
173
173
  this.hex = this.value;
174
174
  }
@@ -185,7 +185,7 @@ export class ColorPicker extends FormElement {
185
185
  }
186
186
  }
187
187
 
188
- private handlePreviewClick(event: MouseEvent) {
188
+ private handlePreviewClick() {
189
189
  this.expanded = !this.expanded;
190
190
  this.selecting = true;
191
191
  (this.shadowRoot.querySelector('.color-picker') as HTMLDivElement).focus();
@@ -237,7 +237,7 @@ export class ColorPicker extends FormElement {
237
237
  <div
238
238
  class=${getClasses({
239
239
  preview: true,
240
- selecting: this.selecting,
240
+ selecting: this.selecting
241
241
  })}
242
242
  style="color:${this.labelColor};background:${this.previewColor}"
243
243
  @click=${this.handlePreviewClick}
@@ -5,7 +5,7 @@ import { TextInput } from '../textinput/TextInput';
5
5
  import {
6
6
  renderCompletionOption,
7
7
  updateInputElementWithCompletion,
8
- executeCompletionQuery,
8
+ executeCompletionQuery
9
9
  } from './helpers';
10
10
 
11
11
  import { FormElement } from '../FormElement';
@@ -252,7 +252,7 @@ export class Completion extends FormElement {
252
252
  const anchorStyles = this.anchorPosition
253
253
  ? {
254
254
  top: `${this.anchorPosition.top}px`,
255
- left: `${this.anchorPosition.left}px`,
255
+ left: `${this.anchorPosition.left}px`
256
256
  }
257
257
  : {};
258
258
 
@@ -266,7 +266,7 @@ export default class ExcellentParser {
266
266
  start: pos,
267
267
  end: null,
268
268
  text: ch,
269
- closed: false,
269
+ closed: false
270
270
  };
271
271
  } else if (
272
272
  ch === this.expressionPrefix &&
@@ -5,7 +5,7 @@ import {
5
5
  Directive,
6
6
  Part,
7
7
  PartInfo,
8
- PartType,
8
+ PartType
9
9
  } from 'lit/directive.js';
10
10
  import ExcellentParser, { Expression } from './ExcellentParser';
11
11
  import {
@@ -14,7 +14,7 @@ import {
14
14
  CompletionResult,
15
15
  CompletionSchema,
16
16
  CompletionType,
17
- KeyedAssets,
17
+ KeyedAssets
18
18
  } from '../interfaces';
19
19
  import { Store } from '../store/Store';
20
20
  import { Remarkable } from 'remarkable';
@@ -25,7 +25,7 @@ const messageParser = new ExcellentParser('@', [
25
25
  'contact',
26
26
  'fields',
27
27
  'globals',
28
- 'urns',
28
+ 'urns'
29
29
  ]);
30
30
 
31
31
  const sessionParser = new ExcellentParser('@', [
@@ -42,7 +42,7 @@ const sessionParser = new ExcellentParser('@', [
42
42
  'webhook',
43
43
  'ticket',
44
44
  'trigger',
45
- 'resume',
45
+ 'resume'
46
46
  ]);
47
47
 
48
48
  // Class-based directive API
@@ -169,7 +169,7 @@ export const getCompletions = (
169
169
  currentProps = keyedAssets[nextType.name].map((key: string) => ({
170
170
  key: template.key.replace('{key}', key),
171
171
  help: template.help.replace('{key}', key),
172
- type: template.type,
172
+ type: template.type
173
173
  }));
174
174
  } else {
175
175
  currentProps = [];
@@ -254,7 +254,7 @@ const getCursorXY = (input, selectionPoint) => {
254
254
  document.body.removeChild(div);
255
255
  return {
256
256
  left: inputX + spanX,
257
- top: inputY + spanY,
257
+ top: inputY + spanY
258
258
  };
259
259
  };
260
260
 
@@ -307,7 +307,7 @@ export const executeCompletionQuery = (
307
307
  currentFunction: null,
308
308
  options: [],
309
309
  anchorPosition: null,
310
- query: null,
310
+ query: null
311
311
  };
312
312
 
313
313
  if (!ele) {
@@ -367,7 +367,7 @@ export const executeCompletionQuery = (
367
367
 
368
368
  result.anchorPosition = {
369
369
  left: caret.left - 2 - ele.scrollLeft,
370
- top: caret.top - ele.scrollTop,
370
+ top: caret.top - ele.scrollTop
371
371
  };
372
372
 
373
373
  result.query = currentExpression.text.substr(
@@ -384,7 +384,7 @@ export const executeCompletionQuery = (
384
384
  ),
385
385
  ...(includeFunctions
386
386
  ? getFunctions(store.getFunctions(), result.query)
387
- : []),
387
+ : [])
388
388
  ];
389
389
 
390
390
  return result;
@@ -10,7 +10,7 @@ import {
10
10
  truncate,
11
11
  DEFAULT_MEDIA_ENDPOINT,
12
12
  WebResponse,
13
- isImageAttachment,
13
+ isImageAttachment
14
14
  } from '../utils';
15
15
  import { Completion } from '../completion/Completion';
16
16
  import { Select } from '../select/Select';
@@ -335,7 +335,7 @@ export class Compose extends FormElement {
335
335
 
336
336
  public getEventHandlers(): EventHandler[] {
337
337
  return [
338
- { event: CustomEventType.ContextChanged, method: this.handleTabChanged },
338
+ { event: CustomEventType.ContextChanged, method: this.handleTabChanged }
339
339
  ];
340
340
  }
341
341
 
@@ -359,7 +359,7 @@ export class Compose extends FormElement {
359
359
  let langValue = {
360
360
  text: '',
361
361
  attachments: [],
362
- quick_replies: [],
362
+ quick_replies: []
363
363
  };
364
364
 
365
365
  if (this.currentLanguage in this.langValues) {
@@ -369,9 +369,11 @@ export class Compose extends FormElement {
369
369
  this.currentText = langValue.text;
370
370
  this.initialText = langValue.text;
371
371
  this.currentAttachments = langValue.attachments;
372
- this.currentQuickReplies = (langValue.quick_replies || []).map(value => {
373
- return { name: value, value };
374
- });
372
+ this.currentQuickReplies = (langValue.quick_replies || []).map(
373
+ (value) => {
374
+ return { name: value, value };
375
+ }
376
+ );
375
377
  this.currentOptin = langValue['optin'] ? [langValue['optin']] : [];
376
378
  this.setFocusOnChatbox();
377
379
 
@@ -402,8 +404,8 @@ export class Compose extends FormElement {
402
404
  this.langValues[this.currentLanguage] = {
403
405
  text: trimmed,
404
406
  attachments: this.currentAttachments,
405
- quick_replies: this.currentQuickReplies.map(option => option.value),
406
- optin: this.currentOptin.length > 0 ? this.currentOptin[0] : null,
407
+ quick_replies: this.currentQuickReplies.map((option) => option.value),
408
+ optin: this.currentOptin.length > 0 ? this.currentOptin[0] : null
407
409
  };
408
410
  } else {
409
411
  delete this.langValues[this.currentLanguage];
@@ -438,7 +440,7 @@ export class Compose extends FormElement {
438
440
  this.buttonError = '';
439
441
  }
440
442
 
441
- private handleQuickReplyChange(event: InputEvent) {
443
+ private handleQuickReplyChange() {
442
444
  this.requestUpdate('currentQuickReplies');
443
445
  }
444
446
 
@@ -514,9 +516,9 @@ export class Compose extends FormElement {
514
516
  let filesToUpload = [];
515
517
  if (this.currentAttachments && this.currentAttachments.length > 0) {
516
518
  //remove duplicate files that have already been uploaded
517
- filesToUpload = [...files].filter(file => {
519
+ filesToUpload = [...files].filter((file) => {
518
520
  const index = this.currentAttachments.findIndex(
519
- value => value.filename === file.name && value.size === file.size
521
+ (value) => value.filename === file.name && value.size === file.size
520
522
  );
521
523
  if (index === -1) {
522
524
  return file;
@@ -525,7 +527,7 @@ export class Compose extends FormElement {
525
527
  } else {
526
528
  filesToUpload = [...files];
527
529
  }
528
- filesToUpload.map(fileToUpload => {
530
+ filesToUpload.map((fileToUpload) => {
529
531
  this.uploadFile(fileToUpload);
530
532
  });
531
533
  }
@@ -568,7 +570,7 @@ export class Compose extends FormElement {
568
570
  }
569
571
  private removeCurrentAttachment(attachmentToRemove: any) {
570
572
  this.currentAttachments = this.currentAttachments.filter(
571
- currentAttachment => currentAttachment !== attachmentToRemove
573
+ (currentAttachment) => currentAttachment !== attachmentToRemove
572
574
  );
573
575
  this.requestUpdate('currentAttachments');
574
576
  }
@@ -580,7 +582,7 @@ export class Compose extends FormElement {
580
582
  filename: file.name,
581
583
  url: file.name,
582
584
  size: file.size,
583
- error: error,
585
+ error: error
584
586
  } as Attachment;
585
587
  this.failedAttachments.push(failedAttachment);
586
588
  this.requestUpdate('failedAttachments');
@@ -736,7 +738,7 @@ export class Compose extends FormElement {
736
738
  return html`
737
739
  ${this.attachments
738
740
  ? html` <div class="attachments-list">
739
- ${this.currentAttachments.map(validAttachment => {
741
+ ${this.currentAttachments.map((validAttachment) => {
740
742
  return html` <div class="attachment-item">
741
743
  <temba-icon
742
744
  class="remove-item"
@@ -755,7 +757,7 @@ export class Compose extends FormElement {
755
757
  })}
756
758
  ${this.getUploader()}
757
759
  </div>
758
- ${this.failedAttachments.map(invalidAttachment => {
760
+ ${this.failedAttachments.map((invalidAttachment) => {
759
761
  return html` <div class="attachment-item error">
760
762
  <div
761
763
  class="remove-item error"
@@ -8,7 +8,7 @@ import { ContactStoreElement } from './ContactStoreElement';
8
8
  const STATUS = {
9
9
  stopped: { name: 'Stopped' },
10
10
  blocked: { name: 'Blocked' },
11
- archived: { name: 'Archived' },
11
+ archived: { name: 'Archived' }
12
12
  };
13
13
 
14
14
  export class ContactBadges extends ContactStoreElement {
@@ -120,7 +120,7 @@ export class ContactBadges extends ContactStoreElement {
120
120
  class=${getClasses({
121
121
  wrapper: true,
122
122
  'has-more': this.hasMore,
123
- expanded: this.expanded,
123
+ expanded: this.expanded
124
124
  })}
125
125
  >
126
126
  <div class="badges">