q2-tecton-elements 1.55.3 → 1.56.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 (377) hide show
  1. package/dist/bundle-report.json +15910 -11843
  2. package/dist/cjs/{index-905f4c87.js → index-99667782.js} +5 -1
  3. package/dist/cjs/index-99667782.js.map +1 -0
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/q2-action-group.cjs.entry.js +2 -2
  6. package/dist/cjs/q2-action-sheet.cjs.entry.js +2 -2
  7. package/dist/cjs/q2-avatar.cjs.entry.js +2 -2
  8. package/dist/cjs/q2-avatar.cjs.entry.js.map +1 -1
  9. package/dist/cjs/q2-badge_7.cjs.entry.js +56 -55
  10. package/dist/cjs/q2-badge_7.cjs.entry.js.map +1 -1
  11. package/dist/cjs/q2-calendar.cjs.entry.js +2 -2
  12. package/dist/cjs/q2-card.cjs.entry.js +1 -1
  13. package/dist/cjs/q2-carousel-pane.cjs.entry.js +3 -3
  14. package/dist/cjs/q2-carousel.cjs.entry.js +2 -2
  15. package/dist/cjs/q2-chart-area.cjs.entry.js +2 -2
  16. package/dist/cjs/q2-chart-bar.cjs.entry.js +2 -2
  17. package/dist/cjs/q2-chart-donut.cjs.entry.js +2 -2
  18. package/dist/cjs/q2-checkbox-group.cjs.entry.js +3 -3
  19. package/dist/cjs/q2-checkbox-group.cjs.entry.js.map +1 -1
  20. package/dist/cjs/q2-checkbox.cjs.entry.js +3 -3
  21. package/dist/cjs/q2-checkbox.cjs.entry.js.map +1 -1
  22. package/dist/cjs/q2-currency.cjs.entry.js +2 -2
  23. package/dist/cjs/q2-currency.cjs.entry.js.map +1 -1
  24. package/dist/cjs/q2-data-table.cjs.entry.js +2 -2
  25. package/dist/cjs/q2-data-table.cjs.entry.js.map +1 -1
  26. package/dist/cjs/q2-detail.cjs.entry.js +2 -2
  27. package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
  28. package/dist/cjs/q2-dropdown.cjs.entry.js +2 -2
  29. package/dist/cjs/q2-editable-field.cjs.entry.js +2 -2
  30. package/dist/cjs/q2-example.cjs.entry.js +1 -1
  31. package/dist/cjs/q2-file-picker.cjs.entry.js +20 -7
  32. package/dist/cjs/q2-file-picker.cjs.entry.js.map +1 -1
  33. package/dist/cjs/q2-form.cjs.entry.js +2 -2
  34. package/dist/cjs/q2-form.cjs.entry.js.map +1 -1
  35. package/dist/cjs/q2-formatted-text.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-grid-area.cjs.entry.js +133 -0
  37. package/dist/cjs/q2-grid-area.cjs.entry.js.map +1 -0
  38. package/dist/cjs/q2-grid.cjs.entry.js +109 -0
  39. package/dist/cjs/q2-grid.cjs.entry.js.map +1 -0
  40. package/dist/cjs/q2-item_3.cjs.entry.js +4 -4
  41. package/dist/cjs/q2-item_3.cjs.entry.js.map +1 -1
  42. package/dist/cjs/q2-legend.cjs.entry.js +1 -1
  43. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  44. package/dist/cjs/q2-message.cjs.entry.js +2 -2
  45. package/dist/cjs/q2-modal.cjs.entry.js +2 -2
  46. package/dist/cjs/q2-month-picker.cjs.entry.js +3 -3
  47. package/dist/cjs/q2-optgroup.cjs.entry.js +2 -2
  48. package/dist/cjs/q2-option-list_2.cjs.entry.js +18 -6
  49. package/dist/cjs/q2-option-list_2.cjs.entry.js.map +1 -1
  50. package/dist/cjs/q2-option.cjs.entry.js +1 -1
  51. package/dist/cjs/q2-pagination.cjs.entry.js +4 -4
  52. package/dist/cjs/q2-pill.cjs.entry.js +2 -2
  53. package/dist/cjs/q2-radio-group.cjs.entry.js +2 -2
  54. package/dist/cjs/q2-radio.cjs.entry.js +2 -2
  55. package/dist/cjs/q2-relative-time.cjs.entry.js +2 -2
  56. package/dist/cjs/q2-resize-observer.cjs.entry.js +1 -1
  57. package/dist/cjs/q2-section.cjs.entry.js +3 -3
  58. package/dist/cjs/q2-select.cjs.entry.js +3 -3
  59. package/dist/cjs/q2-stepper-pane.cjs.entry.js +2 -2
  60. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +2 -2
  61. package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
  62. package/dist/cjs/q2-tag.cjs.entry.js +2 -2
  63. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  64. package/dist/cjs/q2-textarea.cjs.entry.js +2 -2
  65. package/dist/cjs/q2-tooltip.cjs.entry.js +1 -1
  66. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  67. package/dist/collection/collection-manifest.json +2 -0
  68. package/dist/collection/components/q2-action-group/q2-action-group.js +1 -1
  69. package/dist/collection/components/q2-action-sheet/q2-action-sheet.js +1 -1
  70. package/dist/collection/components/q2-avatar/q2-avatar.css +8 -8
  71. package/dist/collection/components/q2-avatar/q2-avatar.js +1 -1
  72. package/dist/collection/components/q2-calendar/q2-calendar.js +1 -1
  73. package/dist/collection/components/q2-calendar/q2-month-picker.js +2 -2
  74. package/dist/collection/components/q2-carousel/q2-carousel.js +1 -1
  75. package/dist/collection/components/q2-carousel-pane/q2-carousel-pane.js +2 -2
  76. package/dist/collection/components/q2-chart-area/q2-chart-area.js +1 -1
  77. package/dist/collection/components/q2-chart-bar/q2-chart-bar.js +1 -1
  78. package/dist/collection/components/q2-chart-donut/q2-chart-donut.js +1 -1
  79. package/dist/collection/components/q2-checkbox/q2-checkbox.css +7 -3
  80. package/dist/collection/components/q2-checkbox/q2-checkbox.js +1 -1
  81. package/dist/collection/components/q2-checkbox-group/q2-checkbox-group.css +0 -5
  82. package/dist/collection/components/q2-checkbox-group/q2-checkbox-group.js +1 -1
  83. package/dist/collection/components/q2-currency/q2-currency.css +2 -2
  84. package/dist/collection/components/q2-currency/q2-currency.js +1 -1
  85. package/dist/collection/components/q2-data-table/q2-data-table.css +1 -2
  86. package/dist/collection/components/q2-detail/q2-detail.js +1 -1
  87. package/dist/collection/components/q2-dropdown/q2-dropdown.js +1 -1
  88. package/dist/collection/components/q2-editable-field/q2-editable-field.js +1 -1
  89. package/dist/collection/components/q2-example/q2-example.js +1 -1
  90. package/dist/collection/components/q2-file-picker/q2-file-picker.css +11 -2
  91. package/dist/collection/components/q2-file-picker/q2-file-picker.js +52 -12
  92. package/dist/collection/components/q2-file-picker/q2-file-picker.js.map +1 -1
  93. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.e2e.js +25 -0
  94. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.e2e.js.map +1 -1
  95. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.spec.js +107 -18
  96. package/dist/collection/components/q2-file-picker/test/q2-file-picker-test.spec.js.map +1 -1
  97. package/dist/collection/components/q2-form/q2-form.css +0 -1
  98. package/dist/collection/components/q2-form/q2-form.js +1 -1
  99. package/dist/collection/components/q2-form/test/q2-form-test.e2e.js +24 -4
  100. package/dist/collection/components/q2-form/test/q2-form-test.e2e.js.map +1 -1
  101. package/dist/collection/components/q2-formatted-text/q2-formatted-text.js +1 -1
  102. package/dist/collection/components/q2-grid/q2-grid.css +98 -0
  103. package/dist/collection/components/q2-grid/q2-grid.js +807 -0
  104. package/dist/collection/components/q2-grid/q2-grid.js.map +1 -0
  105. package/dist/collection/components/q2-grid/test/q2-grid.e2e.js +218 -0
  106. package/dist/collection/components/q2-grid/test/q2-grid.e2e.js.map +1 -0
  107. package/dist/collection/components/q2-grid-area/q2-grid-area.css +110 -0
  108. package/dist/collection/components/q2-grid-area/q2-grid-area.js +1109 -0
  109. package/dist/collection/components/q2-grid-area/q2-grid-area.js.map +1 -0
  110. package/dist/collection/components/q2-grid-area/test/q2-grid-area.e2e.js +196 -0
  111. package/dist/collection/components/q2-grid-area/test/q2-grid-area.e2e.js.map +1 -0
  112. package/dist/collection/components/q2-icon/assets/brand.symbol.svg +1 -1
  113. package/dist/collection/components/q2-icon/assets/browsersos.symbol.svg +1 -0
  114. package/dist/collection/components/q2-icon/assets/cards.symbol.svg +1 -1
  115. package/dist/{q2-tecton-elements/assets/system.symbol.svg → collection/components/q2-icon/assets/devices.symbol.svg} +1 -1
  116. package/dist/collection/components/q2-icon/assets/icon-file-list.json +1 -1
  117. package/dist/collection/components/q2-icon/assets/icon-map.json +1 -1
  118. package/dist/collection/components/q2-icon/assets/legacy.symbol.svg +1 -1
  119. package/dist/collection/components/q2-icon/assets/mobile.symbol.svg +1 -1
  120. package/dist/collection/components/q2-icon/q2-icon.css +7 -1
  121. package/dist/collection/components/q2-icon/q2-icon.js +3 -2
  122. package/dist/collection/components/q2-icon/q2-icon.js.map +1 -1
  123. package/dist/collection/components/q2-icon/test/q2-icon-test.spec.js +3 -3
  124. package/dist/collection/components/q2-icon/test/q2-icon-test.spec.js.map +1 -1
  125. package/dist/collection/components/q2-input/q2-input.js +1 -1
  126. package/dist/collection/components/q2-input/test/q2-input-test.e2e.js +5 -3
  127. package/dist/collection/components/q2-input/test/q2-input-test.e2e.js.map +1 -1
  128. package/dist/collection/components/q2-item/q2-item.css +3 -3
  129. package/dist/collection/components/q2-item/q2-item.js +1 -1
  130. package/dist/collection/components/q2-legend/q2-legend.js +1 -1
  131. package/dist/collection/components/q2-list/q2-list.js +1 -1
  132. package/dist/collection/components/q2-message/q2-message.js +1 -1
  133. package/dist/collection/components/q2-modal/q2-modal.js +1 -1
  134. package/dist/collection/components/q2-optgroup/q2-optgroup.js +1 -1
  135. package/dist/collection/components/q2-option-list/q2-option-list.js +1 -1
  136. package/dist/collection/components/q2-pagination/q2-pagination.js +3 -3
  137. package/dist/collection/components/q2-pill/q2-pill.js +1 -1
  138. package/dist/collection/components/q2-popover/q2-popover.js +40 -5
  139. package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
  140. package/dist/collection/components/q2-popover/test/q2-popover-test.spec.js +2 -2
  141. package/dist/collection/components/q2-popover/test/q2-popover-test.spec.js.map +1 -1
  142. package/dist/collection/components/q2-radio/q2-radio.js +1 -1
  143. package/dist/collection/components/q2-radio-group/q2-radio-group.js +1 -1
  144. package/dist/collection/components/q2-relative-time/q2-relative-time.js +1 -1
  145. package/dist/collection/components/q2-resize-observer/q2-resize-observer.js +1 -1
  146. package/dist/collection/components/q2-section/q2-section.js +2 -2
  147. package/dist/collection/components/q2-select/q2-select.js +2 -2
  148. package/dist/collection/components/q2-stepper/q2-stepper.js +1 -1
  149. package/dist/collection/components/q2-stepper-pane/q2-stepper-pane.js +1 -1
  150. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +1 -1
  151. package/dist/collection/components/q2-tab-container/q2-tab-container.js +1 -1
  152. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +1 -1
  153. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  154. package/dist/collection/components/q2-textarea/q2-textarea.js +1 -1
  155. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +2 -2
  156. package/dist/collection/utils/helpers.js +15 -0
  157. package/dist/collection/utils/helpers.js.map +1 -1
  158. package/dist/collection/utils/index.js +3 -0
  159. package/dist/collection/utils/index.js.map +1 -1
  160. package/dist/components/index.js +4 -0
  161. package/dist/components/index.js.map +1 -1
  162. package/dist/components/index2.js +4 -1
  163. package/dist/components/index2.js.map +1 -1
  164. package/dist/components/q2-action-group2.js +1 -1
  165. package/dist/components/q2-action-sheet.js +1 -1
  166. package/dist/components/q2-avatar2.js +2 -2
  167. package/dist/components/q2-avatar2.js.map +1 -1
  168. package/dist/components/q2-calendar.js +1 -1
  169. package/dist/components/q2-carousel-pane.js +2 -2
  170. package/dist/components/q2-carousel.js +1 -1
  171. package/dist/components/q2-chart-area.js +1 -1
  172. package/dist/components/q2-chart-bar.js +1 -1
  173. package/dist/components/q2-chart-donut.js +1 -1
  174. package/dist/components/q2-checkbox-group.js +2 -2
  175. package/dist/components/q2-checkbox-group.js.map +1 -1
  176. package/dist/components/q2-checkbox2.js +2 -2
  177. package/dist/components/q2-checkbox2.js.map +1 -1
  178. package/dist/components/q2-currency.js +2 -2
  179. package/dist/components/q2-currency.js.map +1 -1
  180. package/dist/components/q2-data-table.js +1 -1
  181. package/dist/components/q2-data-table.js.map +1 -1
  182. package/dist/components/q2-detail.js +1 -1
  183. package/dist/components/q2-dropdown.js +1 -1
  184. package/dist/components/q2-editable-field.js +1 -1
  185. package/dist/components/q2-example.js +1 -1
  186. package/dist/components/q2-file-picker.js +20 -6
  187. package/dist/components/q2-file-picker.js.map +1 -1
  188. package/dist/components/q2-form.js +2 -2
  189. package/dist/components/q2-form.js.map +1 -1
  190. package/dist/components/q2-formatted-text.js +1 -1
  191. package/dist/components/q2-grid-area.d.ts +11 -0
  192. package/dist/components/q2-grid-area.js +190 -0
  193. package/dist/components/q2-grid-area.js.map +1 -0
  194. package/dist/components/q2-grid.d.ts +11 -0
  195. package/dist/components/q2-grid.js +154 -0
  196. package/dist/components/q2-grid.js.map +1 -0
  197. package/dist/components/q2-icon2.js +52 -51
  198. package/dist/components/q2-icon2.js.map +1 -1
  199. package/dist/components/q2-input2.js +1 -1
  200. package/dist/components/q2-item2.js +2 -2
  201. package/dist/components/q2-item2.js.map +1 -1
  202. package/dist/components/q2-legend2.js +1 -1
  203. package/dist/components/q2-list2.js +1 -1
  204. package/dist/components/q2-message2.js +1 -1
  205. package/dist/components/q2-modal.js +1 -1
  206. package/dist/components/q2-month-picker.js +2 -2
  207. package/dist/components/q2-optgroup2.js +1 -1
  208. package/dist/components/q2-option-list2.js +1 -1
  209. package/dist/components/q2-pagination.js +3 -3
  210. package/dist/components/q2-pill.js +1 -1
  211. package/dist/components/q2-popover2.js +17 -5
  212. package/dist/components/q2-popover2.js.map +1 -1
  213. package/dist/components/q2-radio-group.js +1 -1
  214. package/dist/components/q2-radio.js +1 -1
  215. package/dist/components/q2-relative-time.js +1 -1
  216. package/dist/components/q2-resize-observer2.js +1 -1
  217. package/dist/components/q2-section.js +2 -2
  218. package/dist/components/q2-select2.js +3 -3
  219. package/dist/components/q2-stepper-pane.js +1 -1
  220. package/dist/components/q2-stepper-vertical.js +1 -1
  221. package/dist/components/q2-stepper.js +1 -1
  222. package/dist/components/q2-tab-container.js +1 -1
  223. package/dist/components/q2-tab-pane.js +1 -1
  224. package/dist/components/q2-tag.js +1 -1
  225. package/dist/components/q2-textarea.js +1 -1
  226. package/dist/components/tecton-tab-pane.js +2 -2
  227. package/dist/esm/{index-f2a66217.js → index-c215e8ef.js} +5 -2
  228. package/dist/esm/index-c215e8ef.js.map +1 -0
  229. package/dist/esm/loader.js +1 -1
  230. package/dist/esm/q2-action-group.entry.js +2 -2
  231. package/dist/esm/q2-action-sheet.entry.js +2 -2
  232. package/dist/esm/q2-avatar.entry.js +2 -2
  233. package/dist/esm/q2-avatar.entry.js.map +1 -1
  234. package/dist/esm/q2-badge_7.entry.js +56 -55
  235. package/dist/esm/q2-badge_7.entry.js.map +1 -1
  236. package/dist/esm/q2-calendar.entry.js +2 -2
  237. package/dist/esm/q2-card.entry.js +1 -1
  238. package/dist/esm/q2-carousel-pane.entry.js +3 -3
  239. package/dist/esm/q2-carousel.entry.js +2 -2
  240. package/dist/esm/q2-chart-area.entry.js +2 -2
  241. package/dist/esm/q2-chart-bar.entry.js +2 -2
  242. package/dist/esm/q2-chart-donut.entry.js +2 -2
  243. package/dist/esm/q2-checkbox-group.entry.js +3 -3
  244. package/dist/esm/q2-checkbox-group.entry.js.map +1 -1
  245. package/dist/esm/q2-checkbox.entry.js +3 -3
  246. package/dist/esm/q2-checkbox.entry.js.map +1 -1
  247. package/dist/esm/q2-currency.entry.js +2 -2
  248. package/dist/esm/q2-currency.entry.js.map +1 -1
  249. package/dist/esm/q2-data-table.entry.js +2 -2
  250. package/dist/esm/q2-data-table.entry.js.map +1 -1
  251. package/dist/esm/q2-detail.entry.js +2 -2
  252. package/dist/esm/q2-dropdown-item.entry.js +1 -1
  253. package/dist/esm/q2-dropdown.entry.js +2 -2
  254. package/dist/esm/q2-editable-field.entry.js +2 -2
  255. package/dist/esm/q2-example.entry.js +1 -1
  256. package/dist/esm/q2-file-picker.entry.js +20 -7
  257. package/dist/esm/q2-file-picker.entry.js.map +1 -1
  258. package/dist/esm/q2-form.entry.js +2 -2
  259. package/dist/esm/q2-form.entry.js.map +1 -1
  260. package/dist/esm/q2-formatted-text.entry.js +1 -1
  261. package/dist/esm/q2-grid-area.entry.js +129 -0
  262. package/dist/esm/q2-grid-area.entry.js.map +1 -0
  263. package/dist/esm/q2-grid.entry.js +105 -0
  264. package/dist/esm/q2-grid.entry.js.map +1 -0
  265. package/dist/esm/q2-item_3.entry.js +4 -4
  266. package/dist/esm/q2-item_3.entry.js.map +1 -1
  267. package/dist/esm/q2-legend.entry.js +1 -1
  268. package/dist/esm/q2-loc.entry.js +1 -1
  269. package/dist/esm/q2-message.entry.js +2 -2
  270. package/dist/esm/q2-modal.entry.js +2 -2
  271. package/dist/esm/q2-month-picker.entry.js +3 -3
  272. package/dist/esm/q2-optgroup.entry.js +2 -2
  273. package/dist/esm/q2-option-list_2.entry.js +18 -6
  274. package/dist/esm/q2-option-list_2.entry.js.map +1 -1
  275. package/dist/esm/q2-option.entry.js +1 -1
  276. package/dist/esm/q2-pagination.entry.js +4 -4
  277. package/dist/esm/q2-pill.entry.js +2 -2
  278. package/dist/esm/q2-radio-group.entry.js +2 -2
  279. package/dist/esm/q2-radio.entry.js +2 -2
  280. package/dist/esm/q2-relative-time.entry.js +2 -2
  281. package/dist/esm/q2-resize-observer.entry.js +1 -1
  282. package/dist/esm/q2-section.entry.js +3 -3
  283. package/dist/esm/q2-select.entry.js +3 -3
  284. package/dist/esm/q2-stepper-pane.entry.js +2 -2
  285. package/dist/esm/q2-stepper-vertical.entry.js +2 -2
  286. package/dist/esm/q2-stepper.entry.js +2 -2
  287. package/dist/esm/q2-tag.entry.js +2 -2
  288. package/dist/esm/q2-tecton-elements.js +1 -1
  289. package/dist/esm/q2-textarea.entry.js +2 -2
  290. package/dist/esm/q2-tooltip.entry.js +1 -1
  291. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  292. package/dist/q2-tecton-elements/assets/brand.symbol.svg +1 -1
  293. package/dist/q2-tecton-elements/assets/browsersos.symbol.svg +1 -0
  294. package/dist/q2-tecton-elements/assets/cards.symbol.svg +1 -1
  295. package/dist/{collection/components/q2-icon/assets/system.symbol.svg → q2-tecton-elements/assets/devices.symbol.svg} +1 -1
  296. package/dist/q2-tecton-elements/assets/icon-file-list.json +1 -1
  297. package/dist/q2-tecton-elements/assets/icon-map.json +1 -1
  298. package/dist/q2-tecton-elements/assets/legacy.symbol.svg +1 -1
  299. package/dist/q2-tecton-elements/assets/mobile.symbol.svg +1 -1
  300. package/dist/q2-tecton-elements/{index-f2a66217.js → index-c215e8ef.js} +6 -2
  301. package/dist/q2-tecton-elements/index-c215e8ef.js.map +1 -0
  302. package/dist/q2-tecton-elements/q2-action-group.entry.js +4 -4
  303. package/dist/q2-tecton-elements/q2-action-sheet.entry.js +9 -9
  304. package/dist/q2-tecton-elements/q2-avatar.entry.js +7 -7
  305. package/dist/q2-tecton-elements/q2-avatar.entry.js.map +1 -1
  306. package/dist/q2-tecton-elements/q2-badge_7.entry.js +70 -68
  307. package/dist/q2-tecton-elements/q2-badge_7.entry.js.map +1 -1
  308. package/dist/q2-tecton-elements/q2-calendar.entry.js +3 -3
  309. package/dist/q2-tecton-elements/q2-card.entry.js +1 -1
  310. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +4 -4
  311. package/dist/q2-tecton-elements/q2-carousel.entry.js +2 -2
  312. package/dist/q2-tecton-elements/q2-chart-area.entry.js +3 -3
  313. package/dist/q2-tecton-elements/q2-chart-bar.entry.js +80 -80
  314. package/dist/q2-tecton-elements/q2-chart-donut.entry.js +101 -101
  315. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +11 -11
  316. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js.map +1 -1
  317. package/dist/q2-tecton-elements/q2-checkbox.entry.js +12 -12
  318. package/dist/q2-tecton-elements/q2-checkbox.entry.js.map +1 -1
  319. package/dist/q2-tecton-elements/q2-currency.entry.js +7 -7
  320. package/dist/q2-tecton-elements/q2-currency.entry.js.map +1 -1
  321. package/dist/q2-tecton-elements/q2-data-table.entry.js +2 -2
  322. package/dist/q2-tecton-elements/q2-data-table.entry.js.map +1 -1
  323. package/dist/q2-tecton-elements/q2-detail.entry.js +4 -4
  324. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +1 -1
  325. package/dist/q2-tecton-elements/q2-dropdown.entry.js +6 -6
  326. package/dist/q2-tecton-elements/q2-editable-field.entry.js +2 -2
  327. package/dist/q2-tecton-elements/q2-example.entry.js +1 -1
  328. package/dist/q2-tecton-elements/q2-file-picker.entry.js +31 -20
  329. package/dist/q2-tecton-elements/q2-file-picker.entry.js.map +1 -1
  330. package/dist/q2-tecton-elements/q2-form.entry.js +10 -10
  331. package/dist/q2-tecton-elements/q2-form.entry.js.map +1 -1
  332. package/dist/q2-tecton-elements/q2-formatted-text.entry.js +2 -2
  333. package/dist/q2-tecton-elements/q2-grid-area.entry.js +135 -0
  334. package/dist/q2-tecton-elements/q2-grid-area.entry.js.map +1 -0
  335. package/dist/q2-tecton-elements/q2-grid.entry.js +114 -0
  336. package/dist/q2-tecton-elements/q2-grid.entry.js.map +1 -0
  337. package/dist/q2-tecton-elements/q2-item_3.entry.js +20 -20
  338. package/dist/q2-tecton-elements/q2-item_3.entry.js.map +1 -1
  339. package/dist/q2-tecton-elements/q2-legend.entry.js +2 -2
  340. package/dist/q2-tecton-elements/q2-loc.entry.js +1 -1
  341. package/dist/q2-tecton-elements/q2-message.entry.js +6 -6
  342. package/dist/q2-tecton-elements/q2-modal.entry.js +18 -18
  343. package/dist/q2-tecton-elements/q2-month-picker.entry.js +30 -30
  344. package/dist/q2-tecton-elements/q2-optgroup.entry.js +5 -5
  345. package/dist/q2-tecton-elements/q2-option-list_2.entry.js +41 -31
  346. package/dist/q2-tecton-elements/q2-option-list_2.entry.js.map +1 -1
  347. package/dist/q2-tecton-elements/q2-option.entry.js +1 -1
  348. package/dist/q2-tecton-elements/q2-pagination.entry.js +25 -25
  349. package/dist/q2-tecton-elements/q2-pill.entry.js +14 -14
  350. package/dist/q2-tecton-elements/q2-radio-group.entry.js +32 -32
  351. package/dist/q2-tecton-elements/q2-radio.entry.js +9 -9
  352. package/dist/q2-tecton-elements/q2-relative-time.entry.js +2 -2
  353. package/dist/q2-tecton-elements/q2-resize-observer.entry.js +1 -1
  354. package/dist/q2-tecton-elements/q2-section.entry.js +19 -19
  355. package/dist/q2-tecton-elements/q2-select.entry.js +6 -6
  356. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +12 -12
  357. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +37 -37
  358. package/dist/q2-tecton-elements/q2-stepper.entry.js +22 -22
  359. package/dist/q2-tecton-elements/q2-tag.entry.js +6 -6
  360. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  361. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
  362. package/dist/q2-tecton-elements/q2-textarea.entry.js +3 -3
  363. package/dist/q2-tecton-elements/q2-tooltip.entry.js +1 -1
  364. package/dist/q2-tecton-elements/tecton-tab-pane.entry.js +6 -6
  365. package/dist/types/components/q2-file-picker/q2-file-picker.d.ts +31 -17
  366. package/dist/types/components/q2-grid/q2-grid.d.ts +157 -0
  367. package/dist/types/components/q2-grid-area/q2-grid-area.d.ts +168 -0
  368. package/dist/types/components/q2-icon/q2-icon.d.ts +1 -0
  369. package/dist/types/components/q2-popover/q2-popover.d.ts +23 -0
  370. package/dist/types/components.d.ts +698 -6
  371. package/dist/types/util.d.ts +2 -2
  372. package/dist/types/utils/helpers.d.ts +1 -0
  373. package/dist/types/utils/index.d.ts +1 -0
  374. package/package.json +3 -3
  375. package/dist/cjs/index-905f4c87.js.map +0 -1
  376. package/dist/esm/index-f2a66217.js.map +0 -1
  377. package/dist/q2-tecton-elements/index-f2a66217.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"q2-file-picker.js","sourceRoot":"","sources":["../../../../src/components/q2-file-picker/q2-file-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ComponentInterface,\n Element,\n Event,\n EventEmitter,\n Fragment,\n h,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { hasSlotContent, loc } from 'src/utils';\n\ntype FileStatus = 'invalid-type' | 'over-size-limit' | 'over-max-files-limit' | 'in-progress' | 'failed' | 'uploaded';\nexport type FilesObject = {\n invalidFiles: {\n file: File;\n status: 'invalid-type' | 'over-size-limit' | 'over-max-files-limit' | 'in-progress' | 'failed' | 'uploaded';\n }[];\n validFiles: File[];\n};\n\n@Component({\n tag: 'q2-file-picker',\n styleUrl: 'q2-file-picker.scss',\n shadow: true,\n})\nexport class Q2FilePicker implements ComponentInterface {\n // #region Own Properties\n\n browseButtonInput: HTMLElement;\n dropZone: HTMLElement;\n fileItemsToBeDeleted;\n queuedFiles: File[] = [];\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n areFilesUploading: boolean = false;\n\n @State()\n displayedFiles: {\n file: File;\n status: FileStatus;\n toBeRemoved?: boolean;\n }[] = [];\n\n @State()\n isDropZoneHighlighted: boolean = false;\n\n @State()\n refreshCounter = 0;\n\n // #endregion\n // #region Public Property API\n\n /**\n * A description of the field. This is announced by screen readers when the field is focused.\n * @localizable\n */\n @Prop({ reflect: true })\n description: string;\n\n /**\n * Allowed file types based on extensions (e.g., ['jpg', 'png', 'pdf'] or\n * 'jpg, png, pdf'). When using the attribute, provide a comma-separated\n * string (e.g., 'jpg, png, pdf'). Arrays can only be set programmatically\n * via JavaScript.\n */\n @Prop({ reflect: true })\n fileTypes: string[] | string = [];\n\n /**\n * The label for the field. This is announced by screen readers when the field is focused.\n * @localizable\n */\n @Prop({ reflect: true })\n label: string;\n\n /**\n * The maximum number of files that can be selected.\n */\n @Prop({ reflect: true })\n // maxFiles: number | string = Infinity;\n maxFiles: number = Infinity;\n\n /**\n * The maximum size (in bytes) of any file that can be selected.\n */\n @Prop({ reflect: true })\n maxFileSize: number = Infinity;\n\n /**\n * An array of objects representing the status of the files being uploaded.\n * Each object should have a `name` property (the file name) and a `status`\n * property (the status of the file) that equals either 'in-progress',\n * 'failed' or 'uploaded'.\n */\n @Prop({ reflect: true })\n status: { name: string; status: 'in-progress' | 'failed' | 'uploaded' }[] = [];\n\n /**\n * Returns an array of File objects representing the files selected by the\n * user. If no files are selected, the value is an empty array.\n * @readonly\n */\n @Prop({ mutable: true })\n value: FilesObject = { invalidFiles: [], validFiles: [] }; // Ensure FilesObject is exported or imported correctly\n\n /**\n * Determines if the file picker is a browse button or a drop zone with a\n * browse link.\n */\n @Prop({ reflect: true })\n variant: 'browse' | 'browse-drop' = 'browse';\n\n // #endregion\n // #region Events\n\n @Event()\n tctChange: EventEmitter<FilesObject>;\n\n // #endregion\n // #region Watchers\n\n @Watch('status')\n updateFileList(newValue: { name: string; status: FileStatus }[]) {\n newValue.forEach(statusItem => {\n const matchingQueuedFileIndex = this.queuedFiles.findIndex(file => file.name === statusItem.name);\n if (matchingQueuedFileIndex > -1) {\n const matchingFile = this.queuedFiles.splice(matchingQueuedFileIndex, 1)[0];\n this.displayedFiles = [{ file: matchingFile, status: statusItem.status }, ...this.displayedFiles];\n } else {\n const matchingDisplayedFileIndex = this.displayedFiles.findIndex(\n file => file.file.name === statusItem.name\n );\n if (matchingDisplayedFileIndex > -1) {\n this.displayedFiles[matchingDisplayedFileIndex].status = statusItem.status;\n this.disableLoaderIfAllFilesUploaded();\n }\n }\n });\n }\n\n // #endregion\n // #region Local Methods\n\n get dropZoneClasses() {\n const classes = ['drop-zone'];\n if (this.isDropZoneHighlighted) {\n classes.push('drop-zone-highlighted');\n }\n\n return classes.join(' ');\n }\n\n get fileTypesArray() {\n return Array.isArray(this.fileTypes) ? this.fileTypes : this.fileTypes.split(',').map(type => type.trim());\n }\n\n get hasDescription() {\n return !!this.description || this.hasDescriptionSlotContent;\n }\n\n get hasDescriptionSlotContent() {\n return hasSlotContent(this.el, 'description');\n }\n\n get hasLabel() {\n return !!this.label || this.hasLabelSlotContent;\n }\n\n get hasLabelSlotContent() {\n return hasSlotContent(this.el, 'label');\n }\n\n buildFilesObject(filesToUpload: File[]): FilesObject {\n const invalidFiles = [];\n invalidFiles.push(...this.extractFilesOfInvalidTypes(filesToUpload));\n invalidFiles.push(...this.extractFilesOverSizeLimit(filesToUpload));\n invalidFiles.push(...this.extractFilesOverMaxFilesLimit(filesToUpload));\n this.displayedFiles = [...invalidFiles];\n\n if (filesToUpload.length === 0) {\n this.areFilesUploading = false;\n } else {\n this.queuedFiles = filesToUpload;\n }\n\n return { invalidFiles, validFiles: filesToUpload };\n }\n\n dimDropZone = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = false;\n };\n\n disableEvent(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n disableLoaderIfAllFilesUploaded() {\n if (this.queuedFiles.length === 0 && !this.displayedFiles.some(file => file.status === 'in-progress')) {\n this.areFilesUploading = false;\n }\n }\n\n emitChange(filesObject: FilesObject) {\n this.areFilesUploading = filesObject.validFiles.length > 0;\n this.tctChange.emit(filesObject);\n }\n\n extractFilesOfInvalidTypes(files: File[]) {\n const invalidFiles = [];\n\n if (this.fileTypesArray.length === 0) return invalidFiles;\n\n files.forEach(file => {\n const fileExtension = file.name.split('.').pop().toLowerCase();\n if (!this.fileTypesArray.includes(fileExtension)) {\n invalidFiles.push({ file, status: 'invalid-type' });\n }\n });\n\n // Remove invalid files from the files array\n invalidFiles.forEach(invalidFile => {\n const index = files.indexOf(invalidFile.file);\n if (index > -1) {\n files.splice(index, 1);\n }\n });\n\n return invalidFiles;\n }\n\n extractFilesOverMaxFilesLimit(files: File[]) {\n const filesOverMaxFilesLimit = [];\n\n if (this.maxFiles === Infinity) return filesOverMaxFilesLimit;\n\n if (files.length > this.maxFiles) {\n const excessFiles = files.splice(this.maxFiles);\n excessFiles.forEach(file => {\n filesOverMaxFilesLimit.push({ file, status: 'over-max-files-limit' });\n });\n }\n\n return filesOverMaxFilesLimit;\n }\n\n extractFilesOverSizeLimit(files: File[]) {\n const filesOverSizeLimit = [];\n\n if (this.maxFileSize === Infinity) return filesOverSizeLimit;\n\n files.forEach(file => {\n if (file.size > this.maxFileSize) {\n filesOverSizeLimit.push({ file, status: 'over-size-limit' });\n }\n });\n\n // Remove files over size limit from the files array\n filesOverSizeLimit.forEach(overSizeFile => {\n const index = files.indexOf(overSizeFile.file);\n if (index > -1) {\n files.splice(index, 1);\n }\n });\n\n return filesOverSizeLimit;\n }\n\n forceRerender() {\n this.refreshCounter += 1; // Triggers re-render\n }\n\n getAnimationendHandlerToRemoveFileItem(fileName: string) {\n return (e: AnimationEvent) => {\n if (e.animationName === 'shrinkToCenterFadeOut') {\n this.displayedFiles = this.displayedFiles.filter(file => file.file.name !== fileName);\n }\n };\n }\n\n getClickHandlerToRemoveFileItem(fileName: string) {\n return () => {\n const fileToDelete = this.displayedFiles.find(file => file.file.name === fileName);\n if (fileToDelete) {\n fileToDelete.toBeRemoved = true;\n this.forceRerender();\n }\n };\n }\n\n getFileItemClasses(fileName: string) {\n const classes = ['file-item'];\n const matchingFile = this.displayedFiles.find(file => file.file.name === fileName);\n if (matchingFile?.toBeRemoved) {\n classes.push('fade-out');\n } else {\n classes.push('fade-in');\n }\n return classes.join(' ');\n }\n\n getFileItemStatusMessage(status: FileStatus, size: number) {\n switch (status) {\n case 'invalid-type':\n return loc('tecton.element.filePicker.unsupportedFileType');\n case 'over-size-limit':\n return loc('tecton.element.filePicker.sizeExceedsLimit');\n case 'over-max-files-limit':\n return loc('tecton.element.filePicker.overMaxFilesLimit');\n case 'in-progress':\n return loc('tecton.element.filePicker.uploadingEllipsis');\n case 'failed':\n return loc('tecton.element.filePicker.uploadFailed');\n case 'uploaded':\n default:\n return loc('tecton.element.filePicker.fileSize', [(size / (1000 * 1000)).toFixed(2)]);\n }\n }\n\n grabDroppedFiles = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = false;\n const droppedFiles = Array.from(e.dataTransfer.files);\n const filesObject = this.buildFilesObject(droppedFiles);\n\n this.emitChange(filesObject);\n this.value = filesObject;\n };\n\n grabSelectedFiles = (e: Event) => {\n const selectedFiles = Array.from((e.target as HTMLInputElement).files);\n const filesObject = this.buildFilesObject(selectedFiles);\n\n this.emitChange(filesObject);\n this.value = filesObject;\n };\n\n highlightDropZone = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = true;\n };\n\n launchFileBrowser() {\n this.browseButtonInput.dispatchEvent(new MouseEvent('click'));\n }\n\n // #endregion\n // #region Render Methods\n\n render = () => {\n return (\n <div class=\"file-picker\">\n {(this.hasLabel || this.hasDescription) && (\n <div class=\"heading\">\n {this.hasLabel && (\n <label\n class=\"label\"\n htmlFor=\"file-field\"\n test-id=\"label\"\n >\n {!!this.label ? loc(this.label) : this.hasLabelSlotContent ? <slot name=\"label\" /> : ''}\n </label>\n )}\n {this.hasDescription && (\n <div\n class=\"description\"\n id=\"description\"\n test-id=\"description\"\n >\n {!!this.description ? (\n loc(this.description)\n ) : this.hasDescriptionSlotContent ? (\n <slot name=\"description\" />\n ) : (\n ''\n )}\n </div>\n )}\n </div>\n )}\n\n {(this.variant === 'browse-drop' && (\n <div\n class={this.dropZoneClasses}\n onDragEnter={this.disableEvent}\n onDragLeave={this.dimDropZone}\n onDragOver={this.highlightDropZone}\n onDrop={this.grabDroppedFiles}\n ref={el => (this.dropZone = el ?? this.dropZone)}\n test-id=\"drop-zone\"\n >\n {(this.areFilesUploading && (\n <Fragment>\n <q2-loading class=\"loading\"></q2-loading>\n <p class=\"drop-zone-text\">{loc('tecton.element.filePicker.uploadingEllipsis')}</p>\n </Fragment>\n )) || (\n <Fragment>\n <q2-icon type=\"upload\"></q2-icon>\n <p class=\"drop-zone-text\">\n <q2-link\n label={loc('tecton.element.filePicker.browse')}\n onTctClick={() => this.launchFileBrowser()}\n variant=\"inline\"\n test-id=\"browse-link\"\n href=\"javascript:void(0)\"\n />\n {loc('tecton.element.filePicker.orDragFilesHere', [this.maxFiles])}\n </p>\n </Fragment>\n )}\n </div>\n )) || (\n <div\n class=\"browse\"\n test-id=\"browse\"\n >\n <q2-btn\n disabled={this.areFilesUploading}\n intent=\"workflow-primary\"\n loading={this.areFilesUploading}\n onClick={() => this.launchFileBrowser()}\n size=\"medium\"\n test-id=\"browse-button\"\n >\n <q2-icon type=\"paperclip\"></q2-icon>\n <span>{loc('tecton.element.filePicker.attachFiles', [this.maxFiles])}</span>\n </q2-btn>\n </div>\n )}\n <input\n aria-describedby={(!!this.description && 'description') || undefined}\n class=\"sr\"\n id=\"file-field\"\n onChange={this.grabSelectedFiles}\n ref={el => (this.browseButtonInput = el ?? this.browseButtonInput)}\n type=\"file\"\n test-id=\"file-input\"\n multiple\n />\n <div class=\"file-list-container\">\n <q2-list class=\"file-list\">\n {this.displayedFiles.map(file => (\n <q2-item\n class={this.getFileItemClasses(file.file.name)}\n key={file.file.name}\n onAnimationEnd={this.getAnimationendHandlerToRemoveFileItem(file.file.name)}\n >\n <div slot=\"bullet\">\n {file.status === 'invalid-type' ||\n file.status === 'over-size-limit' ||\n file.status === 'failed' ||\n file.status === 'over-max-files-limit' ? (\n <q2-icon\n class=\"icon-error\"\n type=\"error\"\n ></q2-icon>\n ) : file.status === 'in-progress' ? (\n <q2-loading class=\"file-item-loading\"></q2-loading>\n ) : (\n <q2-icon\n class=\"icon-success\"\n type=\"success\"\n ></q2-icon>\n )}\n </div>\n <div slot=\"header\">{file.file.name}</div>\n <div slot=\"body\">{this.getFileItemStatusMessage(file.status, file.file.size)}</div>\n <div slot=\"action\">\n <q2-btn\n class=\"dismiss-button\"\n intent=\"neutral-text\"\n onClick={this.getClickHandlerToRemoveFileItem(file.file.name)}\n >\n <q2-icon type=\"close\"></q2-icon>\n </q2-btn>\n </div>\n </q2-item>\n ))}\n </q2-list>\n </div>\n </div>\n );\n };\n\n // #endregion\n}\n"]}
1
+ {"version":3,"file":"q2-file-picker.js","sourceRoot":"","sources":["../../../../src/components/q2-file-picker/q2-file-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ComponentInterface,\n Element,\n Event,\n EventEmitter,\n Fragment,\n h,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { hasSlotContent, loc } from 'src/utils';\n\ntype DisplayedFile = {\n file: File;\n message?: string;\n status: FileStatus;\n toBeRemoved?: boolean;\n};\ntype UploadFileStatus = 'in-progress' | 'failed' | 'uploaded';\ntype FileStatus = UploadFileStatus | 'invalid-type' | 'over-size-limit' | 'over-max-files-limit';\nexport type StatusFile = {\n name: string;\n status: UploadFileStatus;\n message?: string;\n};\nexport type FilesObject = {\n invalidFiles: {\n file: File;\n status: 'invalid-type' | 'over-size-limit' | 'over-max-files-limit' | 'in-progress' | 'failed' | 'uploaded';\n }[];\n validFiles: File[];\n};\n@Component({\n tag: 'q2-file-picker',\n styleUrl: 'q2-file-picker.scss',\n shadow: true,\n})\nexport class Q2FilePicker implements ComponentInterface {\n // #region Own Properties\n\n browseButtonInput: HTMLElement;\n dropZone: HTMLElement;\n fileItemsToBeDeleted;\n queuedFiles: File[] = [];\n\n // #endregion\n // #region Host HTML Element\n\n @Element()\n el: HTMLElement;\n\n // #endregion\n // #region State Properties\n\n @State()\n areFilesUploading: boolean = false;\n\n @State()\n displayedFiles: DisplayedFile[] = [];\n\n @State()\n isDropZoneHighlighted: boolean = false;\n\n @State()\n refreshCounter = 0;\n\n // #endregion\n // #region Public Property API\n\n /**\n * The size of the browse button. Can be 'none', 'small', 'medium', or 'large'.\n */\n @Prop({ reflect: true })\n buttonSize: 'none' | 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * A description of the field. This is announced by screen readers when the field is focused.\n * @localizable\n */\n @Prop({ reflect: true })\n description: string;\n\n /**\n * Allowed file types based on extensions (e.g., ['jpg', 'png', 'pdf'] or\n * 'jpg, png, pdf'). When using the attribute, provide a comma-separated\n * string (e.g., 'jpg, png, pdf'). Arrays can only be set programmatically\n * via JavaScript.\n */\n @Prop({ reflect: true })\n fileTypes: string[] | string = [];\n\n /**\n * The label for the field. This is announced by screen readers when the field is focused.\n * @localizable\n */\n @Prop({ reflect: true })\n label: string;\n\n /**\n * The maximum number of files that can be selected.\n */\n @Prop({ reflect: true })\n // maxFiles: number | string = Infinity;\n maxFiles: number = Infinity;\n\n /**\n * The maximum size (in bytes) of any file that can be selected.\n */\n @Prop({ reflect: true })\n maxFileSize: number = Infinity;\n\n /**\n * An array of objects representing the status of the files being uploaded.\n * Each object should have a `name` property (the file name), a `status`\n * property (the status of the file) that equals either 'in-progress',\n * 'failed', or 'uploaded', and an optional `message` property.\n *\n * Custom messages provided in the `message` property will only be used for\n * failed uploads (`status: 'failed'`). This allows for more specific error\n * messages in failure scenarios, while ensuring that all other file status\n * messages remain consistent and aligned with approved design/UX standards.\n * Custom messages for failed uploads are limited to a single line.\n * @localizable\n */\n @Prop({ reflect: true })\n status: StatusFile[] = [];\n\n /**\n * Returns an array of File objects representing the files selected by the\n * user. If no files are selected, the value is an empty array.\n * @readonly\n */\n @Prop({ mutable: true })\n value: FilesObject = { invalidFiles: [], validFiles: [] };\n\n /**\n * Determines if the file picker is a browse button or a drop zone with a\n * browse link.\n */\n @Prop({ reflect: true })\n variant: 'browse' | 'browse-drop' = 'browse';\n\n // #endregion\n // #region Events\n\n @Event()\n tctChange: EventEmitter<FilesObject>;\n\n // #endregion\n // #region Watchers\n\n @Watch('status')\n updateFileList(newValue: StatusFile[]) {\n newValue.forEach(statusItem => {\n const matchingQueuedFileIndex = this.queuedFiles.findIndex(file => file.name === statusItem.name);\n if (matchingQueuedFileIndex > -1) {\n const matchingFile = this.queuedFiles.splice(matchingQueuedFileIndex, 1)[0];\n this.displayedFiles = [{ file: matchingFile, status: statusItem.status }, ...this.displayedFiles];\n } else {\n const matchingDisplayedFileIndex = this.displayedFiles.findIndex(\n file => file.file.name === statusItem.name\n );\n if (matchingDisplayedFileIndex > -1) {\n this.displayedFiles[matchingDisplayedFileIndex].status = statusItem.status;\n if (statusItem.status === 'failed' && statusItem.message) {\n this.displayedFiles[matchingDisplayedFileIndex].message = statusItem.message;\n }\n this.disableLoaderIfAllFilesUploaded();\n }\n }\n });\n }\n\n // #endregion\n // #region Local Methods\n\n get actualButtonSize() {\n return this.buttonSize === 'none' ? undefined : this.buttonSize;\n }\n\n get dropZoneClasses() {\n const classes = ['drop-zone'];\n if (this.isDropZoneHighlighted) {\n classes.push('drop-zone-highlighted');\n }\n\n return classes.join(' ');\n }\n\n get fileTypesArray() {\n return Array.isArray(this.fileTypes) ? this.fileTypes : this.fileTypes.split(',').map(type => type.trim());\n }\n\n get hasDescription() {\n return !!this.description || this.hasDescriptionSlotContent;\n }\n\n get hasDescriptionSlotContent() {\n return hasSlotContent(this.el, 'description');\n }\n\n get hasLabel() {\n return !!this.label || this.hasLabelSlotContent;\n }\n\n get hasLabelSlotContent() {\n return hasSlotContent(this.el, 'label');\n }\n\n buildFilesObject(filesToUpload: File[]): FilesObject {\n const invalidFiles = [];\n invalidFiles.push(...this.extractFilesOfInvalidTypes(filesToUpload));\n invalidFiles.push(...this.extractFilesOverSizeLimit(filesToUpload));\n invalidFiles.push(...this.extractFilesOverMaxFilesLimit(filesToUpload));\n this.displayedFiles = [...invalidFiles];\n\n if (filesToUpload.length === 0) {\n this.areFilesUploading = false;\n } else {\n this.queuedFiles = filesToUpload;\n }\n\n return { invalidFiles, validFiles: filesToUpload };\n }\n\n dimDropZone = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = false;\n };\n\n disableEvent(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n disableLoaderIfAllFilesUploaded() {\n if (this.queuedFiles.length === 0 && !this.displayedFiles.some(file => file.status === 'in-progress')) {\n this.areFilesUploading = false;\n }\n }\n\n emitChange(filesObject: FilesObject) {\n this.areFilesUploading = filesObject.validFiles.length > 0;\n this.tctChange.emit(filesObject);\n }\n\n extractFilesOfInvalidTypes(files: File[]) {\n const invalidFiles = [];\n\n if (this.fileTypesArray.length === 0) return invalidFiles;\n\n files.forEach(file => {\n const fileExtension = file.name.split('.').pop().toLowerCase();\n if (!this.fileTypesArray.includes(fileExtension)) {\n invalidFiles.push({ file, status: 'invalid-type' });\n }\n });\n\n // Remove invalid files from the files array\n invalidFiles.forEach(invalidFile => {\n const index = files.indexOf(invalidFile.file);\n if (index > -1) {\n files.splice(index, 1);\n }\n });\n\n return invalidFiles;\n }\n\n extractFilesOverMaxFilesLimit(files: File[]) {\n const filesOverMaxFilesLimit = [];\n\n if (this.maxFiles === Infinity) return filesOverMaxFilesLimit;\n\n if (files.length > this.maxFiles) {\n const excessFiles = files.splice(this.maxFiles);\n excessFiles.forEach(file => {\n filesOverMaxFilesLimit.push({ file, status: 'over-max-files-limit' });\n });\n }\n\n return filesOverMaxFilesLimit;\n }\n\n extractFilesOverSizeLimit(files: File[]) {\n const filesOverSizeLimit = [];\n\n if (this.maxFileSize === Infinity) return filesOverSizeLimit;\n\n files.forEach(file => {\n if (file.size > this.maxFileSize) {\n filesOverSizeLimit.push({ file, status: 'over-size-limit' });\n }\n });\n\n // Remove files over size limit from the files array\n filesOverSizeLimit.forEach(overSizeFile => {\n const index = files.indexOf(overSizeFile.file);\n if (index > -1) {\n files.splice(index, 1);\n }\n });\n\n return filesOverSizeLimit;\n }\n\n forceRerender() {\n this.refreshCounter += 1; // Triggers re-render\n }\n\n getAnimationendHandlerToRemoveFileItem(fileName: string) {\n return (e: AnimationEvent) => {\n if (e.animationName === 'shrinkToCenterFadeOut') {\n this.displayedFiles = this.displayedFiles.filter(file => file.file.name !== fileName);\n }\n };\n }\n\n getClickHandlerToRemoveFileItem(fileName: string) {\n return () => {\n const fileToDelete = this.displayedFiles.find(file => file.file.name === fileName);\n if (fileToDelete) {\n fileToDelete.toBeRemoved = true;\n this.forceRerender();\n }\n };\n }\n\n getFileItemClasses(fileName: string) {\n const classes = ['file-item'];\n const matchingFile = this.displayedFiles.find(file => file.file.name === fileName);\n if (matchingFile?.toBeRemoved) {\n classes.push('fade-out');\n } else {\n classes.push('fade-in');\n }\n return classes.join(' ');\n }\n\n getFileItemStatusMessage(displayedFile: DisplayedFile) {\n switch (displayedFile.status) {\n case 'invalid-type':\n return loc('tecton.element.filePicker.unsupportedFileType');\n case 'over-size-limit':\n return loc('tecton.element.filePicker.sizeExceedsLimit');\n case 'over-max-files-limit':\n return loc('tecton.element.filePicker.overMaxFilesLimit');\n case 'in-progress':\n return loc('tecton.element.filePicker.uploadingEllipsis');\n case 'failed':\n if (displayedFile.message) return loc(displayedFile.message);\n return loc('tecton.element.filePicker.uploadFailed');\n case 'uploaded':\n default:\n return loc('tecton.element.filePicker.fileSize', [\n (displayedFile.file.size / (1000 * 1000)).toFixed(2),\n ]);\n }\n }\n\n grabDroppedFiles = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = false;\n const droppedFiles = Array.from(e.dataTransfer.files);\n const filesObject = this.buildFilesObject(droppedFiles);\n\n this.emitChange(filesObject);\n this.value = filesObject;\n };\n\n grabSelectedFiles = (e: Event) => {\n const selectedFiles = Array.from((e.target as HTMLInputElement).files);\n const filesObject = this.buildFilesObject(selectedFiles);\n // Reset the input value to allow re-selection of the same file\n (this.browseButtonInput as HTMLInputElement).value = '';\n\n this.emitChange(filesObject);\n this.value = filesObject;\n };\n\n highlightDropZone = (e: DragEvent) => {\n this.disableEvent(e);\n this.isDropZoneHighlighted = true;\n };\n\n launchFileBrowser() {\n this.browseButtonInput.dispatchEvent(new MouseEvent('click'));\n }\n\n // #endregion\n // #region Render Methods\n\n render = () => {\n return (\n <div class=\"file-picker\">\n {(this.hasLabel || this.hasDescription) && (\n <div class=\"heading\">\n {this.hasLabel && (\n <label\n class=\"label\"\n htmlFor=\"file-field\"\n test-id=\"label\"\n >\n {!!this.label ? loc(this.label) : this.hasLabelSlotContent ? <slot name=\"label\" /> : ''}\n </label>\n )}\n {this.hasDescription && (\n <div\n class=\"description\"\n id=\"description\"\n test-id=\"description\"\n >\n {!!this.description ? (\n loc(this.description)\n ) : this.hasDescriptionSlotContent ? (\n <slot name=\"description\" />\n ) : (\n ''\n )}\n </div>\n )}\n </div>\n )}\n\n {(this.variant === 'browse-drop' && (\n <div\n class={this.dropZoneClasses}\n onDragEnter={this.disableEvent}\n onDragLeave={this.dimDropZone}\n onDragOver={this.highlightDropZone}\n onDrop={this.grabDroppedFiles}\n ref={el => (this.dropZone = el ?? this.dropZone)}\n test-id=\"drop-zone\"\n >\n {(this.areFilesUploading && (\n <Fragment>\n <q2-loading class=\"loading\"></q2-loading>\n <p class=\"drop-zone-text\">{loc('tecton.element.filePicker.uploadingEllipsis')}</p>\n </Fragment>\n )) || (\n <Fragment>\n <q2-icon type=\"upload\"></q2-icon>\n <p class=\"drop-zone-text\">\n <q2-link\n label={loc('tecton.element.filePicker.browse')}\n onTctClick={() => this.launchFileBrowser()}\n variant=\"inline\"\n test-id=\"browse-link\"\n href=\"javascript:void(0)\"\n />\n {loc('tecton.element.filePicker.orDragFilesHere', [this.maxFiles])}\n </p>\n </Fragment>\n )}\n </div>\n )) || (\n <div\n class=\"browse\"\n test-id=\"browse\"\n >\n <q2-btn\n disabled={this.areFilesUploading}\n intent=\"workflow-primary\"\n loading={this.areFilesUploading}\n onClick={() => this.launchFileBrowser()}\n size={this.actualButtonSize}\n test-id=\"browse-button\"\n >\n <q2-icon type=\"paperclip\"></q2-icon>\n <span>{loc('tecton.element.filePicker.attachFiles', [this.maxFiles])}</span>\n </q2-btn>\n </div>\n )}\n <input\n aria-describedby={(!!this.description && 'description') || undefined}\n class=\"sr\"\n id=\"file-field\"\n onChange={this.grabSelectedFiles}\n ref={el => (this.browseButtonInput = el ?? this.browseButtonInput)}\n type=\"file\"\n test-id=\"file-input\"\n multiple\n />\n <div class=\"file-list-container\">\n <q2-list class=\"file-list\">\n {this.displayedFiles.map(file => (\n <q2-item\n class={this.getFileItemClasses(file.file.name)}\n key={file.file.name}\n onAnimationEnd={this.getAnimationendHandlerToRemoveFileItem(file.file.name)}\n >\n <div slot=\"bullet\">\n {file.status === 'invalid-type' ||\n file.status === 'over-size-limit' ||\n file.status === 'failed' ||\n file.status === 'over-max-files-limit' ? (\n <q2-icon\n class=\"icon-error\"\n type=\"error\"\n ></q2-icon>\n ) : file.status === 'in-progress' ? (\n <q2-loading class=\"file-item-loading\"></q2-loading>\n ) : (\n <q2-icon\n class=\"icon-success\"\n type=\"success\"\n ></q2-icon>\n )}\n </div>\n <div slot=\"header\">{file.file.name}</div>\n <div\n class=\"file-item-info\"\n slot=\"body\"\n >\n {this.getFileItemStatusMessage(file)}\n </div>\n <div slot=\"action\">\n <q2-btn\n class=\"dismiss-button\"\n intent=\"neutral-text\"\n onClick={this.getClickHandlerToRemoveFileItem(file.file.name)}\n >\n <q2-icon type=\"close\"></q2-icon>\n </q2-btn>\n </div>\n </q2-item>\n ))}\n </q2-list>\n </div>\n </div>\n );\n };\n\n // #endregion\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { evaluateA11y, setup } from "../../../utils/helpers";
2
+ import path from "path";
2
3
  describe('q2-legend', () => {
3
4
  describe('[A11y] guideline compliance', () => {
4
5
  it('Does not have accessibility violations', async () => {
@@ -7,5 +8,29 @@ describe('q2-legend', () => {
7
8
  expect(hasViolations).toBe(false);
8
9
  });
9
10
  });
11
+ describe('File chooser', () => {
12
+ it('emits change event after selecting the same file twice', async () => {
13
+ const page = await setup({ html: `<q2-file-picker label="Label" description="Description" />` });
14
+ const fileInput = await page.find('q2-file-picker >>> [test-id="file-input"]');
15
+ const filePath = path.resolve(__dirname, 'q2-file-picker-test-text-file.txt');
16
+ const spy = await page.spyOnEvent('tctChange');
17
+ // Ensure the file input is visible and interactable
18
+ await page.evaluate(() => {
19
+ const input = document
20
+ .querySelector('q2-file-picker')
21
+ .shadowRoot.querySelector('[test-id="file-input"]');
22
+ if (input) {
23
+ input.classList.remove('sr');
24
+ }
25
+ });
26
+ // First selection
27
+ const [fileChooser1] = await Promise.all([page.waitForFileChooser(), fileInput.click()]);
28
+ await fileChooser1.accept([filePath]);
29
+ // Second selection (same file)
30
+ const [fileChooser2] = await Promise.all([page.waitForFileChooser(), fileInput.click()]);
31
+ await fileChooser2.accept([filePath]);
32
+ expect(spy).toHaveReceivedEventTimes(2);
33
+ });
34
+ });
10
35
  });
11
36
  //# sourceMappingURL=q2-file-picker-test.e2e.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"q2-file-picker-test.e2e.js","sourceRoot":"","sources":["../../../../../src/components/q2-file-picker/test/q2-file-picker-test.e2e.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,4DAA4D,EAAE,CAAC,CAAC;YACjG,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YAE/C,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { evaluateA11y, setup } from '@/utils/helpers';\n\ndescribe('q2-legend', () => {\n describe('[A11y] guideline compliance', () => {\n it('Does not have accessibility violations', async () => {\n const page = await setup({ html: `<q2-file-picker label=\"Label\" description=\"Description\" />` });\n const hasViolations = await evaluateA11y(page);\n\n expect(hasViolations).toBe(false);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"q2-file-picker-test.e2e.js","sourceRoot":"","sources":["../../../../../src/components/q2-file-picker/test/q2-file-picker-test.e2e.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,4DAA4D,EAAE,CAAC,CAAC;YACjG,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YAE/C,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,4DAA4D,EAAE,CAAC,CAAC;YACjG,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;YAC9E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAE/C,oDAAoD;YACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACrB,MAAM,KAAK,GAAG,QAAQ;qBACjB,aAAa,CAAC,gBAAgB,CAAE;qBAChC,UAAW,CAAC,aAAa,CAAC,wBAAwB,CAAgB,CAAC;gBACxE,IAAI,KAAK,EAAE,CAAC;oBACR,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,kBAAkB;YAClB,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzF,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEtC,+BAA+B;YAC/B,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzF,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEtC,MAAM,CAAC,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { evaluateA11y, setup } from '@/utils/helpers';\nimport path from 'path';\n\ndescribe('q2-legend', () => {\n describe('[A11y] guideline compliance', () => {\n it('Does not have accessibility violations', async () => {\n const page = await setup({ html: `<q2-file-picker label=\"Label\" description=\"Description\" />` });\n const hasViolations = await evaluateA11y(page);\n\n expect(hasViolations).toBe(false);\n });\n });\n describe('File chooser', () => {\n it('emits change event after selecting the same file twice', async () => {\n const page = await setup({ html: `<q2-file-picker label=\"Label\" description=\"Description\" />` });\n const fileInput = await page.find('q2-file-picker >>> [test-id=\"file-input\"]');\n const filePath = path.resolve(__dirname, 'q2-file-picker-test-text-file.txt');\n const spy = await page.spyOnEvent('tctChange');\n\n // Ensure the file input is visible and interactable\n await page.evaluate(() => {\n const input = document\n .querySelector('q2-file-picker')!\n .shadowRoot!.querySelector('[test-id=\"file-input\"]') as HTMLElement;\n if (input) {\n input.classList.remove('sr');\n }\n });\n\n // First selection\n const [fileChooser1] = await Promise.all([page.waitForFileChooser(), fileInput.click()]);\n await fileChooser1.accept([filePath]);\n\n // Second selection (same file)\n const [fileChooser2] = await Promise.all([page.waitForFileChooser(), fileInput.click()]);\n await fileChooser2.accept([filePath]);\n\n expect(spy).toHaveReceivedEventTimes(2);\n });\n });\n});\n"]}
@@ -41,6 +41,20 @@ describe('q2-legend', () => {
41
41
  return changeCallback;
42
42
  }
43
43
  describe('Props', () => {
44
+ describe('buttonSize', () => {
45
+ it('when set to "none" the size prop on the nested q2-btn is not set', async () => {
46
+ const page = await setupPage({ 'button-size': 'none' });
47
+ await page.waitForChanges();
48
+ const browseButton = page.root.shadowRoot.querySelector('q2-btn');
49
+ expect(browseButton === null || browseButton === void 0 ? void 0 : browseButton.hasAttribute('size')).toBe(false);
50
+ });
51
+ it.each([['small'], ['medium'], ['large']])('when set to "%s" the size prop on the nested q2-btn is set correctly', async (size) => {
52
+ const page = await setupPage({ 'button-size': size });
53
+ await page.waitForChanges();
54
+ const browseButton = page.root.shadowRoot.querySelector('q2-btn');
55
+ expect(browseButton === null || browseButton === void 0 ? void 0 : browseButton.getAttribute('size')).toBe(size);
56
+ });
57
+ });
44
58
  describe('description', () => {
45
59
  it('when set description rendered', async () => {
46
60
  const descriptionText = 'Test Description';
@@ -92,15 +106,16 @@ describe('q2-legend', () => {
92
106
  expect(value).toEqual(expectedValue);
93
107
  });
94
108
  it('supports passing a comma-separated string with spaces after each comma', async () => {
95
- const page = await setupPage({ fileTypes: 'pdf, txt' });
109
+ const page = await setupPage({ 'file-types': 'pdf, txt' });
96
110
  const mockPdfFile = createMockFile({ name: 'test-file.pdf' });
97
111
  const mockTextFile = createMockFile({ name: 'test-file.txt' });
98
- const mockFileList = createMockFileList([mockPdfFile, mockTextFile]);
112
+ const mockPngFile = createMockFile({ name: 'test-file.png' });
113
+ const mockFileList = createMockFileList([mockPdfFile, mockTextFile, mockPngFile]);
99
114
  const changeCallback = simulateFileInputChange(page, mockFileList);
100
115
  await page.waitForChanges();
101
116
  const value = page.root.value;
102
117
  const expectedValue = {
103
- invalidFiles: [],
118
+ invalidFiles: [{ file: mockPngFile, status: 'invalid-type' }],
104
119
  validFiles: [mockPdfFile, mockTextFile],
105
120
  };
106
121
  expect(changeCallback).toHaveBeenCalledWith(expect.objectContaining({
@@ -109,15 +124,16 @@ describe('q2-legend', () => {
109
124
  expect(value).toEqual(expectedValue);
110
125
  });
111
126
  it('supports passing a comma-separated string without spaces after each comma', async () => {
112
- const page = await setupPage({ fileTypes: 'pdf,txt' });
127
+ const page = await setupPage({ 'file-types': 'pdf,txt' });
113
128
  const mockPdfFile = createMockFile({ name: 'test-file.pdf' });
114
129
  const mockTextFile = createMockFile({ name: 'test-file.txt' });
115
- const mockFileList = createMockFileList([mockPdfFile, mockTextFile]);
130
+ const mockPngFile = createMockFile({ name: 'test-file.png' });
131
+ const mockFileList = createMockFileList([mockPdfFile, mockTextFile, mockPngFile]);
116
132
  const changeCallback = simulateFileInputChange(page, mockFileList);
117
133
  await page.waitForChanges();
118
134
  const value = page.root.value;
119
135
  const expectedValue = {
120
- invalidFiles: [],
136
+ invalidFiles: [{ file: mockPngFile, status: 'invalid-type' }],
121
137
  validFiles: [mockPdfFile, mockTextFile],
122
138
  };
123
139
  expect(changeCallback).toHaveBeenCalledWith(expect.objectContaining({
@@ -387,20 +403,93 @@ describe('q2-legend', () => {
387
403
  });
388
404
  });
389
405
  describe('getFileItemStatusMessage', () => {
390
- it('returns the correct status message', async () => {
406
+ it('returns the correct default status message', async () => {
407
+ const page = await setupPage();
408
+ const displayedFiles = [
409
+ {
410
+ file: createMockFile({ name: 'file1.jpg', size: 1234 }),
411
+ status: 'invalid-type',
412
+ response: 'tecton.element.filePicker.unsupportedFileType',
413
+ },
414
+ {
415
+ file: createMockFile({ name: 'file2.png', size: 5678 }),
416
+ status: 'over-size-limit',
417
+ response: 'tecton.element.filePicker.sizeExceedsLimit',
418
+ },
419
+ {
420
+ file: createMockFile({ name: 'file3.pdf', size: 91011 }),
421
+ status: 'over-max-files-limit',
422
+ response: 'tecton.element.filePicker.overMaxFilesLimit',
423
+ },
424
+ {
425
+ file: createMockFile({ name: 'file4.docx', size: 1213 }),
426
+ status: 'in-progress',
427
+ response: 'tecton.element.filePicker.uploadingEllipsis',
428
+ },
429
+ {
430
+ file: createMockFile({ name: 'file5.pptx', size: 1415 }),
431
+ status: 'failed',
432
+ response: 'tecton.element.filePicker.uploadFailed',
433
+ },
434
+ {
435
+ file: createMockFile({ name: 'file6.xlsx', size: 1617 }),
436
+ status: 'uploaded',
437
+ response: 'tecton.element.filePicker.fileSize',
438
+ },
439
+ ];
440
+ displayedFiles.forEach(displayedFile => {
441
+ const result = page.rootInstance.getFileItemStatusMessage(displayedFile);
442
+ expect(result).toEqual(displayedFile.response);
443
+ });
444
+ });
445
+ it('can return a custom localized message for failed uploads', async () => {
446
+ const localizedMessage = 'Localized upload failed message';
447
+ const page = await setupPage({}, { 'test.message': localizedMessage });
448
+ const displayedFile = {
449
+ file: createMockFile({ name: 'file1.txt', size: 1819 }),
450
+ status: 'failed',
451
+ message: 'test.message',
452
+ };
453
+ const result = page.rootInstance.getFileItemStatusMessage(displayedFile);
454
+ expect(result).toEqual(localizedMessage);
455
+ });
456
+ it('returns the standard message for all other statuses even if provided a custom message', async () => {
391
457
  const page = await setupPage();
392
- const statusAndResponses = [
393
- { status: 'invalid-type', response: 'tecton.element.filePicker.unsupportedFileType' },
394
- { status: 'over-size-limit', response: 'tecton.element.filePicker.sizeExceedsLimit' },
395
- { status: 'over-max-files-limit', response: 'tecton.element.filePicker.overMaxFilesLimit' },
396
- { status: 'in-progress', response: 'tecton.element.filePicker.uploadingEllipsis' },
397
- { status: 'failed', response: 'tecton.element.filePicker.uploadFailed' },
398
- { status: 'uploaded', response: 'tecton.element.filePicker.fileSize' },
458
+ const displayedFiles = [
459
+ {
460
+ file: createMockFile({ name: 'file1.jpg', size: 1234 }),
461
+ status: 'invalid-type',
462
+ message: 'custom message',
463
+ response: 'tecton.element.filePicker.unsupportedFileType',
464
+ },
465
+ {
466
+ file: createMockFile({ name: 'file2.png', size: 5678 }),
467
+ status: 'over-size-limit',
468
+ message: 'custom message',
469
+ response: 'tecton.element.filePicker.sizeExceedsLimit',
470
+ },
471
+ {
472
+ file: createMockFile({ name: 'file3.pdf', size: 91011 }),
473
+ status: 'over-max-files-limit',
474
+ message: 'custom message',
475
+ response: 'tecton.element.filePicker.overMaxFilesLimit',
476
+ },
477
+ {
478
+ file: createMockFile({ name: 'file4.docx', size: 1213 }),
479
+ status: 'in-progress',
480
+ message: 'custom message',
481
+ response: 'tecton.element.filePicker.uploadingEllipsis',
482
+ },
483
+ {
484
+ file: createMockFile({ name: 'file6.xlsx', size: 1617 }),
485
+ status: 'uploaded',
486
+ message: 'custom message',
487
+ response: 'tecton.element.filePicker.fileSize',
488
+ },
399
489
  ];
400
- const size = 1234;
401
- statusAndResponses.forEach(({ status, response }) => {
402
- const result = page.rootInstance.getFileItemStatusMessage(status, size);
403
- expect(result).toEqual(response);
490
+ displayedFiles.forEach(displayedFile => {
491
+ const result = page.rootInstance.getFileItemStatusMessage(displayedFile);
492
+ expect(result).toEqual(displayedFile.response);
404
493
  });
405
494
  });
406
495
  });