@nyaruka/temba-components 0.122.0 → 0.124.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 (262) hide show
  1. package/.github/copilot-instructions.md +181 -0
  2. package/.github/workflows/build.yml +3 -3
  3. package/.github/workflows/cla.yml +6 -6
  4. package/.github/workflows/copilot-setup-steps.yml +86 -0
  5. package/CHANGELOG.md +44 -0
  6. package/demo/drag-drop-demo.html +141 -0
  7. package/demo/index.html +57 -0
  8. package/demo/test-drag-drop.html +94 -0
  9. package/dist/locales/es.js +1 -0
  10. package/dist/locales/es.js.map +1 -1
  11. package/dist/locales/fr.js +1 -0
  12. package/dist/locales/fr.js.map +1 -1
  13. package/dist/locales/pt.js +1 -0
  14. package/dist/locales/pt.js.map +1 -1
  15. package/dist/temba-components.js +366 -247
  16. package/dist/temba-components.js.map +1 -1
  17. package/out-tsc/src/chart/TembaChart.js +81 -14
  18. package/out-tsc/src/chart/TembaChart.js.map +1 -1
  19. package/out-tsc/src/fields/FieldManager.js +27 -34
  20. package/out-tsc/src/fields/FieldManager.js.map +1 -1
  21. package/out-tsc/src/list/RunList.js +13 -8
  22. package/out-tsc/src/list/RunList.js.map +1 -1
  23. package/out-tsc/src/list/SortableList.js +257 -60
  24. package/out-tsc/src/list/SortableList.js.map +1 -1
  25. package/out-tsc/src/locales/es.js +1 -0
  26. package/out-tsc/src/locales/es.js.map +1 -1
  27. package/out-tsc/src/locales/fr.js +1 -0
  28. package/out-tsc/src/locales/fr.js.map +1 -1
  29. package/out-tsc/src/locales/pt.js +1 -0
  30. package/out-tsc/src/locales/pt.js.map +1 -1
  31. package/out-tsc/src/omnibox/Omnibox.js +1 -1
  32. package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
  33. package/out-tsc/src/options/Options.js +36 -13
  34. package/out-tsc/src/options/Options.js.map +1 -1
  35. package/out-tsc/src/select/Select.js +226 -43
  36. package/out-tsc/src/select/Select.js.map +1 -1
  37. package/out-tsc/src/store/AppState.js +3 -3
  38. package/out-tsc/src/store/AppState.js.map +1 -1
  39. package/out-tsc/src/utils/index.js +6 -1
  40. package/out-tsc/src/utils/index.js.map +1 -1
  41. package/out-tsc/src/vectoricon/VectorIcon.js +2 -1
  42. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  43. package/out-tsc/src/webchat/WebChat.js +5 -2
  44. package/out-tsc/src/webchat/WebChat.js.map +1 -1
  45. package/out-tsc/temba-modules.js +0 -2
  46. package/out-tsc/temba-modules.js.map +1 -1
  47. package/out-tsc/test/temba-appstate-language.test.js +176 -0
  48. package/out-tsc/test/temba-appstate-language.test.js.map +1 -0
  49. package/out-tsc/test/temba-chart.test.js +125 -0
  50. package/out-tsc/test/temba-chart.test.js.map +1 -1
  51. package/out-tsc/test/temba-dropdown.test.js +317 -0
  52. package/out-tsc/test/temba-dropdown.test.js.map +1 -0
  53. package/out-tsc/test/temba-flow-editor-node.test.js +273 -0
  54. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -0
  55. package/out-tsc/test/temba-flow-editor.test.js +244 -0
  56. package/out-tsc/test/temba-flow-editor.test.js.map +1 -0
  57. package/out-tsc/test/temba-flow-plumber.test.js +145 -0
  58. package/out-tsc/test/temba-flow-plumber.test.js.map +1 -0
  59. package/out-tsc/test/temba-flow-render.test.js +171 -0
  60. package/out-tsc/test/temba-flow-render.test.js.map +1 -0
  61. package/out-tsc/test/temba-omnibox.test.js +2 -3
  62. package/out-tsc/test/temba-omnibox.test.js.map +1 -1
  63. package/out-tsc/test/temba-run-list.test.js +588 -0
  64. package/out-tsc/test/temba-run-list.test.js.map +1 -0
  65. package/out-tsc/test/temba-select.test.js +149 -52
  66. package/out-tsc/test/temba-select.test.js.map +1 -1
  67. package/out-tsc/test/temba-sortable-list.test.js +91 -15
  68. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  69. package/out-tsc/test/temba-toast.test.js +299 -0
  70. package/out-tsc/test/temba-toast.test.js.map +1 -0
  71. package/out-tsc/test/temba-utils-index.test.js +1178 -0
  72. package/out-tsc/test/temba-utils-index.test.js.map +1 -0
  73. package/out-tsc/test/temba-webchat-lightbox-fix.test.js +42 -0
  74. package/out-tsc/test/temba-webchat-lightbox-fix.test.js.map +1 -0
  75. package/out-tsc/test/temba-webchat.test.js +816 -0
  76. package/out-tsc/test/temba-webchat.test.js.map +1 -0
  77. package/out-tsc/test/utils.test.js +33 -1
  78. package/out-tsc/test/utils.test.js.map +1 -1
  79. package/package.json +6 -8
  80. package/screenshots/truth/alert/error.png +0 -0
  81. package/screenshots/truth/alert/info.png +0 -0
  82. package/screenshots/truth/alert/warning.png +0 -0
  83. package/screenshots/truth/checkbox/checkbox-label-background-hover.png +0 -0
  84. package/screenshots/truth/checkbox/checked.png +0 -0
  85. package/screenshots/truth/checkbox/default.png +0 -0
  86. package/screenshots/truth/colorpicker/default.png +0 -0
  87. package/screenshots/truth/colorpicker/focused.png +0 -0
  88. package/screenshots/truth/colorpicker/initialized.png +0 -0
  89. package/screenshots/truth/colorpicker/selected.png +0 -0
  90. package/screenshots/truth/compose/attachments-tab.png +0 -0
  91. package/screenshots/truth/compose/attachments-with-files-focused.png +0 -0
  92. package/screenshots/truth/compose/attachments-with-files.png +0 -0
  93. package/screenshots/truth/compose/intial-text.png +0 -0
  94. package/screenshots/truth/compose/no-counter.png +0 -0
  95. package/screenshots/truth/compose/wraps-text-and-spaces.png +0 -0
  96. package/screenshots/truth/compose/wraps-text-and-url.png +0 -0
  97. package/screenshots/truth/compose/wraps-text-no-spaces.png +0 -0
  98. package/screenshots/truth/contacts/badges.png +0 -0
  99. package/screenshots/truth/contacts/chat-failure.png +0 -0
  100. package/screenshots/truth/contacts/chat-for-active-contact.png +0 -0
  101. package/screenshots/truth/contacts/chat-for-archived-contact.png +0 -0
  102. package/screenshots/truth/contacts/chat-for-blocked-contact.png +0 -0
  103. package/screenshots/truth/contacts/chat-for-stopped-contact.png +0 -0
  104. package/screenshots/truth/contacts/chat-sends-attachments-only.png +0 -0
  105. package/screenshots/truth/contacts/chat-sends-text-and-attachments.png +0 -0
  106. package/screenshots/truth/contacts/chat-sends-text-only.png +0 -0
  107. package/screenshots/truth/content-menu/button-no-items.png +0 -0
  108. package/screenshots/truth/content-menu/items-and-buttons.png +0 -0
  109. package/screenshots/truth/counter/summary.png +0 -0
  110. package/screenshots/truth/counter/text.png +0 -0
  111. package/screenshots/truth/counter/unicode-variables.png +0 -0
  112. package/screenshots/truth/counter/unicode.png +0 -0
  113. package/screenshots/truth/counter/variable.png +0 -0
  114. package/screenshots/truth/date/date-inline.png +0 -0
  115. package/screenshots/truth/date/date.png +0 -0
  116. package/screenshots/truth/date/datetime.png +0 -0
  117. package/screenshots/truth/date/duration.png +0 -0
  118. package/screenshots/truth/date/timedate.png +0 -0
  119. package/screenshots/truth/datepicker/date-truncated-time.png +0 -0
  120. package/screenshots/truth/datepicker/date.png +0 -0
  121. package/screenshots/truth/datepicker/initial-timezone.png +0 -0
  122. package/screenshots/truth/datepicker/updated-keyboard-date.png +0 -0
  123. package/screenshots/truth/dialog/focused.png +0 -0
  124. package/screenshots/truth/dropdown/after-blur.png +0 -0
  125. package/screenshots/truth/dropdown/bottom-edge-collision.png +0 -0
  126. package/screenshots/truth/dropdown/custom-arrow-size.png +0 -0
  127. package/screenshots/truth/dropdown/default.png +0 -0
  128. package/screenshots/truth/dropdown/narrow-toggle.png +0 -0
  129. package/screenshots/truth/dropdown/no-mask.png +0 -0
  130. package/screenshots/truth/dropdown/opened.png +0 -0
  131. package/screenshots/truth/dropdown/positioned.png +0 -0
  132. package/screenshots/truth/dropdown/right-edge-collision.png +0 -0
  133. package/screenshots/truth/dropdown/with-mask.png +0 -0
  134. package/screenshots/truth/flow/editor-basic.png +0 -0
  135. package/screenshots/truth/label/custom.png +0 -0
  136. package/screenshots/truth/label/danger.png +0 -0
  137. package/screenshots/truth/label/dark.png +0 -0
  138. package/screenshots/truth/label/default-icon.png +0 -0
  139. package/screenshots/truth/label/no-icon.png +0 -0
  140. package/screenshots/truth/label/primary.png +0 -0
  141. package/screenshots/truth/label/secondary.png +0 -0
  142. package/screenshots/truth/label/shadow.png +0 -0
  143. package/screenshots/truth/label/tertiary.png +0 -0
  144. package/screenshots/truth/lightbox/img-zoomed.png +0 -0
  145. package/screenshots/truth/list/fields-dragging.png +0 -0
  146. package/screenshots/truth/list/fields-filtered.png +0 -0
  147. package/screenshots/truth/list/fields-hovered.png +0 -0
  148. package/screenshots/truth/list/fields.png +0 -0
  149. package/screenshots/truth/list/items-selected.png +0 -0
  150. package/screenshots/truth/list/items-updated.png +0 -0
  151. package/screenshots/truth/list/items.png +0 -0
  152. package/screenshots/truth/list/sortable-dragging.png +0 -0
  153. package/screenshots/truth/list/sortable-dropped.png +0 -0
  154. package/screenshots/truth/list/sortable.png +0 -0
  155. package/screenshots/truth/menu/menu-focused-with items.png +0 -0
  156. package/screenshots/truth/menu/menu-refresh-1.png +0 -0
  157. package/screenshots/truth/menu/menu-refresh-2.png +0 -0
  158. package/screenshots/truth/menu/menu-root.png +0 -0
  159. package/screenshots/truth/menu/menu-submenu.png +0 -0
  160. package/screenshots/truth/menu/menu-tasks-nextup.png +0 -0
  161. package/screenshots/truth/menu/menu-tasks.png +0 -0
  162. package/screenshots/truth/modax/form.png +0 -0
  163. package/screenshots/truth/modax/simple.png +0 -0
  164. package/screenshots/truth/omnibox/selected.png +0 -0
  165. package/screenshots/truth/options/block.png +0 -0
  166. package/screenshots/truth/run-list/basic.png +0 -0
  167. package/screenshots/truth/select/disabled-multi-selection.png +0 -0
  168. package/screenshots/truth/select/disabled-selection.png +0 -0
  169. package/screenshots/truth/select/disabled.png +0 -0
  170. package/screenshots/truth/select/embedded.png +0 -0
  171. package/screenshots/truth/select/empty-options.png +0 -0
  172. package/screenshots/truth/select/expression-selected.png +0 -0
  173. package/screenshots/truth/select/expressions.png +0 -0
  174. package/screenshots/truth/select/functions.png +0 -0
  175. package/screenshots/truth/select/local-options.png +0 -0
  176. package/screenshots/truth/select/multi-reorder-final.png +0 -0
  177. package/screenshots/truth/select/multi-reorder-initial.png +0 -0
  178. package/screenshots/truth/select/multi-with-endpoint.png +0 -0
  179. package/screenshots/truth/select/multiple-initial-values.png +0 -0
  180. package/screenshots/truth/select/remote-options.png +0 -0
  181. package/screenshots/truth/select/search-enabled.png +0 -0
  182. package/screenshots/truth/select/search-multi-no-matches.png +0 -0
  183. package/screenshots/truth/select/search-selected-focus.png +0 -0
  184. package/screenshots/truth/select/search-selected.png +0 -0
  185. package/screenshots/truth/select/search-with-selected.png +0 -0
  186. package/screenshots/truth/select/searching.png +0 -0
  187. package/screenshots/truth/select/selected-multi-maxitems-reached.png +0 -0
  188. package/screenshots/truth/select/selected-multi.png +0 -0
  189. package/screenshots/truth/select/selected-single.png +0 -0
  190. package/screenshots/truth/select/selection-clearable.png +0 -0
  191. package/screenshots/truth/select/static-initial-value.png +0 -0
  192. package/screenshots/truth/select/static-initial-via-selected.png +0 -0
  193. package/screenshots/truth/select/truncated-selection.png +0 -0
  194. package/screenshots/truth/select/with-placeholder.png +0 -0
  195. package/screenshots/truth/select/without-placeholder.png +0 -0
  196. package/screenshots/truth/slider/custom-min-custom-max-valid-value.png +0 -0
  197. package/screenshots/truth/slider/custom-min-default-max-no-value.png +0 -0
  198. package/screenshots/truth/slider/default-min-custom-max-no-value.png +0 -0
  199. package/screenshots/truth/slider/default-min-default-max-invalid-value.png +0 -0
  200. package/screenshots/truth/slider/default-min-default-max-valid-value.png +0 -0
  201. package/screenshots/truth/slider/update-slider-on-value-change.png +0 -0
  202. package/screenshots/truth/templates/default.png +0 -0
  203. package/screenshots/truth/templates/unapproved.png +0 -0
  204. package/screenshots/truth/textinput/input-disabled.png +0 -0
  205. package/screenshots/truth/textinput/input-focused.png +0 -0
  206. package/screenshots/truth/textinput/input-form.png +0 -0
  207. package/screenshots/truth/textinput/input-inserted.png +0 -0
  208. package/screenshots/truth/textinput/input-placeholder.png +0 -0
  209. package/screenshots/truth/textinput/input-updated.png +0 -0
  210. package/screenshots/truth/textinput/input.png +0 -0
  211. package/screenshots/truth/textinput/textarea-focused.png +0 -0
  212. package/screenshots/truth/textinput/textarea.png +0 -0
  213. package/screenshots/truth/tip/bottom.png +0 -0
  214. package/screenshots/truth/tip/left.png +0 -0
  215. package/screenshots/truth/tip/right.png +0 -0
  216. package/screenshots/truth/tip/top.png +0 -0
  217. package/screenshots/truth/webchat/closed-widget.png +0 -0
  218. package/screenshots/truth/webchat/connected-state.png +0 -0
  219. package/screenshots/truth/webchat/connecting-state.png +0 -0
  220. package/screenshots/truth/webchat/disconnected-state.png +0 -0
  221. package/screenshots/truth/webchat/opened-widget.png +0 -0
  222. package/src/chart/TembaChart.ts +86 -15
  223. package/src/fields/FieldManager.ts +30 -38
  224. package/src/list/RunList.ts +11 -8
  225. package/src/list/SortableList.ts +291 -67
  226. package/src/locales/es.ts +1 -0
  227. package/src/locales/fr.ts +1 -0
  228. package/src/locales/pt.ts +1 -0
  229. package/src/omnibox/Omnibox.ts +1 -1
  230. package/src/options/Options.ts +38 -13
  231. package/src/select/Select.ts +245 -47
  232. package/src/store/AppState.ts +3 -3
  233. package/src/utils/index.ts +17 -5
  234. package/src/vectoricon/VectorIcon.ts +2 -1
  235. package/src/webchat/WebChat.ts +5 -2
  236. package/temba-modules.ts +0 -2
  237. package/test/temba-appstate-language.test.ts +218 -0
  238. package/test/temba-chart.test.ts +161 -1
  239. package/test/temba-dropdown.test.ts +444 -0
  240. package/test/temba-flow-editor-node.test.ts +344 -0
  241. package/test/temba-flow-editor.test.ts +301 -0
  242. package/test/temba-flow-plumber.test.ts +189 -0
  243. package/test/temba-flow-render.test.ts +220 -0
  244. package/test/temba-omnibox.test.ts +2 -3
  245. package/test/temba-run-list.test.ts +774 -0
  246. package/test/temba-select.test.ts +206 -78
  247. package/test/temba-sortable-list.test.ts +108 -15
  248. package/test/temba-toast.test.ts +386 -0
  249. package/test/temba-utils-index.test.ts +1547 -0
  250. package/test/temba-webchat-lightbox-fix.test.ts +57 -0
  251. package/test/temba-webchat.test.ts +1095 -0
  252. package/test/utils.test.ts +56 -2
  253. package/test-assets/list/flow-results.json +17 -0
  254. package/test-assets/list/runs.json +126 -0
  255. package/test-assets/style.css +23 -0
  256. package/web-test-runner.config.mjs +33 -7
  257. package/xliff/es.xlf +3 -0
  258. package/xliff/fr.xlf +3 -0
  259. package/xliff/pt.xlf +3 -0
  260. package/out-tsc/src/outboxmonitor/OutboxMonitor.js +0 -136
  261. package/out-tsc/src/outboxmonitor/OutboxMonitor.js.map +0 -1
  262. package/src/outboxmonitor/OutboxMonitor.ts +0 -148
@@ -0,0 +1,299 @@
1
+ import { fixture, assert, expect } from '@open-wc/testing';
2
+ import { Toast } from '../src/toast/Toast';
3
+ // Register the component if it's not already registered
4
+ if (!customElements.get('temba-toast')) {
5
+ customElements.define('temba-toast', Toast);
6
+ }
7
+ export const createToast = async (attrs = {}) => {
8
+ const attrString = Object.keys(attrs)
9
+ .map((key) => `${key}="${attrs[key]}"`)
10
+ .join(' ');
11
+ return (await fixture(`<temba-toast ${attrString}></temba-toast>`));
12
+ };
13
+ describe('temba-toast', () => {
14
+ it('can be created', async () => {
15
+ const toast = await createToast();
16
+ assert.instanceOf(toast, Toast);
17
+ expect(toast.messages).to.deep.equal([]);
18
+ expect(toast.staleDuration).to.equal(5000);
19
+ expect(toast.animationDuration).to.equal(200);
20
+ expect(toast.errorSticky).to.be.false;
21
+ expect(toast.warningSticky).to.be.false;
22
+ expect(toast.infoSticky).to.be.false;
23
+ });
24
+ it('can set properties via attributes', async () => {
25
+ const toast = await createToast({
26
+ duration: '3000',
27
+ animation: '300',
28
+ 'error-sticky': 'true',
29
+ 'warning-sticky': 'true',
30
+ 'info-sticky': 'true'
31
+ });
32
+ expect(toast.staleDuration).to.equal(3000);
33
+ expect(toast.animationDuration).to.equal(300);
34
+ expect(toast.errorSticky).to.be.true;
35
+ expect(toast.warningSticky).to.be.true;
36
+ expect(toast.infoSticky).to.be.true;
37
+ });
38
+ it('adds info message', async () => {
39
+ const toast = await createToast();
40
+ toast.info('This is an info message');
41
+ expect(toast.messages).to.have.length(1);
42
+ expect(toast.messages[0].text).to.equal('This is an info message');
43
+ expect(toast.messages[0].level).to.equal('info');
44
+ expect(toast.messages[0].id).to.equal(1);
45
+ expect(toast.messages[0].time).to.be.instanceOf(Date);
46
+ expect(toast.messages[0].visible).to.be.undefined;
47
+ });
48
+ it('adds warning message', async () => {
49
+ const toast = await createToast();
50
+ toast.warning('This is a warning message');
51
+ expect(toast.messages).to.have.length(1);
52
+ expect(toast.messages[0].text).to.equal('This is a warning message');
53
+ expect(toast.messages[0].level).to.equal('warning');
54
+ expect(toast.messages[0].id).to.equal(1);
55
+ });
56
+ it('adds error message', async () => {
57
+ const toast = await createToast();
58
+ toast.error('This is an error message');
59
+ expect(toast.messages).to.have.length(1);
60
+ expect(toast.messages[0].text).to.equal('This is an error message');
61
+ expect(toast.messages[0].level).to.equal('error');
62
+ expect(toast.messages[0].id).to.equal(1);
63
+ });
64
+ it('adds multiple messages with incrementing IDs', async () => {
65
+ const toast = await createToast();
66
+ toast.info('First message');
67
+ toast.warning('Second message');
68
+ toast.error('Third message');
69
+ expect(toast.messages).to.have.length(3);
70
+ expect(toast.messages[0].id).to.equal(1);
71
+ expect(toast.messages[1].id).to.equal(2);
72
+ expect(toast.messages[2].id).to.equal(3);
73
+ });
74
+ it('adds multiple messages using addMessages', async () => {
75
+ const toast = await createToast();
76
+ const messages = [
77
+ {
78
+ text: 'First message',
79
+ level: 'info',
80
+ id: 1,
81
+ time: new Date()
82
+ },
83
+ {
84
+ text: 'Second message',
85
+ level: 'warning',
86
+ id: 2,
87
+ time: new Date()
88
+ },
89
+ {
90
+ text: 'Third message',
91
+ level: 'error',
92
+ id: 3,
93
+ time: new Date()
94
+ }
95
+ ];
96
+ toast.addMessages(messages);
97
+ expect(toast.messages).to.have.length(3);
98
+ expect(toast.messages[0].text).to.equal('First message');
99
+ expect(toast.messages[0].level).to.equal('info');
100
+ expect(toast.messages[1].text).to.equal('Second message');
101
+ expect(toast.messages[1].level).to.equal('warning');
102
+ expect(toast.messages[2].text).to.equal('Third message');
103
+ expect(toast.messages[2].level).to.equal('error');
104
+ });
105
+ it('makes messages visible after delay', async () => {
106
+ const toast = await createToast();
107
+ toast.info('Test message');
108
+ // Initially not visible
109
+ expect(toast.messages[0].visible).to.be.undefined;
110
+ // Wait for the timeout
111
+ await new Promise((resolve) => setTimeout(resolve, 150));
112
+ expect(toast.messages[0].visible).to.be.true;
113
+ });
114
+ it('removes message manually', async () => {
115
+ const toast = await createToast();
116
+ toast.info('Test message');
117
+ const message = toast.messages[0];
118
+ expect(toast.messages).to.have.length(1);
119
+ toast.removeMessage(message);
120
+ // Message should have removeTime set
121
+ expect(message.removeTime).to.be.instanceOf(Date);
122
+ // Wait for animation to complete
123
+ await new Promise((resolve) => setTimeout(resolve, 250));
124
+ expect(toast.messages).to.have.length(0);
125
+ });
126
+ it('handles message click to remove', async () => {
127
+ var _a;
128
+ const toast = await createToast();
129
+ toast.info('Test message');
130
+ // Wait for render
131
+ await toast.updateComplete;
132
+ const closeIcon = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('temba-icon[name="close"]');
133
+ expect(closeIcon).to.exist;
134
+ // Simulate click
135
+ closeIcon.click();
136
+ // Wait for animation
137
+ await new Promise((resolve) => setTimeout(resolve, 250));
138
+ expect(toast.messages).to.have.length(0);
139
+ });
140
+ it('handles invalid message ID in click handler', async () => {
141
+ const toast = await createToast();
142
+ toast.info('Test message');
143
+ await toast.updateComplete;
144
+ // Create a mock event with invalid message_id
145
+ const mockEvent = {
146
+ target: {
147
+ getAttribute: () => 'invalid'
148
+ }
149
+ };
150
+ // Should not throw error
151
+ expect(() => {
152
+ toast.handleMessageClicked(mockEvent);
153
+ }).to.not.throw();
154
+ // Message should still exist
155
+ expect(toast.messages).to.have.length(1);
156
+ });
157
+ it('handles missing message in click handler', async () => {
158
+ const toast = await createToast();
159
+ toast.info('Test message');
160
+ await toast.updateComplete;
161
+ // Create a mock event with non-existent message_id
162
+ const mockEvent = {
163
+ target: {
164
+ getAttribute: () => '999'
165
+ }
166
+ };
167
+ // Should not throw error
168
+ expect(() => {
169
+ toast.handleMessageClicked(mockEvent);
170
+ }).to.not.throw();
171
+ // Message should still exist
172
+ expect(toast.messages).to.have.length(1);
173
+ });
174
+ it('checks for stale messages', async () => {
175
+ const toast = await createToast({ duration: '100' }); // 100ms duration
176
+ toast.info('Test message');
177
+ // Wait for message to become stale
178
+ await new Promise((resolve) => setTimeout(resolve, 150));
179
+ // Manually trigger stale check
180
+ toast.checkForStaleMessages();
181
+ // Wait for removal animation
182
+ await new Promise((resolve) => setTimeout(resolve, 250));
183
+ expect(toast.messages).to.have.length(0);
184
+ });
185
+ it('respects sticky info messages', async () => {
186
+ const toast = await createToast({
187
+ duration: '100',
188
+ 'info-sticky': 'true'
189
+ });
190
+ toast.info('Sticky info message');
191
+ // Wait for message to become "stale"
192
+ await new Promise((resolve) => setTimeout(resolve, 150));
193
+ toast.checkForStaleMessages();
194
+ // Message should still exist because it's sticky
195
+ expect(toast.messages).to.have.length(1);
196
+ });
197
+ it('respects sticky warning messages', async () => {
198
+ const toast = await createToast({
199
+ duration: '100',
200
+ 'warning-sticky': 'true'
201
+ });
202
+ toast.warning('Sticky warning message');
203
+ // Wait for message to become "stale"
204
+ await new Promise((resolve) => setTimeout(resolve, 150));
205
+ toast.checkForStaleMessages();
206
+ // Message should still exist because it's sticky
207
+ expect(toast.messages).to.have.length(1);
208
+ });
209
+ it('respects sticky error messages', async () => {
210
+ const toast = await createToast({
211
+ duration: '100',
212
+ 'error-sticky': 'true'
213
+ });
214
+ toast.error('Sticky error message');
215
+ // Wait for message to become "stale"
216
+ await new Promise((resolve) => setTimeout(resolve, 150));
217
+ toast.checkForStaleMessages();
218
+ // Message should still exist because it's sticky
219
+ expect(toast.messages).to.have.length(1);
220
+ });
221
+ it('clears interval when no messages remain', async () => {
222
+ const toast = await createToast({ duration: '100' });
223
+ toast.info('Test message');
224
+ // Verify interval is set
225
+ expect(toast.checker).to.be.greaterThan(0);
226
+ // Wait for stale and removal
227
+ await new Promise((resolve) => setTimeout(resolve, 150));
228
+ toast.checkForStaleMessages();
229
+ // Wait for the removeMessage animation to complete
230
+ await new Promise((resolve) => setTimeout(resolve, 250));
231
+ // Now trigger checkForStaleMessages again to clear the interval
232
+ toast.checkForStaleMessages();
233
+ // Interval should be cleared
234
+ expect(toast.checker).to.equal(0);
235
+ });
236
+ it('clears existing interval when adding new message', async () => {
237
+ const toast = await createToast();
238
+ toast.info('First message');
239
+ const firstChecker = toast.checker;
240
+ expect(firstChecker).to.be.greaterThan(0);
241
+ toast.info('Second message');
242
+ // Should have new interval
243
+ expect(toast.checker).to.be.greaterThan(0);
244
+ expect(toast.checker).to.not.equal(firstChecker);
245
+ });
246
+ it('renders messages with correct CSS classes', async () => {
247
+ var _a;
248
+ const toast = await createToast();
249
+ toast.info('Info message');
250
+ toast.warning('Warning message');
251
+ toast.error('Error message');
252
+ await toast.updateComplete;
253
+ const messages = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.message');
254
+ expect(messages).to.have.length(3);
255
+ expect(messages === null || messages === void 0 ? void 0 : messages[0]).to.have.class('info');
256
+ expect(messages === null || messages === void 0 ? void 0 : messages[1]).to.have.class('warning');
257
+ expect(messages === null || messages === void 0 ? void 0 : messages[2]).to.have.class('error');
258
+ });
259
+ it('renders messages with visible class after delay', async () => {
260
+ var _a;
261
+ const toast = await createToast();
262
+ toast.info('Test message');
263
+ await toast.updateComplete;
264
+ const message = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.message');
265
+ expect(message).to.not.have.class('visible');
266
+ // Wait for visibility timeout
267
+ await new Promise((resolve) => setTimeout(resolve, 150));
268
+ await toast.updateComplete;
269
+ expect(message).to.have.class('visible');
270
+ });
271
+ it('renders messages with removing class when removed', async () => {
272
+ var _a;
273
+ const toast = await createToast();
274
+ toast.info('Test message');
275
+ await toast.updateComplete;
276
+ const messageData = toast.messages[0];
277
+ toast.removeMessage(messageData);
278
+ await toast.updateComplete;
279
+ const message = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.message');
280
+ expect(message).to.have.class('removing');
281
+ });
282
+ it('renders close icons with correct message_id', async () => {
283
+ var _a;
284
+ const toast = await createToast();
285
+ toast.info('Test message');
286
+ await toast.updateComplete;
287
+ const closeIcon = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('temba-icon[name="close"]');
288
+ expect(closeIcon === null || closeIcon === void 0 ? void 0 : closeIcon.getAttribute('message_id')).to.equal('1');
289
+ });
290
+ it('renders correct animation duration styles', async () => {
291
+ var _a;
292
+ const toast = await createToast({ animation: '500' });
293
+ toast.info('Test message');
294
+ await toast.updateComplete;
295
+ const message = (_a = toast.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.message');
296
+ expect(message === null || message === void 0 ? void 0 : message.style.transitionDuration).to.equal('500ms');
297
+ });
298
+ });
299
+ //# sourceMappingURL=temba-toast.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temba-toast.test.js","sourceRoot":"","sources":["../../test/temba-toast.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, assert, expect } from '@open-wc/testing';\nimport { Toast } from '../src/toast/Toast';\n\n// Register the component if it's not already registered\nif (!customElements.get('temba-toast')) {\n customElements.define('temba-toast', Toast);\n}\n\nexport const createToast = async (attrs: any = {}) => {\n const attrString = Object.keys(attrs)\n .map((key) => `${key}=\"${attrs[key]}\"`)\n .join(' ');\n\n return (await fixture(`<temba-toast ${attrString}></temba-toast>`)) as Toast;\n};\n\ndescribe('temba-toast', () => {\n it('can be created', async () => {\n const toast = await createToast();\n assert.instanceOf(toast, Toast);\n expect(toast.messages).to.deep.equal([]);\n expect(toast.staleDuration).to.equal(5000);\n expect(toast.animationDuration).to.equal(200);\n expect(toast.errorSticky).to.be.false;\n expect(toast.warningSticky).to.be.false;\n expect(toast.infoSticky).to.be.false;\n });\n\n it('can set properties via attributes', async () => {\n const toast = await createToast({\n duration: '3000',\n animation: '300',\n 'error-sticky': 'true',\n 'warning-sticky': 'true',\n 'info-sticky': 'true'\n });\n\n expect(toast.staleDuration).to.equal(3000);\n expect(toast.animationDuration).to.equal(300);\n expect(toast.errorSticky).to.be.true;\n expect(toast.warningSticky).to.be.true;\n expect(toast.infoSticky).to.be.true;\n });\n\n it('adds info message', async () => {\n const toast = await createToast();\n toast.info('This is an info message');\n\n expect(toast.messages).to.have.length(1);\n expect(toast.messages[0].text).to.equal('This is an info message');\n expect(toast.messages[0].level).to.equal('info');\n expect(toast.messages[0].id).to.equal(1);\n expect(toast.messages[0].time).to.be.instanceOf(Date);\n expect(toast.messages[0].visible).to.be.undefined;\n });\n\n it('adds warning message', async () => {\n const toast = await createToast();\n toast.warning('This is a warning message');\n\n expect(toast.messages).to.have.length(1);\n expect(toast.messages[0].text).to.equal('This is a warning message');\n expect(toast.messages[0].level).to.equal('warning');\n expect(toast.messages[0].id).to.equal(1);\n });\n\n it('adds error message', async () => {\n const toast = await createToast();\n toast.error('This is an error message');\n\n expect(toast.messages).to.have.length(1);\n expect(toast.messages[0].text).to.equal('This is an error message');\n expect(toast.messages[0].level).to.equal('error');\n expect(toast.messages[0].id).to.equal(1);\n });\n\n it('adds multiple messages with incrementing IDs', async () => {\n const toast = await createToast();\n toast.info('First message');\n toast.warning('Second message');\n toast.error('Third message');\n\n expect(toast.messages).to.have.length(3);\n expect(toast.messages[0].id).to.equal(1);\n expect(toast.messages[1].id).to.equal(2);\n expect(toast.messages[2].id).to.equal(3);\n });\n\n it('adds multiple messages using addMessages', async () => {\n const toast = await createToast();\n const messages = [\n {\n text: 'First message',\n level: 'info' as const,\n id: 1,\n time: new Date()\n },\n {\n text: 'Second message',\n level: 'warning' as const,\n id: 2,\n time: new Date()\n },\n {\n text: 'Third message',\n level: 'error' as const,\n id: 3,\n time: new Date()\n }\n ];\n\n toast.addMessages(messages);\n\n expect(toast.messages).to.have.length(3);\n expect(toast.messages[0].text).to.equal('First message');\n expect(toast.messages[0].level).to.equal('info');\n expect(toast.messages[1].text).to.equal('Second message');\n expect(toast.messages[1].level).to.equal('warning');\n expect(toast.messages[2].text).to.equal('Third message');\n expect(toast.messages[2].level).to.equal('error');\n });\n\n it('makes messages visible after delay', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n // Initially not visible\n expect(toast.messages[0].visible).to.be.undefined;\n\n // Wait for the timeout\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n expect(toast.messages[0].visible).to.be.true;\n });\n\n it('removes message manually', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n const message = toast.messages[0];\n expect(toast.messages).to.have.length(1);\n\n toast.removeMessage(message);\n\n // Message should have removeTime set\n expect(message.removeTime).to.be.instanceOf(Date);\n\n // Wait for animation to complete\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n expect(toast.messages).to.have.length(0);\n });\n\n it('handles message click to remove', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n // Wait for render\n await toast.updateComplete;\n\n const closeIcon = toast.shadowRoot?.querySelector(\n 'temba-icon[name=\"close\"]'\n ) as HTMLElement;\n expect(closeIcon).to.exist;\n\n // Simulate click\n closeIcon.click();\n\n // Wait for animation\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n expect(toast.messages).to.have.length(0);\n });\n\n it('handles invalid message ID in click handler', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n await toast.updateComplete;\n\n // Create a mock event with invalid message_id\n const mockEvent = {\n target: {\n getAttribute: () => 'invalid'\n }\n } as any;\n\n // Should not throw error\n expect(() => {\n (toast as any).handleMessageClicked(mockEvent);\n }).to.not.throw();\n\n // Message should still exist\n expect(toast.messages).to.have.length(1);\n });\n\n it('handles missing message in click handler', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n await toast.updateComplete;\n\n // Create a mock event with non-existent message_id\n const mockEvent = {\n target: {\n getAttribute: () => '999'\n }\n } as any;\n\n // Should not throw error\n expect(() => {\n (toast as any).handleMessageClicked(mockEvent);\n }).to.not.throw();\n\n // Message should still exist\n expect(toast.messages).to.have.length(1);\n });\n\n it('checks for stale messages', async () => {\n const toast = await createToast({ duration: '100' }); // 100ms duration\n toast.info('Test message');\n\n // Wait for message to become stale\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n // Manually trigger stale check\n toast.checkForStaleMessages();\n\n // Wait for removal animation\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n expect(toast.messages).to.have.length(0);\n });\n\n it('respects sticky info messages', async () => {\n const toast = await createToast({\n duration: '100',\n 'info-sticky': 'true'\n });\n toast.info('Sticky info message');\n\n // Wait for message to become \"stale\"\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n toast.checkForStaleMessages();\n\n // Message should still exist because it's sticky\n expect(toast.messages).to.have.length(1);\n });\n\n it('respects sticky warning messages', async () => {\n const toast = await createToast({\n duration: '100',\n 'warning-sticky': 'true'\n });\n toast.warning('Sticky warning message');\n\n // Wait for message to become \"stale\"\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n toast.checkForStaleMessages();\n\n // Message should still exist because it's sticky\n expect(toast.messages).to.have.length(1);\n });\n\n it('respects sticky error messages', async () => {\n const toast = await createToast({\n duration: '100',\n 'error-sticky': 'true'\n });\n toast.error('Sticky error message');\n\n // Wait for message to become \"stale\"\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n toast.checkForStaleMessages();\n\n // Message should still exist because it's sticky\n expect(toast.messages).to.have.length(1);\n });\n\n it('clears interval when no messages remain', async () => {\n const toast = await createToast({ duration: '100' });\n toast.info('Test message');\n\n // Verify interval is set\n expect((toast as any).checker).to.be.greaterThan(0);\n\n // Wait for stale and removal\n await new Promise((resolve) => setTimeout(resolve, 150));\n toast.checkForStaleMessages();\n\n // Wait for the removeMessage animation to complete\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n // Now trigger checkForStaleMessages again to clear the interval\n toast.checkForStaleMessages();\n\n // Interval should be cleared\n expect((toast as any).checker).to.equal(0);\n });\n\n it('clears existing interval when adding new message', async () => {\n const toast = await createToast();\n toast.info('First message');\n\n const firstChecker = (toast as any).checker;\n expect(firstChecker).to.be.greaterThan(0);\n\n toast.info('Second message');\n\n // Should have new interval\n expect((toast as any).checker).to.be.greaterThan(0);\n expect((toast as any).checker).to.not.equal(firstChecker);\n });\n\n it('renders messages with correct CSS classes', async () => {\n const toast = await createToast();\n toast.info('Info message');\n toast.warning('Warning message');\n toast.error('Error message');\n\n await toast.updateComplete;\n\n const messages = toast.shadowRoot?.querySelectorAll('.message');\n expect(messages).to.have.length(3);\n\n expect(messages?.[0]).to.have.class('info');\n expect(messages?.[1]).to.have.class('warning');\n expect(messages?.[2]).to.have.class('error');\n });\n\n it('renders messages with visible class after delay', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n await toast.updateComplete;\n\n const message = toast.shadowRoot?.querySelector('.message');\n expect(message).to.not.have.class('visible');\n\n // Wait for visibility timeout\n await new Promise((resolve) => setTimeout(resolve, 150));\n await toast.updateComplete;\n\n expect(message).to.have.class('visible');\n });\n\n it('renders messages with removing class when removed', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n await toast.updateComplete;\n\n const messageData = toast.messages[0];\n toast.removeMessage(messageData);\n\n await toast.updateComplete;\n\n const message = toast.shadowRoot?.querySelector('.message');\n expect(message).to.have.class('removing');\n });\n\n it('renders close icons with correct message_id', async () => {\n const toast = await createToast();\n toast.info('Test message');\n\n await toast.updateComplete;\n\n const closeIcon = toast.shadowRoot?.querySelector(\n 'temba-icon[name=\"close\"]'\n );\n expect(closeIcon?.getAttribute('message_id')).to.equal('1');\n });\n\n it('renders correct animation duration styles', async () => {\n const toast = await createToast({ animation: '500' });\n toast.info('Test message');\n\n await toast.updateComplete;\n\n const message = toast.shadowRoot?.querySelector('.message') as HTMLElement;\n expect(message?.style.transitionDuration).to.equal('500ms');\n });\n});\n"]}