quasar 2.15.2 → 2.15.4

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 (665) hide show
  1. package/dist/api/AddressbarColor.json +1 -1
  2. package/dist/api/AppFullscreen.json +1 -1
  3. package/dist/api/BottomSheet.json +1 -1
  4. package/dist/api/Cookies.json +1 -1
  5. package/dist/api/Dark.json +1 -1
  6. package/dist/api/Dialog.json +1 -1
  7. package/dist/api/IconSet.json +1 -0
  8. package/dist/api/Lang.json +1 -1
  9. package/dist/api/Loading.json +1 -1
  10. package/dist/api/LoadingBar.json +1 -1
  11. package/dist/api/LocalStorage.json +1 -1
  12. package/dist/api/Morph.json +1 -1
  13. package/dist/api/Notify.json +1 -1
  14. package/dist/api/Platform.json +1 -1
  15. package/dist/api/QAjaxBar.json +1 -1
  16. package/dist/api/QBreadcrumbsEl.json +1 -1
  17. package/dist/api/QBtn.json +1 -1
  18. package/dist/api/QBtnDropdown.json +1 -1
  19. package/dist/api/QBtnToggle.json +1 -1
  20. package/dist/api/QCard.json +1 -1
  21. package/dist/api/QCardSection.json +1 -1
  22. package/dist/api/QCarousel.json +1 -1
  23. package/dist/api/QCarouselControl.json +1 -1
  24. package/dist/api/QCheckbox.json +1 -1
  25. package/dist/api/QChip.json +1 -1
  26. package/dist/api/QDate.json +1 -1
  27. package/dist/api/QDialog.json +1 -1
  28. package/dist/api/QDrawer.json +1 -1
  29. package/dist/api/QEditor.json +1 -1
  30. package/dist/api/QExpansionItem.json +1 -1
  31. package/dist/api/QFab.json +1 -1
  32. package/dist/api/QFabAction.json +1 -1
  33. package/dist/api/QField.json +1 -1
  34. package/dist/api/QFile.json +1 -1
  35. package/dist/api/QForm.json +1 -1
  36. package/dist/api/QFormChildMixin.json +1 -1
  37. package/dist/api/QIcon.json +1 -1
  38. package/dist/api/QInfiniteScroll.json +1 -1
  39. package/dist/api/QInput.json +1 -1
  40. package/dist/api/QIntersection.json +1 -1
  41. package/dist/api/QItem.json +1 -1
  42. package/dist/api/QList.json +1 -1
  43. package/dist/api/QMenu.json +1 -1
  44. package/dist/api/QNoSsr.json +1 -1
  45. package/dist/api/QOptionGroup.json +1 -1
  46. package/dist/api/QPageScroller.json +1 -1
  47. package/dist/api/QPageSticky.json +1 -1
  48. package/dist/api/QPagination.json +1 -1
  49. package/dist/api/QParallax.json +1 -1
  50. package/dist/api/QPopupEdit.json +1 -1
  51. package/dist/api/QPopupProxy.json +1 -1
  52. package/dist/api/QPullToRefresh.json +1 -1
  53. package/dist/api/QRadio.json +1 -1
  54. package/dist/api/QRating.json +1 -1
  55. package/dist/api/QResizeObserver.json +1 -1
  56. package/dist/api/QScrollArea.json +1 -1
  57. package/dist/api/QScrollObserver.json +1 -1
  58. package/dist/api/QSelect.json +1 -1
  59. package/dist/api/QSkeleton.json +1 -1
  60. package/dist/api/QSlideItem.json +1 -1
  61. package/dist/api/QSplitter.json +1 -1
  62. package/dist/api/QStepper.json +1 -1
  63. package/dist/api/QTabPanel.json +1 -1
  64. package/dist/api/QTabPanels.json +1 -1
  65. package/dist/api/QTable.json +1 -1
  66. package/dist/api/QTime.json +1 -1
  67. package/dist/api/QTimelineEntry.json +1 -1
  68. package/dist/api/QToggle.json +1 -1
  69. package/dist/api/QTooltip.json +1 -1
  70. package/dist/api/QTree.json +1 -1
  71. package/dist/api/QUploader.json +1 -1
  72. package/dist/api/QVirtualScroll.json +1 -1
  73. package/dist/api/Ripple.json +1 -1
  74. package/dist/api/Screen.json +1 -1
  75. package/dist/api/ScrollFire.json +1 -1
  76. package/dist/api/SessionStorage.json +1 -1
  77. package/dist/icon-set/bootstrap-icons.umd.prod.js +2 -2
  78. package/dist/icon-set/eva-icons.umd.prod.js +2 -2
  79. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +2 -2
  80. package/dist/icon-set/fontawesome-v5.umd.prod.js +2 -2
  81. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +2 -2
  82. package/dist/icon-set/fontawesome-v6.umd.prod.js +2 -2
  83. package/dist/icon-set/ionicons-v4.umd.prod.js +2 -2
  84. package/dist/icon-set/line-awesome.umd.prod.js +2 -2
  85. package/dist/icon-set/material-icons-outlined.umd.prod.js +2 -2
  86. package/dist/icon-set/material-icons-round.umd.prod.js +2 -2
  87. package/dist/icon-set/material-icons-sharp.umd.prod.js +2 -2
  88. package/dist/icon-set/material-icons.umd.prod.js +2 -2
  89. package/dist/icon-set/material-symbols-outlined.umd.prod.js +2 -2
  90. package/dist/icon-set/material-symbols-rounded.umd.prod.js +2 -2
  91. package/dist/icon-set/material-symbols-sharp.umd.prod.js +2 -2
  92. package/dist/icon-set/mdi-v3.umd.prod.js +2 -2
  93. package/dist/icon-set/mdi-v4.umd.prod.js +2 -2
  94. package/dist/icon-set/mdi-v5.umd.prod.js +2 -2
  95. package/dist/icon-set/mdi-v6.umd.prod.js +2 -2
  96. package/dist/icon-set/mdi-v7.umd.prod.js +2 -2
  97. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +2 -2
  98. package/dist/icon-set/svg-eva-icons.umd.prod.js +2 -2
  99. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +2 -2
  100. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +2 -2
  101. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +2 -2
  102. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +2 -2
  103. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +2 -2
  104. package/dist/icon-set/svg-line-awesome.umd.prod.js +2 -2
  105. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +2 -2
  106. package/dist/icon-set/svg-material-icons-round.umd.prod.js +2 -2
  107. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +2 -2
  108. package/dist/icon-set/svg-material-icons.umd.prod.js +2 -2
  109. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +2 -2
  110. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +2 -2
  111. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +2 -2
  112. package/dist/icon-set/svg-mdi-v6.umd.prod.js +2 -2
  113. package/dist/icon-set/svg-mdi-v7.umd.prod.js +2 -2
  114. package/dist/icon-set/svg-themify.umd.prod.js +2 -2
  115. package/dist/icon-set/themify.umd.prod.js +2 -2
  116. package/dist/lang/ar-TN.umd.prod.js +2 -2
  117. package/dist/lang/ar.umd.prod.js +2 -2
  118. package/dist/lang/az-Latn.umd.prod.js +2 -2
  119. package/dist/lang/bg.umd.prod.js +2 -2
  120. package/dist/lang/bn.umd.prod.js +2 -2
  121. package/dist/lang/ca.umd.prod.js +2 -2
  122. package/dist/lang/cs.umd.prod.js +2 -2
  123. package/dist/lang/da.umd.prod.js +2 -2
  124. package/dist/lang/de-CH.umd.prod.js +2 -2
  125. package/dist/lang/de-DE.umd.prod.js +2 -2
  126. package/dist/lang/de.umd.prod.js +2 -2
  127. package/dist/lang/el.umd.prod.js +2 -2
  128. package/dist/lang/en-GB.umd.prod.js +2 -2
  129. package/dist/lang/en-US.umd.prod.js +2 -2
  130. package/dist/lang/eo.umd.prod.js +2 -2
  131. package/dist/lang/es.umd.prod.js +2 -2
  132. package/dist/lang/et.umd.prod.js +2 -2
  133. package/dist/lang/eu.umd.prod.js +2 -2
  134. package/dist/lang/fa-IR.umd.prod.js +2 -2
  135. package/dist/lang/fa.umd.prod.js +2 -2
  136. package/dist/lang/fi.umd.prod.js +2 -2
  137. package/dist/lang/fr.umd.prod.js +2 -2
  138. package/dist/lang/gn.umd.prod.js +2 -2
  139. package/dist/lang/he.umd.prod.js +2 -2
  140. package/dist/lang/hi.umd.prod.js +2 -2
  141. package/dist/lang/hr.umd.prod.js +2 -2
  142. package/dist/lang/hu.umd.prod.js +2 -2
  143. package/dist/lang/id.umd.prod.js +2 -2
  144. package/dist/lang/is.umd.prod.js +2 -2
  145. package/dist/lang/it.umd.prod.js +2 -2
  146. package/dist/lang/ja.umd.prod.js +2 -2
  147. package/dist/lang/kk.umd.prod.js +2 -2
  148. package/dist/lang/km.umd.prod.js +2 -2
  149. package/dist/lang/ko-KR.umd.prod.js +2 -2
  150. package/dist/lang/kur-CKB.umd.prod.js +2 -2
  151. package/dist/lang/lt.umd.prod.js +2 -2
  152. package/dist/lang/lu.umd.prod.js +2 -2
  153. package/dist/lang/lv.umd.prod.js +2 -2
  154. package/dist/lang/mk.umd.prod.js +2 -2
  155. package/dist/lang/ml.umd.prod.js +2 -2
  156. package/dist/lang/mm.umd.prod.js +2 -2
  157. package/dist/lang/ms-MY.umd.prod.js +2 -2
  158. package/dist/lang/ms.umd.prod.js +2 -2
  159. package/dist/lang/my.umd.prod.js +2 -2
  160. package/dist/lang/nb-NO.umd.prod.js +2 -2
  161. package/dist/lang/nl.umd.prod.js +2 -2
  162. package/dist/lang/pl.umd.prod.js +2 -2
  163. package/dist/lang/pt-BR.umd.prod.js +2 -2
  164. package/dist/lang/pt.umd.prod.js +2 -2
  165. package/dist/lang/ro.umd.prod.js +2 -2
  166. package/dist/lang/ru.umd.prod.js +2 -2
  167. package/dist/lang/sk.umd.prod.js +2 -2
  168. package/dist/lang/sl.umd.prod.js +2 -2
  169. package/dist/lang/sm.umd.prod.js +2 -2
  170. package/dist/lang/sr-CYR.umd.prod.js +2 -2
  171. package/dist/lang/sr.umd.prod.js +2 -2
  172. package/dist/lang/sv.umd.prod.js +2 -2
  173. package/dist/lang/ta.umd.prod.js +2 -2
  174. package/dist/lang/th.umd.prod.js +2 -2
  175. package/dist/lang/tl.umd.prod.js +2 -2
  176. package/dist/lang/tr.umd.prod.js +2 -2
  177. package/dist/lang/ug.umd.prod.js +2 -2
  178. package/dist/lang/uk.umd.prod.js +2 -2
  179. package/dist/lang/uz-Cyrl.umd.prod.js +2 -2
  180. package/dist/lang/uz-Latn.umd.prod.js +2 -2
  181. package/dist/lang/vi.umd.prod.js +2 -2
  182. package/dist/lang/zh-CN.umd.prod.js +2 -2
  183. package/dist/lang/zh-TW.umd.prod.js +2 -2
  184. package/dist/quasar.addon.prod.css +1 -1
  185. package/dist/quasar.addon.rtl.prod.css +1 -1
  186. package/dist/quasar.cjs.prod.js +12 -12
  187. package/dist/quasar.esm.js +571 -523
  188. package/dist/quasar.esm.prod.js +17 -17
  189. package/dist/quasar.prod.css +1 -1
  190. package/dist/quasar.rtl.prod.css +1 -1
  191. package/dist/quasar.sass +1 -1
  192. package/dist/quasar.umd.js +558 -509
  193. package/dist/quasar.umd.prod.js +22 -22
  194. package/dist/transforms/api-list.json +1 -1
  195. package/dist/transforms/import-map.json +1 -1
  196. package/dist/types/config.d.ts +3 -3
  197. package/dist/types/globals.d.ts +1 -1
  198. package/dist/types/index.d.ts +1921 -102
  199. package/dist/vetur/quasar-attributes.json +1 -1
  200. package/dist/vetur/quasar-tags.json +1 -1
  201. package/dist/web-types/web-types.json +1 -1
  202. package/lang/uk.js +1 -1
  203. package/lang/uk.mjs +1 -1
  204. package/package.json +18 -17
  205. package/src/api.extends.json +7 -5
  206. package/src/components/ajax-bar/QAjaxBar.js +2 -2
  207. package/src/components/ajax-bar/QAjaxBar.json +1 -0
  208. package/src/components/avatar/QAvatar.js +3 -3
  209. package/src/components/avatar/QAvatar.json +1 -1
  210. package/src/components/avatar/QAvatar.test.js +169 -83
  211. package/src/components/badge/QBadge.js +2 -2
  212. package/src/components/badge/QBadge.test.js +200 -100
  213. package/src/components/banner/QBanner.js +3 -3
  214. package/src/components/banner/QBanner.test.js +88 -50
  215. package/src/components/bar/QBar.js +3 -3
  216. package/src/components/bar/QBar.test.js +44 -19
  217. package/src/components/breadcrumbs/QBreadcrumbs.js +6 -4
  218. package/src/components/breadcrumbs/QBreadcrumbs.test.js +134 -59
  219. package/src/components/breadcrumbs/QBreadcrumbsEl.js +3 -3
  220. package/src/components/breadcrumbs/QBreadcrumbsEl.json +1 -1
  221. package/src/components/breadcrumbs/QBreadcrumbsEl.test.js +491 -61
  222. package/src/components/btn/QBtn.js +11 -5
  223. package/src/components/btn/QBtn.json +2 -1
  224. package/src/components/btn/QBtn.test.js +1391 -212
  225. package/src/components/btn/use-btn.js +8 -6
  226. package/src/components/btn/use-btn.json +1 -1
  227. package/src/components/btn/use-btn.test.js +86 -542
  228. package/src/components/btn-dropdown/QBtnDropdown.js +9 -10
  229. package/src/components/btn-dropdown/QBtnDropdown.json +3 -3
  230. package/src/components/btn-group/QBtnGroup.js +2 -2
  231. package/src/components/btn-toggle/QBtnToggle.js +3 -3
  232. package/src/components/btn-toggle/QBtnToggle.json +2 -2
  233. package/src/components/card/QCard.js +3 -3
  234. package/src/components/card/QCardActions.js +3 -3
  235. package/src/components/card/QCardSection.js +2 -2
  236. package/src/components/carousel/QCarousel.js +6 -6
  237. package/src/components/carousel/QCarousel.json +1 -1
  238. package/src/components/carousel/QCarouselControl.js +2 -2
  239. package/src/components/carousel/QCarouselControl.json +1 -1
  240. package/src/components/carousel/QCarouselSlide.js +3 -3
  241. package/src/components/carousel/QCarouselSlide.json +1 -1
  242. package/src/components/chat/QChatMessage.js +2 -2
  243. package/src/components/checkbox/QCheckbox.js +1 -1
  244. package/src/components/checkbox/use-checkbox.js +8 -8
  245. package/src/components/checkbox/use-checkbox.json +5 -3
  246. package/src/components/chip/QChip.js +6 -5
  247. package/src/components/chip/QChip.json +4 -0
  248. package/src/components/chip/QChip.test.js +685 -317
  249. package/src/components/circular-progress/QCircularProgress.js +5 -5
  250. package/src/components/circular-progress/QCircularProgress.json +1 -1
  251. package/src/components/circular-progress/{use-circular-progress.js → circular-progress.js} +1 -1
  252. package/src/components/circular-progress/circular-progress.test.js +14 -0
  253. package/src/components/color/QColor.js +10 -10
  254. package/src/components/color/QColor.json +1 -1
  255. package/src/components/date/QDate.js +9 -9
  256. package/src/components/date/QDate.json +17 -11
  257. package/src/components/date/use-datetime.js +2 -2
  258. package/src/components/date/use-datetime.json +6 -6
  259. package/src/components/dialog/QDialog.js +33 -22
  260. package/src/components/dialog/QDialog.json +5 -3
  261. package/src/components/dialog/QDialog.test.js +1094 -220
  262. package/src/components/drawer/QDrawer.js +9 -9
  263. package/src/components/drawer/QDrawer.json +7 -4
  264. package/src/components/editor/QEditor.js +9 -9
  265. package/src/components/editor/QEditor.json +11 -5
  266. package/src/components/editor/editor-caret.js +1 -1
  267. package/src/components/editor/editor-utils.js +3 -3
  268. package/src/components/expansion-item/QExpansionItem.js +9 -9
  269. package/src/components/expansion-item/QExpansionItem.json +2 -2
  270. package/src/components/fab/QFab.js +5 -5
  271. package/src/components/fab/QFab.json +1 -1
  272. package/src/components/fab/QFabAction.js +4 -4
  273. package/src/components/fab/QFabAction.json +2 -1
  274. package/src/components/fab/use-fab.json +1 -1
  275. package/src/components/field/QField.js +2 -2
  276. package/src/components/field/QField.json +7 -3
  277. package/src/components/file/QFile.js +9 -9
  278. package/src/components/file/QFile.json +11 -4
  279. package/src/components/footer/QFooter.js +3 -3
  280. package/src/components/form/QForm.js +6 -6
  281. package/src/components/form/QForm.json +11 -4
  282. package/src/components/form/QFormChildMixin.js +2 -2
  283. package/src/components/form/QFormChildMixin.json +4 -1
  284. package/src/components/header/QHeader.js +3 -3
  285. package/src/components/icon/QIcon.js +3 -3
  286. package/src/components/icon/QIcon.json +1 -1
  287. package/src/components/img/QImg.js +5 -5
  288. package/src/components/img/QImg.json +1 -1
  289. package/src/components/infinite-scroll/QInfiniteScroll.js +6 -6
  290. package/src/components/infinite-scroll/QInfiniteScroll.json +20 -7
  291. package/src/components/inner-loading/QInnerLoading.js +3 -3
  292. package/src/components/inner-loading/QInnerLoading.json +1 -1
  293. package/src/components/input/QInput.js +9 -9
  294. package/src/components/input/QInput.json +16 -5
  295. package/src/components/input/use-mask.js +1 -1
  296. package/src/components/intersection/QIntersection.js +2 -2
  297. package/src/components/item/QItem.js +6 -6
  298. package/src/components/item/QItem.json +1 -1
  299. package/src/components/item/QItemLabel.js +2 -2
  300. package/src/components/item/QItemSection.js +2 -2
  301. package/src/components/item/QList.js +3 -3
  302. package/src/components/knob/QKnob.js +6 -6
  303. package/src/components/knob/QKnob.json +1 -1
  304. package/src/components/layout/QLayout.js +4 -4
  305. package/src/components/linear-progress/QLinearProgress.js +4 -4
  306. package/src/components/linear-progress/QLinearProgress.json +1 -1
  307. package/src/components/markup-table/QMarkupTable.js +3 -3
  308. package/src/components/menu/QMenu.js +20 -20
  309. package/src/components/menu/QMenu.json +8 -4
  310. package/src/components/no-ssr/QNoSsr.js +3 -3
  311. package/src/components/option-group/QOptionGroup.js +2 -2
  312. package/src/components/option-group/QOptionGroup.json +4 -4
  313. package/src/components/page/QPage.js +3 -3
  314. package/src/components/page/QPageContainer.js +3 -3
  315. package/src/components/page-scroller/QPageScroller.js +2 -2
  316. package/src/components/page-sticky/QPageSticky.js +1 -1
  317. package/src/components/page-sticky/QPageSticky.json +1 -1
  318. package/src/components/page-sticky/use-page-sticky.js +2 -2
  319. package/src/components/pagination/QPagination.js +4 -4
  320. package/src/components/pagination/QPagination.json +5 -3
  321. package/src/components/parallax/QParallax.js +6 -6
  322. package/src/components/popup-edit/QPopupEdit.js +4 -4
  323. package/src/components/popup-edit/QPopupEdit.json +30 -14
  324. package/src/components/popup-proxy/QPopupProxy.js +3 -3
  325. package/src/components/popup-proxy/QPopupProxy.json +9 -5
  326. package/src/components/pull-to-refresh/QPullToRefresh.js +5 -5
  327. package/src/components/pull-to-refresh/QPullToRefresh.json +6 -2
  328. package/src/components/radio/QRadio.js +9 -9
  329. package/src/components/radio/QRadio.json +4 -2
  330. package/src/components/range/QRange.js +3 -3
  331. package/src/components/rating/QRating.js +6 -6
  332. package/src/components/rating/QRating.json +2 -2
  333. package/src/components/resize-observer/QResizeObserver.js +3 -3
  334. package/src/components/resize-observer/QResizeObserver.json +2 -1
  335. package/src/components/responsive/QResponsive.js +3 -3
  336. package/src/components/responsive/QResponsive.json +1 -1
  337. package/src/components/scroll-area/QScrollArea.js +6 -6
  338. package/src/components/scroll-area/QScrollArea.json +8 -2
  339. package/src/components/scroll-observer/QScrollObserver.js +3 -3
  340. package/src/components/scroll-observer/QScrollObserver.json +5 -2
  341. package/src/components/select/QSelect.js +10 -10
  342. package/src/components/select/QSelect.json +38 -17
  343. package/src/components/separator/QSeparator.js +2 -2
  344. package/src/components/skeleton/QSkeleton.js +3 -3
  345. package/src/components/slide-item/QSlideItem.js +4 -4
  346. package/src/components/slide-item/QSlideItem.json +3 -1
  347. package/src/components/slide-transition/QSlideTransition.js +1 -1
  348. package/src/components/slider/QSlider.js +4 -4
  349. package/src/components/slider/use-slider.js +6 -6
  350. package/src/components/slider/use-slider.json +1 -1
  351. package/src/components/space/QSpace.js +1 -1
  352. package/src/components/space/QSpace.test.js +17 -0
  353. package/src/components/spinner/QSpinner.js +1 -1
  354. package/src/components/spinner/QSpinner.json +1 -1
  355. package/src/components/spinner/QSpinnerAudio.js +1 -1
  356. package/src/components/spinner/QSpinnerBall.js +1 -1
  357. package/src/components/spinner/QSpinnerBars.js +1 -1
  358. package/src/components/spinner/QSpinnerBox.js +1 -1
  359. package/src/components/spinner/QSpinnerClock.js +1 -1
  360. package/src/components/spinner/QSpinnerComment.js +1 -1
  361. package/src/components/spinner/QSpinnerCube.js +1 -1
  362. package/src/components/spinner/QSpinnerDots.js +1 -1
  363. package/src/components/spinner/QSpinnerFacebook.js +1 -1
  364. package/src/components/spinner/QSpinnerGears.js +1 -1
  365. package/src/components/spinner/QSpinnerGrid.js +1 -1
  366. package/src/components/spinner/QSpinnerHearts.js +1 -1
  367. package/src/components/spinner/QSpinnerHourglass.js +1 -1
  368. package/src/components/spinner/QSpinnerInfinity.js +1 -1
  369. package/src/components/spinner/QSpinnerIos.js +1 -1
  370. package/src/components/spinner/QSpinnerOrbit.js +1 -1
  371. package/src/components/spinner/QSpinnerOval.js +1 -1
  372. package/src/components/spinner/QSpinnerPie.js +1 -1
  373. package/src/components/spinner/QSpinnerPuff.js +1 -1
  374. package/src/components/spinner/QSpinnerRadio.js +1 -1
  375. package/src/components/spinner/QSpinnerRings.js +1 -1
  376. package/src/components/spinner/QSpinnerTail.js +1 -1
  377. package/src/components/spinner/spinner.json +1 -1
  378. package/src/components/spinner/use-spinner.js +1 -1
  379. package/src/components/splitter/QSplitter.js +3 -3
  380. package/src/components/splitter/QSplitter.json +4 -4
  381. package/src/components/stepper/QStep.js +5 -5
  382. package/src/components/stepper/QStep.json +1 -1
  383. package/src/components/stepper/QStepper.js +5 -5
  384. package/src/components/stepper/QStepper.json +1 -1
  385. package/src/components/stepper/QStepperNavigation.js +2 -2
  386. package/src/components/stepper/StepHeader.js +1 -1
  387. package/src/components/tab-panels/QTabPanel.js +3 -3
  388. package/src/components/tab-panels/QTabPanel.json +1 -7
  389. package/src/components/tab-panels/QTabPanels.js +4 -4
  390. package/src/components/tab-panels/QTabPanels.json +1 -1
  391. package/src/components/table/QTable.js +7 -7
  392. package/src/components/table/QTable.json +41 -22
  393. package/src/components/table/QTd.js +2 -2
  394. package/src/components/table/QTh.js +2 -2
  395. package/src/components/table/QTr.js +2 -2
  396. package/src/components/table/table-column-selection.js +1 -1
  397. package/src/components/table/table-sort.js +2 -2
  398. package/src/components/tabs/QRouteTab.js +2 -2
  399. package/src/components/tabs/QRouteTab.json +1 -1
  400. package/src/components/tabs/QTab.js +1 -1
  401. package/src/components/tabs/QTabs.js +6 -6
  402. package/src/components/tabs/use-tab.js +6 -6
  403. package/src/components/time/QTime.js +8 -8
  404. package/src/components/time/QTime.json +5 -3
  405. package/src/components/timeline/QTimeline.js +4 -4
  406. package/src/components/timeline/QTimelineEntry.js +3 -3
  407. package/src/components/toggle/QToggle.js +1 -1
  408. package/src/components/toolbar/QToolbar.js +2 -2
  409. package/src/components/toolbar/QToolbar.test.js +45 -0
  410. package/src/components/toolbar/QToolbarTitle.js +2 -2
  411. package/src/components/toolbar/QToolbarTitle.test.js +45 -0
  412. package/src/components/tooltip/QTooltip.js +15 -15
  413. package/src/components/tooltip/QTooltip.json +6 -5
  414. package/src/components/tree/QTree.js +5 -5
  415. package/src/components/tree/QTree.json +12 -4
  416. package/src/components/uploader/QUploader.js +1 -1
  417. package/src/components/uploader/QUploader.json +25 -10
  418. package/src/components/uploader/QUploaderAddTrigger.js +2 -2
  419. package/src/components/uploader/uploader-core.js +8 -8
  420. package/src/components/uploader/xhr-uploader-plugin.js +3 -1
  421. package/src/components/uploader/xhr-uploader-plugin.json +9 -9
  422. package/src/components/video/QVideo.js +2 -2
  423. package/src/components/video/QVideo.json +1 -1
  424. package/src/components/video/QVideo.test.js +183 -0
  425. package/src/components/virtual-scroll/QVirtualScroll.js +4 -4
  426. package/src/components/virtual-scroll/QVirtualScroll.json +1 -0
  427. package/src/components/virtual-scroll/use-virtual-scroll.js +3 -3
  428. package/src/components/virtual-scroll/use-virtual-scroll.json +7 -3
  429. package/src/composables/private.use-align/use-align.test.js +62 -0
  430. package/src/composables/{private → private.use-anchor}/use-anchor.js +3 -3
  431. package/src/composables/{private → private.use-anchor}/use-anchor.json +0 -1
  432. package/src/composables/private.use-dark/use-dark.test.js +68 -0
  433. package/src/composables/{private → private.use-field}/use-field.js +8 -8
  434. package/src/composables/{private → private.use-field}/use-field.json +7 -10
  435. package/src/composables/{private → private.use-file}/use-file.js +1 -1
  436. package/src/composables/{private → private.use-file}/use-file.json +4 -2
  437. package/src/composables/{private → private.use-fullscreen}/use-fullscreen.js +2 -2
  438. package/src/composables/{private → private.use-fullscreen}/use-fullscreen.json +9 -3
  439. package/src/composables/{private → private.use-history}/use-history.js +1 -1
  440. package/src/composables/private.use-history/use-history.test.js +116 -0
  441. package/src/composables/{private → private.use-model-toggle}/use-model-toggle.js +1 -1
  442. package/src/composables/{private → private.use-panel}/use-panel.js +3 -3
  443. package/src/composables/{private → private.use-panel}/use-panel.json +10 -5
  444. package/src/composables/{private → private.use-portal}/use-portal.js +6 -6
  445. package/src/composables/{private → private.use-prevent-scroll}/use-prevent-scroll.js +1 -1
  446. package/src/composables/private.use-ratio/use-ratio.test.js +40 -0
  447. package/src/composables/{private → private.use-router-link}/use-router-link.js +1 -1
  448. package/src/composables/{private → private.use-scroll-target}/use-scroll-target.js +2 -5
  449. package/src/composables/private.use-size/use-size.test.js +40 -0
  450. package/src/composables/private.use-transition/use-transition.test.js +118 -0
  451. package/src/composables/{private → private.use-validate}/use-validate.js +4 -4
  452. package/src/composables/{private → private.use-validate}/use-validate.json +3 -1
  453. package/src/composables/{use-dialog-plugin-component.js → use-dialog-plugin-component/use-dialog-plugin-component.js} +2 -4
  454. package/src/composables/use-form/private.use-form.test.js +107 -0
  455. package/src/composables/{use-form-child.js → use-form/use-form-child.js} +1 -1
  456. package/src/composables/{use-hydration.js → use-hydration/use-hydration.js} +1 -1
  457. package/src/composables/use-hydration/use-hydration.test.js +27 -0
  458. package/src/composables/{use-id.js → use-id/use-id.js} +2 -2
  459. package/src/composables/use-id/use-id.test.js +72 -0
  460. package/src/composables/{use-interval.js → use-interval/use-interval.js} +1 -1
  461. package/src/composables/use-interval/use-interval.test.js +173 -0
  462. package/src/composables/{use-meta.js → use-meta/use-meta.js} +1 -1
  463. package/src/composables/{use-quasar.js → use-quasar/use-quasar.js} +2 -1
  464. package/src/composables/use-quasar/use-quasar.test.js +35 -0
  465. package/src/composables/{use-render-cache.js → use-render-cache/use-render-cache.js} +2 -2
  466. package/src/composables/use-render-cache/use-render-cache.test.js +73 -0
  467. package/src/composables/use-split-attrs/use-split-attrs.test.js +55 -0
  468. package/src/composables/{use-tick.js → use-tick/use-tick.js} +1 -1
  469. package/src/composables/use-tick/use-tick.test.js +118 -0
  470. package/src/composables/{use-timeout.js → use-timeout/use-timeout.js} +1 -1
  471. package/src/composables/use-timeout/use-timeout.test.js +169 -0
  472. package/src/composables.js +11 -11
  473. package/src/css/index.sass +1 -1
  474. package/src/directives/close-popup/ClosePopup.js +4 -4
  475. package/src/directives/intersection/Intersection.js +3 -3
  476. package/src/directives/morph/Morph.js +2 -2
  477. package/src/directives/morph/Morph.json +1 -1
  478. package/src/directives/mutation/Mutation.js +2 -2
  479. package/src/directives/ripple/Ripple.js +6 -6
  480. package/src/directives/ripple/Ripple.json +2 -2
  481. package/src/directives/ripple/Ripple.test.js +340 -0
  482. package/src/directives/scroll/Scroll.js +4 -4
  483. package/src/directives/scroll-fire/ScrollFire.js +6 -6
  484. package/src/directives/scroll-fire/ScrollFire.json +1 -1
  485. package/src/directives/touch-hold/TouchHold.js +4 -4
  486. package/src/directives/touch-pan/TouchPan.js +5 -5
  487. package/src/directives/touch-repeat/TouchRepeat.js +5 -5
  488. package/src/directives/touch-swipe/TouchSwipe.js +5 -5
  489. package/src/index.dev.js +10 -4
  490. package/src/index.prod.js +11 -4
  491. package/src/index.ssr.js +11 -4
  492. package/src/index.umd.js +12 -4
  493. package/src/install-quasar.js +14 -9
  494. package/src/plugins/addressbar/AddressbarColor.js +2 -2
  495. package/src/plugins/addressbar/AddressbarColor.json +2 -1
  496. package/src/plugins/addressbar/AddressbarColor.test.js +53 -0
  497. package/src/plugins/app-fullscreen/AppFullscreen.js +3 -3
  498. package/src/plugins/app-fullscreen/AppFullscreen.json +4 -1
  499. package/src/plugins/app-fullscreen/AppFullscreen.test.js +206 -0
  500. package/src/plugins/app-fullscreen/test/mock-fullscreen.js +43 -0
  501. package/src/plugins/app-visibility/AppVisibility.js +3 -3
  502. package/src/plugins/app-visibility/AppVisibility.test.js +45 -0
  503. package/src/plugins/bottom-sheet/BottomSheet.js +2 -5
  504. package/src/plugins/bottom-sheet/BottomSheet.json +1 -1
  505. package/src/plugins/bottom-sheet/component/BottomSheetComponent.js +2 -2
  506. package/src/plugins/cookies/Cookies.json +5 -2
  507. package/src/plugins/dark/Dark.js +2 -2
  508. package/src/plugins/dark/Dark.json +5 -2
  509. package/src/plugins/dark/Dark.test.js +158 -0
  510. package/src/plugins/dialog/Dialog.js +2 -5
  511. package/src/plugins/dialog/Dialog.json +3 -3
  512. package/src/plugins/dialog/component/DialogPluginComponent.js +4 -4
  513. package/src/{icon-set.js → plugins/icon-set/IconSet.js} +29 -10
  514. package/src/plugins/icon-set/IconSet.json +1417 -0
  515. package/src/plugins/icon-set/IconSet.test.js +346 -0
  516. package/src/{lang.js → plugins/lang/Lang.js} +25 -15
  517. package/src/plugins/lang/Lang.json +1100 -0
  518. package/src/plugins/lang/Lang.test.js +267 -0
  519. package/src/plugins/loading/Loading.js +5 -5
  520. package/src/plugins/loading/Loading.json +4 -2
  521. package/src/plugins/loading-bar/LoadingBar.js +5 -5
  522. package/src/plugins/loading-bar/LoadingBar.json +9 -4
  523. package/src/plugins/meta/Meta.js +1 -1
  524. package/src/plugins/notify/Notify.js +4 -4
  525. package/src/plugins/notify/Notify.json +8 -6
  526. package/src/plugins/platform/Platform.js +5 -5
  527. package/src/plugins/platform/Platform.json +6 -0
  528. package/src/plugins/platform/Platform.test.js +104 -0
  529. package/src/{body.js → plugins/private.body/Body.js} +5 -4
  530. package/src/plugins/private.body/Body.test.js +28 -0
  531. package/src/{history.js → plugins/private.history/History.js} +2 -2
  532. package/src/plugins/private.history/History.test.js +38 -0
  533. package/src/plugins/screen/Screen.js +4 -4
  534. package/src/plugins/screen/Screen.json +4 -2
  535. package/src/plugins/screen/Screen.test.js +453 -0
  536. package/src/plugins/{local-storage → storage}/LocalStorage.js +1 -1
  537. package/src/plugins/storage/LocalStorage.json +5 -0
  538. package/src/plugins/storage/LocalStorage.test.js +323 -0
  539. package/src/plugins/{session-storage → storage}/SessionStorage.js +1 -1
  540. package/src/plugins/storage/SessionStorage.json +5 -0
  541. package/src/plugins/storage/SessionStorage.test.js +323 -0
  542. package/src/{utils/private → plugins/storage/engine}/web-storage.js +21 -10
  543. package/src/{utils/private → plugins/storage/engine}/web-storage.json +22 -11
  544. package/src/plugins/storage/engine/web-storage.test.js +43 -0
  545. package/src/plugins.js +8 -4
  546. package/src/utils/EventBus/EventBus.test.js +108 -0
  547. package/src/utils/clone/clone.test.js +111 -0
  548. package/src/utils/colors/colors.test.js +459 -0
  549. package/src/utils/{copy-to-clipboard.js → copy-to-clipboard/copy-to-clipboard.js} +1 -1
  550. package/src/utils/{create-meta-mixin.js → create-meta-mixin/create-meta-mixin.js} +1 -1
  551. package/src/utils/{create-uploader-component.js → create-uploader-component/create-uploader-component.js} +4 -4
  552. package/src/utils/css-var/get-css-var.test.js +44 -0
  553. package/src/utils/css-var/set-css-var.test.js +54 -0
  554. package/src/utils/{date.js → date/date.js} +6 -6
  555. package/src/utils/debounce/debounce.test.js +188 -0
  556. package/src/utils/dom/dom.test.js +222 -0
  557. package/src/utils/extend/extend.test.js +93 -0
  558. package/src/utils/{format.js → format/format.js} +2 -2
  559. package/src/utils/format/format.test.js +107 -0
  560. package/src/utils/{frame-debounce.js → frame-debounce/frame-debounce.js} +1 -1
  561. package/src/utils/frame-debounce/frame-debounce.test.js +127 -0
  562. package/src/utils/is/is.test.js +125 -0
  563. package/src/utils/{morph.js → morph/morph.js} +1 -1
  564. package/src/utils/{open-url.js → open-url/open-url.js} +3 -3
  565. package/src/utils/patterns/patterns.test.js +403 -0
  566. package/src/utils/{private → private.click-outside}/click-outside.js +2 -2
  567. package/src/utils/{private/define-reactive-plugin.js → private.create/create.js} +6 -3
  568. package/src/utils/private.create/create.test.js +58 -0
  569. package/src/utils/private.focus/focus-manager.test.js +190 -0
  570. package/src/utils/private.focus/focusout.test.js +114 -0
  571. package/src/utils/private.get-emits-object/get-emits-object.test.js +29 -0
  572. package/src/utils/private.global/global-config.test.js +54 -0
  573. package/src/utils/{private → private.global}/global-dialog.js +1 -1
  574. package/src/utils/{private → private.global}/global-dialog.json +1 -1
  575. package/src/utils/{private → private.global}/global-nodes.js +1 -1
  576. package/src/utils/private.global/global-nodes.test.js +110 -0
  577. package/src/utils/private.inject-obj-prop/inject-obj-prop.test.js +104 -0
  578. package/src/utils/{private → private.keyboard}/escape-key.js +1 -1
  579. package/src/utils/private.keyboard/escape-key.test.js +117 -0
  580. package/src/utils/private.noop-ssr-directive-transform/noop-ssr-directive-transform.test.js +14 -0
  581. package/src/utils/{private → private.portal}/portal.js +1 -1
  582. package/src/utils/{private → private.position-engine}/position-engine.js +1 -1
  583. package/src/utils/private.render/render.test.js +187 -0
  584. package/src/utils/private.rtl/rtl.test.js +13 -0
  585. package/src/utils/private.selection/selection.test.js +40 -0
  586. package/src/utils/private.sort/sort.test.js +25 -0
  587. package/src/utils/{private → private.symbols}/symbols.js +1 -1
  588. package/src/utils/private.touch/touch.test.js +102 -0
  589. package/src/utils/private.vm/vm.test.js +175 -0
  590. package/src/utils/{prevent-scroll.js → scroll/prevent-scroll.js} +3 -3
  591. package/src/utils/{scroll.js → scroll/scroll.js} +1 -1
  592. package/src/utils/throttle/throttle.test.js +146 -0
  593. package/src/utils/uid/uid.test.js +17 -0
  594. package/src/utils.js +24 -24
  595. package/src/vue-plugin.js +12 -4
  596. package/src/Lang.json +0 -19
  597. package/src/api-file-example.json +0 -94
  598. package/src/composables/private/__tests__/use-form.cy.js +0 -11
  599. package/src/composables/private/__tests__/use-size.cy.js +0 -36
  600. package/src/composables/private/__tests__/use-transition.cy.js +0 -111
  601. package/src/composables/private/use-form.test.js +0 -93
  602. package/src/composables/private/use-ratio.test.js +0 -27
  603. package/src/composables/private/use-size.test.js +0 -22
  604. package/src/composables/use-id.test.js +0 -55
  605. package/src/plugins/local-storage/LocalStorage.json +0 -5
  606. package/src/plugins/session-storage/SessionStorage.json +0 -5
  607. package/src/utils/private/create.js +0 -4
  608. /package/src/composables/{private/__tests__ → __tests__}/FieldWrapper.vue +0 -0
  609. /package/src/composables/{private/__tests__ → __tests__}/use-anchor.cy.js +0 -0
  610. /package/src/composables/{private/__tests__ → __tests__}/use-field.cy.js +0 -0
  611. /package/src/composables/{private/__tests__ → __tests__}/use-file.cy.js +0 -0
  612. /package/src/composables/{private/__tests__ → __tests__}/use-fullscreen.cy.js +0 -0
  613. /package/src/composables/{private/__tests__ → __tests__}/use-model-toggle.cy.js +0 -0
  614. /package/src/composables/{private/__tests__ → __tests__}/use-portal.cy.js +0 -0
  615. /package/src/composables/{private/__tests__ → __tests__}/use-router-link.cy.js +0 -0
  616. /package/src/composables/{private/__tests__ → __tests__}/use-validate.cy.js +0 -0
  617. /package/src/composables/{private → private.use-align}/use-align.js +0 -0
  618. /package/src/composables/{private → private.use-dark}/use-dark.js +0 -0
  619. /package/src/composables/{private → private.use-file}/use-file-dom-props.js +0 -0
  620. /package/src/composables/{private → private.use-key-composition}/use-key-composition.js +0 -0
  621. /package/src/composables/{private → private.use-model-toggle}/use-model-toggle.json +0 -0
  622. /package/src/composables/{private → private.use-panel}/use-panel.child.json +0 -0
  623. /package/src/composables/{private → private.use-panel}/use-panel.sass +0 -0
  624. /package/src/composables/{private → private.use-portal}/use-portal.json +0 -0
  625. /package/src/composables/{private → private.use-ratio}/use-ratio.js +0 -0
  626. /package/src/composables/{private → private.use-ratio}/use-ratio.json +0 -0
  627. /package/src/composables/{private → private.use-refocus-target}/use-refocus-target.js +0 -0
  628. /package/src/composables/{private → private.use-router-link}/use-router-link.json +0 -0
  629. /package/src/composables/{private → private.use-size}/use-size.js +0 -0
  630. /package/src/composables/{private → private.use-size}/use-size.json +0 -0
  631. /package/src/composables/{private → private.use-transition}/use-transition.js +0 -0
  632. /package/src/composables/{private → private.use-transition}/use-transition.json +0 -0
  633. /package/src/composables/{private/use-form.js → use-form/private.use-form.js} +0 -0
  634. /package/src/composables/{private/use-form.json → use-form/private.use-form.json} +0 -0
  635. /package/src/composables/{use-split-attrs.js → use-split-attrs/use-split-attrs.js} +0 -0
  636. /package/src/utils/{EventBus.js → EventBus/EventBus.js} +0 -0
  637. /package/src/utils/{clone.js → clone/clone.js} +0 -0
  638. /package/src/utils/{colors.js → colors/colors.js} +0 -0
  639. /package/src/utils/{get-css-var.js → css-var/get-css-var.js} +0 -0
  640. /package/src/utils/{set-css-var.js → css-var/set-css-var.js} +0 -0
  641. /package/src/utils/{private/date-persian.js → date/private.persian.js} +0 -0
  642. /package/src/utils/{debounce.js → debounce/debounce.js} +0 -0
  643. /package/src/utils/{dom.js → dom/dom.js} +0 -0
  644. /package/src/utils/{event.js → event/event.js} +0 -0
  645. /package/src/utils/{export-file.js → export-file/export-file.js} +0 -0
  646. /package/src/utils/{extend.js → extend/extend.js} +0 -0
  647. /package/src/utils/{is.js → is/is.js} +0 -0
  648. /package/src/utils/{patterns.js → patterns/patterns.js} +0 -0
  649. /package/src/utils/{private → private.focus}/focus-manager.js +0 -0
  650. /package/src/utils/{private → private.focus}/focusout.js +0 -0
  651. /package/src/utils/{private → private.get-emits-object}/get-emits-object.js +0 -0
  652. /package/src/utils/{private → private.global}/global-config.js +0 -0
  653. /package/src/utils/{private → private.inject-obj-prop}/inject-obj-prop.js +0 -0
  654. /package/src/utils/{private → private.keyboard}/key-composition.js +0 -0
  655. /package/src/utils/{private → private.noop-ssr-directive-transform}/noop-ssr-directive-transform.js +0 -0
  656. /package/src/utils/{private → private.option-sizes}/option-sizes.js +0 -0
  657. /package/src/utils/{private → private.render}/render.js +0 -0
  658. /package/src/utils/{private → private.rtl}/rtl.js +0 -0
  659. /package/src/utils/{private → private.selection}/selection.js +0 -0
  660. /package/src/utils/{private → private.sort}/sort.js +0 -0
  661. /package/src/utils/{private → private.touch}/touch.js +0 -0
  662. /package/src/utils/{private → private.vm}/vm.js +0 -0
  663. /package/src/utils/{run-sequential-promises.js → run-sequential-promises/run-sequential-promises.js} +0 -0
  664. /package/src/utils/{throttle.js → throttle/throttle.js} +0 -0
  665. /package/src/utils/{uid.js → uid/uid.js} +0 -0
@@ -1,286 +1,581 @@
1
- import { mount } from '@vue/test-utils'
2
- import { describe, test, expect, vi } from 'vitest'
3
- import { nextTick } from 'vue'
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import {
3
+ describe, test, expect, vi,
4
+ beforeEach, afterEach, onTestFinished
5
+ } from 'vitest'
4
6
 
5
- import { timeToPass } from 'test/runtime.utils.js'
6
7
  import QDialog from './QDialog.js'
8
+ import { getRouter } from 'testing/runtime/router.js'
7
9
  import DialogWrapper from './test/DialogWrapper.vue'
8
10
 
9
- function mountDialog (props = {}) {
10
- const wrapper = mount(DialogWrapper, {
11
- props: {
12
- modelValue: false,
13
- 'onUpdate:modelValue': e => wrapper.setProps({ modelValue: e }),
14
- transitionDuration: 0,
15
- ...props
16
- }
17
- })
11
+ let wrapper = null
18
12
 
19
- const getDialog = () => wrapper.findComponent({ name: 'QDialog' })
20
- const getPortal = () => wrapper.findComponent({ name: 'QPortal' })
21
-
22
- return {
23
- wrapper,
24
-
25
- getDialog,
26
- getPortal,
27
-
28
- setProps: props => {
29
- wrapper.setProps(props)
30
- return nextTick()
31
- },
32
-
33
- isMounted: () => {
34
- const portal = getPortal()
35
- if (portal.exists() === false) return false
36
- return document.body.contains(portal.element)
37
- },
38
-
39
- show: () => {
40
- wrapper.setProps({ modelValue: true })
41
- return vi.waitUntil(
42
- () => getPortal().exists(),
43
- {
44
- timeout: 150, // default is 1000
45
- interval: 5 // default is 50
46
- }
47
- )
48
- },
49
-
50
- hide: () => {
51
- wrapper.setProps({ modelValue: false })
52
- return vi.waitUntil(
53
- () => getPortal().exists() === false,
54
- {
55
- timeout: 150, // default is 1000
56
- interval: 5 // default is 50
57
- }
58
- )
59
- },
60
-
61
- waitForEvent: eventName => {
62
- const dlg = getDialog()
63
- const evtLen = 1 + (
64
- dlg.emitted()[ eventName ]?.length
65
- || 0
66
- )
67
-
68
- return vi.waitUntil(
69
- () => (dlg.emitted()[ eventName ]?.length === evtLen),
70
- {
71
- timeout: 150, // default is 1000
72
- interval: 5 // default is 50
73
- }
74
- )
75
- },
76
-
77
- triggerEscape: () => {
78
- const portal = getPortal()
79
- portal.trigger('keydown', { keyCode: 27 })
80
- portal.trigger('keyup', { keyCode: 27 })
81
- },
82
-
83
- triggerBackdropClick: () => {
84
- getPortal()
85
- .find('.q-dialog__backdrop')
86
- .trigger('click')
87
- }
13
+ beforeEach(() => {
14
+ vi.useFakeTimers()
15
+
16
+ if (wrapper !== null) {
17
+ wrapper.unmount()
18
+ wrapper = null
88
19
  }
20
+ })
21
+
22
+ afterEach(() => {
23
+ vi.clearAllTimers()
24
+ vi.restoreAllMocks()
25
+ })
26
+
27
+ async function triggerBackdropClick (wrapper) {
28
+ await wrapper.findComponent({ name: 'QPortal' })
29
+ .find('.q-dialog__backdrop')
30
+ .trigger('click')
31
+ }
32
+
33
+ async function triggerEscKey (wrapper) {
34
+ const portal = await wrapper.findComponent({ name: 'QPortal' })
35
+ await portal.trigger('keydown', { keyCode: 27 })
36
+ await portal.trigger('keyup', { keyCode: 27 })
37
+ }
38
+
39
+ function createFocusEl () {
40
+ const el = document.createElement('div')
41
+ el.setAttribute('tabindex', '0')
42
+ document.body.appendChild(el)
43
+
44
+ onTestFinished(() => { el.remove() })
45
+
46
+ return el
89
47
  }
90
48
 
91
49
  describe('[QDialog API]', () => {
92
50
  describe('[Props]', () => {
93
51
  describe('[(prop)transition-show]', () => {
94
- test('is defined', () => {
52
+ test('is defined correctly', () => {
95
53
  expect(QDialog.props.transitionShow).toBeDefined()
96
54
  })
97
55
 
98
- test.todo('has effect', () => {
99
- const propVal = 'fade'
100
- const wrapper = mount(QDialog, {
56
+ test('type String has effect', async () => {
57
+ wrapper = mount(QDialog, {
58
+ props: {
59
+ modelValue: true,
60
+ transitionShow: 'flip'
61
+ }
62
+ })
63
+
64
+ await flushPromises()
65
+ const content = wrapper.findComponent({ name: 'QPortal' })
66
+
67
+ expect(
68
+ content.get('transition-stub[enterfromclass]')
69
+ .attributes('enterfromclass')
70
+ ).toBe('q-transition--flip-enter-from')
71
+ })
72
+ })
73
+
74
+ describe('[(prop)transition-hide]', () => {
75
+ test('is defined correctly', () => {
76
+ expect(QDialog.props.transitionHide).toBeDefined()
77
+ })
78
+
79
+ test('type String has effect', async () => {
80
+ wrapper = mount(QDialog, {
81
+ props: {
82
+ modelValue: true,
83
+ transitionHide: 'flip'
84
+ }
85
+ })
86
+
87
+ await flushPromises()
88
+ let content = wrapper.findComponent({ name: 'QPortal' })
89
+
90
+ expect(
91
+ content.get('transition-stub[enterfromclass]')
92
+ .attributes('enterfromclass')
93
+ ).toBe('q-transition--scale-enter-from')
94
+
95
+ wrapper.vm.hide()
96
+ await flushPromises()
97
+
98
+ content = wrapper.findComponent({ name: 'QPortal' })
99
+
100
+ expect(
101
+ content.get('transition-stub[leavefromclass]')
102
+ .attributes('leavefromclass')
103
+ ).toBe('q-transition--flip-leave-from')
104
+ })
105
+ })
106
+
107
+ describe('[(prop)transition-duration]', () => {
108
+ test('is defined correctly', () => {
109
+ expect(QDialog.props.transitionDuration).toBeDefined()
110
+ })
111
+
112
+ test.each([
113
+ [ 'String', '1000' ],
114
+ [ 'Number', 1000 ]
115
+ ])('type %s has effect', async (_, propVal) => {
116
+ const onShowFn = vi.fn()
117
+ wrapper = mount(QDialog, {
101
118
  props: {
102
- transitionShow: propVal
119
+ modelValue: true,
120
+ transitionDuration: propVal,
121
+ onShow: onShowFn
103
122
  }
104
123
  })
105
124
 
106
- // TODO: test the effect of the prop
125
+ await flushPromises()
126
+ expect(onShowFn).not.toHaveBeenCalled()
127
+
128
+ vi.advanceTimersByTime(999)
129
+ expect(onShowFn).not.toHaveBeenCalled()
130
+
131
+ vi.advanceTimersByTime(1)
132
+ expect(onShowFn).toHaveBeenCalledTimes(1)
133
+ })
134
+ })
135
+
136
+ describe('[(prop)model-value]', () => {
137
+ test('is defined correctly', () => {
138
+ expect(QDialog.props.modelValue).toBeDefined()
139
+ })
140
+
141
+ test('type Boolean has effect', async () => {
142
+ wrapper = mount(QDialog, {
143
+ props: {
144
+ modelValue: false
145
+ }
146
+ })
147
+
148
+ expect(
149
+ wrapper.findComponent({ name: 'QPortal' })
150
+ .exists()
151
+ ).toBe(false)
152
+
153
+ await wrapper.setProps({ modelValue: true })
154
+ await flushPromises()
155
+ await vi.runAllTimers()
156
+
157
+ expect(
158
+ wrapper.findComponent({ name: 'QPortal' })
159
+ .exists()
160
+ ).toBe(true)
107
161
  })
108
162
  })
109
163
 
110
164
  describe('[(prop)persistent]', () => {
111
- test('should display a persistent dialog', async () => {
112
- const dlg = mountDialog({ persistent: true })
165
+ test('is defined correctly', () => {
166
+ expect(QDialog.props.persistent).toBeDefined()
167
+ })
168
+
169
+ test.each([
170
+ [ 'Backdrop click', triggerBackdropClick ],
171
+ [ 'ESC key', triggerEscKey ]
172
+ ])('handles %s correctly', async (_, trigger) => {
173
+ wrapper = mount(QDialog, {
174
+ props: {
175
+ persistent: false
176
+ }
177
+ })
178
+
179
+ wrapper.vm.show()
180
+ await flushPromises()
113
181
 
114
- await dlg.show()
115
- expect(dlg.isMounted()).toBe(true)
182
+ await trigger(wrapper)
116
183
 
117
- dlg.triggerBackdropClick()
118
- await timeToPass(30)
119
- expect(dlg.isMounted()).toBe(true)
184
+ await flushPromises()
185
+ await vi.runAllTimers()
186
+
187
+ expect(
188
+ wrapper.findComponent({ name: 'QPortal' })
189
+ .exists()
190
+ ).toBe(false)
120
191
 
121
- dlg.triggerEscape()
122
- await timeToPass(30)
123
- expect(dlg.isMounted()).toBe(true)
192
+ await wrapper.setProps({ persistent: true })
124
193
 
125
- await dlg.setProps({ persistent: false })
126
- dlg.triggerBackdropClick()
194
+ wrapper.vm.show()
195
+ await flushPromises()
196
+ await vi.runAllTimers()
127
197
 
128
- await dlg.waitForEvent('hide')
129
- expect(dlg.isMounted()).toBe(false)
198
+ await trigger(wrapper)
199
+
200
+ await flushPromises()
201
+ await vi.runAllTimers()
202
+
203
+ expect(
204
+ wrapper.findComponent({ name: 'QPortal' })
205
+ .exists()
206
+ ).toBe(true)
130
207
  })
131
208
  })
132
209
 
133
210
  describe('[(prop)no-esc-dismiss]', () => {
134
- test('should not allow closing the dialog with the escape key', async () => {
135
- const dlg = mountDialog({ noEscDismiss: true })
211
+ test('is defined correctly', () => {
212
+ expect(QDialog.props.noEscDismiss).toBeDefined()
213
+ })
214
+
215
+ test('type Boolean has effect', async () => {
216
+ wrapper = mount(QDialog, {
217
+ props: {
218
+ noEscDismiss: false
219
+ }
220
+ })
221
+
222
+ wrapper.vm.show()
223
+ await flushPromises()
224
+
225
+ await triggerEscKey(wrapper)
226
+
227
+ await flushPromises()
228
+ await vi.runAllTimers()
136
229
 
137
- await dlg.show()
138
- dlg.triggerEscape()
230
+ expect(
231
+ wrapper.findComponent({ name: 'QPortal' })
232
+ .exists()
233
+ ).toBe(false)
234
+
235
+ await wrapper.setProps({ noEscDismiss: true })
236
+
237
+ wrapper.vm.show()
238
+ await flushPromises()
239
+ await vi.runAllTimers()
139
240
 
140
- await timeToPass(30)
141
- expect(dlg.isMounted()).toBe(true)
241
+ await triggerEscKey(wrapper)
142
242
 
143
- await dlg.setProps({ noEscDismiss: false })
144
- dlg.triggerEscape()
243
+ await flushPromises()
244
+ await vi.runAllTimers()
145
245
 
146
- await dlg.waitForEvent('hide')
147
- expect(dlg.isMounted()).toBe(false)
246
+ expect(
247
+ wrapper.findComponent({ name: 'QPortal' })
248
+ .exists()
249
+ ).toBe(true)
148
250
  })
149
251
  })
150
252
 
151
253
  describe('[(prop)no-backdrop-dismiss]', () => {
152
- test('should not close dialog with backdrop', async () => {
153
- const dlg = mountDialog({ noBackdropDismiss: true })
254
+ test('is defined correctly', () => {
255
+ expect(QDialog.props.noBackdropDismiss).toBeDefined()
256
+ })
154
257
 
155
- await dlg.show()
156
- dlg.triggerBackdropClick()
157
- await timeToPass(30)
258
+ test('type Boolean has effect', async () => {
259
+ wrapper = mount(QDialog, {
260
+ props: {
261
+ noBackdropDismiss: false
262
+ }
263
+ })
158
264
 
159
- expect(dlg.isMounted()).toBe(true)
265
+ wrapper.vm.show()
266
+ await flushPromises()
160
267
 
161
- await dlg.setProps({ noBackdropDismiss: false })
162
- dlg.triggerBackdropClick()
268
+ await triggerBackdropClick(wrapper)
163
269
 
164
- await dlg.waitForEvent('hide')
165
- expect(dlg.isMounted()).toBe(false)
270
+ await flushPromises()
271
+ await vi.runAllTimers()
272
+
273
+ expect(
274
+ wrapper.findComponent({ name: 'QPortal' })
275
+ .exists()
276
+ ).toBe(false)
277
+
278
+ await wrapper.setProps({ noBackdropDismiss: true })
279
+
280
+ wrapper.vm.show()
281
+ await flushPromises()
282
+ await vi.runAllTimers()
283
+
284
+ await triggerBackdropClick(wrapper)
285
+
286
+ await flushPromises()
287
+ await vi.runAllTimers()
288
+
289
+ expect(
290
+ wrapper.findComponent({ name: 'QPortal' })
291
+ .exists()
292
+ ).toBe(true)
166
293
  })
167
294
  })
168
295
 
169
- describe.todo('[(prop)no-route-dismiss]', () => {
170
- test.todo(' ', () => {
171
- //
296
+ describe('[(prop)no-route-dismiss]', () => {
297
+ test('is defined correctly', () => {
298
+ expect(QDialog.props.noRouteDismiss).toBeDefined()
299
+ })
300
+
301
+ test('type Boolean has effect', async () => {
302
+ const router = await getRouter([ '/home', '/account' ])
303
+
304
+ wrapper = mount(QDialog, {
305
+ props: {
306
+ noRouteDismiss: true
307
+ },
308
+ global: {
309
+ plugins: [ router ]
310
+ }
311
+ })
312
+
313
+ wrapper.vm.show()
314
+ await flushPromises()
315
+ await vi.runAllTimers()
316
+
317
+ await router.push('/home')
318
+ await flushPromises()
319
+ await vi.runAllTimers()
320
+
321
+ expect(
322
+ wrapper.findComponent({ name: 'QPortal' })
323
+ .exists()
324
+ ).toBe(true)
325
+
326
+ await wrapper.setProps({ noRouteDismiss: false })
327
+ await flushPromises()
328
+
329
+ await router.push('/account')
330
+ await flushPromises()
331
+ await vi.runAllTimers()
332
+
333
+ expect(
334
+ wrapper.findComponent({ name: 'QPortal' })
335
+ .exists()
336
+ ).toBe(false)
172
337
  })
173
338
  })
174
339
 
175
340
  describe('[(prop)auto-close]', () => {
176
- test('should auto-close the dialog', async () => {
177
- const dlg = mountDialog({ autoClose: false })
341
+ test('is defined correctly', () => {
342
+ expect(QDialog.props.autoClose).toBeDefined()
343
+ })
178
344
 
179
- await dlg.show()
180
- dlg.wrapper.findComponent({ name: 'QBtn' })
345
+ test('type Boolean has effect', async () => {
346
+ wrapper = mount(DialogWrapper, {
347
+ props: {
348
+ autoClose: false
349
+ }
350
+ })
351
+
352
+ wrapper.findComponent({ name: 'QDialog' })
353
+ .vm.show()
354
+
355
+ await flushPromises()
356
+
357
+ await wrapper.findComponent({ name: 'QBtn' })
181
358
  .trigger('click')
182
359
 
183
- await timeToPass(30)
360
+ await flushPromises()
361
+ await vi.runAllTimers()
184
362
 
185
- expect(dlg.isMounted()).toBe(true)
363
+ expect(
364
+ wrapper.findComponent({ name: 'QPortal' })
365
+ .exists()
366
+ ).toBe(true)
367
+
368
+ await wrapper.setProps({ autoClose: true })
369
+
370
+ wrapper.findComponent({ name: 'QDialog' })
371
+ .vm.show()
186
372
 
187
- await dlg.setProps({ autoClose: true })
373
+ await flushPromises()
374
+ await vi.runAllTimers()
188
375
 
189
- dlg.wrapper.findComponent({ name: 'QBtn' })
376
+ await wrapper.findComponent({ name: 'QBtn' })
190
377
  .trigger('click')
191
378
 
192
- await dlg.waitForEvent('hide')
193
- expect(dlg.isMounted()).toBe(false)
379
+ await flushPromises()
380
+ await vi.runAllTimers()
381
+
382
+ expect(
383
+ wrapper.findComponent({ name: 'QPortal' })
384
+ .exists()
385
+ ).toBe(false)
194
386
  })
195
387
  })
196
388
 
197
389
  describe('[(prop)seamless]', () => {
198
- test('should put the dialog in a seamless state', async () => {
199
- const dlg = mountDialog({ seamless: true })
390
+ test('is defined correctly', () => {
391
+ expect(QDialog.props.seamless).toBeDefined()
392
+ })
200
393
 
201
- await dlg.show()
202
- const target = dlg.getPortal().get('.q-dialog')
394
+ test('type Boolean has effect', async () => {
395
+ wrapper = mount(QDialog, {
396
+ props: {
397
+ modelValue: true,
398
+ seamless: true
399
+ }
400
+ })
401
+
402
+ await flushPromises()
403
+ await vi.runAllTimers()
203
404
 
204
405
  expect(
205
- target.classes()
406
+ wrapper.findComponent({ name: 'QPortal' })
407
+ .get('.q-dialog')
408
+ .classes()
206
409
  ).toContain('q-dialog--seamless')
207
410
 
208
- await dlg.setProps({ seamless: false })
411
+ await wrapper.setProps({ seamless: false })
412
+ await flushPromises()
209
413
 
210
414
  expect(
211
- target.classes()
415
+ wrapper.findComponent({ name: 'QPortal' })
416
+ .get('.q-dialog')
417
+ .classes()
212
418
  ).not.toContain('q-dialog--seamless')
213
419
  })
214
420
  })
215
421
 
422
+ describe('[(prop)backdrop-filter]', () => {
423
+ test('is defined correctly', () => {
424
+ expect(QDialog.props.backdropFilter).toBeDefined()
425
+ })
426
+
427
+ // Commented because jsdom doesn't understand backdrop-filter
428
+
429
+ // test('type String has effect', async () => {
430
+ // const propVal = 'blur(4px)'
431
+ // wrapper = mount(QDialog, {
432
+ // props: {
433
+ // modelValue: true,
434
+ // backdropFilter: propVal
435
+ // }
436
+ // })
437
+
438
+ // await flushPromises()
439
+ // await vi.runAllTimers()
440
+
441
+ // expect(
442
+ // wrapper.findComponent({ name: 'QPortal' })
443
+ // .get('.q-dialog__backdrop')
444
+ // .$style('backdrop-filter')
445
+ // ).toBe(propVal)
446
+
447
+ // await wrapper.setProps({ backdropFilter: void 0 })
448
+ // await flushPromises()
449
+
450
+ // expect(
451
+ // wrapper.findComponent({ name: 'QPortal' })
452
+ // .get('.q-dialog__backdrop')
453
+ // .$style('backdrop-filter')
454
+ // ).toBeUndefined()
455
+ // })
456
+ })
457
+
216
458
  describe('[(prop)maximized]', () => {
217
- test('should maximize the dialog', async () => {
218
- const dlg = mountDialog({ maximized: true })
459
+ test('is defined correctly', () => {
460
+ expect(QDialog.props.maximized).toBeDefined()
461
+ })
462
+
463
+ test('type Boolean has effect', async () => {
464
+ wrapper = mount(QDialog, {
465
+ props: {
466
+ modelValue: true,
467
+ maximized: true
468
+ }
469
+ })
219
470
 
220
- await dlg.show()
221
- const target = dlg.getPortal().get('.q-dialog__inner')
471
+ await flushPromises()
472
+ await vi.runAllTimers()
222
473
 
223
474
  expect(
224
- target.classes()
475
+ wrapper.findComponent({ name: 'QPortal' })
476
+ .get('.q-dialog__inner')
477
+ .classes()
225
478
  ).toContain('q-dialog__inner--maximized')
226
479
 
227
- await dlg.setProps({ maximized: false })
480
+ await wrapper.setProps({ maximized: false })
481
+ await flushPromises()
228
482
 
229
483
  expect(
230
- target.classes()
484
+ wrapper.findComponent({ name: 'QPortal' })
485
+ .get('.q-dialog__inner')
486
+ .classes()
231
487
  ).not.toContain('q-dialog__inner--maximized')
232
488
  })
233
489
  })
234
490
 
235
491
  describe('[(prop)full-width]', () => {
236
- test('should use a full-width for the dialog', async () => {
237
- const dlg = mountDialog({ fullWidth: true })
492
+ test('is defined correctly', () => {
493
+ expect(QDialog.props.fullWidth).toBeDefined()
494
+ })
238
495
 
239
- await dlg.show()
240
- const target = dlg.getPortal().get('.q-dialog__inner')
496
+ test('type Boolean has effect', async () => {
497
+ wrapper = mount(QDialog, {
498
+ props: {
499
+ modelValue: true,
500
+ fullWidth: true
501
+ }
502
+ })
503
+
504
+ await flushPromises()
505
+ await vi.runAllTimers()
241
506
 
242
507
  expect(
243
- target.classes()
508
+ wrapper.findComponent({ name: 'QPortal' })
509
+ .get('.q-dialog__inner')
510
+ .classes()
244
511
  ).toContain('q-dialog__inner--fullwidth')
245
512
 
246
- await dlg.setProps({ fullWidth: false })
513
+ await wrapper.setProps({ fullWidth: false })
514
+ await flushPromises()
247
515
 
248
516
  expect(
249
- target.classes()
517
+ wrapper.findComponent({ name: 'QPortal' })
518
+ .get('.q-dialog__inner')
519
+ .classes()
250
520
  ).not.toContain('q-dialog__inner--fullwidth')
251
521
  })
252
522
  })
253
523
 
254
524
  describe('[(prop)full-height]', () => {
255
- test('should set the dialog to full-height', async () => {
256
- const dlg = mountDialog({ fullHeight: true })
525
+ test('is defined correctly', () => {
526
+ expect(QDialog.props.fullHeight).toBeDefined()
527
+ })
257
528
 
258
- await dlg.show()
259
- const target = dlg.getPortal().get('.q-dialog__inner')
529
+ test('type Boolean has effect', async () => {
530
+ wrapper = mount(QDialog, {
531
+ props: {
532
+ modelValue: true,
533
+ fullHeight: true
534
+ }
535
+ })
536
+
537
+ await flushPromises()
538
+ await vi.runAllTimers()
260
539
 
261
540
  expect(
262
- target.classes()
541
+ wrapper.findComponent({ name: 'QPortal' })
542
+ .get('.q-dialog__inner')
543
+ .classes()
263
544
  ).toContain('q-dialog__inner--fullheight')
264
545
 
265
- await dlg.setProps({ fullHeight: false })
546
+ await wrapper.setProps({ fullHeight: false })
547
+ await flushPromises()
266
548
 
267
549
  expect(
268
- target.classes()
550
+ wrapper.findComponent({ name: 'QPortal' })
551
+ .get('.q-dialog__inner')
552
+ .classes()
269
553
  ).not.toContain('q-dialog__inner--fullheight')
270
554
  })
271
555
  })
272
556
 
273
557
  describe('[(prop)position]', () => {
274
- test('should display the dialog at a specific position', async () => {
275
- const dlg = mountDialog()
558
+ test('is defined correctly', () => {
559
+ expect(QDialog.props.position).toBeDefined()
560
+ })
276
561
 
277
- await dlg.show()
562
+ test('type String has effect', async () => {
563
+ wrapper = mount(QDialog, {
564
+ props: {
565
+ modelValue: true
566
+ }
567
+ })
568
+
569
+ await flushPromises()
570
+ await vi.runAllTimers()
278
571
 
279
- const target = dlg.getPortal().get('.q-dialog__inner')
280
- const positions = [ 'top', 'right', 'bottom', 'left' ]
572
+ const positionList = [ 'top', 'right', 'bottom', 'left' ]
573
+ const target = wrapper.findComponent({ name: 'QPortal' })
574
+ .get('.q-dialog__inner')
281
575
 
282
- for (const position of positions) {
283
- await dlg.setProps({ position })
576
+ for (const position of positionList) {
577
+ await wrapper.setProps({ position })
578
+ await flushPromises()
284
579
 
285
580
  const cls = target.classes()
286
581
  expect(cls).toContain(`q-dialog__inner--${ position }`)
@@ -290,100 +585,679 @@ describe('[QDialog API]', () => {
290
585
  })
291
586
 
292
587
  describe('[(prop)square]', () => {
293
- test('should use a square style for dialog', async () => {
294
- const dlg = mountDialog({ square: true })
295
- await dlg.show()
588
+ test('is defined correctly', () => {
589
+ expect(QDialog.props.square).toBeDefined()
590
+ })
591
+
592
+ test('type Boolean has effect', async () => {
593
+ wrapper = mount(DialogWrapper, {
594
+ props: {
595
+ modelValue: true,
596
+ square: true
597
+ }
598
+ })
599
+
600
+ await flushPromises()
601
+ await vi.runAllTimers()
602
+
603
+ expect(
604
+ wrapper
605
+ .findComponent({ name: 'QCard' })
606
+ .get('.q-card')
607
+ .$computedStyle('border-radius')
608
+ ).toBe('0')
609
+
610
+ await wrapper.setProps({ square: false })
611
+ await flushPromises()
612
+
613
+ expect(
614
+ wrapper
615
+ .findComponent({ name: 'QCard' })
616
+ .get('.q-card')
617
+ .$computedStyle('border-radius')
618
+ ).not.toBe('0')
619
+ })
620
+ })
621
+
622
+ describe('[(prop)no-refocus]', () => {
623
+ test('is defined correctly', () => {
624
+ expect(QDialog.props.noRefocus).toBeDefined()
625
+ })
626
+
627
+ test('type Boolean has effect', async () => {
628
+ const el = createFocusEl()
629
+
630
+ el.focus()
631
+
632
+ wrapper = mount(QDialog)
633
+
634
+ wrapper.findComponent({ name: 'QDialog' })
635
+ .vm.show()
636
+
637
+ await flushPromises()
638
+ await vi.runAllTimers()
639
+
640
+ expect(
641
+ document.activeElement
642
+ ).not.toBe(
643
+ el
644
+ )
645
+
646
+ wrapper.findComponent({ name: 'QDialog' })
647
+ .vm.hide()
648
+
649
+ await flushPromises()
650
+ await vi.runAllTimers()
651
+
652
+ expect(
653
+ document.activeElement
654
+ ).toBe(
655
+ el
656
+ )
657
+
658
+ await wrapper.setProps({ noRefocus: true })
659
+
660
+ wrapper.findComponent({ name: 'QDialog' })
661
+ .vm.show()
662
+
663
+ await flushPromises()
664
+ await vi.runAllTimers()
665
+
666
+ wrapper.findComponent({ name: 'QDialog' })
667
+ .vm.hide()
668
+
669
+ await flushPromises()
670
+ await vi.runAllTimers()
671
+
672
+ expect(
673
+ document.activeElement
674
+ ).not.toBe(
675
+ el
676
+ )
677
+ })
678
+ })
679
+
680
+ describe('[(prop)no-focus]', () => {
681
+ test('is defined correctly', () => {
682
+ expect(QDialog.props.noFocus).toBeDefined()
683
+ })
684
+
685
+ test('type Boolean has effect', async () => {
686
+ const el = createFocusEl()
687
+
688
+ el.focus()
689
+
690
+ wrapper = mount(QDialog)
691
+
692
+ wrapper.findComponent({ name: 'QDialog' })
693
+ .vm.show()
694
+
695
+ await flushPromises()
696
+ await vi.runAllTimers()
697
+
698
+ expect(
699
+ document.activeElement
700
+ ).not.toBe(
701
+ el
702
+ )
703
+
704
+ wrapper.findComponent({ name: 'QDialog' })
705
+ .vm.hide()
706
+
707
+ await flushPromises()
708
+ await vi.runAllTimers()
709
+
710
+ expect(
711
+ document.activeElement
712
+ ).toBe(
713
+ el
714
+ )
715
+
716
+ await wrapper.setProps({ noFocus: true })
717
+
718
+ wrapper.findComponent({ name: 'QDialog' })
719
+ .vm.show()
720
+
721
+ await flushPromises()
722
+ await vi.runAllTimers()
723
+
724
+ expect(
725
+ document.activeElement
726
+ ).toBe(
727
+ el
728
+ )
729
+ })
730
+ })
731
+
732
+ describe('[(prop)no-shake]', () => {
733
+ test('is defined correctly', () => {
734
+ expect(QDialog.props.noShake).toBeDefined()
735
+ })
736
+
737
+ test('type Boolean has effect', async () => {
738
+ wrapper = mount(QDialog, {
739
+ props: {
740
+ modelValue: true,
741
+ noShake: true,
742
+ persistent: true
743
+ }
744
+ })
745
+
746
+ await flushPromises()
747
+ await vi.runAllTimers()
748
+
749
+ await triggerBackdropClick(wrapper)
750
+
751
+ await flushPromises()
752
+
753
+ expect(
754
+ wrapper.findComponent({ name: 'QPortal' })
755
+ .get('.q-dialog__inner')
756
+ .classes()
757
+ ).not.toContain('q-animate--scale')
758
+
759
+ await wrapper.setProps({ noShake: false })
760
+ await flushPromises()
761
+
762
+ await triggerBackdropClick(wrapper)
763
+
764
+ expect(
765
+ wrapper.findComponent({ name: 'QPortal' })
766
+ .get('.q-dialog__inner')
767
+ .classes()
768
+ ).toContain('q-animate--scale')
769
+ })
770
+ })
296
771
 
297
- const target = dlg.getPortal().get('.q-dialog__inner')
772
+ describe('[(prop)allow-focus-outside]', () => {
773
+ test('is defined correctly', () => {
774
+ expect(QDialog.props.allowFocusOutside).toBeDefined()
775
+ })
776
+
777
+ test('type Boolean has effect', async () => {
778
+ const el = createFocusEl()
779
+
780
+ wrapper = mount(QDialog, {
781
+ props: {
782
+ modelValue: true,
783
+ allowFocusOutside: false
784
+ }
785
+ })
786
+
787
+ await flushPromises()
788
+ await vi.runAllTimers()
789
+
790
+ el.focus()
791
+
792
+ await flushPromises()
793
+
794
+ expect(
795
+ document.activeElement
796
+ ).not.toBe(
797
+ el
798
+ )
799
+
800
+ await wrapper.setProps({ allowFocusOutside: true })
801
+ await flushPromises()
802
+
803
+ el.focus()
298
804
 
299
- expect(target.classes()).toContain('q-dialog__inner--square')
300
- await dlg.setProps({ square: false })
301
- expect(target.classes()).not.toContain('q-dialog__inner--square')
805
+ await flushPromises()
806
+ await vi.runAllTimers()
807
+
808
+ expect(
809
+ document.activeElement
810
+ ).toBe(
811
+ el
812
+ )
302
813
  })
303
814
  })
304
815
  })
305
816
 
306
817
  describe('[Slots]', () => {
307
818
  describe('[(slot)default]', () => {
308
- test('should display a default slot', async () => {
309
- const dlg = mountDialog({ persistent: true })
310
- await dlg.show()
819
+ test('renders the content', async () => {
820
+ const slotContent = 'some-slot-content'
821
+ wrapper = mount(QDialog, {
822
+ props: {
823
+ modelValue: true
824
+ },
825
+ slots: {
826
+ default: () => slotContent
827
+ }
828
+ })
829
+
830
+ await flushPromises()
831
+ await vi.runAllTimers()
311
832
 
312
833
  expect(
313
- dlg.wrapper.findComponent({ name: 'QBtn' })
314
- .exists()
315
- ).toBe(true)
834
+ wrapper.findComponent({ name: 'QPortal' })
835
+ .html()
836
+ ).toContain(slotContent)
316
837
  })
317
838
  })
318
839
  })
319
840
 
320
841
  describe('[Events]', () => {
842
+ describe('[(event)update:model-value]', () => {
843
+ test('is defined correctly', () => {
844
+ expect(
845
+ QDialog.emits?.includes('update:modelValue')
846
+ ^ (QDialog.props?.[ 'onUpdate:modelValue' ] !== void 0)
847
+ ).toBe(1)
848
+ })
849
+
850
+ test('is emitting', async () => {
851
+ wrapper = mount(QDialog, {
852
+ props: {
853
+ modelValue: false,
854
+ 'onUpdate:modelValue': val => {
855
+ wrapper.setProps({ modelValue: val })
856
+ }
857
+ }
858
+ })
859
+
860
+ await flushPromises()
861
+ await vi.runAllTimers()
862
+
863
+ wrapper.findComponent({ name: 'QDialog' })
864
+ .vm.show()
865
+
866
+ await flushPromises()
867
+ await vi.runAllTimers()
868
+
869
+ const eventList = wrapper.emitted()
870
+ expect(eventList).toHaveProperty('update:modelValue')
871
+ expect(eventList[ 'update:modelValue' ]).toHaveLength(1)
872
+
873
+ const [ value ] = eventList[ 'update:modelValue' ][ 0 ]
874
+ expect(value).toBeTypeOf('boolean')
875
+ })
876
+ })
877
+
878
+ describe('[(event)show]', () => {
879
+ test('is defined correctly', () => {
880
+ expect(
881
+ QDialog.emits?.includes('show')
882
+ ^ (QDialog.props?.onShow !== void 0)
883
+ ).toBe(1)
884
+ })
885
+
886
+ test('is emitting', async () => {
887
+ wrapper = mount(QDialog)
888
+ const event = new MouseEvent('click')
889
+
890
+ await flushPromises()
891
+ await vi.runAllTimers()
892
+
893
+ wrapper.findComponent({ name: 'QDialog' })
894
+ .vm.show(event)
895
+
896
+ await flushPromises()
897
+ await vi.runAllTimers()
898
+
899
+ const eventList = wrapper.emitted()
900
+ expect(eventList).toHaveProperty('show')
901
+ expect(eventList.show).toHaveLength(1)
902
+
903
+ const [ evt ] = eventList.show[ 0 ]
904
+ expect(evt).toBe(evt)
905
+ })
906
+ })
907
+
908
+ describe('[(event)before-show]', () => {
909
+ test('is defined correctly', () => {
910
+ expect(
911
+ QDialog.emits?.includes('beforeShow')
912
+ ^ (QDialog.props?.onBeforeShow !== void 0)
913
+ ).toBe(1)
914
+ })
915
+
916
+ test('is emitting', async () => {
917
+ wrapper = mount(QDialog)
918
+ const event = new MouseEvent('click')
919
+
920
+ await flushPromises()
921
+ await vi.runAllTimers()
922
+
923
+ wrapper.findComponent({ name: 'QDialog' })
924
+ .vm.show(event)
925
+
926
+ await flushPromises()
927
+ await vi.runAllTimers()
928
+
929
+ const eventList = wrapper.emitted()
930
+ expect(eventList).toHaveProperty('beforeShow')
931
+ expect(eventList.beforeShow).toHaveLength(1)
932
+
933
+ const [ evt ] = eventList.beforeShow[ 0 ]
934
+ expect(evt).toBe(event)
935
+ })
936
+ })
937
+
938
+ describe('[(event)hide]', () => {
939
+ test('is defined correctly', () => {
940
+ expect(
941
+ QDialog.emits?.includes('hide')
942
+ ^ (QDialog.props?.onHide !== void 0)
943
+ ).toBe(1)
944
+ })
945
+
946
+ test('is emitting', async () => {
947
+ wrapper = mount(QDialog, {
948
+ props: {
949
+ modelValue: true,
950
+ 'onUpdate:modelValue': val => {
951
+ wrapper.setProps({ modelValue: val })
952
+ }
953
+ }
954
+ })
955
+ const event = new MouseEvent('click')
956
+
957
+ await flushPromises()
958
+ await vi.runAllTimers()
959
+
960
+ wrapper.findComponent({ name: 'QDialog' })
961
+ .vm.hide(event)
962
+
963
+ await flushPromises()
964
+ await vi.runAllTimers()
965
+
966
+ const eventList = wrapper.emitted()
967
+ expect(eventList).toHaveProperty('hide')
968
+ expect(eventList.hide).toHaveLength(1)
969
+
970
+ const [ evt ] = eventList.hide[ 0 ]
971
+ expect(evt).toBe(event)
972
+ })
973
+ })
974
+
975
+ describe('[(event)before-hide]', () => {
976
+ test('is defined correctly', () => {
977
+ expect(
978
+ QDialog.emits?.includes('beforeHide')
979
+ ^ (QDialog.props?.onBeforeHide !== void 0)
980
+ ).toBe(1)
981
+ })
982
+
983
+ test('is emitting', async () => {
984
+ wrapper = mount(QDialog, {
985
+ props: {
986
+ modelValue: true,
987
+ 'onUpdate:modelValue': val => {
988
+ wrapper.setProps({ modelValue: val })
989
+ }
990
+ }
991
+ })
992
+ const event = new MouseEvent('click')
993
+
994
+ await flushPromises()
995
+ await vi.runAllTimers()
996
+
997
+ wrapper.findComponent({ name: 'QDialog' })
998
+ .vm.hide(event)
999
+
1000
+ await flushPromises()
1001
+ await vi.runAllTimers()
1002
+
1003
+ const eventList = wrapper.emitted()
1004
+ expect(eventList).toHaveProperty('beforeHide')
1005
+ expect(eventList.beforeHide).toHaveLength(1)
1006
+
1007
+ const [ evt ] = eventList.beforeHide[ 0 ]
1008
+ expect(evt).toBe(event)
1009
+ })
1010
+ })
1011
+
321
1012
  describe('[(event)shake]', () => {
322
- test('should emit shake event', async () => {
323
- const fn = vi.fn()
324
- const dlg = mountDialog({
325
- noEscDismiss: true,
326
- onShake: fn
1013
+ test('is defined correctly', () => {
1014
+ expect(
1015
+ QDialog.emits?.includes('shake')
1016
+ ^ (QDialog.props?.onShake !== void 0)
1017
+ ).toBe(1)
1018
+ })
1019
+
1020
+ test('is emitting', async () => {
1021
+ wrapper = mount(QDialog, {
1022
+ props: {
1023
+ modelValue: true,
1024
+ persistent: true
1025
+ }
327
1026
  })
328
1027
 
329
- await dlg.show()
1028
+ await flushPromises()
1029
+ await vi.runAllTimers()
330
1030
 
331
- dlg.triggerEscape()
332
- await nextTick()
1031
+ await triggerEscKey(wrapper)
333
1032
 
334
- expect(fn).toHaveBeenCalledTimes(1)
1033
+ expect(
1034
+ wrapper.findComponent({ name: 'QPortal' })
1035
+ .get('.q-dialog__inner')
1036
+ .classes()
1037
+ ).toContain('q-animate--scale')
335
1038
 
336
- dlg.getDialog().vm.shake()
337
- await nextTick()
1039
+ const eventList = wrapper.emitted()
1040
+ expect(eventList).toHaveProperty('shake')
1041
+ expect(eventList.shake).toHaveLength(1)
338
1042
 
339
- expect(fn).toHaveBeenCalledTimes(2)
1043
+ expect(eventList.shake[ 0 ]).toHaveLength(0)
340
1044
  })
341
1045
  })
342
1046
 
343
1047
  describe('[(event)escape-key]', () => {
344
- test('should emit escape-key event', async () => {
345
- const fn = vi.fn()
346
- const dlg = mountDialog({
347
- onEscapeKey: fn
1048
+ test('is defined correctly', () => {
1049
+ expect(
1050
+ QDialog.emits?.includes('escapeKey')
1051
+ ^ (QDialog.props?.onEscapeKey !== void 0)
1052
+ ).toBe(1)
1053
+ })
1054
+
1055
+ test('is emitting', async () => {
1056
+ wrapper = mount(QDialog, {
1057
+ props: {
1058
+ modelValue: true
1059
+ }
348
1060
  })
349
1061
 
350
- await dlg.show()
1062
+ await flushPromises()
1063
+ await vi.runAllTimers()
1064
+
1065
+ await triggerEscKey(wrapper)
351
1066
 
352
- dlg.triggerEscape()
353
- await nextTick()
1067
+ const eventList = wrapper.emitted()
1068
+ expect(eventList).toHaveProperty('escapeKey')
1069
+ expect(eventList.escapeKey).toHaveLength(1)
354
1070
 
355
- expect(fn).toHaveBeenCalledTimes(1)
1071
+ expect(eventList.escapeKey[ 0 ]).toHaveLength(0)
356
1072
  })
357
1073
  })
358
1074
  })
359
1075
 
360
1076
  describe('[Methods]', () => {
361
- describe('[(method)shake]', () => {
362
- test('should use the shake method to shake dialog', async () => {
363
- const dlg = mountDialog({ noEscDismiss: true })
1077
+ describe('[(method)show]', () => {
1078
+ test('should be callable', async () => {
1079
+ wrapper = mount(QDialog)
1080
+
1081
+ expect(
1082
+ wrapper.findComponent({ name: 'QPortal' })
1083
+ .exists()
1084
+ ).toBe(false)
1085
+
1086
+ expect(
1087
+ wrapper.vm.show()
1088
+ ).toBeUndefined()
1089
+
1090
+ await flushPromises()
1091
+ await vi.runAllTimers()
1092
+
1093
+ expect(
1094
+ wrapper.findComponent({ name: 'QPortal' })
1095
+ .exists()
1096
+ ).toBe(true)
1097
+ })
1098
+ })
1099
+
1100
+ describe('[(method)hide]', () => {
1101
+ test('should be callable', async () => {
1102
+ wrapper = mount(QDialog, {
1103
+ props: {
1104
+ modelValue: true
1105
+ }
1106
+ })
364
1107
 
365
- await dlg.show()
1108
+ await flushPromises()
1109
+ await vi.runAllTimers()
366
1110
 
367
- const target = dlg.getPortal().get('.q-dialog__inner')
368
- expect(target.classes()).not.toContain('q-animate--scale')
1111
+ expect(
1112
+ wrapper.findComponent({ name: 'QPortal' })
1113
+ .exists()
1114
+ ).toBe(true)
369
1115
 
370
- dlg.triggerEscape()
371
- await nextTick()
1116
+ expect(
1117
+ wrapper.vm.hide()
1118
+ ).toBeUndefined()
372
1119
 
373
- expect(target.classes()).toContain('q-animate--scale')
1120
+ await flushPromises()
1121
+ await vi.runAllTimers()
374
1122
 
375
- await vi.waitUntil(
376
- () => target.classes().includes('q-animate--scale') === false,
377
- {
378
- timeout: 400, // default is 1000
379
- interval: 50 // default is 50
1123
+ expect(
1124
+ wrapper.findComponent({ name: 'QPortal' })
1125
+ .exists()
1126
+ ).toBe(false)
1127
+ })
1128
+ })
1129
+
1130
+ describe('[(method)toggle]', () => {
1131
+ test('should be callable', async () => {
1132
+ wrapper = mount(QDialog, {
1133
+ props: {
1134
+ modelValue: true
380
1135
  }
1136
+ })
1137
+
1138
+ await flushPromises()
1139
+ await vi.runAllTimers()
1140
+
1141
+ expect(
1142
+ wrapper.findComponent({ name: 'QPortal' })
1143
+ .exists()
1144
+ ).toBe(true)
1145
+
1146
+ expect(
1147
+ wrapper.vm.toggle()
1148
+ ).toBeUndefined()
1149
+
1150
+ await flushPromises()
1151
+ await vi.runAllTimers()
1152
+
1153
+ expect(
1154
+ wrapper.findComponent({ name: 'QPortal' })
1155
+ .exists()
1156
+ ).toBe(false)
1157
+
1158
+ expect(
1159
+ wrapper.vm.toggle()
1160
+ ).toBeUndefined()
1161
+
1162
+ await flushPromises()
1163
+ await vi.runAllTimers()
1164
+
1165
+ expect(
1166
+ wrapper.findComponent({ name: 'QPortal' })
1167
+ .exists()
1168
+ ).toBe(true)
1169
+ })
1170
+ })
1171
+
1172
+ describe('[(method)focus]', () => {
1173
+ test('should focus with a selector', async () => {
1174
+ wrapper = mount(DialogWrapper, {
1175
+ props: {
1176
+ modelValue: true
1177
+ }
1178
+ })
1179
+
1180
+ await flushPromises()
1181
+ await vi.runAllTimers()
1182
+
1183
+ expect(
1184
+ wrapper.findComponent({ name: 'QDialog' })
1185
+ .vm.focus('.q-btn')
1186
+ ).toBeUndefined()
1187
+
1188
+ await flushPromises()
1189
+
1190
+ expect(
1191
+ document.activeElement
1192
+ ).toBe(
1193
+ wrapper.findComponent({ name: 'QBtn' }).element
381
1194
  )
1195
+ })
1196
+
1197
+ test('should focus without a selector', async () => {
1198
+ wrapper = mount(DialogWrapper, {
1199
+ props: {
1200
+ modelValue: true
1201
+ }
1202
+ })
382
1203
 
383
- dlg.getDialog().vm.shake()
384
- await nextTick()
1204
+ await flushPromises()
1205
+ await vi.runAllTimers()
385
1206
 
386
- expect(target.classes()).toContain('q-animate--scale')
1207
+ expect(
1208
+ wrapper.findComponent({ name: 'QDialog' })
1209
+ .vm.focus()
1210
+ ).toBeUndefined()
1211
+
1212
+ await flushPromises()
1213
+
1214
+ expect(
1215
+ document.activeElement
1216
+ ).toBe(
1217
+ wrapper.findComponent({ name: 'QPortal' })
1218
+ .get('.q-dialog__inner').element
1219
+ )
1220
+ })
1221
+ })
1222
+
1223
+ describe('[(method)shake]', () => {
1224
+ test('should be callable', async () => {
1225
+ wrapper = mount(QDialog, {
1226
+ props: {
1227
+ modelValue: true
1228
+ }
1229
+ })
1230
+
1231
+ await flushPromises()
1232
+ await vi.runAllTimers()
1233
+
1234
+ wrapper.findComponent({ name: 'QDialog' })
1235
+ .vm.shake()
1236
+
1237
+ expect(
1238
+ wrapper.findComponent({ name: 'QPortal' })
1239
+ .get('.q-dialog__inner')
1240
+ .classes()
1241
+ ).toContain('q-animate--scale')
1242
+ })
1243
+ })
1244
+ })
1245
+
1246
+ describe('[Computed props]', () => {
1247
+ describe('[(computedProp)contentEl]', () => {
1248
+ test('should be exposed', async () => {
1249
+ wrapper = mount(QDialog, {
1250
+ props: {
1251
+ modelValue: true
1252
+ }
1253
+ })
1254
+
1255
+ await flushPromises()
1256
+ await vi.runAllTimers()
1257
+
1258
+ expect(
1259
+ wrapper.vm.contentEl
1260
+ ).toBeInstanceOf(Element)
387
1261
  })
388
1262
  })
389
1263
  })