sprintify-ui 0.4.4 → 0.4.5

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 (417) hide show
  1. package/README.md +258 -258
  2. package/dist/sprintify-ui.es.js +27776 -18060
  3. package/dist/style.css +1 -1
  4. package/dist/tailwindcss/index.js +306 -306
  5. package/dist/types/src/components/BaseActionItem.vue.d.ts +40 -40
  6. package/dist/types/src/components/BaseActionItemButton.vue.d.ts +25 -25
  7. package/dist/types/src/components/BaseAddressForm.vue.d.ts +84 -84
  8. package/dist/types/src/components/BaseAlert.vue.d.ts +51 -51
  9. package/dist/types/src/components/BaseApp.vue.d.ts +9 -9
  10. package/dist/types/src/components/BaseAppDialogs.vue.d.ts +14 -14
  11. package/dist/types/src/components/BaseAppNotifications.vue.d.ts +2 -2
  12. package/dist/types/src/components/BaseAutocomplete.vue.d.ts +237 -237
  13. package/dist/types/src/components/BaseAutocompleteDrawer.vue.d.ts +91 -91
  14. package/dist/types/src/components/BaseAutocompleteFetch.vue.d.ts +210 -210
  15. package/dist/types/src/components/BaseAvatar.vue.d.ts +52 -52
  16. package/dist/types/src/components/BaseAvatarGroup.vue.d.ts +43 -43
  17. package/dist/types/src/components/BaseBadge.vue.d.ts +60 -60
  18. package/dist/types/src/components/BaseBelongsTo.vue.d.ts +216 -216
  19. package/dist/types/src/components/BaseBoolean.vue.d.ts +10 -10
  20. package/dist/types/src/components/BaseBreadcrumbs.vue.d.ts +24 -24
  21. package/dist/types/src/components/BaseButton.vue.d.ts +23 -23
  22. package/dist/types/src/components/BaseButtonGroup.vue.d.ts +143 -143
  23. package/dist/types/src/components/BaseCalendar.vue.d.ts +124 -0
  24. package/dist/types/src/components/BaseCard.vue.d.ts +21 -21
  25. package/dist/types/src/components/BaseCardRow.vue.d.ts +16 -16
  26. package/dist/types/src/components/BaseCharacterCounter.vue.d.ts +49 -49
  27. package/dist/types/src/components/BaseClickOutside.vue.d.ts +26 -26
  28. package/dist/types/src/components/BaseClipboard.vue.d.ts +22 -22
  29. package/dist/types/src/components/BaseColor.vue.d.ts +80 -80
  30. package/dist/types/src/components/BaseContainer.vue.d.ts +34 -34
  31. package/dist/types/src/components/BaseCounter.vue.d.ts +42 -42
  32. package/dist/types/src/components/BaseCropper.vue.d.ts +76 -76
  33. package/dist/types/src/components/BaseCropperModal.vue.d.ts +28 -28
  34. package/dist/types/src/components/BaseDataIterator.vue.d.ts +227 -227
  35. package/dist/types/src/components/BaseDataIteratorSectionBox.vue.d.ts +20 -20
  36. package/dist/types/src/components/BaseDataIteratorSectionButton.vue.d.ts +25 -25
  37. package/dist/types/src/components/BaseDataIteratorSectionColumns.vue.d.ts +657 -657
  38. package/dist/types/src/components/BaseDataIteratorSectionModal.vue.d.ts +32 -32
  39. package/dist/types/src/components/BaseDataTable.vue.d.ts +406 -406
  40. package/dist/types/src/components/BaseDataTableRowAction.vue.d.ts +31 -31
  41. package/dist/types/src/components/BaseDatePicker.vue.d.ts +124 -124
  42. package/dist/types/src/components/BaseDateSelect.vue.d.ts +79 -79
  43. package/dist/types/src/components/BaseDescriptionList.vue.d.ts +9 -9
  44. package/dist/types/src/components/BaseDescriptionListItem.vue.d.ts +10 -10
  45. package/dist/types/src/components/BaseDialog.vue.d.ts +60 -60
  46. package/dist/types/src/components/BaseDisplayRelativeTime.vue.d.ts +50 -50
  47. package/dist/types/src/components/BaseDraggable.vue.d.ts +49 -49
  48. package/dist/types/src/components/BaseDropdown.vue.d.ts +65 -65
  49. package/dist/types/src/components/BaseDropdownAutocomplete.vue.d.ts +132 -132
  50. package/dist/types/src/components/BaseField.vue.d.ts +58 -58
  51. package/dist/types/src/components/BaseFieldI18n.vue.d.ts +93 -93
  52. package/dist/types/src/components/BaseFilePicker.vue.d.ts +72 -72
  53. package/dist/types/src/components/BaseFilePickerCrop.vue.d.ts +63 -63
  54. package/dist/types/src/components/BaseFileUploader.vue.d.ts +142 -142
  55. package/dist/types/src/components/BaseForm.vue.d.ts +143 -143
  56. package/dist/types/src/components/BaseGantt.vue.d.ts +425 -425
  57. package/dist/types/src/components/BaseHasMany.vue.d.ts +149 -149
  58. package/dist/types/src/components/BaseHeader.vue.d.ts +98 -98
  59. package/dist/types/src/components/BaseIconPicker.vue.d.ts +34 -34
  60. package/dist/types/src/components/BaseInput.vue.d.ts +174 -174
  61. package/dist/types/src/components/BaseInputError.vue.d.ts +9 -9
  62. package/dist/types/src/components/BaseInputLabel.vue.d.ts +42 -42
  63. package/dist/types/src/components/BaseInputPercent.vue.d.ts +138 -138
  64. package/dist/types/src/components/BaseLayoutNotificationDropdown.vue.d.ts +36 -36
  65. package/dist/types/src/components/BaseLayoutNotificationItem.vue.d.ts +16 -16
  66. package/dist/types/src/components/BaseLayoutNotificationItemContent.vue.d.ts +21 -21
  67. package/dist/types/src/components/BaseLayoutSidebar.vue.d.ts +51 -51
  68. package/dist/types/src/components/BaseLayoutSidebarConfigurable.vue.d.ts +87 -87
  69. package/dist/types/src/components/BaseLayoutStacked.vue.d.ts +23 -23
  70. package/dist/types/src/components/BaseLayoutStackedConfigurable.vue.d.ts +78 -78
  71. package/dist/types/src/components/BaseLoadingCover.vue.d.ts +96 -96
  72. package/dist/types/src/components/BaseMediaGallery.vue.d.ts +64 -64
  73. package/dist/types/src/components/BaseMediaGalleryItem.vue.d.ts +45 -45
  74. package/dist/types/src/components/BaseMediaItem.vue.d.ts +27 -27
  75. package/dist/types/src/components/BaseMediaLibrary.vue.d.ts +199 -199
  76. package/dist/types/src/components/BaseMediaList.vue.d.ts +46 -46
  77. package/dist/types/src/components/BaseMediaListItem.vue.d.ts +46 -46
  78. package/dist/types/src/components/BaseMediaPictures.vue.d.ts +55 -55
  79. package/dist/types/src/components/BaseMediaPicturesItem.vue.d.ts +54 -54
  80. package/dist/types/src/components/BaseMediaPreview.vue.d.ts +36 -36
  81. package/dist/types/src/components/BaseMenu.vue.d.ts +68 -68
  82. package/dist/types/src/components/BaseMenuItem.vue.d.ts +61 -61
  83. package/dist/types/src/components/BaseModalCenter.vue.d.ts +80 -80
  84. package/dist/types/src/components/BaseModalSide.vue.d.ts +62 -62
  85. package/dist/types/src/components/BaseNavbar.vue.d.ts +38 -38
  86. package/dist/types/src/components/BaseNavbarItem.vue.d.ts +26 -26
  87. package/dist/types/src/components/BaseNavbarItemContent.vue.d.ts +60 -60
  88. package/dist/types/src/components/BaseNavbarSideItem.vue.d.ts +44 -44
  89. package/dist/types/src/components/BaseNavbarSideItemContent.vue.d.ts +60 -60
  90. package/dist/types/src/components/BasePagination.vue.d.ts +35 -35
  91. package/dist/types/src/components/BasePanel.vue.d.ts +31 -31
  92. package/dist/types/src/components/BasePassword.vue.d.ts +67 -67
  93. package/dist/types/src/components/BaseProgressCircle.vue.d.ts +37 -37
  94. package/dist/types/src/components/BaseRadioGroup.vue.d.ts +105 -105
  95. package/dist/types/src/components/BaseReadMore.vue.d.ts +21 -21
  96. package/dist/types/src/components/BaseRichText.vue.d.ts +92 -92
  97. package/dist/types/src/components/BaseSelect.vue.d.ts +98 -98
  98. package/dist/types/src/components/BaseShortcut.vue.d.ts +86 -86
  99. package/dist/types/src/components/BaseSideNavigation.vue.d.ts +21 -21
  100. package/dist/types/src/components/BaseSideNavigationItem.vue.d.ts +41 -41
  101. package/dist/types/src/components/BaseSkeleton.vue.d.ts +31 -31
  102. package/dist/types/src/components/BaseStatistic.vue.d.ts +55 -55
  103. package/dist/types/src/components/BaseStepper.vue.d.ts +16 -16
  104. package/dist/types/src/components/BaseStepperItem.vue.d.ts +51 -51
  105. package/dist/types/src/components/BaseSwitch.vue.d.ts +87 -87
  106. package/dist/types/src/components/BaseSystemAlert.vue.d.ts +52 -52
  107. package/dist/types/src/components/BaseTabItem.vue.d.ts +41 -41
  108. package/dist/types/src/components/BaseTable.vue.d.ts +221 -221
  109. package/dist/types/src/components/BaseTableColumn.vue.d.ts +174 -174
  110. package/dist/types/src/components/BaseTabs.vue.d.ts +21 -21
  111. package/dist/types/src/components/BaseTagAutocomplete.vue.d.ts +209 -209
  112. package/dist/types/src/components/BaseTagAutocompleteFetch.vue.d.ts +141 -141
  113. package/dist/types/src/components/BaseTextarea.vue.d.ts +103 -103
  114. package/dist/types/src/components/BaseTextareaAutoresize.vue.d.ts +113 -113
  115. package/dist/types/src/components/BaseTimeline.vue.d.ts +14 -14
  116. package/dist/types/src/components/BaseTimelineItem.vue.d.ts +14 -14
  117. package/dist/types/src/components/BaseToast.vue.d.ts +20 -20
  118. package/dist/types/src/components/BaseUniqueCode.vue.d.ts +33 -33
  119. package/dist/types/src/components/SlotComponent.d.ts +43 -43
  120. package/dist/types/src/components/index.d.ts +97 -96
  121. package/dist/types/src/composables/breakpoints.d.ts +27 -27
  122. package/dist/types/src/composables/clickOutside.d.ts +8 -8
  123. package/dist/types/src/composables/field.d.ts +19 -19
  124. package/dist/types/src/composables/hasOptions.d.ts +7 -7
  125. package/dist/types/src/composables/mediaQuery.d.ts +2 -2
  126. package/dist/types/src/composables/modal.d.ts +6 -6
  127. package/dist/types/src/composables/paginatedData.d.ts +7 -7
  128. package/dist/types/src/constants/MyConstants.d.ts +1 -1
  129. package/dist/types/src/constants/index.d.ts +2 -2
  130. package/dist/types/src/i18n/index.d.ts +1 -1
  131. package/dist/types/src/index.d.ts +236 -224
  132. package/dist/types/src/services/gantt/format.d.ts +24 -24
  133. package/dist/types/src/services/gantt/timescale.d.ts +26 -26
  134. package/dist/types/src/services/gantt/types.d.ts +67 -67
  135. package/dist/types/src/stores/dialogs.d.ts +9 -9
  136. package/dist/types/src/stores/i18n.d.ts +5 -5
  137. package/dist/types/src/stores/notifications.d.ts +10 -10
  138. package/dist/types/src/stores/systemAlerts.d.ts +9 -9
  139. package/dist/types/src/stories/PageShow.vue.d.ts +2 -2
  140. package/dist/types/src/svg/BaseEmptyState.vue.d.ts +2 -2
  141. package/dist/types/src/svg/BaseSpinnerLarge.vue.d.ts +2 -2
  142. package/dist/types/src/svg/BaseSpinnerSmall.vue.d.ts +2 -2
  143. package/dist/types/src/types/CalendarEvent.d.ts +9 -0
  144. package/dist/types/src/types/Color.d.ts +9 -9
  145. package/dist/types/src/types/Country.d.ts +4 -4
  146. package/dist/types/src/types/ImagePickerResult.d.ts +5 -5
  147. package/dist/types/src/types/Media.d.ts +9 -9
  148. package/dist/types/src/types/Notification.d.ts +8 -8
  149. package/dist/types/src/types/Region.d.ts +5 -5
  150. package/dist/types/src/types/Status.d.ts +5 -5
  151. package/dist/types/src/types/StepperItem.d.ts +7 -7
  152. package/dist/types/src/types/TimelineItem.d.ts +9 -9
  153. package/dist/types/src/types/UploadedFile.d.ts +10 -10
  154. package/dist/types/src/types/User.d.ts +6 -6
  155. package/dist/types/src/types/index.d.ts +218 -218
  156. package/dist/types/src/utils/blob.d.ts +3 -3
  157. package/dist/types/src/utils/colors.d.ts +13 -13
  158. package/dist/types/src/utils/cropper/avatar.d.ts +5 -5
  159. package/dist/types/src/utils/cropper/cover.d.ts +5 -5
  160. package/dist/types/src/utils/cropper/presetInterface.d.ts +7 -7
  161. package/dist/types/src/utils/cropper/presets.d.ts +6 -6
  162. package/dist/types/src/utils/fileSizeFormat.d.ts +1 -1
  163. package/dist/types/src/utils/fileValidations.d.ts +2 -2
  164. package/dist/types/src/utils/index.d.ts +6 -6
  165. package/dist/types/src/utils/resizeImageFromURI.d.ts +1 -1
  166. package/dist/types/src/utils/scrollPreventer.d.ts +3 -3
  167. package/dist/types/src/utils/toHumanList.d.ts +1 -1
  168. package/package.json +148 -141
  169. package/src/assets/flatpickr.css +243 -243
  170. package/src/assets/form.css +6 -6
  171. package/src/assets/main.css +36 -36
  172. package/src/assets/tailwind.css +2 -2
  173. package/src/components/BaseActionItem.vue +68 -68
  174. package/src/components/BaseActionItemButton.vue +77 -77
  175. package/src/components/BaseAddressForm.stories.js +103 -103
  176. package/src/components/BaseAddressForm.vue +354 -354
  177. package/src/components/BaseAlert.stories.js +52 -52
  178. package/src/components/BaseAlert.vue +158 -158
  179. package/src/components/BaseApp.vue +16 -16
  180. package/src/components/BaseAppDialogs.vue +123 -123
  181. package/src/components/BaseAppNotifications.vue +40 -40
  182. package/src/components/BaseAutocomplete.stories.js +236 -236
  183. package/src/components/BaseAutocomplete.vue +523 -523
  184. package/src/components/BaseAutocompleteDrawer.vue +372 -372
  185. package/src/components/BaseAutocompleteFetch.stories.js +224 -224
  186. package/src/components/BaseAutocompleteFetch.vue +288 -288
  187. package/src/components/BaseAvatar.stories.js +39 -39
  188. package/src/components/BaseAvatar.vue +120 -120
  189. package/src/components/BaseAvatarGroup.stories.js +71 -71
  190. package/src/components/BaseAvatarGroup.vue +148 -148
  191. package/src/components/BaseBadge.stories.js +124 -124
  192. package/src/components/BaseBadge.vue +87 -87
  193. package/src/components/BaseBelongsTo.stories.js +223 -223
  194. package/src/components/BaseBelongsTo.vue +193 -193
  195. package/src/components/BaseBoolean.stories.js +35 -35
  196. package/src/components/BaseBoolean.vue +26 -26
  197. package/src/components/BaseBreadcrumbs.stories.js +50 -50
  198. package/src/components/BaseBreadcrumbs.vue +109 -109
  199. package/src/components/BaseButton.stories.js +88 -88
  200. package/src/components/BaseButton.vue +46 -46
  201. package/src/components/BaseButtonGroup.stories.js +86 -86
  202. package/src/components/BaseButtonGroup.vue +150 -150
  203. package/src/components/BaseCalendar.stories.js +202 -0
  204. package/src/components/BaseCalendar.vue +216 -0
  205. package/src/components/BaseCard.stories.js +61 -61
  206. package/src/components/BaseCard.vue +49 -49
  207. package/src/components/BaseCardRow.vue +34 -34
  208. package/src/components/BaseCharacterCounter.stories.js +30 -30
  209. package/src/components/BaseCharacterCounter.vue +64 -64
  210. package/src/components/BaseClickOutside.vue +37 -37
  211. package/src/components/BaseClipboard.stories.js +32 -32
  212. package/src/components/BaseClipboard.vue +83 -83
  213. package/src/components/BaseColor.stories.js +46 -46
  214. package/src/components/BaseColor.vue +154 -154
  215. package/src/components/BaseContainer.stories.js +34 -34
  216. package/src/components/BaseContainer.vue +50 -50
  217. package/src/components/BaseCounter.stories.js +47 -47
  218. package/src/components/BaseCounter.vue +82 -82
  219. package/src/components/BaseCropper.stories.js +113 -113
  220. package/src/components/BaseCropper.vue +458 -458
  221. package/src/components/BaseCropperModal.stories.js +54 -54
  222. package/src/components/BaseCropperModal.vue +143 -143
  223. package/src/components/BaseDataIterator.stories.js +197 -197
  224. package/src/components/BaseDataIterator.vue +839 -839
  225. package/src/components/BaseDataIteratorSectionBox.vue +36 -36
  226. package/src/components/BaseDataIteratorSectionButton.vue +53 -53
  227. package/src/components/BaseDataIteratorSectionColumns.vue +70 -70
  228. package/src/components/BaseDataIteratorSectionModal.vue +41 -41
  229. package/src/components/BaseDataTable.stories.js +226 -226
  230. package/src/components/BaseDataTable.vue +779 -779
  231. package/src/components/BaseDataTableRowAction.vue +53 -53
  232. package/src/components/BaseDatePicker.stories.js +130 -130
  233. package/src/components/BaseDatePicker.vue +296 -296
  234. package/src/components/BaseDateSelect.stories.js +47 -47
  235. package/src/components/BaseDateSelect.vue +241 -241
  236. package/src/components/BaseDescriptionList.stories.js +35 -35
  237. package/src/components/BaseDescriptionList.vue +13 -13
  238. package/src/components/BaseDescriptionListItem.vue +47 -47
  239. package/src/components/BaseDialog.stories.js +51 -51
  240. package/src/components/BaseDialog.vue +119 -119
  241. package/src/components/BaseDisplayRelativeTime.stories.js +47 -47
  242. package/src/components/BaseDisplayRelativeTime.vue +122 -122
  243. package/src/components/BaseDraggable.vue +71 -71
  244. package/src/components/BaseDropdown.stories.js +210 -210
  245. package/src/components/BaseDropdown.vue +280 -280
  246. package/src/components/BaseDropdownAutocomplete.stories.js +187 -187
  247. package/src/components/BaseDropdownAutocomplete.vue +235 -235
  248. package/src/components/BaseField.vue +112 -112
  249. package/src/components/BaseFieldI18n.stories.js +38 -38
  250. package/src/components/BaseFieldI18n.vue +170 -170
  251. package/src/components/BaseFilePicker.stories.js +84 -84
  252. package/src/components/BaseFilePicker.vue +163 -163
  253. package/src/components/BaseFilePickerCrop.stories.js +135 -135
  254. package/src/components/BaseFilePickerCrop.vue +130 -130
  255. package/src/components/BaseFileUploader.stories.js +102 -102
  256. package/src/components/BaseFileUploader.vue +185 -185
  257. package/src/components/BaseForm.stories.js +48 -48
  258. package/src/components/BaseForm.vue +335 -335
  259. package/src/components/BaseGantt.stories.js +133 -133
  260. package/src/components/BaseGantt.vue +336 -336
  261. package/src/components/BaseHasMany.stories.js +189 -189
  262. package/src/components/BaseHasMany.vue +137 -137
  263. package/src/components/BaseHeader.stories.js +133 -133
  264. package/src/components/BaseHeader.vue +188 -188
  265. package/src/components/BaseIconPicker.stories.js +22 -22
  266. package/src/components/BaseIconPicker.vue +225 -225
  267. package/src/components/BaseInput.stories.js +167 -167
  268. package/src/components/BaseInput.vue +264 -264
  269. package/src/components/BaseInputError.vue +7 -7
  270. package/src/components/BaseInputLabel.stories.js +36 -36
  271. package/src/components/BaseInputLabel.vue +57 -57
  272. package/src/components/BaseInputPercent.stories.js +65 -65
  273. package/src/components/BaseInputPercent.vue +139 -139
  274. package/src/components/BaseLayoutNotificationDropdown.vue +150 -150
  275. package/src/components/BaseLayoutNotificationItem.vue +53 -53
  276. package/src/components/BaseLayoutNotificationItemContent.vue +30 -30
  277. package/src/components/BaseLayoutSidebar.vue +236 -236
  278. package/src/components/BaseLayoutSidebarConfigurable.stories.js +166 -166
  279. package/src/components/BaseLayoutSidebarConfigurable.vue +181 -181
  280. package/src/components/BaseLayoutStacked.vue +52 -52
  281. package/src/components/BaseLayoutStackedConfigurable.stories.js +109 -109
  282. package/src/components/BaseLayoutStackedConfigurable.vue +158 -158
  283. package/src/components/BaseLoadingCover.stories.js +55 -55
  284. package/src/components/BaseLoadingCover.vue +101 -101
  285. package/src/components/BaseMediaGallery.vue +96 -96
  286. package/src/components/BaseMediaGalleryItem.vue +101 -101
  287. package/src/components/BaseMediaItem.stories.js +41 -41
  288. package/src/components/BaseMediaItem.vue +80 -80
  289. package/src/components/BaseMediaLibrary.stories.js +267 -267
  290. package/src/components/BaseMediaLibrary.vue +342 -342
  291. package/src/components/BaseMediaList.vue +67 -67
  292. package/src/components/BaseMediaListItem.vue +212 -212
  293. package/src/components/BaseMediaPictures.vue +64 -64
  294. package/src/components/BaseMediaPicturesItem.vue +100 -100
  295. package/src/components/BaseMediaPreview.stories.js +72 -72
  296. package/src/components/BaseMediaPreview.vue +106 -106
  297. package/src/components/BaseMenu.stories.js +129 -129
  298. package/src/components/BaseMenu.vue +165 -165
  299. package/src/components/BaseMenuItem.vue +145 -145
  300. package/src/components/BaseModalCenter.stories.js +68 -68
  301. package/src/components/BaseModalCenter.vue +128 -128
  302. package/src/components/BaseModalSide.stories.js +55 -55
  303. package/src/components/BaseModalSide.vue +116 -116
  304. package/src/components/BaseNavbar.stories.js +151 -151
  305. package/src/components/BaseNavbar.vue +91 -91
  306. package/src/components/BaseNavbarItem.vue +49 -49
  307. package/src/components/BaseNavbarItemContent.vue +97 -97
  308. package/src/components/BaseNavbarSideItem.vue +114 -114
  309. package/src/components/BaseNavbarSideItemContent.vue +111 -111
  310. package/src/components/BasePagination.stories.js +35 -35
  311. package/src/components/BasePagination.vue +266 -266
  312. package/src/components/BasePanel.stories.js +56 -56
  313. package/src/components/BasePanel.vue +42 -42
  314. package/src/components/BasePassword.stories.js +57 -57
  315. package/src/components/BasePassword.vue +107 -107
  316. package/src/components/BaseProgressCircle.stories.js +27 -27
  317. package/src/components/BaseProgressCircle.vue +80 -80
  318. package/src/components/BaseRadioGroup.stories.js +88 -88
  319. package/src/components/BaseRadioGroup.vue +125 -125
  320. package/src/components/BaseReadMore.stories.js +30 -30
  321. package/src/components/BaseReadMore.vue +73 -73
  322. package/src/components/BaseRichText.stories.js +102 -102
  323. package/src/components/BaseRichText.vue +198 -198
  324. package/src/components/BaseSelect.stories.js +118 -118
  325. package/src/components/BaseSelect.vue +224 -224
  326. package/src/components/BaseShortcut.stories.js +102 -102
  327. package/src/components/BaseShortcut.vue +112 -112
  328. package/src/components/BaseSideNavigation.stories.js +85 -85
  329. package/src/components/BaseSideNavigation.vue +32 -32
  330. package/src/components/BaseSideNavigationItem.vue +95 -95
  331. package/src/components/BaseSkeleton.stories.js +36 -36
  332. package/src/components/BaseSkeleton.vue +40 -40
  333. package/src/components/BaseStatistic.stories.js +51 -51
  334. package/src/components/BaseStatistic.vue +106 -106
  335. package/src/components/BaseStepper.stories.js +94 -94
  336. package/src/components/BaseStepper.vue +72 -72
  337. package/src/components/BaseStepperItem.stories.js +65 -65
  338. package/src/components/BaseStepperItem.vue +149 -149
  339. package/src/components/BaseSwitch.stories.js +130 -130
  340. package/src/components/BaseSwitch.vue +215 -215
  341. package/src/components/BaseSystemAlert.stories.js +63 -63
  342. package/src/components/BaseSystemAlert.vue +89 -89
  343. package/src/components/BaseTabItem.vue +97 -97
  344. package/src/components/BaseTable.vue +904 -904
  345. package/src/components/BaseTableColumn.vue +124 -124
  346. package/src/components/BaseTabs.stories.js +85 -85
  347. package/src/components/BaseTabs.vue +73 -73
  348. package/src/components/BaseTagAutocomplete.stories.js +258 -258
  349. package/src/components/BaseTagAutocomplete.vue +438 -438
  350. package/src/components/BaseTagAutocompleteFetch.stories.js +185 -185
  351. package/src/components/BaseTagAutocompleteFetch.vue +220 -220
  352. package/src/components/BaseTextarea.stories.js +58 -58
  353. package/src/components/BaseTextarea.vue +103 -103
  354. package/src/components/BaseTextareaAutoresize.stories.js +102 -102
  355. package/src/components/BaseTextareaAutoresize.vue +166 -166
  356. package/src/components/BaseTimeline.stories.js +55 -55
  357. package/src/components/BaseTimeline.vue +38 -38
  358. package/src/components/BaseTimelineItem.stories.js +78 -78
  359. package/src/components/BaseTimelineItem.vue +90 -90
  360. package/src/components/BaseToast.stories.js +50 -50
  361. package/src/components/BaseToast.vue +43 -43
  362. package/src/components/BaseUniqueCode.stories.js +36 -36
  363. package/src/components/BaseUniqueCode.vue +183 -183
  364. package/src/components/SlotComponent.ts +37 -37
  365. package/src/components/index.ts +196 -194
  366. package/src/composables/breakpoints.ts +94 -94
  367. package/src/composables/clickOutside.ts +80 -80
  368. package/src/composables/field.ts +117 -117
  369. package/src/composables/hasOptions.ts +68 -68
  370. package/src/composables/mediaQuery.ts +42 -42
  371. package/src/composables/modal.ts +73 -73
  372. package/src/composables/paginatedData.ts +65 -65
  373. package/src/constants/MyConstants.ts +1 -1
  374. package/src/constants/index.ts +5 -5
  375. package/src/env.d.ts +15 -15
  376. package/src/i18n/index.ts +60 -60
  377. package/src/index.ts +114 -114
  378. package/src/lang/en.json +95 -89
  379. package/src/lang/fr.json +95 -89
  380. package/src/services/gantt/format.ts +113 -113
  381. package/src/services/gantt/timescale.ts +242 -242
  382. package/src/services/gantt/types.ts +74 -74
  383. package/src/stores/dialogs.ts +45 -45
  384. package/src/stores/i18n.ts +14 -14
  385. package/src/stores/notifications.ts +47 -47
  386. package/src/stores/systemAlerts.ts +32 -32
  387. package/src/stories/List.stories.js +132 -132
  388. package/src/stories/PageShow.vue +423 -423
  389. package/src/stories/Show.stories.js +22 -22
  390. package/src/svg/BaseEmptyState.vue +38 -38
  391. package/src/svg/BaseSpinnerLarge.vue +59 -59
  392. package/src/svg/BaseSpinnerSmall.vue +15 -15
  393. package/src/types/CalendarEvent.ts +9 -0
  394. package/src/types/Color.ts +9 -9
  395. package/src/types/Country.ts +4 -4
  396. package/src/types/ImagePickerResult.ts +5 -5
  397. package/src/types/Media.ts +10 -10
  398. package/src/types/Notification.ts +10 -10
  399. package/src/types/Region.ts +5 -5
  400. package/src/types/Status.ts +5 -5
  401. package/src/types/StepperItem.ts +8 -8
  402. package/src/types/TimelineItem.ts +9 -9
  403. package/src/types/UploadedFile.ts +11 -11
  404. package/src/types/User.ts +7 -7
  405. package/src/types/index.ts +267 -267
  406. package/src/utils/blob.ts +30 -30
  407. package/src/utils/colors.ts +210 -210
  408. package/src/utils/cropper/avatar.ts +33 -33
  409. package/src/utils/cropper/cover.ts +41 -41
  410. package/src/utils/cropper/presetInterface.ts +16 -16
  411. package/src/utils/cropper/presets.ts +7 -7
  412. package/src/utils/fileSizeFormat.ts +15 -15
  413. package/src/utils/fileValidations.ts +26 -26
  414. package/src/utils/index.ts +16 -16
  415. package/src/utils/resizeImageFromURI.ts +118 -118
  416. package/src/utils/scrollPreventer.ts +11 -11
  417. package/src/utils/toHumanList.ts +20 -20
@@ -1,779 +1,779 @@
1
- <template>
2
- <BaseDataIterator
3
- ref="dataIterator"
4
- :url="url"
5
- :url-query="urlQuery"
6
- :default-query="defaultQuery"
7
- :searchable="searchable"
8
- :actions="actions"
9
- :history-mode="historyMode"
10
- :layout="layout"
11
- :size="size"
12
- :sections="sectionsInternal"
13
- :scroll-top-on-fetch="maxHeight ? false : scrollTopOnFetch"
14
- @fetch="onFetch"
15
- @will-scroll-top="onWillScrollTop"
16
- >
17
- <template
18
- #default="{
19
- items,
20
- loading,
21
- sortField,
22
- sortDirection,
23
- onSortChange,
24
- error,
25
- firstLoad,
26
- }"
27
- >
28
- <BaseCard
29
- clipped
30
- class="w-full overflow-hidden"
31
- >
32
- <div v-if="newCheckedRows.length">
33
- <div
34
- class="flex items-center justify-between border-b border-slate-200 bg-slate-50 py-2 pl-3 pr-2 text-sm"
35
- >
36
- <div>
37
- <span class="mr-3 text-slate-500">{{
38
- t('sui.x_rows_selected', {
39
- count: newCheckedRows.length,
40
- })
41
- }}.</span>
42
- <button
43
- type="button"
44
- class="mr-3 inline text-slate-800 underline underline-offset-1 decoration-slate-400 decoration-2 decoration-dashed"
45
- @click="uncheckAll()"
46
- >
47
- {{ t('sui.deselect_all') }}
48
- </button>
49
- </div>
50
- <BaseMenu
51
- v-if="checkableActions?.length"
52
- tw-menu="w-52"
53
- :items="checkableActions"
54
- >
55
- <template #button="{ open }">
56
- <div
57
- class="flex h-10 px-4 items-center justify-center btn pl-3"
58
- :class="[
59
- open ? 'ring-2 ring-primary-500 ring-offset-2' : false,
60
- ]"
61
- >
62
- <BaseIcon
63
- icon="heroicons-solid:dots-vertical"
64
- class="mr-2"
65
- />
66
-
67
- <span class="font-semibold">
68
- {{ t('sui.bulk_actions') }}
69
- </span>
70
- </div>
71
- </template>
72
- </BaseMenu>
73
- </div>
74
- </div>
75
-
76
- <BaseTable
77
- ref="table"
78
- :checked-rows="newCheckedRows"
79
- :data="items"
80
- :loading="loading"
81
- :detailed="detailed"
82
- :has-detailed-visible="hasDetailedVisible"
83
- :checkable="checkable"
84
- :is-row-checkable="isRowCheckable"
85
- checkbox-position="left"
86
- :sort-field="sortField"
87
- :sort-direction="sortDirection"
88
- :max-height="maxHeight"
89
- :visible-columns="visibleColumns"
90
- :size="size"
91
- @update:checked-rows="onCheckedRowsUpdate"
92
- @sort="onSortChange"
93
- @cell-click="onCellClick"
94
- >
95
- <template #default>
96
- <slot />
97
-
98
- <BaseTableColumn
99
- v-slot="{ row }"
100
- :visible="rowActionsInternal.length"
101
- :toggle="false"
102
- :clickable="false"
103
- custom-key="actions"
104
- class="overflow-hidden"
105
- >
106
- <div class="flex justify-end gap-1 pr-2 text-right">
107
- <div class="btn-group">
108
- <template
109
- v-for="rowAction in visibleRowActions"
110
- :key="rowAction.icon"
111
- >
112
- <BaseDataTableRowAction
113
- :row="row"
114
- :row-action="rowAction"
115
- :size="size"
116
- />
117
- </template>
118
- <BaseMenu
119
- v-if="showRowActionMenu"
120
- :items="rowActionMenuItems(row)"
121
- :size="size == 'sm' ? 'xs' : 'sm'"
122
- :tw-button="[
123
- 'btn flex p-0 items-center justify-center',
124
- {
125
- 'py-1.5 px-2': size == 'sm',
126
- 'p-2': size == 'md'
127
- }
128
- ]"
129
- >
130
- <template #button>
131
- <BaseIcon
132
- icon="heroicons-solid:dots-vertical"
133
- :class="{
134
- 'h-3 w-3': size == 'sm'
135
- }"
136
- />
137
- </template>
138
- </BaseMenu>
139
- </div>
140
- </div>
141
- </BaseTableColumn>
142
- </template>
143
-
144
- <template #detail="propsDetail">
145
- <slot
146
- name="detail"
147
- v-bind="propsDetail"
148
- />
149
- </template>
150
-
151
- <template #checkedHeader="propsCheckHeader">
152
- <slot
153
- name="checkedHeader"
154
- v-bind="propsCheckHeader"
155
- />
156
- </template>
157
-
158
- <template #empty>
159
- <div
160
- v-if="error"
161
- class="flex items-center justify-center py-16"
162
- >
163
- <div class="flex flex-col items-center justify-center">
164
- <BaseIcon
165
- icon="heroicons:x-circle"
166
- class="h-10 w-10 text-red-600"
167
- />
168
- <p class="mt-3 text-center text-sm text-slate-600">
169
- {{ t('sui.whoops') }}
170
- </p>
171
- </div>
172
- </div>
173
- <div
174
- v-else-if="firstLoad"
175
- class="flex items-center justify-center py-16"
176
- >
177
- <div class="flex flex-col items-center">
178
- <BaseEmptyState class="w-32" />
179
-
180
- <p class="mt-3 text-center text-sm text-slate-600">
181
- {{ t('sui.nothing_found') }}
182
- </p>
183
- </div>
184
- </div>
185
- </template>
186
- </BaseTable>
187
- </BaseCard>
188
- </template>
189
-
190
- <template
191
- v-if="$slots.filters"
192
- #filters="{ query, updateQuery, updateQueryValue }"
193
- >
194
- <slot
195
- name="filters"
196
- :query="query"
197
- :update-query="updateQuery"
198
- :update-query-value="updateQueryValue"
199
- />
200
- </template>
201
-
202
- <template #sidebarTop="sidebarProps">
203
- <slot
204
- name="sidebarTop"
205
- v-bind="sidebarProps"
206
- />
207
- </template>
208
-
209
- <template #sidebarBottom="sidebarProps">
210
- <slot
211
- name="sidebarBottom"
212
- v-bind="sidebarProps"
213
- />
214
- </template>
215
-
216
- <template
217
- v-if="toggleable"
218
- #columns
219
- >
220
- <BaseDataIteratorSectionColumns
221
- v-model:visibleColumns="visibleColumns"
222
- :table="table"
223
- @update:visible-columns="onUpdateVisibleColumn"
224
- />
225
- </template>
226
-
227
- <template
228
- v-for="section in sections"
229
- :key="section.name"
230
- #[section.name]
231
- >
232
- <slot :name="section.name" />
233
- </template>
234
- </BaseDataIterator>
235
- </template>
236
-
237
- <script lang="ts" setup>
238
- import { PropType } from 'vue';
239
- import { t } from '@/i18n';
240
- import {
241
- Collection,
242
- CollectionItem,
243
- DataIteratorSection,
244
- DataTableQuery,
245
- MenuItemInterface,
246
- PaginatedCollection,
247
- ResourceCollection,
248
- RowAction,
249
- } from '@/types';
250
- import { useDialogsStore } from '@/stores/dialogs';
251
- import { useNotificationsStore } from '../stores/notifications';
252
- import BaseDataIterator from './BaseDataIterator.vue';
253
- import { cloneDeep, isArray } from 'lodash';
254
-
255
- import BaseCard from './BaseCard.vue';
256
- import BaseTable from './BaseTable.vue';
257
- import BaseTableColumn from './BaseTableColumn.vue';
258
- import BaseDataIteratorSectionColumns from './BaseDataIteratorSectionColumns.vue';
259
- import { BaseIcon, config } from '@/index';
260
- import BaseEmptyState from '../svg/BaseEmptyState.vue';
261
- import { RouteLocationRaw } from 'vue-router';
262
- import BaseMenu from './BaseMenu.vue';
263
- import BaseDataTableRowAction from './BaseDataTableRowAction.vue';
264
-
265
- const router = useRouter();
266
-
267
- const http = config.http;
268
-
269
- const dialogs = useDialogsStore();
270
- const notifications = useNotificationsStore();
271
-
272
- const table = ref<null | InstanceType<typeof BaseTable>>(null);
273
-
274
- const props = defineProps({
275
- /**
276
- * Base URL from which to make requests
277
- */
278
- url: {
279
- required: true,
280
- type: String,
281
- },
282
-
283
- /**
284
- * Query params that always get applied
285
- */
286
- urlQuery: {
287
- default: undefined,
288
- type: Object as PropType<Record<string, any>>,
289
- },
290
-
291
- /**
292
- * Query params that gets applied by default
293
- * These may be overwritten by URL params generated by the data-table or filters
294
- */
295
- defaultQuery: {
296
- default: undefined,
297
- type: Object as PropType<DataTableQuery>,
298
- },
299
-
300
- /**
301
- * Show url for router link
302
- */
303
- showUrl: {
304
- default: undefined,
305
- type: Function as PropType<
306
- ((row: CollectionItem) => RouteLocationRaw) | undefined
307
- >,
308
- },
309
-
310
- /**
311
- * Show/Hide edit button
312
- */
313
- editButton: {
314
- default: true,
315
- type: Boolean,
316
- },
317
-
318
- /**
319
- * Edit url for router link
320
- */
321
- editUrl: {
322
- default: undefined,
323
- type: Function as PropType<
324
- ((row: CollectionItem) => RouteLocationRaw) | undefined
325
- >,
326
- },
327
-
328
- /**
329
- * Show/Hide delete button
330
- */
331
- deleteButton: {
332
- default: true,
333
- type: Boolean,
334
- },
335
-
336
- /**
337
- * Delete endpoint to delete an item
338
- */
339
- deleteUrl: {
340
- default: undefined,
341
- type: Function as PropType<((row: CollectionItem) => string) | undefined>,
342
- },
343
-
344
- /**
345
- * Show toggle-able details on each row
346
- */
347
- detailed: {
348
- default: false,
349
- type: Boolean,
350
- },
351
-
352
- /**
353
- * Check is a given row has details
354
- */
355
- hasDetailedVisible: {
356
- default() {
357
- return true;
358
- },
359
- type: Function as PropType<(row: any) => boolean>,
360
- },
361
-
362
- /**
363
- * Makes row checkable
364
- */
365
- checkable: {
366
- default: false,
367
- type: Boolean,
368
- },
369
-
370
- /**
371
- * Actions on each row
372
- */
373
- checkableActions: {
374
- default: undefined,
375
- type: Array as PropType<MenuItemInterface[]>,
376
- },
377
-
378
- /**
379
- * Checked rows array
380
- */
381
- checkedRows: {
382
- default() {
383
- return [];
384
- },
385
- type: Array as PropType<Record<string, any>[]>,
386
- },
387
-
388
- /**
389
- * Check is a given row is checkable
390
- */
391
- isRowCheckable: {
392
- default() {
393
- return () => true;
394
- },
395
- type: Function,
396
- },
397
-
398
- /**
399
- * Adds a search bar
400
- */
401
- searchable: {
402
- default: true,
403
- type: Boolean,
404
- },
405
-
406
- /**
407
- * Shows the column toggle utility
408
- */
409
- toggleable: {
410
- default: true,
411
- type: Boolean,
412
- },
413
-
414
- /**
415
- * Actions
416
- */
417
- actions: {
418
- default: undefined,
419
- type: Array as PropType<MenuItemInterface[]>,
420
- },
421
-
422
- /**
423
- * Save data table state in URL
424
- */
425
- historyMode: {
426
- default: false,
427
- type: Boolean,
428
- },
429
-
430
- /*
431
- * Max height (in px)
432
- */
433
- maxHeight: {
434
- default: undefined,
435
- type: Number,
436
- },
437
-
438
- /**
439
- * Layout type
440
- *
441
- * default: Layout with a sidebar
442
- * compact: Layout without a sidebar, this is the default layout for mobile, even if you don't specify it
443
- */
444
- layout: {
445
- default: 'default',
446
- type: String as PropType<'default' | 'compact'>,
447
- },
448
-
449
- /**
450
- * Overall size and spacing of the component
451
- */
452
- size: {
453
- default: 'md',
454
- type: String as PropType<'sm' | 'md'>,
455
- },
456
-
457
- sections: {
458
- default: undefined,
459
- type: Array as PropType<DataIteratorSection[]>,
460
- },
461
-
462
- rowActions: {
463
- default: undefined,
464
- type: Array as PropType<RowAction[]>,
465
- },
466
-
467
- numberOfVisibleRowActions: {
468
- default: 2,
469
- type: Number,
470
- },
471
-
472
- /**
473
- * Scroll to top when fetching new data
474
- */
475
- scrollTopOnFetch: {
476
- default: true,
477
- type: Boolean,
478
- },
479
- });
480
-
481
- const emit = defineEmits([
482
- 'cell-click',
483
- 'delete',
484
- 'update:checked-rows',
485
- 'fetch',
486
- ]);
487
-
488
- const dataIterator = ref<null | InstanceType<typeof BaseDataIterator>>(null);
489
-
490
- /*
491
- |--------------------------------------------------------------------------
492
- | Handlers
493
- |--------------------------------------------------------------------------
494
- */
495
-
496
- function onCellClick(payload: CollectionItem) {
497
- if (props.showUrl) {
498
- router.push(props.showUrl(payload));
499
- }
500
- emit('cell-click', payload);
501
- }
502
-
503
- /*
504
- |--------------------------------------------------------------------------
505
- | Gate helpers
506
- |--------------------------------------------------------------------------
507
- */
508
-
509
- const gate = (row: CollectionItem, action: string): boolean => {
510
- if (row.can && Object.prototype.hasOwnProperty.call(row.can, action)) {
511
- return row.can[action];
512
- }
513
- return true;
514
- };
515
-
516
- const canUpdate = (row: CollectionItem): boolean => {
517
- return gate(row, 'update');
518
- };
519
-
520
- const canDelete = (row: CollectionItem): boolean => {
521
- return gate(row, 'delete');
522
- };
523
-
524
- function onDeleteClick(row: CollectionItem) {
525
- dialogs.push({
526
- title: t('sui.delete_record') + '?',
527
- message: t('sui.delete_record_description'),
528
- color: 'danger',
529
- closeOnOutsideClick: true,
530
- confirmText: t('sui.yes_delete'),
531
- onConfirm: () => onDelete(row),
532
- });
533
- }
534
-
535
- const onDelete = (row: CollectionItem) => {
536
- if (!props.deleteUrl) {
537
- return;
538
- }
539
-
540
- http
541
- .delete(props.deleteUrl(row))
542
- .then((response) => {
543
- if (response.data && response.data.message) {
544
- notifications.push({
545
- title: t('sui.success'),
546
- text: response.data.message,
547
- color: 'success',
548
- });
549
- }
550
- emit('delete', row);
551
-
552
- // Refetch even if URL is the same
553
- fetch();
554
- })
555
- .catch((error) => {
556
- notifications.push({
557
- title: t('sui.error'),
558
- text: error.response.data?.message ?? 'Unknown error',
559
- color: 'danger',
560
- });
561
- });
562
- };
563
-
564
- /*
565
- |--------------------------------------------------------------------------
566
- | Toggle columns
567
- |--------------------------------------------------------------------------
568
- */
569
-
570
- const visibleColumns = ref<number[]>([]);
571
-
572
- // Find visible columns in local storage
573
- const VISIBLE_COLUMNS_LOCAL_STORAGE = 'sprintify.visible_columns.';
574
- const VISIBLE_COLUMNS_LOCAL_STORAGE_KEY =
575
- VISIBLE_COLUMNS_LOCAL_STORAGE + window.location.pathname;
576
-
577
- const visibleColumnsFromStorage = JSON.parse(
578
- localStorage.getItem(VISIBLE_COLUMNS_LOCAL_STORAGE_KEY) + ''
579
- ) as number[];
580
-
581
- // If found, set visibleColumns
582
- if (
583
- visibleColumnsFromStorage &&
584
- isArray(visibleColumnsFromStorage) &&
585
- visibleColumnsFromStorage.length > 0
586
- ) {
587
- visibleColumns.value = visibleColumnsFromStorage;
588
- }
589
-
590
- // If nothing is found, set visibleColumns to all columns from table
591
- const unWatchTable = watch(
592
- () => table.value,
593
- () => {
594
- if (
595
- table.value &&
596
- table.value.newColumns.length &&
597
- visibleColumns.value.length == 0
598
- ) {
599
- visibleColumns.value = table.value.newColumns
600
- .filter((c) => c.toggle)
601
- .filter((c) => c.toggleDefault ?? true)
602
- .map((c) => c.newKey);
603
-
604
- unWatchTable();
605
- }
606
- }
607
- );
608
-
609
- /**
610
- * Update local storage when check input update
611
- */
612
- function onUpdateVisibleColumn() {
613
- localStorage.setItem(
614
- VISIBLE_COLUMNS_LOCAL_STORAGE_KEY,
615
- JSON.stringify(visibleColumns.value)
616
- );
617
- }
618
-
619
- /*
620
- |--------------------------------------------------------------------------
621
- | Row Actions
622
- |--------------------------------------------------------------------------
623
- */
624
-
625
- const rowActionsInternal = computed<RowAction[]>(() => {
626
- const actions = cloneDeep(props.rowActions) ?? [];
627
-
628
- if (props.editUrl && props.editButton) {
629
- actions.push({
630
- label: t('sui.edit'),
631
- icon: 'heroicons:cog-6-tooth-solid',
632
- to: (row: CollectionItem) => (props.editUrl ? props.editUrl(row) : ''),
633
- disabled: (row: CollectionItem) => !canUpdate(row),
634
- });
635
- }
636
-
637
- if (props.deleteUrl && props.deleteButton) {
638
- actions.push({
639
- label: t('sui.delete'),
640
- icon: 'heroicons:trash-20-solid',
641
- action: onDeleteClick,
642
- disabled: (row: CollectionItem) => !canDelete(row),
643
- });
644
- }
645
-
646
- return actions;
647
- });
648
-
649
- const visibleRowActions = computed<RowAction[]>(() => {
650
- return rowActionsInternal.value.slice(0, props.numberOfVisibleRowActions);
651
- });
652
-
653
- const showRowActionMenu = computed<boolean>(() => {
654
- return rowActionsInternal.value.length > props.numberOfVisibleRowActions;
655
- });
656
-
657
- function rowActionMenuItems(row: CollectionItem): MenuItemInterface[] {
658
- return rowActionsInternal.value.map((action) => {
659
- return {
660
- label: action.label,
661
- icon: action.icon,
662
- disabled: action.disabled && action.disabled(row),
663
- action: action.action
664
- ? () => {
665
- if (action.action) action.action(row);
666
- }
667
- : undefined,
668
- to: action.to ? action.to(row) : undefined,
669
- };
670
- });
671
- }
672
-
673
- /*
674
- |--------------------------------------------------------------------------
675
- | Checkable
676
- |--------------------------------------------------------------------------
677
- */
678
-
679
- const newCheckedRows = ref<Record<string, any>[]>([]);
680
-
681
- watch(
682
- () => props.checkedRows,
683
- (checkedRows) => {
684
- newCheckedRows.value = checkedRows;
685
- }
686
- );
687
-
688
- function uncheckAll() {
689
- table.value?.uncheckAll();
690
- }
691
-
692
- const sectionsInternal = computed<DataIteratorSection[]>(() => {
693
- const sections = props.sections ?? [];
694
-
695
- if (props.toggleable) {
696
- return [
697
- ...sections,
698
- {
699
- name: 'columns',
700
- icon: 'heroicons:view-columns',
701
- title: t('sui.columns'),
702
- closeText: t('sui.apply'),
703
- opened: false,
704
- },
705
- ];
706
- }
707
-
708
- return sections;
709
- });
710
-
711
- function onCheckedRowsUpdate(checkedRows: Record<string, any>[]) {
712
- newCheckedRows.value = checkedRows;
713
- emit('update:checked-rows', checkedRows);
714
- }
715
-
716
- /*
717
- |--------------------------------------------------------------------------
718
- | Scrolling behavior
719
- |--------------------------------------------------------------------------
720
- */
721
-
722
- function onWillScrollTop() {
723
- if (!props.scrollTopOnFetch) {
724
- return;
725
- }
726
-
727
- if (props.maxHeight) {
728
- table.value?.scrollTop();
729
-
730
- const top = dataIterator.value?.$el?.getBoundingClientRect()?.top ?? 0;
731
-
732
- if (top < 0) {
733
- dataIterator.value?.scrollIntoView();
734
- }
735
- }
736
- }
737
-
738
- /*
739
- |--------------------------------------------------------------------------
740
- | On fetch
741
- |--------------------------------------------------------------------------
742
- */
743
-
744
- function onFetch(
745
- payload: null | ResourceCollection | PaginatedCollection | Collection
746
- ) {
747
- emit('fetch', payload);
748
- }
749
-
750
- /*
751
- |--------------------------------------------------------------------------
752
- | Exposed functions
753
- |--------------------------------------------------------------------------
754
- */
755
-
756
- function fetch() {
757
- if (!dataIterator.value) {
758
- return;
759
- }
760
- dataIterator.value.fetch();
761
- }
762
-
763
- function fetchWithoutLoading() {
764
- if (!dataIterator.value) {
765
- return;
766
- }
767
- dataIterator.value.fetchWithoutLoading();
768
- }
769
-
770
- const dataIteratorQuery = computed((): DataTableQuery | null => {
771
- return dataIterator.value?.query ?? null;
772
- });
773
-
774
- defineExpose({
775
- fetch,
776
- fetchWithoutLoading,
777
- query: dataIteratorQuery,
778
- });
779
- </script>
1
+ <template>
2
+ <BaseDataIterator
3
+ ref="dataIterator"
4
+ :url="url"
5
+ :url-query="urlQuery"
6
+ :default-query="defaultQuery"
7
+ :searchable="searchable"
8
+ :actions="actions"
9
+ :history-mode="historyMode"
10
+ :layout="layout"
11
+ :size="size"
12
+ :sections="sectionsInternal"
13
+ :scroll-top-on-fetch="maxHeight ? false : scrollTopOnFetch"
14
+ @fetch="onFetch"
15
+ @will-scroll-top="onWillScrollTop"
16
+ >
17
+ <template
18
+ #default="{
19
+ items,
20
+ loading,
21
+ sortField,
22
+ sortDirection,
23
+ onSortChange,
24
+ error,
25
+ firstLoad,
26
+ }"
27
+ >
28
+ <BaseCard
29
+ clipped
30
+ class="w-full overflow-hidden"
31
+ >
32
+ <div v-if="newCheckedRows.length">
33
+ <div
34
+ class="flex items-center justify-between border-b border-slate-200 bg-slate-50 py-2 pl-3 pr-2 text-sm"
35
+ >
36
+ <div>
37
+ <span class="mr-3 text-slate-500">{{
38
+ t('sui.x_rows_selected', {
39
+ count: newCheckedRows.length,
40
+ })
41
+ }}.</span>
42
+ <button
43
+ type="button"
44
+ class="mr-3 inline text-slate-800 underline underline-offset-1 decoration-slate-400 decoration-2 decoration-dashed"
45
+ @click="uncheckAll()"
46
+ >
47
+ {{ t('sui.deselect_all') }}
48
+ </button>
49
+ </div>
50
+ <BaseMenu
51
+ v-if="checkableActions?.length"
52
+ tw-menu="w-52"
53
+ :items="checkableActions"
54
+ >
55
+ <template #button="{ open }">
56
+ <div
57
+ class="flex h-10 px-4 items-center justify-center btn pl-3"
58
+ :class="[
59
+ open ? 'ring-2 ring-primary-500 ring-offset-2' : false,
60
+ ]"
61
+ >
62
+ <BaseIcon
63
+ icon="heroicons-solid:dots-vertical"
64
+ class="mr-2"
65
+ />
66
+
67
+ <span class="font-semibold">
68
+ {{ t('sui.bulk_actions') }}
69
+ </span>
70
+ </div>
71
+ </template>
72
+ </BaseMenu>
73
+ </div>
74
+ </div>
75
+
76
+ <BaseTable
77
+ ref="table"
78
+ :checked-rows="newCheckedRows"
79
+ :data="items"
80
+ :loading="loading"
81
+ :detailed="detailed"
82
+ :has-detailed-visible="hasDetailedVisible"
83
+ :checkable="checkable"
84
+ :is-row-checkable="isRowCheckable"
85
+ checkbox-position="left"
86
+ :sort-field="sortField"
87
+ :sort-direction="sortDirection"
88
+ :max-height="maxHeight"
89
+ :visible-columns="visibleColumns"
90
+ :size="size"
91
+ @update:checked-rows="onCheckedRowsUpdate"
92
+ @sort="onSortChange"
93
+ @cell-click="onCellClick"
94
+ >
95
+ <template #default>
96
+ <slot />
97
+
98
+ <BaseTableColumn
99
+ v-slot="{ row }"
100
+ :visible="rowActionsInternal.length"
101
+ :toggle="false"
102
+ :clickable="false"
103
+ custom-key="actions"
104
+ class="overflow-hidden"
105
+ >
106
+ <div class="flex justify-end gap-1 pr-2 text-right">
107
+ <div class="btn-group">
108
+ <template
109
+ v-for="rowAction in visibleRowActions"
110
+ :key="rowAction.icon"
111
+ >
112
+ <BaseDataTableRowAction
113
+ :row="row"
114
+ :row-action="rowAction"
115
+ :size="size"
116
+ />
117
+ </template>
118
+ <BaseMenu
119
+ v-if="showRowActionMenu"
120
+ :items="rowActionMenuItems(row)"
121
+ :size="size == 'sm' ? 'xs' : 'sm'"
122
+ :tw-button="[
123
+ 'btn flex p-0 items-center justify-center',
124
+ {
125
+ 'py-1.5 px-2': size == 'sm',
126
+ 'p-2': size == 'md'
127
+ }
128
+ ]"
129
+ >
130
+ <template #button>
131
+ <BaseIcon
132
+ icon="heroicons-solid:dots-vertical"
133
+ :class="{
134
+ 'h-3 w-3': size == 'sm'
135
+ }"
136
+ />
137
+ </template>
138
+ </BaseMenu>
139
+ </div>
140
+ </div>
141
+ </BaseTableColumn>
142
+ </template>
143
+
144
+ <template #detail="propsDetail">
145
+ <slot
146
+ name="detail"
147
+ v-bind="propsDetail"
148
+ />
149
+ </template>
150
+
151
+ <template #checkedHeader="propsCheckHeader">
152
+ <slot
153
+ name="checkedHeader"
154
+ v-bind="propsCheckHeader"
155
+ />
156
+ </template>
157
+
158
+ <template #empty>
159
+ <div
160
+ v-if="error"
161
+ class="flex items-center justify-center py-16"
162
+ >
163
+ <div class="flex flex-col items-center justify-center">
164
+ <BaseIcon
165
+ icon="heroicons:x-circle"
166
+ class="h-10 w-10 text-red-600"
167
+ />
168
+ <p class="mt-3 text-center text-sm text-slate-600">
169
+ {{ t('sui.whoops') }}
170
+ </p>
171
+ </div>
172
+ </div>
173
+ <div
174
+ v-else-if="firstLoad"
175
+ class="flex items-center justify-center py-16"
176
+ >
177
+ <div class="flex flex-col items-center">
178
+ <BaseEmptyState class="w-32" />
179
+
180
+ <p class="mt-3 text-center text-sm text-slate-600">
181
+ {{ t('sui.nothing_found') }}
182
+ </p>
183
+ </div>
184
+ </div>
185
+ </template>
186
+ </BaseTable>
187
+ </BaseCard>
188
+ </template>
189
+
190
+ <template
191
+ v-if="$slots.filters"
192
+ #filters="{ query, updateQuery, updateQueryValue }"
193
+ >
194
+ <slot
195
+ name="filters"
196
+ :query="query"
197
+ :update-query="updateQuery"
198
+ :update-query-value="updateQueryValue"
199
+ />
200
+ </template>
201
+
202
+ <template #sidebarTop="sidebarProps">
203
+ <slot
204
+ name="sidebarTop"
205
+ v-bind="sidebarProps"
206
+ />
207
+ </template>
208
+
209
+ <template #sidebarBottom="sidebarProps">
210
+ <slot
211
+ name="sidebarBottom"
212
+ v-bind="sidebarProps"
213
+ />
214
+ </template>
215
+
216
+ <template
217
+ v-if="toggleable"
218
+ #columns
219
+ >
220
+ <BaseDataIteratorSectionColumns
221
+ v-model:visibleColumns="visibleColumns"
222
+ :table="table"
223
+ @update:visible-columns="onUpdateVisibleColumn"
224
+ />
225
+ </template>
226
+
227
+ <template
228
+ v-for="section in sections"
229
+ :key="section.name"
230
+ #[section.name]
231
+ >
232
+ <slot :name="section.name" />
233
+ </template>
234
+ </BaseDataIterator>
235
+ </template>
236
+
237
+ <script lang="ts" setup>
238
+ import { PropType } from 'vue';
239
+ import { t } from '@/i18n';
240
+ import {
241
+ Collection,
242
+ CollectionItem,
243
+ DataIteratorSection,
244
+ DataTableQuery,
245
+ MenuItemInterface,
246
+ PaginatedCollection,
247
+ ResourceCollection,
248
+ RowAction,
249
+ } from '@/types';
250
+ import { useDialogsStore } from '@/stores/dialogs';
251
+ import { useNotificationsStore } from '../stores/notifications';
252
+ import BaseDataIterator from './BaseDataIterator.vue';
253
+ import { cloneDeep, isArray } from 'lodash';
254
+
255
+ import BaseCard from './BaseCard.vue';
256
+ import BaseTable from './BaseTable.vue';
257
+ import BaseTableColumn from './BaseTableColumn.vue';
258
+ import BaseDataIteratorSectionColumns from './BaseDataIteratorSectionColumns.vue';
259
+ import { BaseIcon, config } from '@/index';
260
+ import BaseEmptyState from '../svg/BaseEmptyState.vue';
261
+ import { RouteLocationRaw } from 'vue-router';
262
+ import BaseMenu from './BaseMenu.vue';
263
+ import BaseDataTableRowAction from './BaseDataTableRowAction.vue';
264
+
265
+ const router = useRouter();
266
+
267
+ const http = config.http;
268
+
269
+ const dialogs = useDialogsStore();
270
+ const notifications = useNotificationsStore();
271
+
272
+ const table = ref<null | InstanceType<typeof BaseTable>>(null);
273
+
274
+ const props = defineProps({
275
+ /**
276
+ * Base URL from which to make requests
277
+ */
278
+ url: {
279
+ required: true,
280
+ type: String,
281
+ },
282
+
283
+ /**
284
+ * Query params that always get applied
285
+ */
286
+ urlQuery: {
287
+ default: undefined,
288
+ type: Object as PropType<Record<string, any>>,
289
+ },
290
+
291
+ /**
292
+ * Query params that gets applied by default
293
+ * These may be overwritten by URL params generated by the data-table or filters
294
+ */
295
+ defaultQuery: {
296
+ default: undefined,
297
+ type: Object as PropType<DataTableQuery>,
298
+ },
299
+
300
+ /**
301
+ * Show url for router link
302
+ */
303
+ showUrl: {
304
+ default: undefined,
305
+ type: Function as PropType<
306
+ ((row: CollectionItem) => RouteLocationRaw) | undefined
307
+ >,
308
+ },
309
+
310
+ /**
311
+ * Show/Hide edit button
312
+ */
313
+ editButton: {
314
+ default: true,
315
+ type: Boolean,
316
+ },
317
+
318
+ /**
319
+ * Edit url for router link
320
+ */
321
+ editUrl: {
322
+ default: undefined,
323
+ type: Function as PropType<
324
+ ((row: CollectionItem) => RouteLocationRaw) | undefined
325
+ >,
326
+ },
327
+
328
+ /**
329
+ * Show/Hide delete button
330
+ */
331
+ deleteButton: {
332
+ default: true,
333
+ type: Boolean,
334
+ },
335
+
336
+ /**
337
+ * Delete endpoint to delete an item
338
+ */
339
+ deleteUrl: {
340
+ default: undefined,
341
+ type: Function as PropType<((row: CollectionItem) => string) | undefined>,
342
+ },
343
+
344
+ /**
345
+ * Show toggle-able details on each row
346
+ */
347
+ detailed: {
348
+ default: false,
349
+ type: Boolean,
350
+ },
351
+
352
+ /**
353
+ * Check is a given row has details
354
+ */
355
+ hasDetailedVisible: {
356
+ default() {
357
+ return true;
358
+ },
359
+ type: Function as PropType<(row: any) => boolean>,
360
+ },
361
+
362
+ /**
363
+ * Makes row checkable
364
+ */
365
+ checkable: {
366
+ default: false,
367
+ type: Boolean,
368
+ },
369
+
370
+ /**
371
+ * Actions on each row
372
+ */
373
+ checkableActions: {
374
+ default: undefined,
375
+ type: Array as PropType<MenuItemInterface[]>,
376
+ },
377
+
378
+ /**
379
+ * Checked rows array
380
+ */
381
+ checkedRows: {
382
+ default() {
383
+ return [];
384
+ },
385
+ type: Array as PropType<Record<string, any>[]>,
386
+ },
387
+
388
+ /**
389
+ * Check is a given row is checkable
390
+ */
391
+ isRowCheckable: {
392
+ default() {
393
+ return () => true;
394
+ },
395
+ type: Function,
396
+ },
397
+
398
+ /**
399
+ * Adds a search bar
400
+ */
401
+ searchable: {
402
+ default: true,
403
+ type: Boolean,
404
+ },
405
+
406
+ /**
407
+ * Shows the column toggle utility
408
+ */
409
+ toggleable: {
410
+ default: true,
411
+ type: Boolean,
412
+ },
413
+
414
+ /**
415
+ * Actions
416
+ */
417
+ actions: {
418
+ default: undefined,
419
+ type: Array as PropType<MenuItemInterface[]>,
420
+ },
421
+
422
+ /**
423
+ * Save data table state in URL
424
+ */
425
+ historyMode: {
426
+ default: false,
427
+ type: Boolean,
428
+ },
429
+
430
+ /*
431
+ * Max height (in px)
432
+ */
433
+ maxHeight: {
434
+ default: undefined,
435
+ type: Number,
436
+ },
437
+
438
+ /**
439
+ * Layout type
440
+ *
441
+ * default: Layout with a sidebar
442
+ * compact: Layout without a sidebar, this is the default layout for mobile, even if you don't specify it
443
+ */
444
+ layout: {
445
+ default: 'default',
446
+ type: String as PropType<'default' | 'compact'>,
447
+ },
448
+
449
+ /**
450
+ * Overall size and spacing of the component
451
+ */
452
+ size: {
453
+ default: 'md',
454
+ type: String as PropType<'sm' | 'md'>,
455
+ },
456
+
457
+ sections: {
458
+ default: undefined,
459
+ type: Array as PropType<DataIteratorSection[]>,
460
+ },
461
+
462
+ rowActions: {
463
+ default: undefined,
464
+ type: Array as PropType<RowAction[]>,
465
+ },
466
+
467
+ numberOfVisibleRowActions: {
468
+ default: 2,
469
+ type: Number,
470
+ },
471
+
472
+ /**
473
+ * Scroll to top when fetching new data
474
+ */
475
+ scrollTopOnFetch: {
476
+ default: true,
477
+ type: Boolean,
478
+ },
479
+ });
480
+
481
+ const emit = defineEmits([
482
+ 'cell-click',
483
+ 'delete',
484
+ 'update:checked-rows',
485
+ 'fetch',
486
+ ]);
487
+
488
+ const dataIterator = ref<null | InstanceType<typeof BaseDataIterator>>(null);
489
+
490
+ /*
491
+ |--------------------------------------------------------------------------
492
+ | Handlers
493
+ |--------------------------------------------------------------------------
494
+ */
495
+
496
+ function onCellClick(payload: CollectionItem) {
497
+ if (props.showUrl) {
498
+ router.push(props.showUrl(payload));
499
+ }
500
+ emit('cell-click', payload);
501
+ }
502
+
503
+ /*
504
+ |--------------------------------------------------------------------------
505
+ | Gate helpers
506
+ |--------------------------------------------------------------------------
507
+ */
508
+
509
+ const gate = (row: CollectionItem, action: string): boolean => {
510
+ if (row.can && Object.prototype.hasOwnProperty.call(row.can, action)) {
511
+ return row.can[action];
512
+ }
513
+ return true;
514
+ };
515
+
516
+ const canUpdate = (row: CollectionItem): boolean => {
517
+ return gate(row, 'update');
518
+ };
519
+
520
+ const canDelete = (row: CollectionItem): boolean => {
521
+ return gate(row, 'delete');
522
+ };
523
+
524
+ function onDeleteClick(row: CollectionItem) {
525
+ dialogs.push({
526
+ title: t('sui.delete_record') + '?',
527
+ message: t('sui.delete_record_description'),
528
+ color: 'danger',
529
+ closeOnOutsideClick: true,
530
+ confirmText: t('sui.yes_delete'),
531
+ onConfirm: () => onDelete(row),
532
+ });
533
+ }
534
+
535
+ const onDelete = (row: CollectionItem) => {
536
+ if (!props.deleteUrl) {
537
+ return;
538
+ }
539
+
540
+ http
541
+ .delete(props.deleteUrl(row))
542
+ .then((response) => {
543
+ if (response.data && response.data.message) {
544
+ notifications.push({
545
+ title: t('sui.success'),
546
+ text: response.data.message,
547
+ color: 'success',
548
+ });
549
+ }
550
+ emit('delete', row);
551
+
552
+ // Refetch even if URL is the same
553
+ fetch();
554
+ })
555
+ .catch((error) => {
556
+ notifications.push({
557
+ title: t('sui.error'),
558
+ text: error.response.data?.message ?? 'Unknown error',
559
+ color: 'danger',
560
+ });
561
+ });
562
+ };
563
+
564
+ /*
565
+ |--------------------------------------------------------------------------
566
+ | Toggle columns
567
+ |--------------------------------------------------------------------------
568
+ */
569
+
570
+ const visibleColumns = ref<number[]>([]);
571
+
572
+ // Find visible columns in local storage
573
+ const VISIBLE_COLUMNS_LOCAL_STORAGE = 'sprintify.visible_columns.';
574
+ const VISIBLE_COLUMNS_LOCAL_STORAGE_KEY =
575
+ VISIBLE_COLUMNS_LOCAL_STORAGE + window.location.pathname;
576
+
577
+ const visibleColumnsFromStorage = JSON.parse(
578
+ localStorage.getItem(VISIBLE_COLUMNS_LOCAL_STORAGE_KEY) + ''
579
+ ) as number[];
580
+
581
+ // If found, set visibleColumns
582
+ if (
583
+ visibleColumnsFromStorage &&
584
+ isArray(visibleColumnsFromStorage) &&
585
+ visibleColumnsFromStorage.length > 0
586
+ ) {
587
+ visibleColumns.value = visibleColumnsFromStorage;
588
+ }
589
+
590
+ // If nothing is found, set visibleColumns to all columns from table
591
+ const unWatchTable = watch(
592
+ () => table.value,
593
+ () => {
594
+ if (
595
+ table.value &&
596
+ table.value.newColumns.length &&
597
+ visibleColumns.value.length == 0
598
+ ) {
599
+ visibleColumns.value = table.value.newColumns
600
+ .filter((c) => c.toggle)
601
+ .filter((c) => c.toggleDefault ?? true)
602
+ .map((c) => c.newKey);
603
+
604
+ unWatchTable();
605
+ }
606
+ }
607
+ );
608
+
609
+ /**
610
+ * Update local storage when check input update
611
+ */
612
+ function onUpdateVisibleColumn() {
613
+ localStorage.setItem(
614
+ VISIBLE_COLUMNS_LOCAL_STORAGE_KEY,
615
+ JSON.stringify(visibleColumns.value)
616
+ );
617
+ }
618
+
619
+ /*
620
+ |--------------------------------------------------------------------------
621
+ | Row Actions
622
+ |--------------------------------------------------------------------------
623
+ */
624
+
625
+ const rowActionsInternal = computed<RowAction[]>(() => {
626
+ const actions = cloneDeep(props.rowActions) ?? [];
627
+
628
+ if (props.editUrl && props.editButton) {
629
+ actions.push({
630
+ label: t('sui.edit'),
631
+ icon: 'heroicons:cog-6-tooth-solid',
632
+ to: (row: CollectionItem) => (props.editUrl ? props.editUrl(row) : ''),
633
+ disabled: (row: CollectionItem) => !canUpdate(row),
634
+ });
635
+ }
636
+
637
+ if (props.deleteUrl && props.deleteButton) {
638
+ actions.push({
639
+ label: t('sui.delete'),
640
+ icon: 'heroicons:trash-20-solid',
641
+ action: onDeleteClick,
642
+ disabled: (row: CollectionItem) => !canDelete(row),
643
+ });
644
+ }
645
+
646
+ return actions;
647
+ });
648
+
649
+ const visibleRowActions = computed<RowAction[]>(() => {
650
+ return rowActionsInternal.value.slice(0, props.numberOfVisibleRowActions);
651
+ });
652
+
653
+ const showRowActionMenu = computed<boolean>(() => {
654
+ return rowActionsInternal.value.length > props.numberOfVisibleRowActions;
655
+ });
656
+
657
+ function rowActionMenuItems(row: CollectionItem): MenuItemInterface[] {
658
+ return rowActionsInternal.value.map((action) => {
659
+ return {
660
+ label: action.label,
661
+ icon: action.icon,
662
+ disabled: action.disabled && action.disabled(row),
663
+ action: action.action
664
+ ? () => {
665
+ if (action.action) action.action(row);
666
+ }
667
+ : undefined,
668
+ to: action.to ? action.to(row) : undefined,
669
+ };
670
+ });
671
+ }
672
+
673
+ /*
674
+ |--------------------------------------------------------------------------
675
+ | Checkable
676
+ |--------------------------------------------------------------------------
677
+ */
678
+
679
+ const newCheckedRows = ref<Record<string, any>[]>([]);
680
+
681
+ watch(
682
+ () => props.checkedRows,
683
+ (checkedRows) => {
684
+ newCheckedRows.value = checkedRows;
685
+ }
686
+ );
687
+
688
+ function uncheckAll() {
689
+ table.value?.uncheckAll();
690
+ }
691
+
692
+ const sectionsInternal = computed<DataIteratorSection[]>(() => {
693
+ const sections = props.sections ?? [];
694
+
695
+ if (props.toggleable) {
696
+ return [
697
+ ...sections,
698
+ {
699
+ name: 'columns',
700
+ icon: 'heroicons:view-columns',
701
+ title: t('sui.columns'),
702
+ closeText: t('sui.apply'),
703
+ opened: false,
704
+ },
705
+ ];
706
+ }
707
+
708
+ return sections;
709
+ });
710
+
711
+ function onCheckedRowsUpdate(checkedRows: Record<string, any>[]) {
712
+ newCheckedRows.value = checkedRows;
713
+ emit('update:checked-rows', checkedRows);
714
+ }
715
+
716
+ /*
717
+ |--------------------------------------------------------------------------
718
+ | Scrolling behavior
719
+ |--------------------------------------------------------------------------
720
+ */
721
+
722
+ function onWillScrollTop() {
723
+ if (!props.scrollTopOnFetch) {
724
+ return;
725
+ }
726
+
727
+ if (props.maxHeight) {
728
+ table.value?.scrollTop();
729
+
730
+ const top = dataIterator.value?.$el?.getBoundingClientRect()?.top ?? 0;
731
+
732
+ if (top < 0) {
733
+ dataIterator.value?.scrollIntoView();
734
+ }
735
+ }
736
+ }
737
+
738
+ /*
739
+ |--------------------------------------------------------------------------
740
+ | On fetch
741
+ |--------------------------------------------------------------------------
742
+ */
743
+
744
+ function onFetch(
745
+ payload: null | ResourceCollection | PaginatedCollection | Collection
746
+ ) {
747
+ emit('fetch', payload);
748
+ }
749
+
750
+ /*
751
+ |--------------------------------------------------------------------------
752
+ | Exposed functions
753
+ |--------------------------------------------------------------------------
754
+ */
755
+
756
+ function fetch() {
757
+ if (!dataIterator.value) {
758
+ return;
759
+ }
760
+ dataIterator.value.fetch();
761
+ }
762
+
763
+ function fetchWithoutLoading() {
764
+ if (!dataIterator.value) {
765
+ return;
766
+ }
767
+ dataIterator.value.fetchWithoutLoading();
768
+ }
769
+
770
+ const dataIteratorQuery = computed((): DataTableQuery | null => {
771
+ return dataIterator.value?.query ?? null;
772
+ });
773
+
774
+ defineExpose({
775
+ fetch,
776
+ fetchWithoutLoading,
777
+ query: dataIteratorQuery,
778
+ });
779
+ </script>