sprintify-ui 0.4.5 → 0.4.7

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 (420) hide show
  1. package/README.md +258 -258
  2. package/dist/sprintify-ui.es.js +10 -10
  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 +206 -216
  19. package/dist/types/src/components/BaseBelongsToFetch.vue.d.ts +216 -0
  20. package/dist/types/src/components/BaseBoolean.vue.d.ts +10 -10
  21. package/dist/types/src/components/BaseBreadcrumbs.vue.d.ts +24 -24
  22. package/dist/types/src/components/BaseButton.vue.d.ts +23 -23
  23. package/dist/types/src/components/BaseButtonGroup.vue.d.ts +143 -143
  24. package/dist/types/src/components/BaseCalendar.vue.d.ts +124 -124
  25. package/dist/types/src/components/BaseCard.vue.d.ts +21 -21
  26. package/dist/types/src/components/BaseCardRow.vue.d.ts +16 -16
  27. package/dist/types/src/components/BaseCharacterCounter.vue.d.ts +49 -49
  28. package/dist/types/src/components/BaseClickOutside.vue.d.ts +26 -26
  29. package/dist/types/src/components/BaseClipboard.vue.d.ts +22 -22
  30. package/dist/types/src/components/BaseColor.vue.d.ts +80 -80
  31. package/dist/types/src/components/BaseContainer.vue.d.ts +34 -34
  32. package/dist/types/src/components/BaseCounter.vue.d.ts +42 -42
  33. package/dist/types/src/components/BaseCropper.vue.d.ts +76 -76
  34. package/dist/types/src/components/BaseCropperModal.vue.d.ts +28 -28
  35. package/dist/types/src/components/BaseDataIterator.vue.d.ts +227 -227
  36. package/dist/types/src/components/BaseDataIteratorSectionBox.vue.d.ts +20 -20
  37. package/dist/types/src/components/BaseDataIteratorSectionButton.vue.d.ts +25 -25
  38. package/dist/types/src/components/BaseDataIteratorSectionColumns.vue.d.ts +657 -657
  39. package/dist/types/src/components/BaseDataIteratorSectionModal.vue.d.ts +32 -32
  40. package/dist/types/src/components/BaseDataTable.vue.d.ts +406 -406
  41. package/dist/types/src/components/BaseDataTableRowAction.vue.d.ts +31 -31
  42. package/dist/types/src/components/BaseDatePicker.vue.d.ts +124 -124
  43. package/dist/types/src/components/BaseDateSelect.vue.d.ts +79 -79
  44. package/dist/types/src/components/BaseDescriptionList.vue.d.ts +9 -9
  45. package/dist/types/src/components/BaseDescriptionListItem.vue.d.ts +10 -10
  46. package/dist/types/src/components/BaseDialog.vue.d.ts +60 -60
  47. package/dist/types/src/components/BaseDisplayRelativeTime.vue.d.ts +50 -50
  48. package/dist/types/src/components/BaseDraggable.vue.d.ts +49 -49
  49. package/dist/types/src/components/BaseDropdown.vue.d.ts +65 -65
  50. package/dist/types/src/components/BaseDropdownAutocomplete.vue.d.ts +132 -132
  51. package/dist/types/src/components/BaseField.vue.d.ts +58 -58
  52. package/dist/types/src/components/BaseFieldI18n.vue.d.ts +93 -93
  53. package/dist/types/src/components/BaseFilePicker.vue.d.ts +72 -72
  54. package/dist/types/src/components/BaseFilePickerCrop.vue.d.ts +63 -63
  55. package/dist/types/src/components/BaseFileUploader.vue.d.ts +142 -142
  56. package/dist/types/src/components/BaseForm.vue.d.ts +143 -143
  57. package/dist/types/src/components/BaseGantt.vue.d.ts +425 -425
  58. package/dist/types/src/components/BaseHasMany.vue.d.ts +149 -149
  59. package/dist/types/src/components/BaseHeader.vue.d.ts +98 -98
  60. package/dist/types/src/components/BaseIconPicker.vue.d.ts +34 -34
  61. package/dist/types/src/components/BaseInput.vue.d.ts +174 -174
  62. package/dist/types/src/components/BaseInputError.vue.d.ts +9 -9
  63. package/dist/types/src/components/BaseInputLabel.vue.d.ts +42 -42
  64. package/dist/types/src/components/BaseInputPercent.vue.d.ts +138 -138
  65. package/dist/types/src/components/BaseLayoutNotificationDropdown.vue.d.ts +36 -36
  66. package/dist/types/src/components/BaseLayoutNotificationItem.vue.d.ts +16 -16
  67. package/dist/types/src/components/BaseLayoutNotificationItemContent.vue.d.ts +21 -21
  68. package/dist/types/src/components/BaseLayoutSidebar.vue.d.ts +51 -51
  69. package/dist/types/src/components/BaseLayoutSidebarConfigurable.vue.d.ts +87 -87
  70. package/dist/types/src/components/BaseLayoutStacked.vue.d.ts +23 -23
  71. package/dist/types/src/components/BaseLayoutStackedConfigurable.vue.d.ts +78 -78
  72. package/dist/types/src/components/BaseLoadingCover.vue.d.ts +96 -96
  73. package/dist/types/src/components/BaseMediaGallery.vue.d.ts +64 -64
  74. package/dist/types/src/components/BaseMediaGalleryItem.vue.d.ts +45 -45
  75. package/dist/types/src/components/BaseMediaItem.vue.d.ts +27 -27
  76. package/dist/types/src/components/BaseMediaLibrary.vue.d.ts +199 -199
  77. package/dist/types/src/components/BaseMediaList.vue.d.ts +46 -46
  78. package/dist/types/src/components/BaseMediaListItem.vue.d.ts +46 -46
  79. package/dist/types/src/components/BaseMediaPictures.vue.d.ts +55 -55
  80. package/dist/types/src/components/BaseMediaPicturesItem.vue.d.ts +54 -54
  81. package/dist/types/src/components/BaseMediaPreview.vue.d.ts +36 -36
  82. package/dist/types/src/components/BaseMenu.vue.d.ts +68 -68
  83. package/dist/types/src/components/BaseMenuItem.vue.d.ts +61 -61
  84. package/dist/types/src/components/BaseModalCenter.vue.d.ts +80 -80
  85. package/dist/types/src/components/BaseModalSide.vue.d.ts +62 -62
  86. package/dist/types/src/components/BaseNavbar.vue.d.ts +38 -38
  87. package/dist/types/src/components/BaseNavbarItem.vue.d.ts +26 -26
  88. package/dist/types/src/components/BaseNavbarItemContent.vue.d.ts +60 -60
  89. package/dist/types/src/components/BaseNavbarSideItem.vue.d.ts +44 -44
  90. package/dist/types/src/components/BaseNavbarSideItemContent.vue.d.ts +60 -60
  91. package/dist/types/src/components/BasePagination.vue.d.ts +35 -35
  92. package/dist/types/src/components/BasePanel.vue.d.ts +31 -31
  93. package/dist/types/src/components/BasePassword.vue.d.ts +67 -67
  94. package/dist/types/src/components/BaseProgressCircle.vue.d.ts +37 -37
  95. package/dist/types/src/components/BaseRadioGroup.vue.d.ts +105 -105
  96. package/dist/types/src/components/BaseReadMore.vue.d.ts +21 -21
  97. package/dist/types/src/components/BaseRichText.vue.d.ts +92 -92
  98. package/dist/types/src/components/BaseSelect.vue.d.ts +98 -98
  99. package/dist/types/src/components/BaseShortcut.vue.d.ts +86 -86
  100. package/dist/types/src/components/BaseSideNavigation.vue.d.ts +21 -21
  101. package/dist/types/src/components/BaseSideNavigationItem.vue.d.ts +41 -41
  102. package/dist/types/src/components/BaseSkeleton.vue.d.ts +31 -31
  103. package/dist/types/src/components/BaseStatistic.vue.d.ts +55 -55
  104. package/dist/types/src/components/BaseStepper.vue.d.ts +16 -16
  105. package/dist/types/src/components/BaseStepperItem.vue.d.ts +51 -51
  106. package/dist/types/src/components/BaseSwitch.vue.d.ts +87 -87
  107. package/dist/types/src/components/BaseSystemAlert.vue.d.ts +52 -52
  108. package/dist/types/src/components/BaseTabItem.vue.d.ts +41 -41
  109. package/dist/types/src/components/BaseTable.vue.d.ts +221 -221
  110. package/dist/types/src/components/BaseTableColumn.vue.d.ts +174 -174
  111. package/dist/types/src/components/BaseTabs.vue.d.ts +21 -21
  112. package/dist/types/src/components/BaseTagAutocomplete.vue.d.ts +209 -209
  113. package/dist/types/src/components/BaseTagAutocompleteFetch.vue.d.ts +141 -141
  114. package/dist/types/src/components/BaseTextarea.vue.d.ts +103 -103
  115. package/dist/types/src/components/BaseTextareaAutoresize.vue.d.ts +113 -113
  116. package/dist/types/src/components/BaseTimeline.vue.d.ts +14 -14
  117. package/dist/types/src/components/BaseTimelineItem.vue.d.ts +14 -14
  118. package/dist/types/src/components/BaseToast.vue.d.ts +20 -20
  119. package/dist/types/src/components/BaseUniqueCode.vue.d.ts +33 -33
  120. package/dist/types/src/components/SlotComponent.d.ts +43 -43
  121. package/dist/types/src/components/index.d.ts +97 -97
  122. package/dist/types/src/composables/breakpoints.d.ts +27 -27
  123. package/dist/types/src/composables/clickOutside.d.ts +8 -8
  124. package/dist/types/src/composables/field.d.ts +19 -19
  125. package/dist/types/src/composables/hasOptions.d.ts +7 -7
  126. package/dist/types/src/composables/mediaQuery.d.ts +2 -2
  127. package/dist/types/src/composables/modal.d.ts +6 -6
  128. package/dist/types/src/composables/paginatedData.d.ts +7 -7
  129. package/dist/types/src/constants/MyConstants.d.ts +1 -1
  130. package/dist/types/src/constants/index.d.ts +2 -2
  131. package/dist/types/src/i18n/index.d.ts +1 -1
  132. package/dist/types/src/index.d.ts +236 -236
  133. package/dist/types/src/services/gantt/format.d.ts +24 -24
  134. package/dist/types/src/services/gantt/timescale.d.ts +26 -26
  135. package/dist/types/src/services/gantt/types.d.ts +67 -67
  136. package/dist/types/src/stores/dialogs.d.ts +9 -9
  137. package/dist/types/src/stores/i18n.d.ts +5 -5
  138. package/dist/types/src/stores/notifications.d.ts +10 -10
  139. package/dist/types/src/stores/systemAlerts.d.ts +9 -9
  140. package/dist/types/src/stories/PageShow.vue.d.ts +2 -2
  141. package/dist/types/src/svg/BaseEmptyState.vue.d.ts +2 -2
  142. package/dist/types/src/svg/BaseSpinnerLarge.vue.d.ts +2 -2
  143. package/dist/types/src/svg/BaseSpinnerSmall.vue.d.ts +2 -2
  144. package/dist/types/src/types/CalendarEvent.d.ts +9 -9
  145. package/dist/types/src/types/Color.d.ts +9 -9
  146. package/dist/types/src/types/Country.d.ts +4 -4
  147. package/dist/types/src/types/ImagePickerResult.d.ts +5 -5
  148. package/dist/types/src/types/Media.d.ts +9 -9
  149. package/dist/types/src/types/Notification.d.ts +8 -8
  150. package/dist/types/src/types/Region.d.ts +5 -5
  151. package/dist/types/src/types/Status.d.ts +5 -5
  152. package/dist/types/src/types/StepperItem.d.ts +7 -7
  153. package/dist/types/src/types/TimelineItem.d.ts +9 -9
  154. package/dist/types/src/types/UploadedFile.d.ts +10 -10
  155. package/dist/types/src/types/User.d.ts +6 -6
  156. package/dist/types/src/types/index.d.ts +219 -218
  157. package/dist/types/src/utils/blob.d.ts +3 -3
  158. package/dist/types/src/utils/colors.d.ts +13 -13
  159. package/dist/types/src/utils/cropper/avatar.d.ts +5 -5
  160. package/dist/types/src/utils/cropper/cover.d.ts +5 -5
  161. package/dist/types/src/utils/cropper/presetInterface.d.ts +7 -7
  162. package/dist/types/src/utils/cropper/presets.d.ts +6 -6
  163. package/dist/types/src/utils/fileSizeFormat.d.ts +1 -1
  164. package/dist/types/src/utils/fileValidations.d.ts +2 -2
  165. package/dist/types/src/utils/index.d.ts +6 -6
  166. package/dist/types/src/utils/resizeImageFromURI.d.ts +1 -1
  167. package/dist/types/src/utils/scrollPreventer.d.ts +3 -3
  168. package/dist/types/src/utils/toHumanList.d.ts +1 -1
  169. package/package.json +148 -148
  170. package/src/assets/flatpickr.css +243 -243
  171. package/src/assets/form.css +6 -6
  172. package/src/assets/main.css +36 -36
  173. package/src/assets/tailwind.css +2 -2
  174. package/src/components/BaseActionItem.vue +68 -68
  175. package/src/components/BaseActionItemButton.vue +77 -77
  176. package/src/components/BaseAddressForm.stories.js +103 -103
  177. package/src/components/BaseAddressForm.vue +354 -354
  178. package/src/components/BaseAlert.stories.js +52 -52
  179. package/src/components/BaseAlert.vue +158 -158
  180. package/src/components/BaseApp.vue +16 -16
  181. package/src/components/BaseAppDialogs.vue +123 -123
  182. package/src/components/BaseAppNotifications.vue +40 -40
  183. package/src/components/BaseAutocomplete.stories.js +236 -236
  184. package/src/components/BaseAutocomplete.vue +523 -523
  185. package/src/components/BaseAutocompleteDrawer.vue +372 -372
  186. package/src/components/BaseAutocompleteFetch.stories.js +224 -224
  187. package/src/components/BaseAutocompleteFetch.vue +288 -288
  188. package/src/components/BaseAvatar.stories.js +39 -39
  189. package/src/components/BaseAvatar.vue +120 -120
  190. package/src/components/BaseAvatarGroup.stories.js +71 -71
  191. package/src/components/BaseAvatarGroup.vue +148 -148
  192. package/src/components/BaseBadge.stories.js +124 -124
  193. package/src/components/BaseBadge.vue +87 -87
  194. package/src/components/BaseBelongsTo.stories.js +217 -223
  195. package/src/components/BaseBelongsTo.vue +157 -193
  196. package/src/components/BaseBelongsToFetch.stories.js +223 -0
  197. package/src/components/BaseBelongsToFetch.vue +193 -0
  198. package/src/components/BaseBoolean.stories.js +35 -35
  199. package/src/components/BaseBoolean.vue +26 -26
  200. package/src/components/BaseBreadcrumbs.stories.js +50 -50
  201. package/src/components/BaseBreadcrumbs.vue +109 -109
  202. package/src/components/BaseButton.stories.js +88 -88
  203. package/src/components/BaseButton.vue +46 -46
  204. package/src/components/BaseButtonGroup.stories.js +86 -86
  205. package/src/components/BaseButtonGroup.vue +150 -150
  206. package/src/components/BaseCalendar.stories.js +202 -202
  207. package/src/components/BaseCalendar.vue +215 -215
  208. package/src/components/BaseCard.stories.js +61 -61
  209. package/src/components/BaseCard.vue +49 -49
  210. package/src/components/BaseCardRow.vue +34 -34
  211. package/src/components/BaseCharacterCounter.stories.js +30 -30
  212. package/src/components/BaseCharacterCounter.vue +64 -64
  213. package/src/components/BaseClickOutside.vue +37 -37
  214. package/src/components/BaseClipboard.stories.js +32 -32
  215. package/src/components/BaseClipboard.vue +83 -83
  216. package/src/components/BaseColor.stories.js +46 -46
  217. package/src/components/BaseColor.vue +154 -154
  218. package/src/components/BaseContainer.stories.js +34 -34
  219. package/src/components/BaseContainer.vue +50 -50
  220. package/src/components/BaseCounter.stories.js +47 -47
  221. package/src/components/BaseCounter.vue +82 -82
  222. package/src/components/BaseCropper.stories.js +113 -113
  223. package/src/components/BaseCropper.vue +458 -458
  224. package/src/components/BaseCropperModal.stories.js +54 -54
  225. package/src/components/BaseCropperModal.vue +143 -143
  226. package/src/components/BaseDataIterator.stories.js +197 -197
  227. package/src/components/BaseDataIterator.vue +839 -839
  228. package/src/components/BaseDataIteratorSectionBox.vue +36 -36
  229. package/src/components/BaseDataIteratorSectionButton.vue +53 -53
  230. package/src/components/BaseDataIteratorSectionColumns.vue +70 -70
  231. package/src/components/BaseDataIteratorSectionModal.vue +41 -41
  232. package/src/components/BaseDataTable.stories.js +226 -226
  233. package/src/components/BaseDataTable.vue +779 -779
  234. package/src/components/BaseDataTableRowAction.vue +53 -53
  235. package/src/components/BaseDatePicker.stories.js +130 -130
  236. package/src/components/BaseDatePicker.vue +296 -296
  237. package/src/components/BaseDateSelect.stories.js +47 -47
  238. package/src/components/BaseDateSelect.vue +241 -241
  239. package/src/components/BaseDescriptionList.stories.js +35 -35
  240. package/src/components/BaseDescriptionList.vue +13 -13
  241. package/src/components/BaseDescriptionListItem.vue +47 -47
  242. package/src/components/BaseDialog.stories.js +51 -51
  243. package/src/components/BaseDialog.vue +119 -119
  244. package/src/components/BaseDisplayRelativeTime.stories.js +47 -47
  245. package/src/components/BaseDisplayRelativeTime.vue +122 -122
  246. package/src/components/BaseDraggable.vue +71 -71
  247. package/src/components/BaseDropdown.stories.js +210 -210
  248. package/src/components/BaseDropdown.vue +280 -280
  249. package/src/components/BaseDropdownAutocomplete.stories.js +187 -187
  250. package/src/components/BaseDropdownAutocomplete.vue +235 -235
  251. package/src/components/BaseField.vue +112 -112
  252. package/src/components/BaseFieldI18n.stories.js +38 -38
  253. package/src/components/BaseFieldI18n.vue +170 -170
  254. package/src/components/BaseFilePicker.stories.js +84 -84
  255. package/src/components/BaseFilePicker.vue +163 -163
  256. package/src/components/BaseFilePickerCrop.stories.js +135 -135
  257. package/src/components/BaseFilePickerCrop.vue +130 -130
  258. package/src/components/BaseFileUploader.stories.js +102 -102
  259. package/src/components/BaseFileUploader.vue +185 -185
  260. package/src/components/BaseForm.stories.js +48 -48
  261. package/src/components/BaseForm.vue +335 -335
  262. package/src/components/BaseGantt.stories.js +133 -133
  263. package/src/components/BaseGantt.vue +336 -336
  264. package/src/components/BaseHasMany.stories.js +189 -189
  265. package/src/components/BaseHasMany.vue +137 -137
  266. package/src/components/BaseHeader.stories.js +133 -133
  267. package/src/components/BaseHeader.vue +188 -188
  268. package/src/components/BaseIconPicker.stories.js +22 -22
  269. package/src/components/BaseIconPicker.vue +225 -225
  270. package/src/components/BaseInput.stories.js +167 -167
  271. package/src/components/BaseInput.vue +264 -264
  272. package/src/components/BaseInputError.vue +7 -7
  273. package/src/components/BaseInputLabel.stories.js +36 -36
  274. package/src/components/BaseInputLabel.vue +57 -57
  275. package/src/components/BaseInputPercent.stories.js +65 -65
  276. package/src/components/BaseInputPercent.vue +139 -139
  277. package/src/components/BaseLayoutNotificationDropdown.vue +150 -150
  278. package/src/components/BaseLayoutNotificationItem.vue +53 -53
  279. package/src/components/BaseLayoutNotificationItemContent.vue +30 -30
  280. package/src/components/BaseLayoutSidebar.vue +236 -236
  281. package/src/components/BaseLayoutSidebarConfigurable.stories.js +166 -166
  282. package/src/components/BaseLayoutSidebarConfigurable.vue +181 -181
  283. package/src/components/BaseLayoutStacked.vue +52 -52
  284. package/src/components/BaseLayoutStackedConfigurable.stories.js +109 -109
  285. package/src/components/BaseLayoutStackedConfigurable.vue +158 -158
  286. package/src/components/BaseLoadingCover.stories.js +55 -55
  287. package/src/components/BaseLoadingCover.vue +101 -101
  288. package/src/components/BaseMediaGallery.vue +96 -96
  289. package/src/components/BaseMediaGalleryItem.vue +101 -101
  290. package/src/components/BaseMediaItem.stories.js +41 -41
  291. package/src/components/BaseMediaItem.vue +80 -80
  292. package/src/components/BaseMediaLibrary.stories.js +267 -267
  293. package/src/components/BaseMediaLibrary.vue +342 -342
  294. package/src/components/BaseMediaList.vue +67 -67
  295. package/src/components/BaseMediaListItem.vue +212 -212
  296. package/src/components/BaseMediaPictures.vue +64 -64
  297. package/src/components/BaseMediaPicturesItem.vue +100 -100
  298. package/src/components/BaseMediaPreview.stories.js +72 -72
  299. package/src/components/BaseMediaPreview.vue +106 -106
  300. package/src/components/BaseMenu.stories.js +129 -129
  301. package/src/components/BaseMenu.vue +165 -165
  302. package/src/components/BaseMenuItem.vue +145 -145
  303. package/src/components/BaseModalCenter.stories.js +68 -68
  304. package/src/components/BaseModalCenter.vue +128 -128
  305. package/src/components/BaseModalSide.stories.js +55 -55
  306. package/src/components/BaseModalSide.vue +116 -116
  307. package/src/components/BaseNavbar.stories.js +151 -151
  308. package/src/components/BaseNavbar.vue +91 -91
  309. package/src/components/BaseNavbarItem.vue +49 -49
  310. package/src/components/BaseNavbarItemContent.vue +97 -97
  311. package/src/components/BaseNavbarSideItem.vue +114 -114
  312. package/src/components/BaseNavbarSideItemContent.vue +111 -111
  313. package/src/components/BasePagination.stories.js +35 -35
  314. package/src/components/BasePagination.vue +266 -266
  315. package/src/components/BasePanel.stories.js +56 -56
  316. package/src/components/BasePanel.vue +42 -42
  317. package/src/components/BasePassword.stories.js +57 -57
  318. package/src/components/BasePassword.vue +107 -107
  319. package/src/components/BaseProgressCircle.stories.js +27 -27
  320. package/src/components/BaseProgressCircle.vue +80 -80
  321. package/src/components/BaseRadioGroup.stories.js +88 -88
  322. package/src/components/BaseRadioGroup.vue +125 -125
  323. package/src/components/BaseReadMore.stories.js +30 -30
  324. package/src/components/BaseReadMore.vue +73 -73
  325. package/src/components/BaseRichText.stories.js +102 -102
  326. package/src/components/BaseRichText.vue +198 -198
  327. package/src/components/BaseSelect.stories.js +118 -118
  328. package/src/components/BaseSelect.vue +224 -224
  329. package/src/components/BaseShortcut.stories.js +102 -102
  330. package/src/components/BaseShortcut.vue +112 -112
  331. package/src/components/BaseSideNavigation.stories.js +85 -85
  332. package/src/components/BaseSideNavigation.vue +32 -32
  333. package/src/components/BaseSideNavigationItem.vue +95 -95
  334. package/src/components/BaseSkeleton.stories.js +36 -36
  335. package/src/components/BaseSkeleton.vue +40 -40
  336. package/src/components/BaseStatistic.stories.js +51 -51
  337. package/src/components/BaseStatistic.vue +106 -106
  338. package/src/components/BaseStepper.stories.js +94 -94
  339. package/src/components/BaseStepper.vue +72 -72
  340. package/src/components/BaseStepperItem.stories.js +65 -65
  341. package/src/components/BaseStepperItem.vue +149 -149
  342. package/src/components/BaseSwitch.stories.js +130 -130
  343. package/src/components/BaseSwitch.vue +215 -215
  344. package/src/components/BaseSystemAlert.stories.js +63 -63
  345. package/src/components/BaseSystemAlert.vue +89 -89
  346. package/src/components/BaseTabItem.vue +97 -97
  347. package/src/components/BaseTable.vue +904 -904
  348. package/src/components/BaseTableColumn.vue +124 -124
  349. package/src/components/BaseTabs.stories.js +85 -85
  350. package/src/components/BaseTabs.vue +73 -73
  351. package/src/components/BaseTagAutocomplete.stories.js +258 -258
  352. package/src/components/BaseTagAutocomplete.vue +438 -438
  353. package/src/components/BaseTagAutocompleteFetch.stories.js +185 -185
  354. package/src/components/BaseTagAutocompleteFetch.vue +220 -220
  355. package/src/components/BaseTextarea.stories.js +58 -58
  356. package/src/components/BaseTextarea.vue +103 -103
  357. package/src/components/BaseTextareaAutoresize.stories.js +102 -102
  358. package/src/components/BaseTextareaAutoresize.vue +166 -166
  359. package/src/components/BaseTimeline.stories.js +55 -55
  360. package/src/components/BaseTimeline.vue +38 -38
  361. package/src/components/BaseTimelineItem.stories.js +78 -78
  362. package/src/components/BaseTimelineItem.vue +90 -90
  363. package/src/components/BaseToast.stories.js +50 -50
  364. package/src/components/BaseToast.vue +43 -43
  365. package/src/components/BaseUniqueCode.stories.js +36 -36
  366. package/src/components/BaseUniqueCode.vue +183 -183
  367. package/src/components/SlotComponent.ts +37 -37
  368. package/src/components/index.ts +196 -196
  369. package/src/composables/breakpoints.ts +94 -94
  370. package/src/composables/clickOutside.ts +80 -80
  371. package/src/composables/field.ts +117 -117
  372. package/src/composables/hasOptions.ts +68 -68
  373. package/src/composables/mediaQuery.ts +42 -42
  374. package/src/composables/modal.ts +73 -73
  375. package/src/composables/paginatedData.ts +65 -65
  376. package/src/constants/MyConstants.ts +1 -1
  377. package/src/constants/index.ts +5 -5
  378. package/src/env.d.ts +15 -15
  379. package/src/i18n/index.ts +60 -60
  380. package/src/index.ts +114 -114
  381. package/src/lang/en.json +95 -95
  382. package/src/lang/fr.json +95 -95
  383. package/src/services/gantt/format.ts +113 -113
  384. package/src/services/gantt/timescale.ts +242 -242
  385. package/src/services/gantt/types.ts +74 -74
  386. package/src/stores/dialogs.ts +45 -45
  387. package/src/stores/i18n.ts +14 -14
  388. package/src/stores/notifications.ts +47 -47
  389. package/src/stores/systemAlerts.ts +32 -32
  390. package/src/stories/List.stories.js +132 -132
  391. package/src/stories/PageShow.vue +423 -423
  392. package/src/stories/Show.stories.js +22 -22
  393. package/src/svg/BaseEmptyState.vue +38 -38
  394. package/src/svg/BaseSpinnerLarge.vue +59 -59
  395. package/src/svg/BaseSpinnerSmall.vue +15 -15
  396. package/src/types/CalendarEvent.ts +9 -9
  397. package/src/types/Color.ts +9 -9
  398. package/src/types/Country.ts +4 -4
  399. package/src/types/ImagePickerResult.ts +5 -5
  400. package/src/types/Media.ts +10 -10
  401. package/src/types/Notification.ts +10 -10
  402. package/src/types/Region.ts +5 -5
  403. package/src/types/Status.ts +5 -5
  404. package/src/types/StepperItem.ts +8 -8
  405. package/src/types/TimelineItem.ts +9 -9
  406. package/src/types/UploadedFile.ts +11 -11
  407. package/src/types/User.ts +7 -7
  408. package/src/types/index.ts +268 -267
  409. package/src/utils/blob.ts +30 -30
  410. package/src/utils/colors.ts +210 -210
  411. package/src/utils/cropper/avatar.ts +33 -33
  412. package/src/utils/cropper/cover.ts +41 -41
  413. package/src/utils/cropper/presetInterface.ts +16 -16
  414. package/src/utils/cropper/presets.ts +7 -7
  415. package/src/utils/fileSizeFormat.ts +15 -15
  416. package/src/utils/fileValidations.ts +26 -26
  417. package/src/utils/index.ts +16 -16
  418. package/src/utils/resizeImageFromURI.ts +118 -118
  419. package/src/utils/scrollPreventer.ts +11 -11
  420. 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>