@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
@@ -1 +1 @@
1
- {"version":3,"file":"temba-select.test.js","sourceRoot":"","sources":["../../test/temba-select.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sinon from 'sinon';\nimport { fixture, expect, assert } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { Options } from '../src/options/Options';\nimport { Select, SelectOption } from '../src/select/Select';\nimport {\n assertScreenshot,\n checkTimers,\n getClip,\n loadStore,\n mouseClickElement\n} from './utils.test';\nimport { CustomEventType } from '../src/interfaces';\n\nconst colors = [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1' },\n { name: 'Blue', value: '2' }\n];\n\nexport const createSelect = async (clock, def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 250px;');\n\n const select: Select<SelectOption> = await fixture(def, { parentNode });\n clock.runAll();\n await select.updateComplete;\n return select;\n};\n\nexport const open = async (clock, select: Select<SelectOption>) => {\n if (!select.endpoint) {\n await mouseClickElement(select);\n await clock.runAll();\n await clock.runAll();\n return select;\n }\n\n const promise = new Promise<Select<SelectOption>>((resolve) => {\n select.addEventListener(\n CustomEventType.FetchComplete,\n async () => {\n await clock.runAll();\n resolve(select);\n },\n { once: true }\n );\n });\n\n await mouseClickElement(select);\n await clock.runAll();\n\n return promise;\n};\n\nexport const clear = (select: Select<SelectOption>) => {\n (select.shadowRoot.querySelector('.clear-button') as HTMLDivElement).click();\n};\n\nexport const getOptions = (select: Select<SelectOption>): Options => {\n return select.shadowRoot.querySelector('temba-options[visible]');\n};\n\nexport const clickOption = async (\n clock: any,\n select: Select<SelectOption>,\n index: number\n) => {\n const options = getOptions(select);\n const option = options.shadowRoot.querySelector(\n `[data-option-index=\"${index}\"]`\n ) as HTMLDivElement;\n\n await mouseClickElement(option);\n await options.updateComplete;\n await select.updateComplete;\n await clock.runAll();\n\n checkTimers(clock);\n};\n\nexport const openAndClick = async (\n clock: any,\n select: Select<SelectOption>,\n index: number\n) => {\n await open(clock, select);\n await clickOption(clock, select, index);\n};\n\nexport const getSelectHTML = (\n options: SelectOption[] = colors,\n attrs: any = { placeholder: 'Select a color', name: 'color' },\n selected: any = null\n): string => {\n const selectHTML = `\n <temba-select${Object.keys(attrs)\n .map((name: string) => {\n // check if it's a string attribute\n if (typeof attrs[name] === 'string') {\n return ` ${name}=\"${attrs[name].replace(/\"/g, '&quot;')}\"`;\n }\n\n if (typeof attrs[name] === 'boolean') {\n return ` ${name}`;\n }\n\n return ` ${name}=\"${attrs[name]}\"`;\n })\n .join(' ')}>\n ${options\n .map(\n (option) =>\n `<temba-option name=\"${option.name}\" value=\"${option.value}\"${\n option.selected || option.value === selected ? ' selected' : ''\n }></temba-option>`\n )\n .join('')}\n </temba-select>`;\n return selectHTML;\n};\n\nconst getClipWithOptions = (select: Select<any>) => {\n const selectClip = getClip(select);\n const options = select.shadowRoot.querySelector(\n 'temba-options[visible]'\n ) as Options;\n\n if (options) {\n const optionsClip = getClip(options);\n const y = Math.min(selectClip.y, optionsClip.y);\n const x = Math.min(selectClip.x, optionsClip.x);\n const combinedClip = {\n y,\n x,\n width: Math.max(selectClip.right, optionsClip.right) - x,\n height: Math.max(selectClip.bottom, optionsClip.bottom) - y\n };\n return combinedClip;\n }\n\n return selectClip;\n};\n\ndescribe('temba-select', () => {\n let clock: any;\n beforeEach(function () {\n clock = useFakeTimers();\n clock.tick(400);\n setViewport({ width: 500, height: 1000, deviceScaleFactor: 2 });\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const select = await createSelect(clock, '<temba-select></temba-select>');\n assert.instanceOf(select, Select);\n });\n\n it('can be disabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled', getClip(select));\n });\n\n it('can be disabled with selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true, value: '0' })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled-selection', getClip(select));\n });\n\n it('can be disabled with multi selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n\n await openAndClick(clock, select, 0);\n select.disabled = true;\n expect(select.disabled).to.equal(true);\n\n // make sure we can't select anymore\n await open(clock, select);\n expect(select.isOpen()).to.equal(false);\n await assertScreenshot('select/disabled-multi-selection', getClip(select));\n });\n\n it('can be created with temba-option tags', async () => {\n const select = await createSelect(clock, getSelectHTML());\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values.length).to.equal(0);\n await assertScreenshot('select/with-placeholder', getClip(select));\n });\n\n it('picks the first option without a placeholder', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}));\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values[0].name).to.equal('Red');\n await assertScreenshot('select/without-placeholder', getClip(select));\n });\n\n it('shows options when opened', async () => {\n const select = await createSelect(clock, getSelectHTML());\n await open(clock, select);\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // our options should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n await assertScreenshot('select/local-options', getClipWithOptions(select));\n });\n\n it('can be created with attribute options', async () => {\n const options = JSON.stringify([{ name: 'Embedded Option', value: '0' }]);\n const select = await createSelect(clock, getSelectHTML([], { options }));\n // select the first option\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Embedded Option');\n await assertScreenshot('select/embedded', getClipWithOptions(select));\n });\n\n describe('single selection', () => {\n it('can select a single option', async () => {\n const select = await createSelect(clock, getSelectHTML());\n\n // nothing is selected to start\n expect(select.values.length).to.equal(0);\n expect(select.value).to.equal(null);\n\n // select the first option\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n await openAndClick(clock, select, 0);\n\n assert(changeEvent.called, 'change event not fired');\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n\n await assertScreenshot(\n 'select/selected-single',\n getClipWithOptions(select)\n );\n });\n\n it('can search with existing selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the second option\n await openAndClick(clock, select, 1);\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Green');\n\n // for single selection our current selection should be in the list and focused\n await open(clock, select);\n assert.equal(select.cursorIndex, 1);\n assert.equal(select.visibleOptions.length, 3);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await open(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot(\n 'select/search-with-selected',\n getClipWithOptions(select)\n );\n\n // but our cursor should be on the first match\n assert.equal(select.cursorIndex, 0);\n });\n });\n\n describe('multiple selection', () => {\n it('can select multiple options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option twice\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n // now we should have red and green selected\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi',\n getClipWithOptions(select)\n );\n });\n\n it('can select multiple options until maxitems', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n multi: true,\n maxItems: 2\n })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option 3 times, only 2 (maxitems) options are handled and added\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await open(clock, select);\n assert.equal(select.visibleOptions.length, 0);\n assert(!changeEvent.called, 'change event should not be fired');\n\n // but we should have red and green selected only, no blue\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi-maxitems-reached',\n getClipWithOptions(select)\n );\n });\n\n it('shows multiple values on initialization', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select a color',\n multi: true\n }\n )\n );\n await assertScreenshot('select/multiple-initial-values', getClip(select));\n expect(select.values.length).to.equal(2);\n });\n });\n\n describe('static options', () => {\n it('accepts an initial value', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { value: '1' })\n );\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot('select/static-initial-value', getClip(select));\n });\n\n it('honors temba-option selected attribute', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}, '1'));\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot(\n 'select/static-initial-via-selected',\n getClip(select)\n );\n });\n });\n\n describe('endpoints', () => {\n it('can load from an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json'\n })\n );\n\n await open(clock, select);\n await assertScreenshot(\n 'select/remote-options',\n getClipWithOptions(select)\n );\n assert.equal(select.visibleOptions.length, 3);\n });\n\n it('can search an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true\n })\n );\n\n await typeInto('temba-select', 're', false);\n await open(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot('select/searching', getClipWithOptions(select));\n });\n\n it('can use an endpoint and allow multiple', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true,\n multi: true\n })\n );\n\n await assertScreenshot(\n 'select/multi-with-endpoint',\n getClipWithOptions(select)\n );\n\n // await typeInto('temba-select', 're', false);\n // await open(select);\n // assert.equal(select.visibleOptions.length, 2);\n });\n\n it('pages through cursor results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid'\n })\n );\n\n await open(clock, select);\n\n // should have all three pages visible right away\n assert.equal(select.visibleOptions.length, 15);\n });\n\n it('shows cached results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid',\n searchable: true\n })\n );\n\n // wait for updates from fetching three pages\n await open(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen\n select.blur();\n await clock.tick(250);\n\n await open(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen once more (previous bug failed on third opening)\n // select.blur();\n // await open(select);\n // assert.equal(select.visibleOptions.length, 15);\n });\n\n it('can enter expressions', async () => {\n await loadStore();\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n endpoint: '/colors.json',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'Hi there @contact', false);\n await open(clock, select);\n\n assert.equal(select.completionOptions.length, 14);\n await assertScreenshot('select/expressions', getClipWithOptions(select));\n });\n\n it('clears single selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { clearable: true })\n );\n assert.equal(select.getStaticOptions().length, 3);\n\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Red');\n\n await assertScreenshot('select/selection-clearable', getClip(select));\n\n clear(select);\n expect(select.values.length).to.equal(0);\n });\n\n it('should look the same with search enabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n await assertScreenshot(\n 'select/search-enabled',\n getClipWithOptions(select)\n );\n });\n\n it('should look the same with search enabled and selection made', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n await assertScreenshot(\n 'select/search-selected',\n getClipWithOptions(select)\n );\n });\n\n it('should show focus for the selected option', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n\n // now open and look at focus\n await open(clock, select);\n await assertScreenshot(\n 'select/search-selected-focus',\n getClipWithOptions(select)\n );\n });\n\n it('should show search with existing multiple selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n multi: true\n })\n );\n\n // select the first option\n await openAndClick(clock, select, 0);\n await openAndClick(clock, select, 0);\n await open(clock, select);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await open(clock, select);\n\n // should have two things selected and active query and no matching options\n await assertScreenshot(\n 'select/search-multi-no-matches',\n getClipWithOptions(select)\n );\n });\n\n it('should show functions', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'look at @(max(m', false);\n await open(clock, select);\n\n await assertScreenshot('select/functions', getClipWithOptions(select));\n });\n\n it('should truncate selection if necessesary', async () => {\n const options = [\n {\n name: 'this_is_a_long_selection_to_make_sure_it_truncates',\n value: '0'\n }\n ];\n\n const select = await createSelect(\n clock,\n getSelectHTML(options, {\n value: '0'\n })\n );\n\n await assertScreenshot(\n 'select/truncated-selection',\n getClipWithOptions(select)\n );\n });\n\n it('can select expression completion as value', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n multi: true,\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', '@con', false);\n await openAndClick(clock, select, 0);\n\n expect(select.values[0].name).to.equal('@contact');\n await assertScreenshot(\n 'select/expression-selected',\n getClipWithOptions(select)\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-select.test.js","sourceRoot":"","sources":["../../test/temba-select.test.ts"],"names":[],"mappings":"AAAA,OAAc,KAAK,KAAK,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAgB,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,GAAG;IACb,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;IAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;IACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAElD,MAAM,MAAM,GAAyB,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACxE,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,cAAc,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAA4B,EAAE,EAAE;IACnD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAoB,CAAC,KAAK,EAAE,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAA0B,MAAM,EAChC,QAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,EAC7D,WAAgB,IAAI,EACZ,EAAE;IACV,MAAM,UAAU,GAAG;iBACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9B,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;QACpB,mCAAmC;QACnC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;QAC7D,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC;MACR,OAAO;SACN,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT,uBAAuB,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,KAAK,IACxD,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAC/D,kBAAkB,CACrB;SACA,IAAI,CAAC,EAAE,CAAC;kBACG,CAAC;IACjB,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAmB,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAC7C,wBAAwB,CACd,CAAC;IAEb,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG;YACnB,CAAC;YACD,CAAC;YACD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;YACxD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;SAC5D,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,KAA4B,CAAC;IACjC,UAAU,CAAC;QACT,KAAK,GAAG,aAAa,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;QAC1E,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC1C,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACtD,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,gBAAgB,CAAC,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACtE,CAAC;QAEF,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,oCAAoC;QACpC,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,gBAAgB,CAAC,iCAAiC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,gBAAgB,CAAC,yBAAyB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC1D,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpC,gCAAgC;QAChC,MAAM,CAAC,MAAM,CACX,OAAO,CAAC,UAAU;aACf,aAAa,CAAC,oBAAoB,CAAC;aACnC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC9B,CAAC;QAEF,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,0BAA0B;QAC1B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1D,MAAM,gBAAgB,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CACvD,CAAC;QAEF,6CAA6C;QAC7C,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEhC,gEAAgE;QAChE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpC,yCAAyC;QACzC,MAAM,CAAC,MAAM,CACX,OAAO,CAAC,UAAU;aACf,aAAa,CAAC,oBAAoB,CAAC;aACnC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC9B,CAAC;QAEF,wCAAwC;QACxC,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;QAE1D,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YAE1D,+BAA+B;YAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpC,0BAA0B;YAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAErC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAEtD,MAAM,gBAAgB,CACpB,wBAAwB,EACxB,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAC5C,CAAC;YAEF,2BAA2B;YAC3B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEhD,+EAA+E;YAC/E,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE9C,gFAAgF;YAChF,MAAM,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE9C,MAAM,gBAAgB,CACpB,6BAA6B,EAC7B,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;YAEF,8CAA8C;YAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACtE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAE/C,gCAAgC;YAChC,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;YAErD,WAAW,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;YAErD,4CAA4C;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAExD,MAAM,gBAAgB,CACpB,uBAAuB,EACvB,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE;gBACpB,WAAW,EAAE,gBAAgB;gBAC7B,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,CAAC;aACZ,CAAC,CACH,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAE/C,mFAAmF;YACnF,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;YAErD,WAAW,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;YAErD,WAAW,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;YAEhE,0DAA0D;YAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAExD,MAAM,gBAAgB,CACpB,wCAAwC,EACxC,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CACX;gBACE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC7C,EACD;gBACE,WAAW,EAAE,gBAAgB;gBAC7B,KAAK,EAAE,IAAI;aACZ,CACF,CACF,CAAC;YACF,MAAM,gBAAgB,CAAC,gCAAgC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CACX;gBACE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC7C,EACD;gBACE,WAAW,EAAE,eAAe;gBAC5B,KAAK,EAAE,IAAI;aACZ,CACF,CACF,CAAC;YAEF,yCAAyC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAE/C,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAClD,qBAAqB,CACtB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAEpC,gEAAgE;YAChE,iDAAiD;YACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAEjC,MAAM,UAAU,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,WAAW,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YAEtD,4BAA4B;YAC5B,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,EAAE,UAAU,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3D,MAAM,SAAS,EAAE,CAAC;YAElB,8DAA8D;YAC9D,MAAM,SAAS,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC5D,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,EAAE,CAAC;YAEf,2DAA2D;YAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEhD,sBAAsB;YACtB,MAAM,CAAC,MAAM,GAAG;gBACd,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC7C,CAAC;YACF,MAAM,MAAM,CAAC,cAAc,CAAC;YAE5B,gDAAgD;YAChD,iDAAiD;YACjD,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAClD,MAAM,cAAc,GAAG,YAAY;iBAChC,aAAa,CAAC,aAAa,CAAC;iBAC5B,qBAAqB,EAAE,CAAC;YAE3B,2BAA2B;YAC3B,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,EAAE,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACzD,MAAM,SAAS,EAAE,CAAC;YAElB,4CAA4C;YAC5C,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,EAAE,CAAC;YAEf,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE9C,sBAAsB;YACtB,MAAM,CAAC,MAAM,GAAG;gBACd,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC7C,CAAC;YACF,MAAM,MAAM,CAAC,cAAc,CAAC;YAE5B,4DAA4D;YAC5D,uCAAuC;YACvC,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAE5D,6BAA6B;YAC7B,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,GAAG,EAAE,EAAE,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,SAAS,EAAE,CAAC;YAElB,4CAA4C;YAC5C,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,GAAG,EAAE,EAAE,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,GAAG,EAAE,EAAE,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,EAAE,CAAC;YAEf,2BAA2B;YAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;gBAC3D,WAAW,EAAE,gBAAgB;gBAC7B,KAAK,EAAE,IAAI;aACZ,CAAC,CACH,CAAC;YAEF,qDAAqD;YACrD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAClD,qBAAqB,CACtB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAEhC,+CAA+C;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;gBAC3D,WAAW,EAAE,gBAAgB;gBAC7B,KAAK,EAAE,KAAK;aACb,CAAC,CACH,CAAC;YAEF,oDAAoD;YACpD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAClD,qBAAqB,CACtB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAEhC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACtC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,gBAAgB,CAAC,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,gBAAgB,CACpB,oCAAoC,EACpC,OAAO,CAAC,MAAM,CAAC,CAChB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,iCAAiC;aAC5C,CAAC,CACH,CAAC;YAEF,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,gBAAgB,CACpB,uBAAuB,EACvB,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,iCAAiC;gBAC3C,UAAU,EAAE,IAAI;aACjB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE9C,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,iCAAiC;gBAC3C,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;aACZ,CAAC,CACH,CAAC;YAEF,MAAM,gBAAgB,CACpB,4BAA4B,EAC5B,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;YAEF,+CAA+C;YAC/C,sBAAsB;YACtB,iDAAiD;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,iCAAiC;gBAC3C,QAAQ,EAAE,MAAM;aACjB,CAAC,CACH,CAAC;YAEF,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,iDAAiD;YACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,iCAAiC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;aACjB,CAAC,CACH,CAAC;YAEF,6CAA6C;YAC7C,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE/C,mBAAmB;YACnB,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE/C,oEAAoE;YACpE,iBAAiB;YACjB,sBAAsB;YACtB,kDAAkD;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,EAAE,EAAE;gBAChB,QAAQ,EAAE,cAAc;gBACxB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,SAAS;aACvB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,gBAAgB,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAC3C,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAElD,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE9C,MAAM,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAEtE,KAAK,CAAC,MAAM,CAAC,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE;gBACpB,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,IAAI;aACjB,CAAC,CACH,CAAC;YACF,MAAM,gBAAgB,CACpB,uBAAuB,EACvB,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAC5C,CAAC;YAEF,0BAA0B;YAC1B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,gBAAgB,CACpB,wBAAwB,EACxB,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAC5C,CAAC;YAEF,0BAA0B;YAC1B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAErC,6BAA6B;YAC7B,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,gBAAgB,CACpB,8BAA8B,EAC9B,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE;gBACpB,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;aACZ,CAAC,CACH,CAAC;YAEF,0BAA0B;YAC1B,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,gFAAgF;YAChF,MAAM,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,2EAA2E;YAC3E,MAAM,gBAAgB,CACpB,gCAAgC,EAChC,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,SAAS,EAAE,CAAC;YAElB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE;gBACpB,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,SAAS;aACvB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,CAAC,cAAc,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,GAAG;gBACd;oBACE,IAAI,EAAE,8EAA8E;oBACpF,KAAK,EAAE,GAAG;iBACX;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,OAAO,EAAE;gBACrB,KAAK,EAAE,GAAG;aACX,CAAC,CACH,CAAC;YAEF,MAAM,gBAAgB,CACpB,4BAA4B,EAC5B,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,SAAS,EAAE,CAAC;YAElB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,aAAa,CAAC,MAAM,EAAE;gBACpB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,SAAS;aACvB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAErC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,gBAAgB,CACpB,4BAA4B,EAC5B,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import Sinon, * as sinon from 'sinon';\nimport { fixture, expect, assert } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { Options } from '../src/options/Options';\nimport { Select, SelectOption } from '../src/select/Select';\nimport {\n assertScreenshot,\n getClip,\n getOptions,\n loadStore,\n openAndClick,\n openSelect\n} from './utils.test';\n\nconst colors = [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1' },\n { name: 'Blue', value: '2' }\n];\n\nexport const createSelect = async (clock, def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 400px;');\n\n const select: Select<SelectOption> = await fixture(def, { parentNode });\n clock.runAll();\n await select.updateComplete;\n return select;\n};\n\nexport const clear = (select: Select<SelectOption>) => {\n (select.shadowRoot.querySelector('.clear-button') as HTMLDivElement).click();\n};\n\nexport const getSelectHTML = (\n options: SelectOption[] = colors,\n attrs: any = { placeholder: 'Select a color', name: 'color' },\n selected: any = null\n): string => {\n const selectHTML = `\n <temba-select${Object.keys(attrs)\n .map((name: string) => {\n // check if it's a string attribute\n if (typeof attrs[name] === 'string') {\n return ` ${name}=\"${attrs[name].replace(/\"/g, '&quot;')}\"`;\n }\n\n if (typeof attrs[name] === 'boolean') {\n return ` ${name}`;\n }\n\n return ` ${name}=\"${attrs[name]}\"`;\n })\n .join(' ')}>\n ${options\n .map(\n (option) =>\n `<temba-option name=\"${option.name}\" value=\"${option.value}\"${\n option.selected || option.value === selected ? ' selected' : ''\n }></temba-option>`\n )\n .join('')}\n </temba-select>`;\n return selectHTML;\n};\n\nconst getClipWithOptions = (select: Select<any>) => {\n const selectClip = getClip(select);\n const options = select.shadowRoot.querySelector(\n 'temba-options[visible]'\n ) as Options;\n\n if (options) {\n const optionsClip = getClip(options);\n const y = Math.min(selectClip.y, optionsClip.y);\n const x = Math.min(selectClip.x, optionsClip.x);\n const combinedClip = {\n y,\n x,\n width: Math.max(selectClip.right, optionsClip.right) - x,\n height: Math.max(selectClip.bottom, optionsClip.bottom) - y\n };\n return combinedClip;\n }\n\n return selectClip;\n};\n\ndescribe('temba-select', () => {\n let clock: Sinon.SinonFakeTimers;\n beforeEach(function () {\n clock = useFakeTimers();\n clock.tick(400);\n setViewport({ width: 500, height: 1000, deviceScaleFactor: 2 });\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const select = await createSelect(clock, '<temba-select></temba-select>');\n assert.instanceOf(select, Select);\n });\n\n it('can be disabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled', getClip(select));\n });\n\n it('can be disabled with selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true, value: '0' })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled-selection', getClip(select));\n });\n\n it('can be disabled with multi selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n\n await openAndClick(clock, select, 0);\n select.disabled = true;\n expect(select.disabled).to.equal(true);\n\n // make sure we can't select anymore\n await openSelect(clock, select);\n expect(select.isOpen()).to.equal(false);\n await assertScreenshot('select/disabled-multi-selection', getClip(select));\n });\n\n it('can be created with temba-option tags', async () => {\n const select = await createSelect(clock, getSelectHTML());\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values.length).to.equal(0);\n await assertScreenshot('select/with-placeholder', getClip(select));\n });\n\n it('picks the first option without a placeholder', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}));\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values[0].name).to.equal('Red');\n await assertScreenshot('select/without-placeholder', getClip(select));\n });\n\n it('shows options when opened', async () => {\n const select = await createSelect(clock, getSelectHTML());\n await openSelect(clock, select);\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // our options should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n await assertScreenshot('select/local-options', getClipWithOptions(select));\n });\n\n it('can be created with attribute options', async () => {\n const options = JSON.stringify([{ name: 'Embedded Option', value: '0' }]);\n const select = await createSelect(clock, getSelectHTML([], { options }));\n // select the first option\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Embedded Option');\n await assertScreenshot('select/embedded', getClipWithOptions(select));\n });\n\n it('shows no options message when opening with empty options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], { placeholder: 'Select an option' })\n );\n\n // attempt to open the select with no options\n await openSelect(clock, select);\n\n // should show options dropdown even though there are no options\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // the options dropdown should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n // should contain a \"No options\" message\n const noOptionsText = options.shadowRoot.textContent;\n assert.include(noOptionsText.toLowerCase(), 'no options');\n\n await assertScreenshot('select/empty-options', getClipWithOptions(select));\n });\n\n describe('single selection', () => {\n it('can select a single option', async () => {\n const select = await createSelect(clock, getSelectHTML());\n\n // nothing is selected to start\n expect(select.values.length).to.equal(0);\n expect(select.value).to.equal(null);\n\n // select the first option\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n await openAndClick(clock, select, 0);\n\n assert(changeEvent.called, 'change event not fired');\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n\n await assertScreenshot(\n 'select/selected-single',\n getClipWithOptions(select)\n );\n });\n\n it('can search with existing selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the second option\n await openAndClick(clock, select, 1);\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Green');\n\n // for single selection our current selection should be in the list and focused\n await openSelect(clock, select);\n assert.equal(select.cursorIndex, 1);\n assert.equal(select.visibleOptions.length, 3);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot(\n 'select/search-with-selected',\n getClipWithOptions(select)\n );\n\n // but our cursor should be on the first match\n assert.equal(select.cursorIndex, 0);\n });\n });\n\n describe('multiple selection', () => {\n it('can select multiple options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option twice\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n // now we should have red and green selected\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi',\n getClipWithOptions(select)\n );\n });\n\n it('can select multiple options until maxitems', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n multi: true,\n maxItems: 2\n })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option 3 times, only 2 (maxitems) options are handled and added\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 0);\n assert(!changeEvent.called, 'change event should not be fired');\n\n // but we should have red and green selected only, no blue\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi-maxitems-reached',\n getClipWithOptions(select)\n );\n });\n\n it('shows multiple values on initialization', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select a color',\n multi: true\n }\n )\n );\n await assertScreenshot('select/multiple-initial-values', getClip(select));\n expect(select.values.length).to.equal(2);\n });\n });\n\n describe('drag and drop reordering', () => {\n it('handles drag and drop with swap-based logic', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select colors',\n multi: true\n }\n )\n );\n\n // Verify initial order: Red, Green, Blue\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.not.be.null;\n\n // Example 1: Pick up Blue (index 2), drop between Red and Green\n // Expected result: Red, Blue, Green (swap [1,2])\n const blueItem = sortableList.querySelector('#selected-2');\n const greenItem = sortableList.querySelector('#selected-1');\n expect(blueItem).to.not.be.null;\n expect(greenItem).to.not.be.null;\n\n const blueBounds = blueItem.getBoundingClientRect();\n const greenBounds = greenItem.getBoundingClientRect();\n\n // Start drag from Blue item\n await moveMouse(blueBounds.left + 10, blueBounds.top + 10);\n await mouseDown();\n\n // Drag to position between Red and Green (left side of Green)\n await moveMouse(greenBounds.left - 5, greenBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Red, Blue, Green (Green and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Green');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 2: Pick up Red (index 0), drop at end\n // Expected result: Green, Blue, Red (swap [0,2])\n const redItem = sortableList.querySelector('#selected-0');\n const redBounds = redItem.getBoundingClientRect();\n const blueItemBounds = sortableList\n .querySelector('#selected-2')\n .getBoundingClientRect();\n\n // Start drag from Red item\n await moveMouse(redBounds.left + 10, redBounds.top + 10);\n await mouseDown();\n\n // Drag to end position (right side of Blue)\n await moveMouse(blueItemBounds.right + 5, blueItemBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Green, Blue, Red (Red and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Green');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Red');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 3: Pick up Green (index 1), drop at same position\n // Expected result: No change, no event\n const greenItemNew = sortableList.querySelector('#selected-1');\n const greenBoundsNew = greenItemNew.getBoundingClientRect();\n\n // Start drag from Green item\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await mouseDown();\n\n // Drag slightly but return to same position\n await moveMouse(greenBoundsNew.left + 15, greenBoundsNew.top + 10);\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: No change\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n });\n\n it('does not show sortable list for single item', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: true\n })\n );\n\n // Should not have a sortable list with only one item\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n // Should still show the selected item normally\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n\n it('does not show sortable list for non-multi select', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: false\n })\n );\n\n // Should not have a sortable list for single select\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n });\n\n describe('static options', () => {\n it('accepts an initial value', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { value: '1' })\n );\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot('select/static-initial-value', getClip(select));\n });\n\n it('honors temba-option selected attribute', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}, '1'));\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot(\n 'select/static-initial-via-selected',\n getClip(select)\n );\n });\n });\n\n describe('endpoints', () => {\n it('can load from an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json'\n })\n );\n\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/remote-options',\n getClipWithOptions(select)\n );\n assert.equal(select.visibleOptions.length, 3);\n });\n\n it('can search an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true\n })\n );\n\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot('select/searching', getClipWithOptions(select));\n });\n\n it('can use an endpoint and allow multiple', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true,\n multi: true\n })\n );\n\n await assertScreenshot(\n 'select/multi-with-endpoint',\n getClipWithOptions(select)\n );\n\n // await typeInto('temba-select', 're', false);\n // await open(select);\n // assert.equal(select.visibleOptions.length, 2);\n });\n\n it('pages through cursor results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid'\n })\n );\n\n await openSelect(clock, select);\n\n // should have all three pages visible right away\n assert.equal(select.visibleOptions.length, 15);\n });\n\n it('shows cached results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid',\n searchable: true\n })\n );\n\n // wait for updates from fetching three pages\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen\n select.blur();\n await clock.tick(250);\n\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen once more (previous bug failed on third opening)\n // select.blur();\n // await open(select);\n // assert.equal(select.visibleOptions.length, 15);\n });\n\n it('can enter expressions', async () => {\n await loadStore();\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n endpoint: '/colors.json',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'Hi there @contact', false);\n await openSelect(clock, select);\n\n assert.equal(select.completionOptions.length, 14);\n await assertScreenshot('select/expressions', getClipWithOptions(select));\n });\n\n it('clears single selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { clearable: true })\n );\n assert.equal(select.getStaticOptions().length, 3);\n\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Red');\n\n await assertScreenshot('select/selection-clearable', getClip(select));\n\n clear(select);\n expect(select.values.length).to.equal(0);\n });\n\n it('should look the same with search enabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n await assertScreenshot(\n 'select/search-enabled',\n getClipWithOptions(select)\n );\n });\n\n it('should look the same with search enabled and selection made', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n await assertScreenshot(\n 'select/search-selected',\n getClipWithOptions(select)\n );\n });\n\n it('should show focus for the selected option', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n\n // now open and look at focus\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/search-selected-focus',\n getClipWithOptions(select)\n );\n });\n\n it('should show search with existing multiple selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n multi: true\n })\n );\n\n // select the first option\n await openAndClick(clock, select, 0);\n await openAndClick(clock, select, 0);\n await openSelect(clock, select);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n\n // should have two things selected and active query and no matching options\n await assertScreenshot(\n 'select/search-multi-no-matches',\n getClipWithOptions(select)\n );\n });\n\n it('should show functions', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'look at @(max(m', false);\n await openSelect(clock, select);\n\n await assertScreenshot('select/functions', getClipWithOptions(select));\n });\n\n it('should truncate selection if necessesary', async () => {\n const options = [\n {\n name: 'this_is_a_long_selection_to_make_sure_it_truncates_but_it_needs_to_be_longer',\n value: '0'\n }\n ];\n\n const select = await createSelect(\n clock,\n getSelectHTML(options, {\n value: '0'\n })\n );\n\n await assertScreenshot(\n 'select/truncated-selection',\n getClipWithOptions(select)\n );\n });\n\n it('can select expression completion as value', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n multi: true,\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', '@con', false);\n await openAndClick(clock, select, 0);\n\n expect(select.values[0].name).to.equal('@contact');\n await assertScreenshot(\n 'select/expression-selected',\n getClipWithOptions(select)\n );\n });\n });\n});\n"]}
@@ -2,43 +2,119 @@ import { expect, fixture, oneEvent } from '@open-wc/testing';
2
2
  import { html } from 'lit';
3
3
  import { CustomEventType } from '../src/interfaces';
4
4
  import { assertScreenshot, getClip } from './utils.test';
5
+ import { useFakeTimers } from 'sinon';
5
6
  const BORING_LIST = html `
6
7
  <temba-sortable-list>
7
- <div class="sortable" id="chicken" style="padding:10px">Chicken</div>
8
- <div class="sortable" id="fish" style="padding:10px">Fish</div>
8
+ <style>
9
+ .sortable {
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ text-align: center;
14
+ height: 20px;
15
+ }
16
+ </style>
17
+ <div class="sortable" id="chicken" style="">Chicken</div>
18
+ <div class="sortable" id="fish">Fish</div>
19
+ </temba-sortable-list>
20
+ `;
21
+ const HORIZONTAL_LIST = html `
22
+ <temba-sortable-list horizontal>
23
+ <style>
24
+ .sortable {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ text-align: center;
29
+ height: 20px;
30
+ width: 50px;
31
+ }
32
+ </style>
33
+ <div class="sortable" id="red">Red</div>
34
+ <div class="sortable" id="blue">Blue</div>
35
+ <div class="sortable" id="green">Green</div>
9
36
  </temba-sortable-list>
10
37
  `;
11
38
  const createSorter = async (def) => {
12
39
  const parentNode = document.createElement('div');
13
- parentNode.setAttribute('style', 'width: 200px;');
40
+ parentNode.setAttribute('style', 'width: 100px;');
14
41
  return (await fixture(def, { parentNode }));
15
42
  };
16
43
  describe('temba-sortable-list', () => {
44
+ let clock;
45
+ beforeEach(function () {
46
+ clock = useFakeTimers();
47
+ clock.runAll();
48
+ });
49
+ afterEach(function () {
50
+ clock.restore();
51
+ });
17
52
  it('renders default', async () => {
18
53
  const list = await createSorter(BORING_LIST);
19
54
  await assertScreenshot('list/sortable', getClip(list));
20
55
  });
21
- it('drags', async () => {
56
+ it('can get ids of sortable elements', async () => {
22
57
  const list = await createSorter(BORING_LIST);
23
- const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);
24
- const updated = oneEvent(list, 'change', false);
58
+ await list.updateComplete;
59
+ const ids = list.getIds();
60
+ expect(ids).to.deep.equal(['chicken', 'fish']);
61
+ });
62
+ it('works with horizontal layout', async () => {
63
+ const list = await createSorter(HORIZONTAL_LIST);
64
+ await list.updateComplete;
65
+ const ids = list.getIds();
66
+ expect(ids).to.deep.equal(['red', 'blue', 'green']);
67
+ // Test horizontal drag behavior
25
68
  const bounds = list.getBoundingClientRect();
26
- await moveMouse(bounds.left + 20, bounds.bottom - 10);
69
+ const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);
70
+ // Drag the first item (red) to after the second item (blue)
71
+ await moveMouse(bounds.left + 10, bounds.top + 10);
27
72
  await mouseDown();
28
- await moveMouse(bounds.left + 30, bounds.top + 20);
29
- // we should fire an order changed event
73
+ await moveMouse(bounds.left + 80, bounds.top + 10);
74
+ await mouseUp();
75
+ clock.runAll();
30
76
  const orderEvent = await orderChanged;
31
77
  expect(orderEvent.detail).to.deep.equal({
32
- from: 'fish',
33
- to: 'chicken',
34
- fromIdx: 1,
35
- toIdx: 0
78
+ swap: [0, 2]
36
79
  });
80
+ });
81
+ it('handles prepareGhost callback', async () => {
82
+ const list = await createSorter(BORING_LIST);
83
+ let ghostPrepared = false;
84
+ list.prepareGhost = (ghost) => {
85
+ ghostPrepared = true;
86
+ ghost.style.backgroundColor = 'red';
87
+ };
88
+ const bounds = list.getBoundingClientRect();
89
+ // Start dragging to trigger ghost creation
90
+ await moveMouse(bounds.left + 20, bounds.bottom - 10);
91
+ await mouseDown();
92
+ await moveMouse(bounds.left + 30, bounds.bottom - 10);
93
+ expect(ghostPrepared).to.be.true;
94
+ // Clean up
95
+ await mouseUp();
96
+ clock.runAll();
97
+ });
98
+ it('drags', async () => {
99
+ const list = await createSorter(BORING_LIST);
100
+ const updated = oneEvent(list, 'change', false);
101
+ const bounds = list.getBoundingClientRect();
102
+ await moveMouse(bounds.left + 20, bounds.bottom - 10);
103
+ await mouseDown();
104
+ await moveMouse(bounds.left + 20, bounds.top + 5);
37
105
  // should be hovered
38
106
  await assertScreenshot('list/sortable-dragging', getClip(list));
39
- // now lets drop, it'll look the same as before dragging since
40
- // its the consuming elements job to do the reordering
107
+ // now lets drop - this will fire the order changed event
108
+ const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);
41
109
  await mouseUp();
110
+ clock.runAll();
111
+ await list.updateComplete;
112
+ clock.runAll();
113
+ // we should fire an order changed event on drop
114
+ const orderEvent = await orderChanged;
115
+ expect(orderEvent.detail).to.deep.equal({
116
+ swap: [1, 0]
117
+ });
42
118
  await assertScreenshot('list/sortable-dropped', getClip(list));
43
119
  // we should fire a change event
44
120
  const changeEvent = await updated;
@@ -1 +1 @@
1
- {"version":3,"file":"temba-sortable-list.test.js","sourceRoot":"","sources":["../../test/temba-sortable-list.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,GAAG,IAAI,CAAA;;;;;CAKvB,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,GAAmB,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAiB,CAAC;AAC9D,CAAC,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,IAAI,GAAiB,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACrB,MAAM,IAAI,GAAiB,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE5C,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAEnD,wCAAwC;QACxC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACtC,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,gBAAgB,CAAC,wBAAwB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhE,8DAA8D;QAC9D,sDAAsD;QACtD,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,gBAAgB,CAAC,uBAAuB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,gCAAgC;QAChC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html, TemplateResult } from 'lit';\nimport { CustomEventType } from '../src/interfaces';\nimport { SortableList } from '../src/list/SortableList';\nimport { assertScreenshot, getClip } from './utils.test';\n\nconst BORING_LIST = html`\n <temba-sortable-list>\n <div class=\"sortable\" id=\"chicken\" style=\"padding:10px\">Chicken</div>\n <div class=\"sortable\" id=\"fish\" style=\"padding:10px\">Fish</div>\n </temba-sortable-list>\n`;\n\nconst createSorter = async (def: TemplateResult) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 200px;');\n return (await fixture(def, { parentNode })) as SortableList;\n};\n\ndescribe('temba-sortable-list', () => {\n it('renders default', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n await assertScreenshot('list/sortable', getClip(list));\n });\n\n it('drags', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);\n const updated = oneEvent(list, 'change', false);\n\n const bounds = list.getBoundingClientRect();\n\n await moveMouse(bounds.left + 20, bounds.bottom - 10);\n await mouseDown();\n await moveMouse(bounds.left + 30, bounds.top + 20);\n\n // we should fire an order changed event\n const orderEvent = await orderChanged;\n expect(orderEvent.detail).to.deep.equal({\n from: 'fish',\n to: 'chicken',\n fromIdx: 1,\n toIdx: 0\n });\n\n // should be hovered\n await assertScreenshot('list/sortable-dragging', getClip(list));\n\n // now lets drop, it'll look the same as before dragging since\n // its the consuming elements job to do the reordering\n await mouseUp();\n await assertScreenshot('list/sortable-dropped', getClip(list));\n\n // we should fire a change event\n const changeEvent = await updated;\n expect(changeEvent.type).to.equal('change');\n });\n});\n"]}
1
+ {"version":3,"file":"temba-sortable-list.test.js","sourceRoot":"","sources":["../../test/temba-sortable-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html, TemplateResult } from 'lit';\nimport { CustomEventType } from '../src/interfaces';\nimport { SortableList } from '../src/list/SortableList';\nimport { assertScreenshot, getClip } from './utils.test';\nimport Sinon, { useFakeTimers } from 'sinon';\n\nconst BORING_LIST = html`\n <temba-sortable-list>\n <style>\n .sortable {\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n height: 20px;\n }\n </style>\n <div class=\"sortable\" id=\"chicken\" style=\"\">Chicken</div>\n <div class=\"sortable\" id=\"fish\">Fish</div>\n </temba-sortable-list>\n`;\n\nconst HORIZONTAL_LIST = html`\n <temba-sortable-list horizontal>\n <style>\n .sortable {\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n height: 20px;\n width: 50px;\n }\n </style>\n <div class=\"sortable\" id=\"red\">Red</div>\n <div class=\"sortable\" id=\"blue\">Blue</div>\n <div class=\"sortable\" id=\"green\">Green</div>\n </temba-sortable-list>\n`;\n\nconst createSorter = async (def: TemplateResult) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 100px;');\n return (await fixture(def, { parentNode })) as SortableList;\n};\n\ndescribe('temba-sortable-list', () => {\n let clock: Sinon.SinonFakeTimers;\n beforeEach(function () {\n clock = useFakeTimers();\n clock.runAll();\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('renders default', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n await assertScreenshot('list/sortable', getClip(list));\n });\n\n it('can get ids of sortable elements', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n await list.updateComplete;\n\n const ids = list.getIds();\n expect(ids).to.deep.equal(['chicken', 'fish']);\n });\n\n it('works with horizontal layout', async () => {\n const list: SortableList = await createSorter(HORIZONTAL_LIST);\n await list.updateComplete;\n\n const ids = list.getIds();\n expect(ids).to.deep.equal(['red', 'blue', 'green']);\n\n // Test horizontal drag behavior\n const bounds = list.getBoundingClientRect();\n const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);\n\n // Drag the first item (red) to after the second item (blue)\n await moveMouse(bounds.left + 10, bounds.top + 10);\n await mouseDown();\n await moveMouse(bounds.left + 80, bounds.top + 10);\n await mouseUp();\n clock.runAll();\n\n const orderEvent = await orderChanged;\n expect(orderEvent.detail).to.deep.equal({\n swap: [0, 2]\n });\n });\n\n it('handles prepareGhost callback', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n let ghostPrepared = false;\n\n list.prepareGhost = (ghost: HTMLElement) => {\n ghostPrepared = true;\n ghost.style.backgroundColor = 'red';\n };\n\n const bounds = list.getBoundingClientRect();\n\n // Start dragging to trigger ghost creation\n await moveMouse(bounds.left + 20, bounds.bottom - 10);\n await mouseDown();\n await moveMouse(bounds.left + 30, bounds.bottom - 10);\n\n expect(ghostPrepared).to.be.true;\n\n // Clean up\n await mouseUp();\n clock.runAll();\n });\n\n it('drags', async () => {\n const list: SortableList = await createSorter(BORING_LIST);\n const updated = oneEvent(list, 'change', false);\n\n const bounds = list.getBoundingClientRect();\n\n await moveMouse(bounds.left + 20, bounds.bottom - 10);\n await mouseDown();\n await moveMouse(bounds.left + 20, bounds.top + 5);\n\n // should be hovered\n await assertScreenshot('list/sortable-dragging', getClip(list));\n\n // now lets drop - this will fire the order changed event\n const orderChanged = oneEvent(list, CustomEventType.OrderChanged, false);\n await mouseUp();\n clock.runAll();\n await list.updateComplete;\n clock.runAll();\n\n // we should fire an order changed event on drop\n const orderEvent = await orderChanged;\n expect(orderEvent.detail).to.deep.equal({\n swap: [1, 0]\n });\n\n await assertScreenshot('list/sortable-dropped', getClip(list));\n\n // we should fire a change event\n const changeEvent = await updated;\n expect(changeEvent.type).to.equal('change');\n });\n});\n"]}