@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.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 (690) hide show
  1. package/README.md +4 -0
  2. package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
  3. package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
  4. package/dist/common-admin.css +1 -1
  5. package/dist/common-admin.js +282 -282
  6. package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
  7. package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  9. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
  10. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  12. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
  13. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  15. package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
  16. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  22. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
  23. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  25. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
  26. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  28. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
  29. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  31. package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
  32. package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  34. package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
  35. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  37. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  39. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
  40. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  42. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  44. package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
  45. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  47. package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  49. package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
  50. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
  52. package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
  53. package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
  54. package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
  55. package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
  56. package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
  57. package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
  58. package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
  59. package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
  60. package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
  61. package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
  62. package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
  63. package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
  64. package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
  65. package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
  66. package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
  67. package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
  68. package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
  69. package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
  70. package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
  71. package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
  72. package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
  73. package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
  74. package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
  75. package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
  76. package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
  77. package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
  78. package/dist/domains/api/composables/defineApiClient.js.map +1 -1
  79. package/dist/domains/api/composables/request.d.ts +18 -48
  80. package/dist/domains/api/composables/request.js.map +1 -1
  81. package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
  82. package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
  83. package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
  84. package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
  85. package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
  86. package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
  87. package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
  88. package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
  89. package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
  90. package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
  91. package/dist/domains/api/composables/useApiRequest.js.map +1 -1
  92. package/dist/domains/api/utils/apiErrors.d.ts +28 -55
  93. package/dist/domains/api/utils/apiErrors.js.map +1 -1
  94. package/dist/domains/api/utils/listBody.d.ts +22 -43
  95. package/dist/domains/api/utils/listBody.js.map +1 -1
  96. package/dist/domains/auth/components/Acl.js.map +1 -1
  97. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
  99. package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
  100. package/dist/domains/auth/composables/defineAuth.js.map +1 -1
  101. package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
  102. package/dist/domains/auth/composables/refreshSession.js.map +1 -1
  103. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  104. package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
  105. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/domains/cached/components/ACachedUserChip.js +1 -1
  107. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  108. package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
  109. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
  111. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
  112. package/dist/domains/cached/composables/defineCached.d.ts +13 -11
  113. package/dist/domains/cached/composables/defineCached.js.map +1 -1
  114. package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
  115. package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
  116. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  117. package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
  119. package/dist/domains/collab/composables/collabField.d.ts +5 -3
  120. package/dist/domains/collab/composables/collabField.js.map +1 -1
  121. package/dist/domains/collab/composables/collabInit.js +58 -54
  122. package/dist/domains/collab/composables/collabInit.js.map +1 -1
  123. package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
  124. package/dist/domains/collab/composables/collabRecovery.js +99 -0
  125. package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
  126. package/dist/domains/collab/composables/collabRoom.js +106 -106
  127. package/dist/domains/collab/composables/collabRoom.js.map +1 -1
  128. package/dist/domains/collab/composables/collabState.d.ts +11 -4
  129. package/dist/domains/collab/composables/collabState.js +34 -25
  130. package/dist/domains/collab/composables/collabState.js.map +1 -1
  131. package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
  132. package/dist/domains/collab/types/Collab.d.ts +31 -5
  133. package/dist/domains/collab/types/Collab.js +23 -11
  134. package/dist/domains/collab/types/Collab.js.map +1 -1
  135. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  136. package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
  137. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  139. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  141. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
  142. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
  144. package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
  145. package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
  146. package/dist/domains/dam/api/damAssetApi.js.map +1 -1
  147. package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
  148. package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
  149. package/dist/domains/dam/api/damConstants.js.map +1 -1
  150. package/dist/domains/dam/api/damEndPoints.js.map +1 -1
  151. package/dist/domains/dam/api/damImageApi.js.map +1 -1
  152. package/dist/domains/dam/api/uploadApi.js.map +1 -1
  153. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  154. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
  155. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  157. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  158. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  159. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
  160. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
  162. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  163. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  165. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  167. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  169. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
  170. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  172. package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
  173. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  175. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
  176. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  178. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  179. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  180. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
  182. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
  183. package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
  184. package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
  185. package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
  186. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
  187. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
  188. package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
  189. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  190. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
  191. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  193. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
  194. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  196. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
  197. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  199. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  200. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  201. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
  202. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  203. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  204. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  205. package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
  206. package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
  207. package/dist/domains/dam/author/api/authorApi.js.map +1 -1
  208. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  209. package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
  210. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  212. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
  213. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  215. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  216. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
  217. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  218. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
  219. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  221. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
  222. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
  224. package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
  225. package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
  226. package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
  227. package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
  228. package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
  229. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  230. package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
  232. package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
  233. package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
  234. package/dist/domains/dam/composables/damConfigName.js.map +1 -1
  235. package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
  236. package/dist/domains/dam/composables/damNotifications.js.map +1 -1
  237. package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
  238. package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
  239. package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
  240. package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
  241. package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
  242. package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
  243. package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
  244. package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
  245. package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
  246. package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
  247. package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
  248. package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
  249. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
  250. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
  251. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  252. package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
  253. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  254. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  255. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
  257. package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
  258. package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
  259. package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
  260. package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
  261. package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
  262. package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
  263. package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
  264. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
  265. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
  266. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  267. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  269. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  270. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  271. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  273. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  274. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
  275. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
  276. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  277. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
  278. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  279. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  280. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
  281. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  283. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
  284. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  285. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  286. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
  287. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  289. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
  290. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  291. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  292. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  293. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  294. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  295. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
  296. package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
  297. package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
  298. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
  299. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
  300. package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
  301. package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
  302. package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
  303. package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
  304. package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
  305. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
  306. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
  307. package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
  308. package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
  309. package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
  310. package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
  311. package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
  312. package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
  313. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  314. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
  315. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  317. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
  318. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  319. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
  320. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  321. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
  322. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  323. package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
  324. package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
  325. package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
  326. package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
  327. package/dist/domains/dam/types/Asset.d.ts +1 -1
  328. package/dist/domains/dam/types/Asset.js.map +1 -1
  329. package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
  330. package/dist/domains/dam/types/UploadQueue.js.map +1 -1
  331. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  332. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  334. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
  335. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  336. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  337. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  338. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  339. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  340. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  341. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
  342. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  343. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  344. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
  345. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  347. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  348. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  349. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
  350. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  351. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  352. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
  353. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  354. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
  355. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
  356. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
  357. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
  358. package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
  359. package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
  360. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
  361. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
  362. package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
  363. package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
  364. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
  365. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
  366. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
  367. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
  368. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
  369. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
  370. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
  371. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
  372. package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
  373. package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
  374. package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
  375. package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
  376. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
  377. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
  378. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
  379. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
  380. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
  381. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
  382. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
  383. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
  384. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
  385. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
  386. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
  387. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
  388. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
  389. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
  390. package/dist/domains/dam/user/api/userApi.d.ts +2 -2
  391. package/dist/domains/dam/user/api/userApi.js.map +1 -1
  392. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  393. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
  394. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  395. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  396. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
  397. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  398. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  399. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
  400. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  401. package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
  402. package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
  403. package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
  404. package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
  405. package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
  406. package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
  407. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  408. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  409. package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
  410. package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
  411. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  412. package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  413. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  414. package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  415. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  416. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  417. package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
  418. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  419. package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
  420. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  421. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  422. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  423. package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
  424. package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
  425. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
  426. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  427. package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
  428. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  429. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
  430. package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
  431. package/dist/domains/filters/composables/filterFactory.js +38 -31
  432. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  433. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  434. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
  435. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
  436. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  437. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
  438. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  439. package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
  440. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  441. package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
  442. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  443. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  444. package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
  445. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  446. package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
  447. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  448. package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
  449. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  450. package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
  451. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
  452. package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
  453. package/dist/domains/job/api/jobApi.js.map +1 -1
  454. package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
  455. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  456. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  457. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  458. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
  459. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  460. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  461. package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
  462. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  463. package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
  464. package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
  465. package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
  466. package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
  467. package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
  468. package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
  469. package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
  470. package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
  471. package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
  472. package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
  473. package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
  474. package/dist/domains/log/api/logApi.d.ts +2 -3
  475. package/dist/domains/log/api/logApi.js.map +1 -1
  476. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  477. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  478. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  479. package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
  480. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  481. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  482. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  483. package/dist/domains/log/components/ALogListView.js.map +1 -1
  484. package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
  485. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  486. package/dist/domains/log/composables/logActions.d.ts +4 -5
  487. package/dist/domains/log/composables/logActions.js.map +1 -1
  488. package/dist/domains/log/composables/logType.d.ts +6 -7
  489. package/dist/domains/log/composables/logType.js.map +1 -1
  490. package/dist/domains/log/filter/logFilter.d.ts +8 -11
  491. package/dist/domains/log/filter/logFilter.js.map +1 -1
  492. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  493. package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
  494. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  495. package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
  496. package/dist/domains/permission/composables/permissionActions.js.map +1 -1
  497. package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
  498. package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
  499. package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
  500. package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
  501. package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
  502. package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
  503. package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
  504. package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
  505. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  506. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
  507. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  508. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  509. package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
  510. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  511. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  512. package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
  513. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  514. package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
  515. package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
  516. package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
  517. package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
  518. package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
  519. package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
  520. package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
  521. package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
  522. package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
  523. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  524. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  525. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  526. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  527. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  528. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  529. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
  530. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
  531. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
  532. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
  533. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  534. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  535. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
  536. package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
  537. package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
  538. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  539. package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
  540. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  541. package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
  542. package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
  543. package/dist/domains/system/components/AAlerts.js.map +1 -1
  544. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  545. package/dist/domains/system/composables/alerts.js.map +1 -1
  546. package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
  547. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  548. package/dist/domains/system/composables/languageSettings.js.map +1 -1
  549. package/dist/domains/system/composables/loginStatus.js.map +1 -1
  550. package/dist/domains/system/composables/navigationError.d.ts +6 -8
  551. package/dist/domains/system/composables/navigationError.js.map +1 -1
  552. package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
  553. package/dist/domains/system/composables/pageNavigation.js.map +1 -1
  554. package/dist/domains/system/composables/recordActions.d.ts +14 -22
  555. package/dist/domains/system/composables/recordActions.js.map +1 -1
  556. package/dist/domains/system/composables/recordPage.d.ts +23 -38
  557. package/dist/domains/system/composables/recordPage.js.map +1 -1
  558. package/dist/domains/system/composables/routeHistory.d.ts +4 -5
  559. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  560. package/dist/domains/system/composables/sentry.js.map +1 -1
  561. package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
  562. package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
  563. package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
  564. package/dist/domains/system/store/datatablePageStore.js +10 -3
  565. package/dist/domains/system/store/datatablePageStore.js.map +1 -1
  566. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  567. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  568. package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
  569. package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
  570. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  571. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
  572. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
  573. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  574. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  575. package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
  576. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  577. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  578. package/dist/domains/ui/components/ACard.js.map +1 -1
  579. package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
  580. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
  581. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  582. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  583. package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
  584. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
  585. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  586. package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
  587. package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
  588. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  589. package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
  590. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  591. package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
  592. package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
  593. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  594. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  595. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  596. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
  597. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  598. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
  599. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  600. package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
  601. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  602. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  603. package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
  604. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  606. package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
  607. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  608. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  609. package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
  610. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  611. package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
  612. package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
  613. package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
  614. package/dist/domains/ui/view/components/ALoginView.js +1 -1
  615. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  616. package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
  617. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  618. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  619. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  620. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  621. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  622. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
  623. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
  624. package/dist/lib.d.ts +2 -2
  625. package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
  626. package/dist/plugins/commonVuetifyConfig.js.map +1 -1
  627. package/dist/plugins/i18n.d.ts +4 -5
  628. package/dist/plugins/i18n.js.map +1 -1
  629. package/dist/plugins/pluginOptions.d.ts +4 -2
  630. package/dist/plugins/pluginOptions.js.map +1 -1
  631. package/dist/plugins/webfontloader.js.map +1 -1
  632. package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
  633. package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
  634. package/dist/shared/error/AnzuError.d.ts +3 -5
  635. package/dist/shared/error/AnzuError.js.map +1 -1
  636. package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
  637. package/dist/shared/error/AuthUnavailableError.js.map +1 -1
  638. package/dist/shared/error/isInCauseChain.d.ts +2 -2
  639. package/dist/shared/error/isInCauseChain.js.map +1 -1
  640. package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
  641. package/dist/shared/types/Validation.d.ts +4 -5
  642. package/dist/shared/types/common.d.ts +1 -3
  643. package/dist/shared/types/globalComponents.d.ts +5 -6
  644. package/dist/shared/utils/common.js.map +1 -1
  645. package/dist/shared/utils/datetime.d.ts +0 -1
  646. package/dist/shared/utils/datetime.js.map +1 -1
  647. package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
  648. package/dist/shared/utils/datetimePickerValue.js.map +1 -1
  649. package/dist/shared/utils/development.d.ts +3 -3
  650. package/dist/shared/utils/development.js.map +1 -1
  651. package/dist/shared/utils/envConfig.d.ts +4 -4
  652. package/dist/shared/utils/envConfig.js.map +1 -1
  653. package/dist/shared/utils/json.d.ts +1 -1
  654. package/dist/shared/utils/json.js.map +1 -1
  655. package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
  656. package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
  657. package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
  658. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
  659. package/dist/testing/appShell.d.ts +11 -11
  660. package/dist/testing/appShell.js.map +1 -1
  661. package/dist/testing/closeButtons.d.ts +9 -11
  662. package/dist/testing/closeButtons.js.map +1 -1
  663. package/dist/testing/declaredDependencies.d.ts +7 -7
  664. package/dist/testing/declaredDependencies.js.map +1 -1
  665. package/dist/testing/generatedRoutes.d.ts +6 -11
  666. package/dist/testing/generatedRoutes.js.map +1 -1
  667. package/dist/testing/routeHistory.d.ts +5 -12
  668. package/dist/testing/routeHistory.js.map +1 -1
  669. package/dist/testing/sortableLists.d.ts +16 -21
  670. package/dist/testing/sortableLists.js.map +1 -1
  671. package/dist/testing/typedRouter.d.ts +0 -1
  672. package/dist/testing/typedRouter.js.map +1 -1
  673. package/package.json +39 -29
  674. package/src/e2e/conventions.d.mts +4 -0
  675. package/src/e2e/conventions.mjs +15 -0
  676. package/src/e2e/index.d.mts +8 -0
  677. package/src/e2e/index.mjs +1 -0
  678. package/src/e2e/routeWalk.d.mts +43 -0
  679. package/src/e2e/routeWalk.mjs +606 -0
  680. package/src/e2e/types.d.mts +161 -0
  681. package/src/eslint/adminConfig.mjs +19 -27
  682. package/src/eslint/globalComponentNames.mjs +3 -4
  683. package/src/eslint/oxlint.mjs +7 -20
  684. package/src/eslint/plugin.d.mts +2 -4
  685. package/src/eslint/plugin.mjs +18 -34
  686. package/src/eslint/validRouteName.mjs +6 -7
  687. package/src/vite/devWatch.mjs +30 -43
  688. package/src/vite/index.d.mts +5 -5
  689. package/src/vite/sentry.mjs +7 -12
  690. package/src/vite/sourcemaps.mjs +4 -8
@@ -4,10 +4,12 @@ type __VLS_Props = {
4
4
  dataCy?: string | undefined;
5
5
  titleClass?: string | undefined;
6
6
  };
7
- declare var __VLS_13: {};
8
- type __VLS_Slots = {} & {
9
- default?: (props: typeof __VLS_13) => any;
7
+ declare const __VLS_template: () => {
8
+ __VLS_Slots: {
9
+ default?: (props: {}) => any;
10
+ };
10
11
  };
12
+ type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
11
13
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
12
14
  value: string | number | null;
13
15
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ATimeTrackingFields.js","names":["_sfc_main","ATimeTrackingFields_vue_vue_type_script_setup_true_lang_default","ATimeTrackingFields_default"],"sources":["../../../../src/domains/ui/components/ATimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n// Deprecated: `AUserAndTimeTrackingFields` without `users` draws the dates (dropping a row that has\n// none, where this one keeps the title), and with an admin's user cache\n// (`createUserAndTimeTrackingFields`) also who. Kept for the admins that still use it.\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { AnzuUserAndTimeTrackingAware } from '@/shared/types/AnzuUserAndTimeTrackingAware'\nimport { dateTimePretty } from '@/shared/utils/datetime'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n }\n)\n\nconst createdAt = computed(() => {\n return dateTimePretty(props.data.createdAt)\n})\nconst modifiedAt = computed(() => {\n return dateTimePretty(props.data.modifiedAt)\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow :title=\"t('common.model.tracking.created')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideCreatedAt\"\n class=\"mr-2\"\n >\n {{ createdAt }}\n </div>\n </div>\n </ARow>\n <ARow :title=\"t('common.model.tracking.modified')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideModifiedAt\"\n class=\"mr-2\"\n >\n {{ modifiedAt }}\n </div>\n </div>\n </ARow>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ATimeTrackingFields.js","names":["_sfc_main","ATimeTrackingFields_vue_vue_type_script_setup_true_lang_default","ATimeTrackingFields_default"],"sources":["../../../../src/domains/ui/components/ATimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n// Deprecated: use `AUserAndTimeTrackingFields`. Without `users` it draws\n// the dates, but drops a row with none where this one keeps the title.\n// With an admin's user cache (`createUserAndTimeTrackingFields`) it also shows who. Kept for admins that still use it.\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { AnzuUserAndTimeTrackingAware } from '@/shared/types/AnzuUserAndTimeTrackingAware'\nimport { dateTimePretty } from '@/shared/utils/datetime'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n }\n)\n\nconst createdAt = computed(() => {\n return dateTimePretty(props.data.createdAt)\n})\nconst modifiedAt = computed(() => {\n return dateTimePretty(props.data.modifiedAt)\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow :title=\"t('common.model.tracking.created')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideCreatedAt\"\n class=\"mr-2\"\n >\n {{ createdAt }}\n </div>\n </div>\n </ARow>\n <ARow :title=\"t('common.model.tracking.modified')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideModifiedAt\"\n class=\"mr-2\"\n >\n {{ modifiedAt }}\n </div>\n </div>\n </ARow>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","ARow","_unref","_withCtx","_createElementVNode","_toDisplayString","_createCommentVNode","ARow_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","ATimeTrackingFields_vue_vue_type_script_setup_true_lang_default","props","__props","createdAt","computed","dateTimePretty","modifiedAt","useI18n","openBlock","createElementBlock","Fragment","createVNode","unref","t","withCtx","createElementVNode","createCommentVNode","toDisplayString"],"sources":["../../../../src/domains/ui/components/ATimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n// Deprecated: `AUserAndTimeTrackingFields` without `users` draws the dates (dropping a row that has\n// none, where this one keeps the title), and with an admin's user cache\n// (`createUserAndTimeTrackingFields`) also who. Kept for the admins that still use it.\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { AnzuUserAndTimeTrackingAware } from '@/shared/types/AnzuUserAndTimeTrackingAware'\nimport { dateTimePretty } from '@/shared/utils/datetime'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n }\n)\n\nconst createdAt = computed(() => {\n return dateTimePretty(props.data.createdAt)\n})\nconst modifiedAt = computed(() => {\n return dateTimePretty(props.data.modifiedAt)\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow :title=\"t('common.model.tracking.created')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideCreatedAt\"\n class=\"mr-2\"\n >\n {{ createdAt }}\n </div>\n </div>\n </ARow>\n <ARow :title=\"t('common.model.tracking.modified')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideModifiedAt\"\n class=\"mr-2\"\n >\n {{ modifiedAt }}\n </div>\n </div>\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAUA,IAAMgB,IAAQC,GAYRC,IAAYC,QACTC,EAAeJ,EAAM,KAAK,SAAS,CAC3C,GACKK,IAAaF,QACVC,EAAeJ,EAAM,KAAK,UAAU,CAC5C,GAEK,EAAE,SAAMM,EAAQ;E,mCAIpBnB,EASOC,GAAA,EATA,OAAOC,EAAAuB,CAAA,CAAC,CAAA,+BAAA,E;GACb,SAAAtB,QAOM,CAPNC,EAOM,OAPNI,GAOM,CALKM,EAAA,gB,aADTjB,EAAA,GAAAC,EAKM,OALNW,GAKMJ,EADDU,EAAA,KAAS,GAAA,CAAA,E;;E,kBAIlBf,EASOC,GAAA,EATA,OAAOC,EAAAuB,CAAA,CAAC,CAAA,gCAAA,E;GACb,SAAAtB,QAOM,CAPNC,EAOM,OAPNM,GAOM,CALKI,EAAA,iB,aADTjB,EAAA,GAAAC,EAKM,OALNa,GAKMN,EADDa,EAAA,KAAU,GAAA,CAAA,E"}
1
+ {"version":3,"file":"ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","ARow","_unref","_withCtx","_createElementVNode","_toDisplayString","_createCommentVNode","ARow_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","ATimeTrackingFields_vue_vue_type_script_setup_true_lang_default","props","__props","createdAt","computed","dateTimePretty","modifiedAt","useI18n","openBlock","createElementBlock","Fragment","createVNode","unref","t","withCtx","createElementVNode","createCommentVNode","toDisplayString"],"sources":["../../../../src/domains/ui/components/ATimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n// Deprecated: use `AUserAndTimeTrackingFields`. Without `users` it draws\n// the dates, but drops a row with none where this one keeps the title.\n// With an admin's user cache (`createUserAndTimeTrackingFields`) it also shows who. Kept for admins that still use it.\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { AnzuUserAndTimeTrackingAware } from '@/shared/types/AnzuUserAndTimeTrackingAware'\nimport { dateTimePretty } from '@/shared/utils/datetime'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\nconst props = withDefaults(\n defineProps<{\n data: AnzuUserAndTimeTrackingAware | any\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n }>(),\n {\n hideCreatedAt: false,\n hideModifiedAt: false,\n }\n)\n\nconst createdAt = computed(() => {\n return dateTimePretty(props.data.createdAt)\n})\nconst modifiedAt = computed(() => {\n return dateTimePretty(props.data.modifiedAt)\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow :title=\"t('common.model.tracking.created')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideCreatedAt\"\n class=\"mr-2\"\n >\n {{ createdAt }}\n </div>\n </div>\n </ARow>\n <ARow :title=\"t('common.model.tracking.modified')\">\n <div class=\"d-flex align-center\">\n <div\n v-if=\"!hideModifiedAt\"\n class=\"mr-2\"\n >\n {{ modifiedAt }}\n </div>\n </div>\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAUA,IAAMgB,IAAQC,GAYRC,IAAYC,QACTC,EAAeJ,EAAM,KAAK,SAAS,CAC3C,GACKK,IAAaF,QACVC,EAAeJ,EAAM,KAAK,UAAU,CAC5C,GAEK,EAAE,SAAMM,EAAQ;E,mCAIpBnB,EASOC,GAAA,EATA,OAAOC,EAAAuB,CAAA,CAAC,CAAA,+BAAA,E;GACb,SAAAtB,QAOM,CAPNC,EAOM,OAPNI,GAOM,CALKM,EAAA,gB,aADTjB,EAAA,GAAAC,EAKM,OALNW,GAKMJ,EADDU,EAAA,KAAS,GAAA,CAAA,E;;E,kBAIlBf,EASOC,GAAA,EATA,OAAOC,EAAAuB,CAAA,CAAC,CAAA,gCAAA,E;GACb,SAAAtB,QAOM,CAPNC,EAOM,OAPNM,GAOM,CALKI,EAAA,iB,aADTjB,EAAA,GAAAC,EAKM,OALNa,GAKMN,EADDa,EAAA,KAAU,GAAA,CAAA,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserAndTimeTrackingFields.js","names":["_sfc_main","AUserAndTimeTrackingFields_vue_vue_type_script_setup_true_lang_default","AUserAndTimeTrackingFields_default"],"sources":["../../../../src/domains/ui/components/AUserAndTimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, useSlots, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport ADatetime from '@/domains/ui/datetime/components/ADatetime.vue'\nimport ACachedUserChip from '@/domains/cached/components/ACachedUserChip.vue'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isNull, isUndefined } from '@/shared/utils/common'\n\n/**\n * Created and modified -- when and by whom -- for a detail or an edit form.\n *\n * An admin does not use it directly but through its own component made by\n * `createUserAndTimeTrackingFields`, which supplies its user cache and the route to a user's detail.\n * Without `users` it draws the dates only, as it always has.\n */\nconst props = withDefaults(\n defineProps<{\n data: UserAndTimeTrackingData\n users?: UserAndTimeTrackingUsers | undefined\n userRouteName?: string | undefined\n userExternalUrlTemplate?: string | undefined\n // `any`: an admin's label reads its own user (a nickname), which `AnzuUserMinimal` does not have.\n userTitleFn?: ((user: CachedItem<any>) => string) | undefined\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n hideCreatedBy?: boolean\n hideModifiedBy?: boolean\n }>(),\n {\n users: undefined,\n userRouteName: undefined,\n userExternalUrlTemplate: undefined,\n userTitleFn: undefined,\n hideCreatedAt: false,\n hideModifiedAt: false,\n hideCreatedBy: false,\n hideModifiedBy: false,\n }\n)\n\ndefineSlots<{\n /** The user part of a row, for an admin that draws its own chip. */\n user?: (props: { id: IntegerId | null; field: 'createdBy' | 'modifiedBy' }) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\n\nconst hasDate = (value: string | null | undefined) => !isUndefined(value) && !isNull(value) && value !== ''\n\n// `undefined` is a field the backend does not send (no user tracking), so it is left out; `null` is\n// a field it sends empty, and the chip shows it as such.\nconst userShown = (hidden: boolean, id: IntegerId | null | undefined) =>\n !hidden && !isUndefined(id) && (!!props.users || !!slots.user)\n\nconst createdAtShown = computed(() => !props.hideCreatedAt && hasDate(props.data.createdAt))\nconst modifiedAtShown = computed(() => !props.hideModifiedAt && hasDate(props.data.modifiedAt))\nconst createdByShown = computed(() => userShown(props.hideCreatedBy, props.data.createdBy))\nconst modifiedByShown = computed(() => userShown(props.hideModifiedBy, props.data.modifiedBy))\n\n// The rows ask for their users themselves: the detail and edit actions that load a record do not put\n// its users into the cache, and a save changes `modifiedBy`. Read off `props.data` on every run,\n// because a store replaces the record whole after a fetch or a save. `defineCached` debounces, so the\n// rows of one page share a request with every other chip on it.\nwatch(\n [\n () => props.data.createdBy,\n () => props.data.modifiedBy,\n () => props.hideCreatedBy,\n () => props.hideModifiedBy,\n () => props.users,\n ],\n ([createdBy, modifiedBy, hideCreatedBy, hideModifiedBy, users]) => {\n if (!users) return\n const ids = [hideCreatedBy ? null : createdBy, hideModifiedBy ? null : modifiedBy].filter(\n (id): id is IntegerId => !!id\n )\n if (ids.length === 0) return\n users.addToCachedUsers(ids)\n users.fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <ARow\n v-if=\"createdAtShown || createdByShown\"\n :title=\"t('common.model.tracking.created')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"createdAtShown\"\n :date-time=\"data.createdAt ?? null\"\n />\n <slot\n v-if=\"createdByShown\"\n :id=\"data.createdBy || null\"\n name=\"user\"\n field=\"createdBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.createdBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n <ARow\n v-if=\"modifiedAtShown || modifiedByShown\"\n :title=\"t('common.model.tracking.modified')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"modifiedAtShown\"\n :date-time=\"data.modifiedAt ?? null\"\n />\n <slot\n v-if=\"modifiedByShown\"\n :id=\"data.modifiedBy || null\"\n name=\"user\"\n field=\"modifiedBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.modifiedBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserAndTimeTrackingFields.js","names":["_sfc_main","AUserAndTimeTrackingFields_vue_vue_type_script_setup_true_lang_default","AUserAndTimeTrackingFields_default"],"sources":["../../../../src/domains/ui/components/AUserAndTimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, useSlots, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport ADatetime from '@/domains/ui/datetime/components/ADatetime.vue'\nimport ACachedUserChip from '@/domains/cached/components/ACachedUserChip.vue'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isNull, isUndefined } from '@/shared/utils/common'\n\n/**\n * Created and modified, when and by whom, for a detail or edit form.\n * Admins use it through their own component from `createUserAndTimeTrackingFields`, which\n * supplies the user cache and user detail route. Without `users` it draws only the dates.\n */\nconst props = withDefaults(\n defineProps<{\n data: UserAndTimeTrackingData\n users?: UserAndTimeTrackingUsers | undefined\n userRouteName?: string | undefined\n userExternalUrlTemplate?: string | undefined\n // `any`: an admin's label reads its own user (a nickname), which `AnzuUserMinimal` does not have.\n userTitleFn?: ((user: CachedItem<any>) => string) | undefined\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n hideCreatedBy?: boolean\n hideModifiedBy?: boolean\n }>(),\n {\n users: undefined,\n userRouteName: undefined,\n userExternalUrlTemplate: undefined,\n userTitleFn: undefined,\n hideCreatedAt: false,\n hideModifiedAt: false,\n hideCreatedBy: false,\n hideModifiedBy: false,\n }\n)\n\ndefineSlots<{\n /** The user part of a row, for an admin that draws its own chip. */\n user?: (props: { id: IntegerId | null; field: 'createdBy' | 'modifiedBy' }) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\n\nconst hasDate = (value: string | null | undefined) => !isUndefined(value) && !isNull(value) && value !== ''\n\n// `undefined` is a field the backend does not send (no user tracking),\n// so it is hidden. `null` is sent empty, and the chip shows it as empty.\nconst userShown = (hidden: boolean, id: IntegerId | null | undefined) =>\n !hidden && !isUndefined(id) && (!!props.users || !!slots.user)\n\nconst createdAtShown = computed(() => !props.hideCreatedAt && hasDate(props.data.createdAt))\nconst modifiedAtShown = computed(() => !props.hideModifiedAt && hasDate(props.data.modifiedAt))\nconst createdByShown = computed(() => userShown(props.hideCreatedBy, props.data.createdBy))\nconst modifiedByShown = computed(() => userShown(props.hideModifiedBy, props.data.modifiedBy))\n\n// The rows fetch their users themselves. Record loads do not fill the cache, and a save changes `modifiedBy`.\n// Reads `props.data` on every run because a store replaces the whole record after\n// a fetch or save. `defineCached` debounces, so chips on a page share one request.\nwatch(\n [\n () => props.data.createdBy,\n () => props.data.modifiedBy,\n () => props.hideCreatedBy,\n () => props.hideModifiedBy,\n () => props.users,\n ],\n ([createdBy, modifiedBy, hideCreatedBy, hideModifiedBy, users]) => {\n if (!users) return\n const ids = [hideCreatedBy ? null : createdBy, hideModifiedBy ? null : modifiedBy].filter(\n (id): id is IntegerId => !!id\n )\n if (ids.length === 0) return\n users.addToCachedUsers(ids)\n users.fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <ARow\n v-if=\"createdAtShown || createdByShown\"\n :title=\"t('common.model.tracking.created')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"createdAtShown\"\n :date-time=\"data.createdAt ?? null\"\n />\n <slot\n v-if=\"createdByShown\"\n :id=\"data.createdBy || null\"\n name=\"user\"\n field=\"createdBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.createdBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n <ARow\n v-if=\"modifiedAtShown || modifiedByShown\"\n :title=\"t('common.model.tracking.modified')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"modifiedAtShown\"\n :date-time=\"data.modifiedAt ?? null\"\n />\n <slot\n v-if=\"modifiedByShown\"\n :id=\"data.modifiedBy || null\"\n name=\"user\"\n field=\"modifiedBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.modifiedBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n</template>\n"],"mappings":""}
@@ -2,11 +2,9 @@ import { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '../../../shar
2
2
  import { CachedItem } from '../../cached/composables/defineCached';
3
3
  import { IntegerId } from '../../../shared/types/common';
4
4
  /**
5
- * Created and modified -- when and by whom -- for a detail or an edit form.
6
- *
7
- * An admin does not use it directly but through its own component made by
8
- * `createUserAndTimeTrackingFields`, which supplies its user cache and the route to a user's detail.
9
- * Without `users` it draws the dates only, as it always has.
5
+ * Created and modified, when and by whom, for a detail or edit form.
6
+ * Admins use it through their own component from `createUserAndTimeTrackingFields`, which
7
+ * supplies the user cache and user detail route. Without `users` it draws only the dates.
10
8
  */
11
9
  type __VLS_Props = {
12
10
  data: UserAndTimeTrackingData;
@@ -1 +1 @@
1
- {"version":3,"file":"AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","ARow","_unref","_withCtx","_createElementVNode","ADatetime","_createCommentVNode","_renderSlot","ACachedUserChip","ARow_default","ADatetime_default","ACachedUserChip_default","_hoisted_1","_hoisted_2","AUserAndTimeTrackingFields_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","slots","useSlots","hasDate","isUndefined","value","isNull","userShown","hidden","id","createdAtShown","computed","modifiedAtShown","createdByShown","modifiedByShown","watch","createdBy","modifiedBy","hideCreatedBy","hideModifiedBy","users","ids","openBlock","createElementBlock","Fragment","createBlock","unref","t","withCtx","createElementVNode","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/ui/components/AUserAndTimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, useSlots, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport ADatetime from '@/domains/ui/datetime/components/ADatetime.vue'\nimport ACachedUserChip from '@/domains/cached/components/ACachedUserChip.vue'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isNull, isUndefined } from '@/shared/utils/common'\n\n/**\n * Created and modified -- when and by whom -- for a detail or an edit form.\n *\n * An admin does not use it directly but through its own component made by\n * `createUserAndTimeTrackingFields`, which supplies its user cache and the route to a user's detail.\n * Without `users` it draws the dates only, as it always has.\n */\nconst props = withDefaults(\n defineProps<{\n data: UserAndTimeTrackingData\n users?: UserAndTimeTrackingUsers | undefined\n userRouteName?: string | undefined\n userExternalUrlTemplate?: string | undefined\n // `any`: an admin's label reads its own user (a nickname), which `AnzuUserMinimal` does not have.\n userTitleFn?: ((user: CachedItem<any>) => string) | undefined\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n hideCreatedBy?: boolean\n hideModifiedBy?: boolean\n }>(),\n {\n users: undefined,\n userRouteName: undefined,\n userExternalUrlTemplate: undefined,\n userTitleFn: undefined,\n hideCreatedAt: false,\n hideModifiedAt: false,\n hideCreatedBy: false,\n hideModifiedBy: false,\n }\n)\n\ndefineSlots<{\n /** The user part of a row, for an admin that draws its own chip. */\n user?: (props: { id: IntegerId | null; field: 'createdBy' | 'modifiedBy' }) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\n\nconst hasDate = (value: string | null | undefined) => !isUndefined(value) && !isNull(value) && value !== ''\n\n// `undefined` is a field the backend does not send (no user tracking), so it is left out; `null` is\n// a field it sends empty, and the chip shows it as such.\nconst userShown = (hidden: boolean, id: IntegerId | null | undefined) =>\n !hidden && !isUndefined(id) && (!!props.users || !!slots.user)\n\nconst createdAtShown = computed(() => !props.hideCreatedAt && hasDate(props.data.createdAt))\nconst modifiedAtShown = computed(() => !props.hideModifiedAt && hasDate(props.data.modifiedAt))\nconst createdByShown = computed(() => userShown(props.hideCreatedBy, props.data.createdBy))\nconst modifiedByShown = computed(() => userShown(props.hideModifiedBy, props.data.modifiedBy))\n\n// The rows ask for their users themselves: the detail and edit actions that load a record do not put\n// its users into the cache, and a save changes `modifiedBy`. Read off `props.data` on every run,\n// because a store replaces the record whole after a fetch or a save. `defineCached` debounces, so the\n// rows of one page share a request with every other chip on it.\nwatch(\n [\n () => props.data.createdBy,\n () => props.data.modifiedBy,\n () => props.hideCreatedBy,\n () => props.hideModifiedBy,\n () => props.users,\n ],\n ([createdBy, modifiedBy, hideCreatedBy, hideModifiedBy, users]) => {\n if (!users) return\n const ids = [hideCreatedBy ? null : createdBy, hideModifiedBy ? null : modifiedBy].filter(\n (id): id is IntegerId => !!id\n )\n if (ids.length === 0) return\n users.addToCachedUsers(ids)\n users.fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <ARow\n v-if=\"createdAtShown || createdByShown\"\n :title=\"t('common.model.tracking.created')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"createdAtShown\"\n :date-time=\"data.createdAt ?? null\"\n />\n <slot\n v-if=\"createdByShown\"\n :id=\"data.createdBy || null\"\n name=\"user\"\n field=\"createdBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.createdBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n <ARow\n v-if=\"modifiedAtShown || modifiedByShown\"\n :title=\"t('common.model.tracking.modified')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"modifiedAtShown\"\n :date-time=\"data.modifiedAt ?? null\"\n />\n <slot\n v-if=\"modifiedByShown\"\n :id=\"data.modifiedBy || null\"\n name=\"user\"\n field=\"modifiedBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.modifiedBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,IAAMkB,IAAQC,GA8BR,EAAE,SAAMC,EAAQ,GAChBC,IAAQC,EAAS,GAEjBC,KAAW,MAAqC,CAACC,EAAYC,CAAK,KAAK,CAACC,EAAOD,CAAK,KAAKA,MAAU,IAInGE,KAAa,GAAiB,MAClC,CAACC,KAAU,CAACJ,EAAYK,CAAE,MAAM,CAAC,CAACX,EAAM,SAAS,CAAC,CAACG,EAAM,OAErDS,IAAiBC,QAAe,CAACb,EAAM,iBAAiBK,EAAQL,EAAM,KAAK,SAAS,CAAC,GACrFc,IAAkBD,QAAe,CAACb,EAAM,kBAAkBK,EAAQL,EAAM,KAAK,UAAU,CAAC,GACxFe,IAAiBF,QAAeJ,EAAUT,EAAM,eAAeA,EAAM,KAAK,SAAS,CAAC,GACpFgB,IAAkBH,QAAeJ,EAAUT,EAAM,gBAAgBA,EAAM,KAAK,UAAU,CAAC;E,OAM7FiB,EACE;SACQjB,EAAM,KAAK;SACXA,EAAM,KAAK;SACXA,EAAM;SACNA,EAAM;SACNA,EAAM;EACd,IACC,CAACkB,GAAWC,GAAYC,GAAeC,GAAgBC,OAAW;GACjE,IAAI,CAACA,GAAO;GACZ,IAAMC,IAAM,CAACH,IAAgB,OAAOF,GAAWG,IAAiB,OAAOF,CAAU,CAAC,CAAC,QAChF,MAAwB,CAAC,CAACR,CAC7B;GACA,AAAIY,EAAI,WAAW,MACnBD,EAAM,iBAAiBC,CAAG,GAC1BD,EAAM,iBAAiB;EACzB,GACA,EAAE,WAAW,GAAK,CACpB,I,2BAKUV,EAAA,SAAkBG,EAAA,SAD1BjC,EAAA,GAAAG,EAyBOC,GAAA;;GAvBJ,OAAOC,EAAA0C,CAAA,CAAC,CAAA,+BAAA;;GAET,SAAAzC,QAoBM,CApBNC,EAoBM,OApBNQ,GAoBM,CAlBIe,EAAA,SADR9B,EAAA,GAAAG,EAGEK,GAAA;;IADC,aAAWW,EAAA,KAAK,aAAS;G,yCAGpBc,EAAA,QADRvB,EAcO0C,EAAA,QAAA,QAAA;IAZJ,IAAIjC,EAAA,KAAK,aAAS;IAEnB,OAAM;GAJR,SAcO,CAPGA,EAAA,SADRnB,EAAA,GAAAG,EAOEQ,GAAA;;IALC,IAAIQ,EAAA,KAAK;IACT,iBAAeA,EAAA,MAAM;IACrB,cAAYA,EAAA;IACZ,yBAAuBA,EAAA;IACvB,YAAUA,EAAA;;;;;;;;;E,+BAMXa,EAAA,SAAmBE,EAAA,SAD3BlC,EAAA,GAAAG,EAyBOC,GAAA;;GAvBJ,OAAOC,EAAA0C,CAAA,CAAC,CAAA,gCAAA;;GAET,SAAAzC,QAoBM,CApBNC,EAoBM,OApBNS,GAoBM,CAlBIgB,EAAA,SADRhC,EAAA,GAAAG,EAGEK,GAAA;;IADC,aAAWW,EAAA,KAAK,cAAU;G,yCAGrBe,EAAA,QADRxB,EAcO0C,EAAA,QAAA,QAAA;IAZJ,IAAIjC,EAAA,KAAK,cAAU;IAEpB,OAAM;GAJR,SAcO,CAPGA,EAAA,SADRnB,EAAA,GAAAG,EAOEQ,GAAA;;IALC,IAAIQ,EAAA,KAAK;IACT,iBAAeA,EAAA,MAAM;IACrB,cAAYA,EAAA;IACZ,yBAAuBA,EAAA;IACvB,YAAUA,EAAA"}
1
+ {"version":3,"file":"AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","ARow","_unref","_withCtx","_createElementVNode","ADatetime","_createCommentVNode","_renderSlot","ACachedUserChip","ARow_default","ADatetime_default","ACachedUserChip_default","_hoisted_1","_hoisted_2","AUserAndTimeTrackingFields_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","slots","useSlots","hasDate","isUndefined","value","isNull","userShown","hidden","id","createdAtShown","computed","modifiedAtShown","createdByShown","modifiedByShown","watch","createdBy","modifiedBy","hideCreatedBy","hideModifiedBy","users","ids","openBlock","createElementBlock","Fragment","createBlock","unref","t","withCtx","createElementVNode","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/ui/components/AUserAndTimeTrackingFields.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, useSlots, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport ADatetime from '@/domains/ui/datetime/components/ADatetime.vue'\nimport ACachedUserChip from '@/domains/cached/components/ACachedUserChip.vue'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isNull, isUndefined } from '@/shared/utils/common'\n\n/**\n * Created and modified, when and by whom, for a detail or edit form.\n * Admins use it through their own component from `createUserAndTimeTrackingFields`, which\n * supplies the user cache and user detail route. Without `users` it draws only the dates.\n */\nconst props = withDefaults(\n defineProps<{\n data: UserAndTimeTrackingData\n users?: UserAndTimeTrackingUsers | undefined\n userRouteName?: string | undefined\n userExternalUrlTemplate?: string | undefined\n // `any`: an admin's label reads its own user (a nickname), which `AnzuUserMinimal` does not have.\n userTitleFn?: ((user: CachedItem<any>) => string) | undefined\n hideCreatedAt?: boolean\n hideModifiedAt?: boolean\n hideCreatedBy?: boolean\n hideModifiedBy?: boolean\n }>(),\n {\n users: undefined,\n userRouteName: undefined,\n userExternalUrlTemplate: undefined,\n userTitleFn: undefined,\n hideCreatedAt: false,\n hideModifiedAt: false,\n hideCreatedBy: false,\n hideModifiedBy: false,\n }\n)\n\ndefineSlots<{\n /** The user part of a row, for an admin that draws its own chip. */\n user?: (props: { id: IntegerId | null; field: 'createdBy' | 'modifiedBy' }) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\n\nconst hasDate = (value: string | null | undefined) => !isUndefined(value) && !isNull(value) && value !== ''\n\n// `undefined` is a field the backend does not send (no user tracking),\n// so it is hidden. `null` is sent empty, and the chip shows it as empty.\nconst userShown = (hidden: boolean, id: IntegerId | null | undefined) =>\n !hidden && !isUndefined(id) && (!!props.users || !!slots.user)\n\nconst createdAtShown = computed(() => !props.hideCreatedAt && hasDate(props.data.createdAt))\nconst modifiedAtShown = computed(() => !props.hideModifiedAt && hasDate(props.data.modifiedAt))\nconst createdByShown = computed(() => userShown(props.hideCreatedBy, props.data.createdBy))\nconst modifiedByShown = computed(() => userShown(props.hideModifiedBy, props.data.modifiedBy))\n\n// The rows fetch their users themselves. Record loads do not fill the cache, and a save changes `modifiedBy`.\n// Reads `props.data` on every run because a store replaces the whole record after\n// a fetch or save. `defineCached` debounces, so chips on a page share one request.\nwatch(\n [\n () => props.data.createdBy,\n () => props.data.modifiedBy,\n () => props.hideCreatedBy,\n () => props.hideModifiedBy,\n () => props.users,\n ],\n ([createdBy, modifiedBy, hideCreatedBy, hideModifiedBy, users]) => {\n if (!users) return\n const ids = [hideCreatedBy ? null : createdBy, hideModifiedBy ? null : modifiedBy].filter(\n (id): id is IntegerId => !!id\n )\n if (ids.length === 0) return\n users.addToCachedUsers(ids)\n users.fetchCachedUsers()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <ARow\n v-if=\"createdAtShown || createdByShown\"\n :title=\"t('common.model.tracking.created')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"createdAtShown\"\n :date-time=\"data.createdAt ?? null\"\n />\n <slot\n v-if=\"createdByShown\"\n :id=\"data.createdBy || null\"\n name=\"user\"\n field=\"createdBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.createdBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n <ARow\n v-if=\"modifiedAtShown || modifiedByShown\"\n :title=\"t('common.model.tracking.modified')\"\n >\n <div class=\"d-flex flex-wrap align-center gc-2 gr-1\">\n <ADatetime\n v-if=\"modifiedAtShown\"\n :date-time=\"data.modifiedAt ?? null\"\n />\n <slot\n v-if=\"modifiedByShown\"\n :id=\"data.modifiedBy || null\"\n name=\"user\"\n field=\"modifiedBy\"\n >\n <ACachedUserChip\n v-if=\"users\"\n :id=\"data.modifiedBy\"\n :get-cached-fn=\"users.getCachedUser\"\n :route-name=\"userRouteName\"\n :external-url-template=\"userExternalUrlTemplate\"\n :title-fn=\"userTitleFn\"\n />\n </slot>\n </div>\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBA,IAAMkB,IAAQC,GA8BR,EAAE,SAAMC,EAAQ,GAChBC,IAAQC,EAAS,GAEjBC,KAAW,MAAqC,CAACC,EAAYC,CAAK,KAAK,CAACC,EAAOD,CAAK,KAAKA,MAAU,IAInGE,KAAa,GAAiB,MAClC,CAACC,KAAU,CAACJ,EAAYK,CAAE,MAAM,CAAC,CAACX,EAAM,SAAS,CAAC,CAACG,EAAM,OAErDS,IAAiBC,QAAe,CAACb,EAAM,iBAAiBK,EAAQL,EAAM,KAAK,SAAS,CAAC,GACrFc,IAAkBD,QAAe,CAACb,EAAM,kBAAkBK,EAAQL,EAAM,KAAK,UAAU,CAAC,GACxFe,IAAiBF,QAAeJ,EAAUT,EAAM,eAAeA,EAAM,KAAK,SAAS,CAAC,GACpFgB,IAAkBH,QAAeJ,EAAUT,EAAM,gBAAgBA,EAAM,KAAK,UAAU,CAAC;E,OAK7FiB,EACE;SACQjB,EAAM,KAAK;SACXA,EAAM,KAAK;SACXA,EAAM;SACNA,EAAM;SACNA,EAAM;EACd,IACC,CAACkB,GAAWC,GAAYC,GAAeC,GAAgBC,OAAW;GACjE,IAAI,CAACA,GAAO;GACZ,IAAMC,IAAM,CAACH,IAAgB,OAAOF,GAAWG,IAAiB,OAAOF,CAAU,CAAC,CAAC,QAChF,MAAwB,CAAC,CAACR,CAC7B;GACA,AAAIY,EAAI,WAAW,MACnBD,EAAM,iBAAiBC,CAAG,GAC1BD,EAAM,iBAAiB;EACzB,GACA,EAAE,WAAW,GAAK,CACpB,I,2BAKUV,EAAA,SAAkBG,EAAA,SAD1BjC,EAAA,GAAAG,EAyBOC,GAAA;;GAvBJ,OAAOC,EAAA0C,CAAA,CAAC,CAAA,+BAAA;;GAET,SAAAzC,QAoBM,CApBNC,EAoBM,OApBNQ,GAoBM,CAlBIe,EAAA,SADR9B,EAAA,GAAAG,EAGEK,GAAA;;IADC,aAAWW,EAAA,KAAK,aAAS;G,yCAGpBc,EAAA,QADRvB,EAcO0C,EAAA,QAAA,QAAA;IAZJ,IAAIjC,EAAA,KAAK,aAAS;IAEnB,OAAM;GAJR,SAcO,CAPGA,EAAA,SADRnB,EAAA,GAAAG,EAOEQ,GAAA;;IALC,IAAIQ,EAAA,KAAK;IACT,iBAAeA,EAAA,MAAM;IACrB,cAAYA,EAAA;IACZ,yBAAuBA,EAAA;IACvB,YAAUA,EAAA;;;;;;;;;E,+BAMXa,EAAA,SAAmBE,EAAA,SAD3BlC,EAAA,GAAAG,EAyBOC,GAAA;;GAvBJ,OAAOC,EAAA0C,CAAA,CAAC,CAAA,gCAAA;;GAET,SAAAzC,QAoBM,CApBNC,EAoBM,OApBNS,GAoBM,CAlBIgB,EAAA,SADRhC,EAAA,GAAAG,EAGEK,GAAA;;IADC,aAAWW,EAAA,KAAK,cAAU;G,yCAGrBe,EAAA,QADRxB,EAcO0C,EAAA,QAAA,QAAA;IAZJ,IAAIjC,EAAA,KAAK,cAAU;IAEpB,OAAM;GAJR,SAcO,CAPGA,EAAA,SADRnB,EAAA,GAAAG,EAOEQ,GAAA;;IALC,IAAIQ,EAAA,KAAK;IACT,iBAAeA,EAAA,MAAM;IACrB,cAAYA,EAAA;IACZ,yBAAuBA,EAAA;IACvB,YAAUA,EAAA"}
@@ -2,7 +2,7 @@ import e from "../../../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./ADatetimePicker.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  // src/domains/ui/datetime/components/ADatetimePicker.vue
5
- var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-9c0882ba"]]);
5
+ var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-ec08a2a8"]]);
6
6
  export { n as default };
7
7
 
8
8
  //# sourceMappingURL=ADatetimePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ADatetimePicker.js","names":["_sfc_main","_plugin_vue_export_helper_default","ADatetimePicker_vue_vue_type_script_setup_true_lang_default","ADatetimePicker_default"],"sources":["../../../../../src/domains/ui/datetime/components/ADatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DatetimeUTC } from '@/shared/types/common'\nimport { computed, nextTick, ref, toRaw, useTemplateRef, watch } from 'vue'\nimport { isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport useVuelidate, { type ErrorObject } from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport TimePicker from '@/domains/ui/datetime/components/TimePicker.vue'\nimport type { Dayjs } from 'dayjs'\nimport {\n applyCalendarDate,\n type DatetimePickerType,\n emptyBaseValue,\n formatDisplay,\n isSameValue,\n parseModel,\n parseTyped,\n placeholderFor,\n serialize,\n toCalendarDate,\n todayValue,\n} from '@/shared/utils/datetimePickerValue'\nimport { useI18n } from 'vue-i18n'\nimport type { VTextField } from 'vuetify/components/VTextField'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTC | null | undefined\n type?: DatetimePickerType\n label?: string\n hideLabel?: boolean\n clearable?: boolean\n disabled?: boolean\n hideDetails?: boolean\n required?: boolean\n hideSetToNow?: boolean\n placeholder?: string\n dataCy?: string\n defaultValue?: DatetimeUTC | null | undefined\n errorMessages?: string[]\n lastMinuteMoment?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: '',\n hideLabel: false,\n clearable: false,\n disabled: false,\n hideDetails: false,\n required: false,\n hideSetToNow: false,\n placeholder: '',\n dataCy: '',\n defaultValue: null,\n errorMessages: undefined,\n lastMinuteMoment: false,\n // Not set, the text field follows a readonly `VForm` around it; the calendar and clearing follow only this prop.\n readonly: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'blur'): void\n (e: 'focus'): void\n (e: 'update:modelValue', data: DatetimeUTC | null | undefined): void\n (e: 'open'): void\n (e: 'close'): void\n (e: 'afterClear'): void\n}>()\n\nconst pickerOpened = ref(false)\nconst pickerKey = ref(0)\nconst timeKey = ref(0)\nconst timePickerInstance = useTemplateRef<InstanceType<typeof TimePicker>>('timePickerInstance')\nconst inputInstance = useTemplateRef<InstanceType<typeof VTextField>>('inputInstance')\nconst confirmRefButton = useTemplateRef<HTMLButtonElement>('confirmRefButton')\nconst textFieldValue = ref('')\n\nconst datePickerValue = ref<null | Date>(null)\nconst timePickerValue = ref<null | { hours: number; minutes: number }>(null)\nconst datetimeInternal = ref<null | Dayjs>(null)\n\nconst { t } = useI18n()\n\nconst placeholderComputed = computed(() => {\n return props.placeholder.length ? props.placeholder : placeholderFor(props.type)\n})\n\nconst { requiredIf } = useValidate()\nconst rules = computed(() => {\n return {\n textFieldValue: {\n required: requiredIf(props.required),\n },\n }\n})\nconst v$ = useVuelidate(rules, { textFieldValue })\n\nconst tryEmitNewValue = (newValue: DatetimeUTC | null | undefined) => {\n if (newValue === props.modelValue) return\n emit('update:modelValue', newValue)\n}\n\nconst updateDateAndTimePickerOnlyWhenChanged = (newValue: Dayjs | null) => {\n if (isNull(newValue)) return\n if (\n props.type !== 'date' &&\n (isNull(timePickerValue.value) ||\n newValue.hour() !== timePickerValue.value.hours ||\n newValue.minute() !== timePickerValue.value.minutes)\n ) {\n timePickerValue.value = { hours: newValue.hour(), minutes: newValue.minute() }\n }\n if (\n isNull(datePickerValue.value) ||\n newValue.year() !== datePickerValue.value.getFullYear() ||\n newValue.month() !== datePickerValue.value.getMonth() ||\n newValue.date() !== datePickerValue.value.getDate()\n ) {\n datePickerValue.value = toCalendarDate(newValue, props.type)\n }\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n datetimeInternal.value = parseModel(newValue, props.type, props.lastMinuteMoment)\n },\n { immediate: true }\n)\n\nconst watchDatePicker = (newValue: null | Date, internal: Dayjs) => {\n if (isNull(newValue)) return internal\n return applyCalendarDate(internal, newValue, props.type)\n}\n\nconst watchTimePicker = (newValue: null | { hours: number; minutes: number }, internal: Dayjs) => {\n if (isNull(newValue) || props.type === 'date') return internal\n return internal.set('hour', newValue.hours).set('minute', newValue.minutes)\n}\n\nwatch([timePickerValue, datePickerValue], ([newTimePickerValue, newDatePickerValue]) => {\n let newDate: Dayjs | null = null\n\n if (!isNull(datetimeInternal.value)) {\n newDate = datetimeInternal.value\n } else {\n newDate =\n parseModel(props.modelValue, props.type, props.lastMinuteMoment) ??\n emptyBaseValue(props.type, props.lastMinuteMoment)\n }\n\n newDate = watchTimePicker(newTimePickerValue, newDate!)\n newDate = watchDatePicker(newDatePickerValue, newDate!)\n if (newDate.isSame(toRaw(datetimeInternal.value))) return\n datetimeInternal.value = newDate\n})\n\nwatch(\n datetimeInternal,\n (newValue) => {\n if (isNull(newValue)) {\n textFieldValue.value = ''\n tryEmitNewValue(null)\n return\n }\n const newUtcValue = serialize(newValue, props.type)\n textFieldValue.value = formatDisplay(newValue, props.type)\n updateDateAndTimePickerOnlyWhenChanged(newValue)\n tryEmitNewValue(newUtcValue)\n },\n { immediate: true }\n)\n\nwatch(pickerOpened, (newValue) => {\n if (newValue) {\n onTextFieldBlur()\n if (isNull(datetimeInternal.value) && (isNull(props.defaultValue) || isUndefined(props.defaultValue))) {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n }\n emit('open')\n return\n }\n emit('close')\n})\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessages)) return props.errorMessages\n if (v$.value.textFieldValue.$errors.length)\n return [v$.value.textFieldValue.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst onTextFieldBlur = () => {\n const filtered = textFieldValue.value.replace(/[^\\s\\d.:]/g, '').trim()\n if (filtered.length === 0 && !props.required) {\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('blur')\n return\n }\n // keep seconds from original model\n const seconds = parseModel(props.modelValue, props.type, props.lastMinuteMoment)?.second() ?? 0\n const reparsed = parseTyped(filtered, props.type, seconds)\n if (!isNull(reparsed)) {\n // A day click blurs this field before the picker emits, so re-assigning an unchanged datetime\n // would push the stale date back into it.\n if (isSameValue(reparsed, toRaw(datetimeInternal.value), props.type)) {\n textFieldValue.value = formatDisplay(reparsed, props.type)\n } else {\n datetimeInternal.value = reparsed\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n return\n }\n if (!isNull(datetimeInternal.value)) {\n textFieldValue.value = formatDisplay(datetimeInternal.value, props.type)\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n}\n\nconst onClear = () => {\n if (isNull(props.defaultValue) || isUndefined(props.defaultValue)) {\n datetimeInternal.value = null\n datePickerValue.value = null\n timePickerValue.value = null\n emit('afterClear')\n return\n }\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('afterClear')\n}\n\nconst close = () => {\n pickerOpened.value = false\n inputInstance.value?.focus()\n inputInstance.value?.blur()\n emit('close')\n emit('blur')\n}\n\nconst onTextFieldFocus = () => {\n emit('focus')\n}\n\n// The calendar icon is a button: Enter and Space open and close the calendar as a click does. Its menu takes only the\n// arrows from the keyboard. The keyup of that Enter stays on the icon: the Enter of the field would report it left a\n// second time.\nconst togglePicker = () => {\n pickerOpened.value = !pickerOpened.value\n}\n\nconst onTimePickerEnterKeyup = () => {\n pickerOpened.value = false\n}\n\nconst onFocusConfirm = () => {\n confirmRefButton.value?.focus()\n}\n\nconst onDatePickerUpdate = () => {\n if (props.type === 'date') {\n // The value travels through pre-flush watchers, so closing now would emit blur and release the\n // collab lock with the previous value still in the model.\n nextTick(close)\n return\n }\n timePickerInstance.value?.focusHour()\n}\n\nconst now = () => {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n nextTick(() => {\n // Vuetify navigates the calendar to a new value on its own, but skips an unchanged day, so a\n // value that is already today would leave the user on whatever month they paged to.\n pickerKey.value++\n timeKey.value++\n })\n}\n</script>\n\n<template>\n <VTextField\n ref=\"inputInstance\"\n v-model=\"textFieldValue\"\n :error-messages=\"errorMessageComputed\"\n :persistent-placeholder=\"true\"\n :placeholder=\"placeholderComputed\"\n class=\"a-datetime-picker\"\n :hide-details=\"hideDetails ? true : 'auto'\"\n :data-cy=\"dataCy.length ? dataCy : undefined\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n autocomplete=\"off\"\n @blur=\"onTextFieldBlur\"\n @focus=\"onTextFieldFocus\"\n @keyup.enter=\"onTextFieldBlur\"\n >\n <template #append-inner>\n <VIcon\n v-if=\"clearable && !readonly && defaultValue !== modelValue\"\n class=\"a-datetime-picker__clearable-icon\"\n icon=\"mdi-close-circle\"\n :aria-label=\"t('common.button.clear')\"\n @click.stop=\"onClear\"\n />\n <VMenu\n v-if=\"!disabled && !readonly\"\n location=\"bottom end\"\n origin=\"top end\"\n :close-on-content-click=\"false\"\n :model-value=\"pickerOpened\"\n @update:model-value=\"(value: boolean) => (pickerOpened = value)\"\n >\n <template #activator=\"{ props: menuProps }\">\n <VIcon\n class=\"a-datetime-picker__calendar-icon\"\n icon=\"mdi-calendar\"\n size=\"small\"\n :aria-label=\"t('$vuetify.datePicker.title')\"\n v-bind=\"menuProps\"\n @keydown.enter.space.prevent=\"togglePicker\"\n @keyup.enter.stop\n />\n </template>\n\n <VCard v-if=\"pickerOpened\">\n <VBtn\n v-tooltip=\"t('common.button.close')\"\n :aria-label=\"t('common.button.close')\"\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"position-absolute top-0 right-0\"\n @click.stop=\"close\"\n >\n <VIcon\n icon=\"mdi-close\"\n color=\"white\"\n />\n </VBtn>\n <VDatePicker\n :key=\"pickerKey\"\n v-model=\"datePickerValue\"\n class=\"a-datetime-picker-calendar\"\n color=\"primary\"\n show-adjacent-months\n v-bind=\"$attrs\"\n @update:model-value=\"onDatePickerUpdate\"\n />\n <TimePicker\n v-if=\"type !== 'date'\"\n ref=\"timePickerInstance\"\n :key=\"timeKey\"\n v-model=\"timePickerValue\"\n @enter-keyup=\"onTimePickerEnterKeyup\"\n @focus-confirm=\"onFocusConfirm\"\n />\n <div class=\"d-flex\">\n <button\n v-if=\"!hideSetToNow\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"8\"\n @click=\"now\"\n >\n {{ type === 'date' ? t('common.time.today') : t('common.time.now') }}\n </button>\n <button\n ref=\"confirmRefButton\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"7\"\n @click.stop=\"close\"\n >\n {{ t('common.button.confirm') }}\n </button>\n </div>\n </VCard>\n </VMenu>\n\n <div class=\"ml-1\">\n <slot name=\"append-inner\" />\n </div>\n </template>\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"a-required-mark\"\n />\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-datetime-picker {\n :deep(.v-field__append-inner .v-icon) {\n cursor: pointer;\n }\n\n &__calendar-icon {\n margin-top: 2px;\n opacity: 0.6 !important;\n }\n\n &__clearable-icon {\n opacity: 0 !important;\n }\n\n &:hover {\n .a-datetime-picker__clearable-icon {\n opacity: 0.6 !important;\n }\n }\n\n &__bottom-button {\n width: 100%;\n text-align: center;\n font-size: 0.86rem;\n font-family: Roboto, sans-serif;\n font-weight: bold;\n line-height: 1.8;\n padding: 6px 0;\n\n &:hover {\n background-color: rgb(0 0 0 / 5%);\n }\n }\n}\n\n.a-datetime-picker-calendar {\n :deep(.v-picker-title) {\n display: none;\n }\n\n :deep(.v-date-picker-header) {\n padding-top: 12px;\n }\n\n :deep(.v-date-picker-month) {\n padding-bottom: 2px;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ADatetimePicker.js","names":["_sfc_main","_plugin_vue_export_helper_default","ADatetimePicker_vue_vue_type_script_setup_true_lang_default","ADatetimePicker_default"],"sources":["../../../../../src/domains/ui/datetime/components/ADatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DatetimeUTC } from '@/shared/types/common'\nimport { computed, nextTick, ref, toRaw, useTemplateRef, watch } from 'vue'\nimport { isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport useVuelidate, { type ErrorObject } from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport TimePicker from '@/domains/ui/datetime/components/TimePicker.vue'\nimport type { Dayjs } from 'dayjs'\nimport {\n applyCalendarDate,\n type DatetimePickerType,\n emptyBaseValue,\n formatDisplay,\n isSameValue,\n parseModel,\n parseTyped,\n placeholderFor,\n serialize,\n toCalendarDate,\n todayValue,\n} from '@/shared/utils/datetimePickerValue'\nimport { useI18n } from 'vue-i18n'\nimport type { VTextField } from 'vuetify/components/VTextField'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTC | null | undefined\n type?: DatetimePickerType\n label?: string\n hideLabel?: boolean\n clearable?: boolean\n disabled?: boolean\n hideDetails?: boolean\n required?: boolean\n hideSetToNow?: boolean\n placeholder?: string\n dataCy?: string\n defaultValue?: DatetimeUTC | null | undefined\n errorMessages?: string[]\n lastMinuteMoment?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: '',\n hideLabel: false,\n clearable: false,\n disabled: false,\n hideDetails: false,\n required: false,\n hideSetToNow: false,\n placeholder: '',\n dataCy: '',\n defaultValue: null,\n errorMessages: undefined,\n lastMinuteMoment: false,\n // When unset, the text field follows a readonly `VForm` around it. The calendar and clearing follow only this prop.\n readonly: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'blur'): void\n (e: 'focus'): void\n (e: 'update:modelValue', data: DatetimeUTC | null | undefined): void\n (e: 'open'): void\n (e: 'close'): void\n (e: 'afterClear'): void\n}>()\n\nconst pickerOpened = ref(false)\nconst pickerKey = ref(0)\nconst timeKey = ref(0)\nconst timePickerInstance = useTemplateRef<InstanceType<typeof TimePicker>>('timePickerInstance')\nconst inputInstance = useTemplateRef<InstanceType<typeof VTextField>>('inputInstance')\nconst confirmRefButton = useTemplateRef<HTMLButtonElement>('confirmRefButton')\nconst textFieldValue = ref('')\n\nconst datePickerValue = ref<null | Date>(null)\nconst timePickerValue = ref<null | { hours: number; minutes: number }>(null)\nconst datetimeInternal = ref<null | Dayjs>(null)\n\nconst { t } = useI18n()\n\nconst placeholderComputed = computed(() => {\n return props.placeholder.length ? props.placeholder : placeholderFor(props.type)\n})\n\nconst { requiredIf } = useValidate()\nconst rules = computed(() => {\n return {\n textFieldValue: {\n required: requiredIf(props.required),\n },\n }\n})\nconst v$ = useVuelidate(rules, { textFieldValue })\n\nconst tryEmitNewValue = (newValue: DatetimeUTC | null | undefined) => {\n if (newValue === props.modelValue) return\n emit('update:modelValue', newValue)\n}\n\nconst updateDateAndTimePickerOnlyWhenChanged = (newValue: Dayjs | null) => {\n if (isNull(newValue)) return\n if (\n props.type !== 'date' &&\n (isNull(timePickerValue.value) ||\n newValue.hour() !== timePickerValue.value.hours ||\n newValue.minute() !== timePickerValue.value.minutes)\n ) {\n timePickerValue.value = { hours: newValue.hour(), minutes: newValue.minute() }\n }\n if (\n isNull(datePickerValue.value) ||\n newValue.year() !== datePickerValue.value.getFullYear() ||\n newValue.month() !== datePickerValue.value.getMonth() ||\n newValue.date() !== datePickerValue.value.getDate()\n ) {\n datePickerValue.value = toCalendarDate(newValue, props.type)\n }\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n datetimeInternal.value = parseModel(newValue, props.type, props.lastMinuteMoment)\n },\n { immediate: true }\n)\n\nconst watchDatePicker = (newValue: null | Date, internal: Dayjs) => {\n if (isNull(newValue)) return internal\n return applyCalendarDate(internal, newValue, props.type)\n}\n\nconst watchTimePicker = (newValue: null | { hours: number; minutes: number }, internal: Dayjs) => {\n if (isNull(newValue) || props.type === 'date') return internal\n return internal.set('hour', newValue.hours).set('minute', newValue.minutes)\n}\n\nwatch([timePickerValue, datePickerValue], ([newTimePickerValue, newDatePickerValue]) => {\n let newDate: Dayjs | null = null\n\n if (!isNull(datetimeInternal.value)) {\n newDate = datetimeInternal.value\n } else {\n newDate =\n parseModel(props.modelValue, props.type, props.lastMinuteMoment) ??\n emptyBaseValue(props.type, props.lastMinuteMoment)\n }\n\n newDate = watchTimePicker(newTimePickerValue, newDate!)\n newDate = watchDatePicker(newDatePickerValue, newDate!)\n if (newDate.isSame(toRaw(datetimeInternal.value))) return\n datetimeInternal.value = newDate\n})\n\nwatch(\n datetimeInternal,\n (newValue) => {\n if (isNull(newValue)) {\n textFieldValue.value = ''\n tryEmitNewValue(null)\n return\n }\n const newUtcValue = serialize(newValue, props.type)\n textFieldValue.value = formatDisplay(newValue, props.type)\n updateDateAndTimePickerOnlyWhenChanged(newValue)\n tryEmitNewValue(newUtcValue)\n },\n { immediate: true }\n)\n\nwatch(pickerOpened, (newValue) => {\n if (newValue) {\n onTextFieldBlur()\n if (isNull(datetimeInternal.value) && (isNull(props.defaultValue) || isUndefined(props.defaultValue))) {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n }\n emit('open')\n return\n }\n emit('close')\n})\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessages)) return props.errorMessages\n if (v$.value.textFieldValue.$errors.length)\n return [v$.value.textFieldValue.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst onTextFieldBlur = () => {\n const filtered = textFieldValue.value.replace(/[^\\s\\d.:]/g, '').trim()\n if (filtered.length === 0 && !props.required) {\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('blur')\n return\n }\n // Keeps the seconds from the original model.\n const seconds = parseModel(props.modelValue, props.type, props.lastMinuteMoment)?.second() ?? 0\n const reparsed = parseTyped(filtered, props.type, seconds)\n if (!isNull(reparsed)) {\n // A day click blurs this field before the picker emits, so re-assigning an unchanged datetime\n // would push the stale date back into it.\n if (isSameValue(reparsed, toRaw(datetimeInternal.value), props.type)) {\n textFieldValue.value = formatDisplay(reparsed, props.type)\n } else {\n datetimeInternal.value = reparsed\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n return\n }\n if (!isNull(datetimeInternal.value)) {\n textFieldValue.value = formatDisplay(datetimeInternal.value, props.type)\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n}\n\nconst onClear = () => {\n if (isNull(props.defaultValue) || isUndefined(props.defaultValue)) {\n datetimeInternal.value = null\n datePickerValue.value = null\n timePickerValue.value = null\n emit('afterClear')\n return\n }\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('afterClear')\n}\n\nconst close = () => {\n pickerOpened.value = false\n inputInstance.value?.focus()\n inputInstance.value?.blur()\n emit('close')\n emit('blur')\n}\n\nconst onTextFieldFocus = () => {\n emit('focus')\n}\n\n// The calendar icon is a button. Enter and Space toggle the calendar like a click. Its menu takes only the arrow keys.\n// The keyup of that Enter stays on the icon. Otherwise the field's Enter handler would report leaving a second time.\nconst togglePicker = () => {\n pickerOpened.value = !pickerOpened.value\n}\n\nconst onTimePickerEnterKeyup = () => {\n pickerOpened.value = false\n}\n\nconst onFocusConfirm = () => {\n confirmRefButton.value?.focus()\n}\n\nconst onDatePickerUpdate = () => {\n if (props.type === 'date') {\n // The value travels through pre-flush watchers, so closing now would emit blur and release the\n // collab lock with the previous value still in the model.\n nextTick(close)\n return\n }\n timePickerInstance.value?.focusHour()\n}\n\nconst now = () => {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n nextTick(() => {\n // Vuetify navigates the calendar to a new value on its own, but skips an unchanged day, so a\n // value that is already today would leave the user on whatever month they paged to.\n pickerKey.value++\n timeKey.value++\n })\n}\n</script>\n\n<template>\n <VTextField\n ref=\"inputInstance\"\n v-model=\"textFieldValue\"\n :error-messages=\"errorMessageComputed\"\n :persistent-placeholder=\"true\"\n :placeholder=\"placeholderComputed\"\n class=\"a-datetime-picker\"\n :hide-details=\"hideDetails ? true : 'auto'\"\n :data-cy=\"dataCy.length ? dataCy : undefined\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n autocomplete=\"off\"\n @blur=\"onTextFieldBlur\"\n @focus=\"onTextFieldFocus\"\n @keyup.enter=\"onTextFieldBlur\"\n >\n <template #append-inner>\n <VIcon\n v-if=\"clearable && !readonly && defaultValue !== modelValue\"\n class=\"a-datetime-picker__clearable-icon\"\n icon=\"mdi-close-circle\"\n :aria-label=\"t('common.button.clear')\"\n @click.stop=\"onClear\"\n />\n <VMenu\n v-if=\"!disabled && !readonly\"\n location=\"bottom end\"\n origin=\"top end\"\n :close-on-content-click=\"false\"\n :model-value=\"pickerOpened\"\n @update:model-value=\"(value: boolean) => (pickerOpened = value)\"\n >\n <template #activator=\"{ props: menuProps }\">\n <VIcon\n class=\"a-datetime-picker__calendar-icon\"\n icon=\"mdi-calendar\"\n size=\"small\"\n :aria-label=\"t('$vuetify.datePicker.title')\"\n v-bind=\"menuProps\"\n @keydown.enter.space.prevent=\"togglePicker\"\n @keyup.enter.stop\n />\n </template>\n\n <VCard v-if=\"pickerOpened\">\n <VBtn\n v-tooltip=\"t('common.button.close')\"\n :aria-label=\"t('common.button.close')\"\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"position-absolute top-0 right-0\"\n @click.stop=\"close\"\n >\n <VIcon\n icon=\"mdi-close\"\n color=\"white\"\n />\n </VBtn>\n <VDatePicker\n :key=\"pickerKey\"\n v-model=\"datePickerValue\"\n class=\"a-datetime-picker-calendar\"\n color=\"primary\"\n show-adjacent-months\n v-bind=\"$attrs\"\n @update:model-value=\"onDatePickerUpdate\"\n />\n <TimePicker\n v-if=\"type !== 'date'\"\n ref=\"timePickerInstance\"\n :key=\"timeKey\"\n v-model=\"timePickerValue\"\n @enter-keyup=\"onTimePickerEnterKeyup\"\n @focus-confirm=\"onFocusConfirm\"\n />\n <div class=\"d-flex\">\n <button\n v-if=\"!hideSetToNow\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"8\"\n @click=\"now\"\n >\n {{ type === 'date' ? t('common.time.today') : t('common.time.now') }}\n </button>\n <button\n ref=\"confirmRefButton\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"7\"\n @click.stop=\"close\"\n >\n {{ t('common.button.confirm') }}\n </button>\n </div>\n </VCard>\n </VMenu>\n\n <div class=\"ml-1\">\n <slot name=\"append-inner\" />\n </div>\n </template>\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"a-required-mark\"\n />\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-datetime-picker {\n :deep(.v-field__append-inner .v-icon) {\n cursor: pointer;\n }\n\n &__calendar-icon {\n margin-top: 2px;\n opacity: 0.6 !important;\n }\n\n &__clearable-icon {\n opacity: 0 !important;\n }\n\n &:hover {\n .a-datetime-picker__clearable-icon {\n opacity: 0.6 !important;\n }\n }\n\n &__bottom-button {\n width: 100%;\n text-align: center;\n font-size: 0.86rem;\n font-family: Roboto, sans-serif;\n font-weight: bold;\n line-height: 1.8;\n padding: 6px 0;\n\n &:hover {\n background-color: rgb(0 0 0 / 5%);\n }\n }\n}\n\n.a-datetime-picker-calendar {\n :deep(.v-picker-title) {\n display: none;\n }\n\n :deep(.v-date-picker-header) {\n padding-top: 12px;\n }\n\n :deep(.v-date-picker-month) {\n padding-bottom: 2px;\n }\n}\n</style>\n"],"mappings":""}
@@ -17,10 +17,12 @@ type __VLS_Props = {
17
17
  lastMinuteMoment?: boolean;
18
18
  readonly?: boolean;
19
19
  };
20
- declare var __VLS_70: {};
21
- type __VLS_Slots = {} & {
22
- 'append-inner'?: (props: typeof __VLS_70) => any;
20
+ declare const __VLS_template: () => {
21
+ __VLS_Slots: {
22
+ 'append-inner'?: (props: {}) => any;
23
+ };
23
24
  };
25
+ type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
24
26
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
25
27
  close: () => any;
26
28
  open: () => any;
@@ -1 +1 @@
1
- {"version":3,"file":"ADatetimePicker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","_component_VTextField","_withKeys","_createSlots","_withCtx","_component_VIcon","_unref","_withModifiers","_createCommentVNode","_component_VMenu","_createVNode","_mergeProps","_component_VCard","_withDirectives","_component_VBtn","_directive_tooltip","_component_VDatePicker","TimePicker","_createElementVNode","_createElementBlock","_toDisplayString","_renderSlot","_createTextVNode","TimePicker_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","ADatetimePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","pickerOpened","ref","pickerKey","timeKey","timePickerInstance","useTemplateRef","inputInstance","confirmRefButton","textFieldValue","datePickerValue","timePickerValue","datetimeInternal","useI18n","placeholderComputed","computed","placeholderFor","useValidate","rules","requiredIf","v$","tryEmitNewValue","newValue","updateDateAndTimePickerOnlyWhenChanged","isNull","toCalendarDate","oldValue","parseModel","watchDatePicker","internal","applyCalendarDate","watchTimePicker","watch","newTimePickerValue","newDatePickerValue","newDate","emptyBaseValue","toRaw","newUtcValue","serialize","formatDisplay","onTextFieldBlur","isUndefined","todayValue","errorMessageComputed","isDefined","item","filtered","seconds","reparsed","parseTyped","isSameValue","onClear","close","onTextFieldFocus","togglePicker","onTimePickerEnterKeyup","onFocusConfirm","onDatePickerUpdate","nextTick","now","openBlock","createBlock","VTextField","_cache","$event","withKeys","createSlots","withCtx","VIcon","unref","t","withModifiers","createCommentVNode","VMenu","value","menuProps","createVNode","mergeProps","VCard","withDirectives","VBtn","Tooltip","VDatePicker","_ctx","createElementVNode","createElementBlock","toDisplayString","renderSlot","createTextVNode"],"sources":["../../../../../src/domains/ui/datetime/components/ADatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DatetimeUTC } from '@/shared/types/common'\nimport { computed, nextTick, ref, toRaw, useTemplateRef, watch } from 'vue'\nimport { isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport useVuelidate, { type ErrorObject } from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport TimePicker from '@/domains/ui/datetime/components/TimePicker.vue'\nimport type { Dayjs } from 'dayjs'\nimport {\n applyCalendarDate,\n type DatetimePickerType,\n emptyBaseValue,\n formatDisplay,\n isSameValue,\n parseModel,\n parseTyped,\n placeholderFor,\n serialize,\n toCalendarDate,\n todayValue,\n} from '@/shared/utils/datetimePickerValue'\nimport { useI18n } from 'vue-i18n'\nimport type { VTextField } from 'vuetify/components/VTextField'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTC | null | undefined\n type?: DatetimePickerType\n label?: string\n hideLabel?: boolean\n clearable?: boolean\n disabled?: boolean\n hideDetails?: boolean\n required?: boolean\n hideSetToNow?: boolean\n placeholder?: string\n dataCy?: string\n defaultValue?: DatetimeUTC | null | undefined\n errorMessages?: string[]\n lastMinuteMoment?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: '',\n hideLabel: false,\n clearable: false,\n disabled: false,\n hideDetails: false,\n required: false,\n hideSetToNow: false,\n placeholder: '',\n dataCy: '',\n defaultValue: null,\n errorMessages: undefined,\n lastMinuteMoment: false,\n // Not set, the text field follows a readonly `VForm` around it; the calendar and clearing follow only this prop.\n readonly: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'blur'): void\n (e: 'focus'): void\n (e: 'update:modelValue', data: DatetimeUTC | null | undefined): void\n (e: 'open'): void\n (e: 'close'): void\n (e: 'afterClear'): void\n}>()\n\nconst pickerOpened = ref(false)\nconst pickerKey = ref(0)\nconst timeKey = ref(0)\nconst timePickerInstance = useTemplateRef<InstanceType<typeof TimePicker>>('timePickerInstance')\nconst inputInstance = useTemplateRef<InstanceType<typeof VTextField>>('inputInstance')\nconst confirmRefButton = useTemplateRef<HTMLButtonElement>('confirmRefButton')\nconst textFieldValue = ref('')\n\nconst datePickerValue = ref<null | Date>(null)\nconst timePickerValue = ref<null | { hours: number; minutes: number }>(null)\nconst datetimeInternal = ref<null | Dayjs>(null)\n\nconst { t } = useI18n()\n\nconst placeholderComputed = computed(() => {\n return props.placeholder.length ? props.placeholder : placeholderFor(props.type)\n})\n\nconst { requiredIf } = useValidate()\nconst rules = computed(() => {\n return {\n textFieldValue: {\n required: requiredIf(props.required),\n },\n }\n})\nconst v$ = useVuelidate(rules, { textFieldValue })\n\nconst tryEmitNewValue = (newValue: DatetimeUTC | null | undefined) => {\n if (newValue === props.modelValue) return\n emit('update:modelValue', newValue)\n}\n\nconst updateDateAndTimePickerOnlyWhenChanged = (newValue: Dayjs | null) => {\n if (isNull(newValue)) return\n if (\n props.type !== 'date' &&\n (isNull(timePickerValue.value) ||\n newValue.hour() !== timePickerValue.value.hours ||\n newValue.minute() !== timePickerValue.value.minutes)\n ) {\n timePickerValue.value = { hours: newValue.hour(), minutes: newValue.minute() }\n }\n if (\n isNull(datePickerValue.value) ||\n newValue.year() !== datePickerValue.value.getFullYear() ||\n newValue.month() !== datePickerValue.value.getMonth() ||\n newValue.date() !== datePickerValue.value.getDate()\n ) {\n datePickerValue.value = toCalendarDate(newValue, props.type)\n }\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n datetimeInternal.value = parseModel(newValue, props.type, props.lastMinuteMoment)\n },\n { immediate: true }\n)\n\nconst watchDatePicker = (newValue: null | Date, internal: Dayjs) => {\n if (isNull(newValue)) return internal\n return applyCalendarDate(internal, newValue, props.type)\n}\n\nconst watchTimePicker = (newValue: null | { hours: number; minutes: number }, internal: Dayjs) => {\n if (isNull(newValue) || props.type === 'date') return internal\n return internal.set('hour', newValue.hours).set('minute', newValue.minutes)\n}\n\nwatch([timePickerValue, datePickerValue], ([newTimePickerValue, newDatePickerValue]) => {\n let newDate: Dayjs | null = null\n\n if (!isNull(datetimeInternal.value)) {\n newDate = datetimeInternal.value\n } else {\n newDate =\n parseModel(props.modelValue, props.type, props.lastMinuteMoment) ??\n emptyBaseValue(props.type, props.lastMinuteMoment)\n }\n\n newDate = watchTimePicker(newTimePickerValue, newDate!)\n newDate = watchDatePicker(newDatePickerValue, newDate!)\n if (newDate.isSame(toRaw(datetimeInternal.value))) return\n datetimeInternal.value = newDate\n})\n\nwatch(\n datetimeInternal,\n (newValue) => {\n if (isNull(newValue)) {\n textFieldValue.value = ''\n tryEmitNewValue(null)\n return\n }\n const newUtcValue = serialize(newValue, props.type)\n textFieldValue.value = formatDisplay(newValue, props.type)\n updateDateAndTimePickerOnlyWhenChanged(newValue)\n tryEmitNewValue(newUtcValue)\n },\n { immediate: true }\n)\n\nwatch(pickerOpened, (newValue) => {\n if (newValue) {\n onTextFieldBlur()\n if (isNull(datetimeInternal.value) && (isNull(props.defaultValue) || isUndefined(props.defaultValue))) {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n }\n emit('open')\n return\n }\n emit('close')\n})\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessages)) return props.errorMessages\n if (v$.value.textFieldValue.$errors.length)\n return [v$.value.textFieldValue.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst onTextFieldBlur = () => {\n const filtered = textFieldValue.value.replace(/[^\\s\\d.:]/g, '').trim()\n if (filtered.length === 0 && !props.required) {\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('blur')\n return\n }\n // keep seconds from original model\n const seconds = parseModel(props.modelValue, props.type, props.lastMinuteMoment)?.second() ?? 0\n const reparsed = parseTyped(filtered, props.type, seconds)\n if (!isNull(reparsed)) {\n // A day click blurs this field before the picker emits, so re-assigning an unchanged datetime\n // would push the stale date back into it.\n if (isSameValue(reparsed, toRaw(datetimeInternal.value), props.type)) {\n textFieldValue.value = formatDisplay(reparsed, props.type)\n } else {\n datetimeInternal.value = reparsed\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n return\n }\n if (!isNull(datetimeInternal.value)) {\n textFieldValue.value = formatDisplay(datetimeInternal.value, props.type)\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n}\n\nconst onClear = () => {\n if (isNull(props.defaultValue) || isUndefined(props.defaultValue)) {\n datetimeInternal.value = null\n datePickerValue.value = null\n timePickerValue.value = null\n emit('afterClear')\n return\n }\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('afterClear')\n}\n\nconst close = () => {\n pickerOpened.value = false\n inputInstance.value?.focus()\n inputInstance.value?.blur()\n emit('close')\n emit('blur')\n}\n\nconst onTextFieldFocus = () => {\n emit('focus')\n}\n\n// The calendar icon is a button: Enter and Space open and close the calendar as a click does. Its menu takes only the\n// arrows from the keyboard. The keyup of that Enter stays on the icon: the Enter of the field would report it left a\n// second time.\nconst togglePicker = () => {\n pickerOpened.value = !pickerOpened.value\n}\n\nconst onTimePickerEnterKeyup = () => {\n pickerOpened.value = false\n}\n\nconst onFocusConfirm = () => {\n confirmRefButton.value?.focus()\n}\n\nconst onDatePickerUpdate = () => {\n if (props.type === 'date') {\n // The value travels through pre-flush watchers, so closing now would emit blur and release the\n // collab lock with the previous value still in the model.\n nextTick(close)\n return\n }\n timePickerInstance.value?.focusHour()\n}\n\nconst now = () => {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n nextTick(() => {\n // Vuetify navigates the calendar to a new value on its own, but skips an unchanged day, so a\n // value that is already today would leave the user on whatever month they paged to.\n pickerKey.value++\n timeKey.value++\n })\n}\n</script>\n\n<template>\n <VTextField\n ref=\"inputInstance\"\n v-model=\"textFieldValue\"\n :error-messages=\"errorMessageComputed\"\n :persistent-placeholder=\"true\"\n :placeholder=\"placeholderComputed\"\n class=\"a-datetime-picker\"\n :hide-details=\"hideDetails ? true : 'auto'\"\n :data-cy=\"dataCy.length ? dataCy : undefined\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n autocomplete=\"off\"\n @blur=\"onTextFieldBlur\"\n @focus=\"onTextFieldFocus\"\n @keyup.enter=\"onTextFieldBlur\"\n >\n <template #append-inner>\n <VIcon\n v-if=\"clearable && !readonly && defaultValue !== modelValue\"\n class=\"a-datetime-picker__clearable-icon\"\n icon=\"mdi-close-circle\"\n :aria-label=\"t('common.button.clear')\"\n @click.stop=\"onClear\"\n />\n <VMenu\n v-if=\"!disabled && !readonly\"\n location=\"bottom end\"\n origin=\"top end\"\n :close-on-content-click=\"false\"\n :model-value=\"pickerOpened\"\n @update:model-value=\"(value: boolean) => (pickerOpened = value)\"\n >\n <template #activator=\"{ props: menuProps }\">\n <VIcon\n class=\"a-datetime-picker__calendar-icon\"\n icon=\"mdi-calendar\"\n size=\"small\"\n :aria-label=\"t('$vuetify.datePicker.title')\"\n v-bind=\"menuProps\"\n @keydown.enter.space.prevent=\"togglePicker\"\n @keyup.enter.stop\n />\n </template>\n\n <VCard v-if=\"pickerOpened\">\n <VBtn\n v-tooltip=\"t('common.button.close')\"\n :aria-label=\"t('common.button.close')\"\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"position-absolute top-0 right-0\"\n @click.stop=\"close\"\n >\n <VIcon\n icon=\"mdi-close\"\n color=\"white\"\n />\n </VBtn>\n <VDatePicker\n :key=\"pickerKey\"\n v-model=\"datePickerValue\"\n class=\"a-datetime-picker-calendar\"\n color=\"primary\"\n show-adjacent-months\n v-bind=\"$attrs\"\n @update:model-value=\"onDatePickerUpdate\"\n />\n <TimePicker\n v-if=\"type !== 'date'\"\n ref=\"timePickerInstance\"\n :key=\"timeKey\"\n v-model=\"timePickerValue\"\n @enter-keyup=\"onTimePickerEnterKeyup\"\n @focus-confirm=\"onFocusConfirm\"\n />\n <div class=\"d-flex\">\n <button\n v-if=\"!hideSetToNow\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"8\"\n @click=\"now\"\n >\n {{ type === 'date' ? t('common.time.today') : t('common.time.now') }}\n </button>\n <button\n ref=\"confirmRefButton\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"7\"\n @click.stop=\"close\"\n >\n {{ t('common.button.confirm') }}\n </button>\n </div>\n </VCard>\n </VMenu>\n\n <div class=\"ml-1\">\n <slot name=\"append-inner\" />\n </div>\n </template>\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"a-required-mark\"\n />\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-datetime-picker {\n :deep(.v-field__append-inner .v-icon) {\n cursor: pointer;\n }\n\n &__calendar-icon {\n margin-top: 2px;\n opacity: 0.6 !important;\n }\n\n &__clearable-icon {\n opacity: 0 !important;\n }\n\n &:hover {\n .a-datetime-picker__clearable-icon {\n opacity: 0.6 !important;\n }\n }\n\n &__bottom-button {\n width: 100%;\n text-align: center;\n font-size: 0.86rem;\n font-family: Roboto, sans-serif;\n font-weight: bold;\n line-height: 1.8;\n padding: 6px 0;\n\n &:hover {\n background-color: rgb(0 0 0 / 5%);\n }\n }\n}\n\n.a-datetime-picker-calendar {\n :deep(.v-picker-title) {\n display: none;\n }\n\n :deep(.v-date-picker-header) {\n padding-top: 12px;\n }\n\n :deep(.v-date-picker-month) {\n padding-bottom: 2px;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ADatetimePicker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","_component_VTextField","_withKeys","_createSlots","_withCtx","_component_VIcon","_unref","_withModifiers","_createCommentVNode","_component_VMenu","_createVNode","_mergeProps","_component_VCard","_withDirectives","_component_VBtn","_directive_tooltip","_component_VDatePicker","TimePicker","_createElementVNode","_createElementBlock","_toDisplayString","_renderSlot","_createTextVNode","TimePicker_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","ADatetimePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","pickerOpened","ref","pickerKey","timeKey","timePickerInstance","useTemplateRef","inputInstance","confirmRefButton","textFieldValue","datePickerValue","timePickerValue","datetimeInternal","useI18n","placeholderComputed","computed","placeholderFor","useValidate","rules","requiredIf","v$","tryEmitNewValue","newValue","updateDateAndTimePickerOnlyWhenChanged","isNull","toCalendarDate","oldValue","parseModel","watchDatePicker","internal","applyCalendarDate","watchTimePicker","watch","newTimePickerValue","newDatePickerValue","newDate","emptyBaseValue","toRaw","newUtcValue","serialize","formatDisplay","onTextFieldBlur","isUndefined","todayValue","errorMessageComputed","isDefined","item","filtered","seconds","reparsed","parseTyped","isSameValue","onClear","close","onTextFieldFocus","togglePicker","onTimePickerEnterKeyup","onFocusConfirm","onDatePickerUpdate","nextTick","now","openBlock","createBlock","VTextField","_cache","$event","withKeys","createSlots","withCtx","VIcon","unref","t","withModifiers","createCommentVNode","VMenu","value","menuProps","createVNode","mergeProps","VCard","withDirectives","VBtn","Tooltip","VDatePicker","_ctx","createElementVNode","createElementBlock","toDisplayString","renderSlot","createTextVNode"],"sources":["../../../../../src/domains/ui/datetime/components/ADatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DatetimeUTC } from '@/shared/types/common'\nimport { computed, nextTick, ref, toRaw, useTemplateRef, watch } from 'vue'\nimport { isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport useVuelidate, { type ErrorObject } from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport TimePicker from '@/domains/ui/datetime/components/TimePicker.vue'\nimport type { Dayjs } from 'dayjs'\nimport {\n applyCalendarDate,\n type DatetimePickerType,\n emptyBaseValue,\n formatDisplay,\n isSameValue,\n parseModel,\n parseTyped,\n placeholderFor,\n serialize,\n toCalendarDate,\n todayValue,\n} from '@/shared/utils/datetimePickerValue'\nimport { useI18n } from 'vue-i18n'\nimport type { VTextField } from 'vuetify/components/VTextField'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTC | null | undefined\n type?: DatetimePickerType\n label?: string\n hideLabel?: boolean\n clearable?: boolean\n disabled?: boolean\n hideDetails?: boolean\n required?: boolean\n hideSetToNow?: boolean\n placeholder?: string\n dataCy?: string\n defaultValue?: DatetimeUTC | null | undefined\n errorMessages?: string[]\n lastMinuteMoment?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: '',\n hideLabel: false,\n clearable: false,\n disabled: false,\n hideDetails: false,\n required: false,\n hideSetToNow: false,\n placeholder: '',\n dataCy: '',\n defaultValue: null,\n errorMessages: undefined,\n lastMinuteMoment: false,\n // When unset, the text field follows a readonly `VForm` around it. The calendar and clearing follow only this prop.\n readonly: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'blur'): void\n (e: 'focus'): void\n (e: 'update:modelValue', data: DatetimeUTC | null | undefined): void\n (e: 'open'): void\n (e: 'close'): void\n (e: 'afterClear'): void\n}>()\n\nconst pickerOpened = ref(false)\nconst pickerKey = ref(0)\nconst timeKey = ref(0)\nconst timePickerInstance = useTemplateRef<InstanceType<typeof TimePicker>>('timePickerInstance')\nconst inputInstance = useTemplateRef<InstanceType<typeof VTextField>>('inputInstance')\nconst confirmRefButton = useTemplateRef<HTMLButtonElement>('confirmRefButton')\nconst textFieldValue = ref('')\n\nconst datePickerValue = ref<null | Date>(null)\nconst timePickerValue = ref<null | { hours: number; minutes: number }>(null)\nconst datetimeInternal = ref<null | Dayjs>(null)\n\nconst { t } = useI18n()\n\nconst placeholderComputed = computed(() => {\n return props.placeholder.length ? props.placeholder : placeholderFor(props.type)\n})\n\nconst { requiredIf } = useValidate()\nconst rules = computed(() => {\n return {\n textFieldValue: {\n required: requiredIf(props.required),\n },\n }\n})\nconst v$ = useVuelidate(rules, { textFieldValue })\n\nconst tryEmitNewValue = (newValue: DatetimeUTC | null | undefined) => {\n if (newValue === props.modelValue) return\n emit('update:modelValue', newValue)\n}\n\nconst updateDateAndTimePickerOnlyWhenChanged = (newValue: Dayjs | null) => {\n if (isNull(newValue)) return\n if (\n props.type !== 'date' &&\n (isNull(timePickerValue.value) ||\n newValue.hour() !== timePickerValue.value.hours ||\n newValue.minute() !== timePickerValue.value.minutes)\n ) {\n timePickerValue.value = { hours: newValue.hour(), minutes: newValue.minute() }\n }\n if (\n isNull(datePickerValue.value) ||\n newValue.year() !== datePickerValue.value.getFullYear() ||\n newValue.month() !== datePickerValue.value.getMonth() ||\n newValue.date() !== datePickerValue.value.getDate()\n ) {\n datePickerValue.value = toCalendarDate(newValue, props.type)\n }\n}\n\nwatch(\n () => props.modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n datetimeInternal.value = parseModel(newValue, props.type, props.lastMinuteMoment)\n },\n { immediate: true }\n)\n\nconst watchDatePicker = (newValue: null | Date, internal: Dayjs) => {\n if (isNull(newValue)) return internal\n return applyCalendarDate(internal, newValue, props.type)\n}\n\nconst watchTimePicker = (newValue: null | { hours: number; minutes: number }, internal: Dayjs) => {\n if (isNull(newValue) || props.type === 'date') return internal\n return internal.set('hour', newValue.hours).set('minute', newValue.minutes)\n}\n\nwatch([timePickerValue, datePickerValue], ([newTimePickerValue, newDatePickerValue]) => {\n let newDate: Dayjs | null = null\n\n if (!isNull(datetimeInternal.value)) {\n newDate = datetimeInternal.value\n } else {\n newDate =\n parseModel(props.modelValue, props.type, props.lastMinuteMoment) ??\n emptyBaseValue(props.type, props.lastMinuteMoment)\n }\n\n newDate = watchTimePicker(newTimePickerValue, newDate!)\n newDate = watchDatePicker(newDatePickerValue, newDate!)\n if (newDate.isSame(toRaw(datetimeInternal.value))) return\n datetimeInternal.value = newDate\n})\n\nwatch(\n datetimeInternal,\n (newValue) => {\n if (isNull(newValue)) {\n textFieldValue.value = ''\n tryEmitNewValue(null)\n return\n }\n const newUtcValue = serialize(newValue, props.type)\n textFieldValue.value = formatDisplay(newValue, props.type)\n updateDateAndTimePickerOnlyWhenChanged(newValue)\n tryEmitNewValue(newUtcValue)\n },\n { immediate: true }\n)\n\nwatch(pickerOpened, (newValue) => {\n if (newValue) {\n onTextFieldBlur()\n if (isNull(datetimeInternal.value) && (isNull(props.defaultValue) || isUndefined(props.defaultValue))) {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n }\n emit('open')\n return\n }\n emit('close')\n})\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessages)) return props.errorMessages\n if (v$.value.textFieldValue.$errors.length)\n return [v$.value.textFieldValue.$errors.map((item: ErrorObject) => item.$message).join(' ')]\n return []\n})\n\nconst onTextFieldBlur = () => {\n const filtered = textFieldValue.value.replace(/[^\\s\\d.:]/g, '').trim()\n if (filtered.length === 0 && !props.required) {\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('blur')\n return\n }\n // Keeps the seconds from the original model.\n const seconds = parseModel(props.modelValue, props.type, props.lastMinuteMoment)?.second() ?? 0\n const reparsed = parseTyped(filtered, props.type, seconds)\n if (!isNull(reparsed)) {\n // A day click blurs this field before the picker emits, so re-assigning an unchanged datetime\n // would push the stale date back into it.\n if (isSameValue(reparsed, toRaw(datetimeInternal.value), props.type)) {\n textFieldValue.value = formatDisplay(reparsed, props.type)\n } else {\n datetimeInternal.value = reparsed\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n return\n }\n if (!isNull(datetimeInternal.value)) {\n textFieldValue.value = formatDisplay(datetimeInternal.value, props.type)\n }\n v$.value.textFieldValue.$touch()\n emit('blur')\n}\n\nconst onClear = () => {\n if (isNull(props.defaultValue) || isUndefined(props.defaultValue)) {\n datetimeInternal.value = null\n datePickerValue.value = null\n timePickerValue.value = null\n emit('afterClear')\n return\n }\n datetimeInternal.value = parseModel(props.defaultValue, props.type, props.lastMinuteMoment)\n emit('afterClear')\n}\n\nconst close = () => {\n pickerOpened.value = false\n inputInstance.value?.focus()\n inputInstance.value?.blur()\n emit('close')\n emit('blur')\n}\n\nconst onTextFieldFocus = () => {\n emit('focus')\n}\n\n// The calendar icon is a button. Enter and Space toggle the calendar like a click. Its menu takes only the arrow keys.\n// The keyup of that Enter stays on the icon. Otherwise the field's Enter handler would report leaving a second time.\nconst togglePicker = () => {\n pickerOpened.value = !pickerOpened.value\n}\n\nconst onTimePickerEnterKeyup = () => {\n pickerOpened.value = false\n}\n\nconst onFocusConfirm = () => {\n confirmRefButton.value?.focus()\n}\n\nconst onDatePickerUpdate = () => {\n if (props.type === 'date') {\n // The value travels through pre-flush watchers, so closing now would emit blur and release the\n // collab lock with the previous value still in the model.\n nextTick(close)\n return\n }\n timePickerInstance.value?.focusHour()\n}\n\nconst now = () => {\n datetimeInternal.value = todayValue(props.type, props.lastMinuteMoment)\n nextTick(() => {\n // Vuetify navigates the calendar to a new value on its own, but skips an unchanged day, so a\n // value that is already today would leave the user on whatever month they paged to.\n pickerKey.value++\n timeKey.value++\n })\n}\n</script>\n\n<template>\n <VTextField\n ref=\"inputInstance\"\n v-model=\"textFieldValue\"\n :error-messages=\"errorMessageComputed\"\n :persistent-placeholder=\"true\"\n :placeholder=\"placeholderComputed\"\n class=\"a-datetime-picker\"\n :hide-details=\"hideDetails ? true : 'auto'\"\n :data-cy=\"dataCy.length ? dataCy : undefined\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n autocomplete=\"off\"\n @blur=\"onTextFieldBlur\"\n @focus=\"onTextFieldFocus\"\n @keyup.enter=\"onTextFieldBlur\"\n >\n <template #append-inner>\n <VIcon\n v-if=\"clearable && !readonly && defaultValue !== modelValue\"\n class=\"a-datetime-picker__clearable-icon\"\n icon=\"mdi-close-circle\"\n :aria-label=\"t('common.button.clear')\"\n @click.stop=\"onClear\"\n />\n <VMenu\n v-if=\"!disabled && !readonly\"\n location=\"bottom end\"\n origin=\"top end\"\n :close-on-content-click=\"false\"\n :model-value=\"pickerOpened\"\n @update:model-value=\"(value: boolean) => (pickerOpened = value)\"\n >\n <template #activator=\"{ props: menuProps }\">\n <VIcon\n class=\"a-datetime-picker__calendar-icon\"\n icon=\"mdi-calendar\"\n size=\"small\"\n :aria-label=\"t('$vuetify.datePicker.title')\"\n v-bind=\"menuProps\"\n @keydown.enter.space.prevent=\"togglePicker\"\n @keyup.enter.stop\n />\n </template>\n\n <VCard v-if=\"pickerOpened\">\n <VBtn\n v-tooltip=\"t('common.button.close')\"\n :aria-label=\"t('common.button.close')\"\n icon\n variant=\"text\"\n :width=\"36\"\n :height=\"36\"\n class=\"position-absolute top-0 right-0\"\n @click.stop=\"close\"\n >\n <VIcon\n icon=\"mdi-close\"\n color=\"white\"\n />\n </VBtn>\n <VDatePicker\n :key=\"pickerKey\"\n v-model=\"datePickerValue\"\n class=\"a-datetime-picker-calendar\"\n color=\"primary\"\n show-adjacent-months\n v-bind=\"$attrs\"\n @update:model-value=\"onDatePickerUpdate\"\n />\n <TimePicker\n v-if=\"type !== 'date'\"\n ref=\"timePickerInstance\"\n :key=\"timeKey\"\n v-model=\"timePickerValue\"\n @enter-keyup=\"onTimePickerEnterKeyup\"\n @focus-confirm=\"onFocusConfirm\"\n />\n <div class=\"d-flex\">\n <button\n v-if=\"!hideSetToNow\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"8\"\n @click=\"now\"\n >\n {{ type === 'date' ? t('common.time.today') : t('common.time.now') }}\n </button>\n <button\n ref=\"confirmRefButton\"\n type=\"button\"\n class=\"a-datetime-picker__bottom-button\"\n tabindex=\"7\"\n @click.stop=\"close\"\n >\n {{ t('common.button.confirm') }}\n </button>\n </div>\n </VCard>\n </VMenu>\n\n <div class=\"ml-1\">\n <slot name=\"append-inner\" />\n </div>\n </template>\n <template\n v-if=\"!hideLabel\"\n #label\n >\n {{ label\n }}<span\n v-if=\"required\"\n class=\"a-required-mark\"\n />\n </template>\n </VTextField>\n</template>\n\n<style lang=\"scss\" scoped>\n.a-datetime-picker {\n :deep(.v-field__append-inner .v-icon) {\n cursor: pointer;\n }\n\n &__calendar-icon {\n margin-top: 2px;\n opacity: 0.6 !important;\n }\n\n &__clearable-icon {\n opacity: 0 !important;\n }\n\n &:hover {\n .a-datetime-picker__clearable-icon {\n opacity: 0.6 !important;\n }\n }\n\n &__bottom-button {\n width: 100%;\n text-align: center;\n font-size: 0.86rem;\n font-family: Roboto, sans-serif;\n font-weight: bold;\n line-height: 1.8;\n padding: 6px 0;\n\n &:hover {\n background-color: rgb(0 0 0 / 5%);\n }\n }\n}\n\n.a-datetime-picker-calendar {\n :deep(.v-picker-title) {\n display: none;\n }\n\n :deep(.v-date-picker-header) {\n padding-top: 12px;\n }\n\n :deep(.v-date-picker-month) {\n padding-bottom: 2px;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFileDropzone.js","names":["_sfc_main","AFileDropzone_vue_vue_type_script_setup_true_lang_default","AFileDropzone_default"],"sources":["../../../../../src/domains/ui/file/components/AFileDropzone.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useDropZone } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useDropzoneGlobalDragState } from '@/domains/ui/file/composables/dropzone'\nimport { isNull } from '@/shared/utils/common'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useI18n } from 'vue-i18n'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n variant?: 'fill' | 'default' | 'fullscreen'\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n disabled?: boolean\n transparent?: boolean\n size?: 'small' | 'default' | 'large'\n hoverOnly?: boolean\n hideText?: boolean\n }>(),\n {\n variant: 'default',\n accept: undefined,\n maxSizes: undefined,\n disabled: false,\n transparent: false,\n size: 'default',\n hoverOnly: false,\n hideText: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'drop', files: File[]): void\n (e: 'click'): void\n}>()\n\nconst dropZoneRef = ref<HTMLDivElement>()\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\n\nfunction onDrop(files: File[] | null) {\n if (props.disabled) return\n if (isNull(files) || files.length === 0) return\n emit('drop', checkFormatsAndSizes(files))\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, onDrop)\n\nconst { isDraggingFile } = useDropzoneGlobalDragState()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"a-file-dropzone\"\n :class=\"{\n 'a-file-dropzone--bg': !transparent,\n 'a-file-dropzone--over': isOverDropZone && isDraggingFile,\n 'a-file-dropzone--possibility': isDraggingFile,\n 'a-file-dropzone--disabled': disabled,\n [`a-file-dropzone--${variant}`]: true,\n [`a-file-dropzone--${size}`]: true,\n [`a-file-dropzone--hover-only`]: hoverOnly,\n [`a-file-dropzone--hide-text`]: hideText,\n }\"\n @click.stop=\"emit('click')\"\n >\n <div\n v-if=\"disabled\"\n class=\"text\"\n />\n <div\n v-else-if=\"isDraggingFile\"\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropHere') }}\n </div>\n <div\n v-else\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropPossibility') }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-file-dropzone';\n\n.#{$class-name-root} {\n outline-offset: -4px;\n position: relative;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .text {\n padding: 6px;\n pointer-events: none;\n user-select: none;\n text-align: center;\n border-radius: 5px;\n }\n\n &--bg {\n width: 100%;\n }\n\n &--fullscreen {\n inset: 0;\n position: fixed;\n z-index: 9999;\n }\n\n &--small {\n min-height: 70px;\n\n .text {\n font-size: 0.75rem;\n line-height: 1.2;\n padding: 4px;\n }\n }\n\n &--default {\n min-height: 140px;\n }\n\n &--large {\n min-height: 210px;\n }\n\n &--fill {\n position: absolute !important;\n inset: 0;\n min-height: 40px;\n }\n\n &--hover-only {\n display: none;\n }\n\n &--hide-text .text,\n &--disabled .text {\n display: none;\n }\n\n &.#{$class-name-root}--hover-only.#{$class-name-root}--possibility {\n display: flex;\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n .text {\n background-color: rgb(212 212 212 / 50%);\n }\n\n &--bg {\n background-color: #d4d4d4;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #e5edf1;\n outline: 2px dashed #bacfd4;\n }\n\n // After `--possibility`, here and under the dark theme: a zone with the file over it has both classes, and of two\n // rules of the same weight the later one is drawn.\n &--over:not(&--disabled) {\n background-color: #dcedc8;\n outline: 2px dashed #7cb342;\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n .text {\n background-color: rgb(57 57 57 / 50%);\n }\n\n &--bg {\n background-color: #393939;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #212531;\n outline: 2px dashed #01579b;\n }\n\n &--over:not(&--disabled) {\n background-color: #283121;\n outline: 2px dashed #333e28;\n }\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"AFileDropzone.js","names":["_sfc_main","AFileDropzone_vue_vue_type_script_setup_true_lang_default","AFileDropzone_default"],"sources":["../../../../../src/domains/ui/file/components/AFileDropzone.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useDropZone } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useDropzoneGlobalDragState } from '@/domains/ui/file/composables/dropzone'\nimport { isNull } from '@/shared/utils/common'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useI18n } from 'vue-i18n'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n variant?: 'fill' | 'default' | 'fullscreen'\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n disabled?: boolean\n transparent?: boolean\n size?: 'small' | 'default' | 'large'\n hoverOnly?: boolean\n hideText?: boolean\n }>(),\n {\n variant: 'default',\n accept: undefined,\n maxSizes: undefined,\n disabled: false,\n transparent: false,\n size: 'default',\n hoverOnly: false,\n hideText: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'drop', files: File[]): void\n (e: 'click'): void\n}>()\n\nconst dropZoneRef = ref<HTMLDivElement>()\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\n\nfunction onDrop(files: File[] | null) {\n if (props.disabled) return\n if (isNull(files) || files.length === 0) return\n emit('drop', checkFormatsAndSizes(files))\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, onDrop)\n\nconst { isDraggingFile } = useDropzoneGlobalDragState()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"a-file-dropzone\"\n :class=\"{\n 'a-file-dropzone--bg': !transparent,\n 'a-file-dropzone--over': isOverDropZone && isDraggingFile,\n 'a-file-dropzone--possibility': isDraggingFile,\n 'a-file-dropzone--disabled': disabled,\n [`a-file-dropzone--${variant}`]: true,\n [`a-file-dropzone--${size}`]: true,\n [`a-file-dropzone--hover-only`]: hoverOnly,\n [`a-file-dropzone--hide-text`]: hideText,\n }\"\n @click.stop=\"emit('click')\"\n >\n <div\n v-if=\"disabled\"\n class=\"text\"\n />\n <div\n v-else-if=\"isDraggingFile\"\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropHere') }}\n </div>\n <div\n v-else\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropPossibility') }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-file-dropzone';\n\n.#{$class-name-root} {\n outline-offset: -4px;\n position: relative;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .text {\n padding: 6px;\n pointer-events: none;\n user-select: none;\n text-align: center;\n border-radius: 5px;\n }\n\n &--bg {\n width: 100%;\n }\n\n &--fullscreen {\n inset: 0;\n position: fixed;\n z-index: 9999;\n }\n\n &--small {\n min-height: 70px;\n\n .text {\n font-size: 0.75rem;\n line-height: 1.2;\n padding: 4px;\n }\n }\n\n &--default {\n min-height: 140px;\n }\n\n &--large {\n min-height: 210px;\n }\n\n &--fill {\n position: absolute !important;\n inset: 0;\n min-height: 40px;\n }\n\n &--hover-only {\n display: none;\n }\n\n &--hide-text .text,\n &--disabled .text {\n display: none;\n }\n\n &.#{$class-name-root}--hover-only.#{$class-name-root}--possibility {\n display: flex;\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n .text {\n background-color: rgb(212 212 212 / 50%);\n }\n\n &--bg {\n background-color: #d4d4d4;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #e5edf1;\n outline: 2px dashed #bacfd4;\n }\n\n // Must come after `--possibility`, here and under the dark theme. A zone with\n // a file over it has both classes, and the later rule of equal weight wins.\n &--over:not(&--disabled) {\n background-color: #dcedc8;\n outline: 2px dashed #7cb342;\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n .text {\n background-color: rgb(57 57 57 / 50%);\n }\n\n &--bg {\n background-color: #393939;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #212531;\n outline: 2px dashed #01579b;\n }\n\n &--over:not(&--disabled) {\n background-color: #283121;\n outline: 2px dashed #333e28;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -21,7 +21,7 @@ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {
21
21
  disabled: boolean;
22
22
  size: "small" | "default" | "large";
23
23
  accept: string;
24
- variant: "fill" | "default" | "fullscreen";
24
+ variant: "default" | "fill" | "fullscreen";
25
25
  transparent: boolean;
26
26
  maxSizes: Record<string, number>;
27
27
  hoverOnly: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AFileDropzone.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_withModifiers","_toDisplayString","_hoisted_1","_hoisted_2","_hoisted_3","AFileDropzone_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","dropZoneRef","ref","useFormatAndSizeCheck","onDrop","isNull","files","checkFormatsAndSizes","useDropZone","useDropzoneGlobalDragState","useI18n","openBlock","createElementBlock","normalizeClass","unref","isOverDropZone","isDraggingFile","_cache","withModifiers","toDisplayString","t"],"sources":["../../../../../src/domains/ui/file/components/AFileDropzone.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useDropZone } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useDropzoneGlobalDragState } from '@/domains/ui/file/composables/dropzone'\nimport { isNull } from '@/shared/utils/common'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useI18n } from 'vue-i18n'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n variant?: 'fill' | 'default' | 'fullscreen'\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n disabled?: boolean\n transparent?: boolean\n size?: 'small' | 'default' | 'large'\n hoverOnly?: boolean\n hideText?: boolean\n }>(),\n {\n variant: 'default',\n accept: undefined,\n maxSizes: undefined,\n disabled: false,\n transparent: false,\n size: 'default',\n hoverOnly: false,\n hideText: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'drop', files: File[]): void\n (e: 'click'): void\n}>()\n\nconst dropZoneRef = ref<HTMLDivElement>()\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\n\nfunction onDrop(files: File[] | null) {\n if (props.disabled) return\n if (isNull(files) || files.length === 0) return\n emit('drop', checkFormatsAndSizes(files))\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, onDrop)\n\nconst { isDraggingFile } = useDropzoneGlobalDragState()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"a-file-dropzone\"\n :class=\"{\n 'a-file-dropzone--bg': !transparent,\n 'a-file-dropzone--over': isOverDropZone && isDraggingFile,\n 'a-file-dropzone--possibility': isDraggingFile,\n 'a-file-dropzone--disabled': disabled,\n [`a-file-dropzone--${variant}`]: true,\n [`a-file-dropzone--${size}`]: true,\n [`a-file-dropzone--hover-only`]: hoverOnly,\n [`a-file-dropzone--hide-text`]: hideText,\n }\"\n @click.stop=\"emit('click')\"\n >\n <div\n v-if=\"disabled\"\n class=\"text\"\n />\n <div\n v-else-if=\"isDraggingFile\"\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropHere') }}\n </div>\n <div\n v-else\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropPossibility') }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-file-dropzone';\n\n.#{$class-name-root} {\n outline-offset: -4px;\n position: relative;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .text {\n padding: 6px;\n pointer-events: none;\n user-select: none;\n text-align: center;\n border-radius: 5px;\n }\n\n &--bg {\n width: 100%;\n }\n\n &--fullscreen {\n inset: 0;\n position: fixed;\n z-index: 9999;\n }\n\n &--small {\n min-height: 70px;\n\n .text {\n font-size: 0.75rem;\n line-height: 1.2;\n padding: 4px;\n }\n }\n\n &--default {\n min-height: 140px;\n }\n\n &--large {\n min-height: 210px;\n }\n\n &--fill {\n position: absolute !important;\n inset: 0;\n min-height: 40px;\n }\n\n &--hover-only {\n display: none;\n }\n\n &--hide-text .text,\n &--disabled .text {\n display: none;\n }\n\n &.#{$class-name-root}--hover-only.#{$class-name-root}--possibility {\n display: flex;\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n .text {\n background-color: rgb(212 212 212 / 50%);\n }\n\n &--bg {\n background-color: #d4d4d4;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #e5edf1;\n outline: 2px dashed #bacfd4;\n }\n\n // After `--possibility`, here and under the dark theme: a zone with the file over it has both classes, and of two\n // rules of the same weight the later one is drawn.\n &--over:not(&--disabled) {\n background-color: #dcedc8;\n outline: 2px dashed #7cb342;\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n .text {\n background-color: rgb(57 57 57 / 50%);\n }\n\n &--bg {\n background-color: #393939;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #212531;\n outline: 2px dashed #01579b;\n }\n\n &--over:not(&--disabled) {\n background-color: #283121;\n outline: 2px dashed #333e28;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWA,IAAMW,IAAQC,GAsBRC,IAAOH,GAKPI,IAAcC,EAAoB,GAElC,EAAE,4BAAyBC,QACzBL,EAAM,cACNA,EAAM,QACd;EAEA,SAASM,EAAO,GAAsB;GACpC,AAAIN,EAAM,YACNO,EAAOC,CAAK,KAAKA,EAAM,WAAW,KACtCN,EAAK,QAAQO,EAAqBD,CAAK,CAAC;EAC1C;EAEA,IAAM,EAAE,sBAAmBE,EAAYP,GAAaG,CAAM,GAEpD,EAAE,sBAAmBK,EAA2B,GAChD,EAAE,SAAMC,EAAQ;E,kBAIpBvB,EAAA,GAAAC,EA+BM,OAAA;GA9BA,SAAA;GAAJ,KAAIa;GACJ,OAAKZ,EAAA,CAAC,mBAAiB;IACiB,uBAAA,CAAAU,EAAA;IAA4C,yBAAAT,EAAAyB,CAAA,KAAkBzB,EAAA0B,CAAA;IAAsD,gCAAA1B,EAAA0B,CAAA;IAAmD,6BAAAjB,EAAA;KAAqC,oBAAAA,EAAA,YAAO;KAAsC,oBAAAA,EAAA,SAAI;IAAkD,+BAAAA,EAAA;IAAiD,8BAAAA,EAAA;;GAUvY,SAAK,AAAAkB,EAAA,OAAA1B,GAAA,MAAOS,EAAI,OAAA,GAAA,CAAA,MAAA,CAAA;E,IAGTD,EAAA,YADRZ,EAAA,GAAAC,EAGE,OAHFK,CAGE,KAEWH,EAAA0B,CAAA,KADb7B,EAAA,GAAAC,EAKM,OALNM,GAKMF,EADDF,EAAA8B,CAAA,CAAC,CAAA,iCAAA,CAAA,GAAA,CAAA,MAENjC,EAAA,GAAAC,EAKM,OALNO,GAKMH,EADDF,EAAA8B,CAAA,CAAC,CAAA,wCAAA,CAAA,GAAA,CAAA,E"}
1
+ {"version":3,"file":"AFileDropzone.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_withModifiers","_toDisplayString","_hoisted_1","_hoisted_2","_hoisted_3","AFileDropzone_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","dropZoneRef","ref","useFormatAndSizeCheck","onDrop","isNull","files","checkFormatsAndSizes","useDropZone","useDropzoneGlobalDragState","useI18n","openBlock","createElementBlock","normalizeClass","unref","isOverDropZone","isDraggingFile","_cache","withModifiers","toDisplayString","t"],"sources":["../../../../../src/domains/ui/file/components/AFileDropzone.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useDropZone } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useDropzoneGlobalDragState } from '@/domains/ui/file/composables/dropzone'\nimport { isNull } from '@/shared/utils/common'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useI18n } from 'vue-i18n'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n variant?: 'fill' | 'default' | 'fullscreen'\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n disabled?: boolean\n transparent?: boolean\n size?: 'small' | 'default' | 'large'\n hoverOnly?: boolean\n hideText?: boolean\n }>(),\n {\n variant: 'default',\n accept: undefined,\n maxSizes: undefined,\n disabled: false,\n transparent: false,\n size: 'default',\n hoverOnly: false,\n hideText: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'drop', files: File[]): void\n (e: 'click'): void\n}>()\n\nconst dropZoneRef = ref<HTMLDivElement>()\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\n\nfunction onDrop(files: File[] | null) {\n if (props.disabled) return\n if (isNull(files) || files.length === 0) return\n emit('drop', checkFormatsAndSizes(files))\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, onDrop)\n\nconst { isDraggingFile } = useDropzoneGlobalDragState()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"a-file-dropzone\"\n :class=\"{\n 'a-file-dropzone--bg': !transparent,\n 'a-file-dropzone--over': isOverDropZone && isDraggingFile,\n 'a-file-dropzone--possibility': isDraggingFile,\n 'a-file-dropzone--disabled': disabled,\n [`a-file-dropzone--${variant}`]: true,\n [`a-file-dropzone--${size}`]: true,\n [`a-file-dropzone--hover-only`]: hoverOnly,\n [`a-file-dropzone--hide-text`]: hideText,\n }\"\n @click.stop=\"emit('click')\"\n >\n <div\n v-if=\"disabled\"\n class=\"text\"\n />\n <div\n v-else-if=\"isDraggingFile\"\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropHere') }}\n </div>\n <div\n v-else\n class=\"text\"\n >\n {{ t('common.system.dropzone.dropPossibility') }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n$class-name-root: 'a-file-dropzone';\n\n.#{$class-name-root} {\n outline-offset: -4px;\n position: relative;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .text {\n padding: 6px;\n pointer-events: none;\n user-select: none;\n text-align: center;\n border-radius: 5px;\n }\n\n &--bg {\n width: 100%;\n }\n\n &--fullscreen {\n inset: 0;\n position: fixed;\n z-index: 9999;\n }\n\n &--small {\n min-height: 70px;\n\n .text {\n font-size: 0.75rem;\n line-height: 1.2;\n padding: 4px;\n }\n }\n\n &--default {\n min-height: 140px;\n }\n\n &--large {\n min-height: 210px;\n }\n\n &--fill {\n position: absolute !important;\n inset: 0;\n min-height: 40px;\n }\n\n &--hover-only {\n display: none;\n }\n\n &--hide-text .text,\n &--disabled .text {\n display: none;\n }\n\n &.#{$class-name-root}--hover-only.#{$class-name-root}--possibility {\n display: flex;\n }\n}\n\n.v-theme--light {\n .#{$class-name-root} {\n .text {\n background-color: rgb(212 212 212 / 50%);\n }\n\n &--bg {\n background-color: #d4d4d4;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #e5edf1;\n outline: 2px dashed #bacfd4;\n }\n\n // Must come after `--possibility`, here and under the dark theme. A zone with\n // a file over it has both classes, and the later rule of equal weight wins.\n &--over:not(&--disabled) {\n background-color: #dcedc8;\n outline: 2px dashed #7cb342;\n }\n }\n}\n\n.v-theme--dark {\n .#{$class-name-root} {\n .text {\n background-color: rgb(57 57 57 / 50%);\n }\n\n &--bg {\n background-color: #393939;\n }\n\n &--possibility:not(&--disabled) {\n background-color: #212531;\n outline: 2px dashed #01579b;\n }\n\n &--over:not(&--disabled) {\n background-color: #283121;\n outline: 2px dashed #333e28;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWA,IAAMW,IAAQC,GAsBRC,IAAOH,GAKPI,IAAcC,EAAoB,GAElC,EAAE,4BAAyBC,QACzBL,EAAM,cACNA,EAAM,QACd;EAEA,SAASM,EAAO,GAAsB;GACpC,AAAIN,EAAM,YACNO,EAAOC,CAAK,KAAKA,EAAM,WAAW,KACtCN,EAAK,QAAQO,EAAqBD,CAAK,CAAC;EAC1C;EAEA,IAAM,EAAE,sBAAmBE,EAAYP,GAAaG,CAAM,GAEpD,EAAE,sBAAmBK,EAA2B,GAChD,EAAE,SAAMC,EAAQ;E,kBAIpBvB,EAAA,GAAAC,EA+BM,OAAA;GA9BA,SAAA;GAAJ,KAAIa;GACJ,OAAKZ,EAAA,CAAC,mBAAiB;IACiB,uBAAA,CAAAU,EAAA;IAA4C,yBAAAT,EAAAyB,CAAA,KAAkBzB,EAAA0B,CAAA;IAAsD,gCAAA1B,EAAA0B,CAAA;IAAmD,6BAAAjB,EAAA;KAAqC,oBAAAA,EAAA,YAAO;KAAsC,oBAAAA,EAAA,SAAI;IAAkD,+BAAAA,EAAA;IAAiD,8BAAAA,EAAA;;GAUvY,SAAK,AAAAkB,EAAA,OAAA1B,GAAA,MAAOS,EAAI,OAAA,GAAA,CAAA,MAAA,CAAA;E,IAGTD,EAAA,YADRZ,EAAA,GAAAC,EAGE,OAHFK,CAGE,KAEWH,EAAA0B,CAAA,KADb7B,EAAA,GAAAC,EAKM,OALNM,GAKMF,EADDF,EAAA8B,CAAA,CAAC,CAAA,iCAAA,CAAA,GAAA,CAAA,MAENjC,EAAA,GAAAC,EAKM,OALNO,GAKMH,EADDF,EAAA8B,CAAA,CAAC,CAAA,wCAAA,CAAA,GAAA,CAAA,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFileInput.js","names":["_sfc_main","AFileInput_vue_vue_type_script_setup_true_lang_default","AFileInput_default"],"sources":["../../../../../src/domains/ui/file/components/AFileInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, withModifiers } from 'vue'\nimport { isBoolean, isUndefined } from '@/shared/utils/common'\nimport AFileDropzone from '@/domains/ui/file/components/AFileDropzone.vue'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n useDropzone?: boolean\n dropzoneVariant?: 'fill' | 'default' | 'fullscreen'\n onDropzoneClickCallback?: (() => void) | undefined | false // false for disable, undefined for browse files, otherwise custom callback is used\n hoverOnly?: boolean\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n useDropzone: false,\n dropzoneVariant: 'default',\n onDropzoneClickCallback: undefined,\n hoverOnly: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst BLOCK_DOUBLE_CLICK_MS = 200\n\nconst inputRef = ref<undefined | HTMLInputElement>(undefined)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst fileInputKeyLocal = ref(props.fileInputKey || 0)\nconst blockDoubleClick = ref(false)\n\nconst clickInput = () => {\n if (blockDoubleClick.value === true) {\n return\n }\n blockDoubleClick.value = true\n inputRef.value?.click()\n setTimeout(() => {\n blockDoubleClick.value = false\n }, BLOCK_DOUBLE_CLICK_MS)\n}\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\nconst { showWarningT } = useAlerts()\n\nconst validateData = (files: File[]) => {\n if (!props.multiple && files.length > 0) {\n const checked = checkFormatsAndSizes([files[0]!])\n emit('filesInput', checked)\n return\n }\n const checked = checkFormatsAndSizes(files)\n emit('filesInput', checked)\n}\n\nconst onDropzoneDrop = (files: File[]) => {\n if (props.multiple) {\n validateData(files)\n return\n }\n // One file is taken: the first the check lets through. Taken before the check, the first dropped lost a file\n // the check lets through whenever one it refuses was dropped before it.\n const checked = checkFormatsAndSizes(files)\n if (checked.length > 1) showWarningT('common.system.upload.onlyOneFile')\n emit('filesInput', checked.slice(0, 1))\n}\n\nconst onInputFileChange = (payload: Event) => {\n const event = payload as InputFileChangeEvent\n emit('change', event)\n validateData(Array.from(event.target?.files ?? []))\n // Handed over, or refused with its warning: emptied, the input tells of the same file when it is picked again. With\n // the value kept it told nothing until its host changed `fileInputKey`, which not every host is given.\n if (event.target) event.target.value = ''\n}\n\nconst onFileDropzoneClick = () => {\n if (isBoolean(props.onDropzoneClickCallback)) {\n return\n }\n if (isUndefined(props.onDropzoneClickCallback)) {\n clickInput()\n return\n }\n props.onDropzoneClickCallback()\n}\n\nwatch(\n () => props.fileInputKey,\n (newValue, oldValue) => {\n if (newValue === oldValue || isUndefined(newValue)) {\n return\n }\n fileInputKeyLocal.value = newValue\n }\n)\n\ndefineExpose({\n activate: clickInput,\n})\n</script>\n\n<template>\n <AFileDropzone\n v-if=\"useDropzone\"\n :variant=\"dropzoneVariant\"\n :hover-only=\"hoverOnly\"\n @click=\"onFileDropzoneClick\"\n @drop=\"onDropzoneDrop\"\n />\n <slot\n v-else\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => clickInput(), ['stop']) }\"\n />\n <input\n ref=\"inputRef\"\n :key=\"fileInputKeyLocal\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n hidden\n tabindex=\"-1\"\n type=\"file\"\n @change=\"onInputFileChange\"\n />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFileInput.js","names":["_sfc_main","AFileInput_vue_vue_type_script_setup_true_lang_default","AFileInput_default"],"sources":["../../../../../src/domains/ui/file/components/AFileInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, withModifiers } from 'vue'\nimport { isBoolean, isUndefined } from '@/shared/utils/common'\nimport AFileDropzone from '@/domains/ui/file/components/AFileDropzone.vue'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n useDropzone?: boolean\n dropzoneVariant?: 'fill' | 'default' | 'fullscreen'\n onDropzoneClickCallback?: (() => void) | undefined | false // false for disable, undefined for browse files, otherwise custom callback is used\n hoverOnly?: boolean\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n useDropzone: false,\n dropzoneVariant: 'default',\n onDropzoneClickCallback: undefined,\n hoverOnly: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst BLOCK_DOUBLE_CLICK_MS = 200\n\nconst inputRef = ref<undefined | HTMLInputElement>(undefined)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst fileInputKeyLocal = ref(props.fileInputKey || 0)\nconst blockDoubleClick = ref(false)\n\nconst clickInput = () => {\n if (blockDoubleClick.value === true) {\n return\n }\n blockDoubleClick.value = true\n inputRef.value?.click()\n setTimeout(() => {\n blockDoubleClick.value = false\n }, BLOCK_DOUBLE_CLICK_MS)\n}\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\nconst { showWarningT } = useAlerts()\n\nconst validateData = (files: File[]) => {\n if (!props.multiple && files.length > 0) {\n const checked = checkFormatsAndSizes([files[0]!])\n emit('filesInput', checked)\n return\n }\n const checked = checkFormatsAndSizes(files)\n emit('filesInput', checked)\n}\n\nconst onDropzoneDrop = (files: File[]) => {\n if (props.multiple) {\n validateData(files)\n return\n }\n // Take the first file that passes the check. Taking the first dropped\n // file before the check lost a valid file when a refused one came first.\n const checked = checkFormatsAndSizes(files)\n if (checked.length > 1) showWarningT('common.system.upload.onlyOneFile')\n emit('filesInput', checked.slice(0, 1))\n}\n\nconst onInputFileChange = (payload: Event) => {\n const event = payload as InputFileChangeEvent\n emit('change', event)\n validateData(Array.from(event.target?.files ?? []))\n // Clear the input after handing over or refusing the file, so picking the same file again fires a change.\n // Not every host changes `fileInputKey` to reset it.\n if (event.target) event.target.value = ''\n}\n\nconst onFileDropzoneClick = () => {\n if (isBoolean(props.onDropzoneClickCallback)) {\n return\n }\n if (isUndefined(props.onDropzoneClickCallback)) {\n clickInput()\n return\n }\n props.onDropzoneClickCallback()\n}\n\nwatch(\n () => props.fileInputKey,\n (newValue, oldValue) => {\n if (newValue === oldValue || isUndefined(newValue)) {\n return\n }\n fileInputKeyLocal.value = newValue\n }\n)\n\ndefineExpose({\n activate: clickInput,\n})\n</script>\n\n<template>\n <AFileDropzone\n v-if=\"useDropzone\"\n :variant=\"dropzoneVariant\"\n :hover-only=\"hoverOnly\"\n @click=\"onFileDropzoneClick\"\n @drop=\"onDropzoneDrop\"\n />\n <slot\n v-else\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => clickInput(), ['stop']) }\"\n />\n <input\n ref=\"inputRef\"\n :key=\"fileInputKeyLocal\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n hidden\n tabindex=\"-1\"\n type=\"file\"\n @change=\"onInputFileChange\"\n />\n</template>\n"],"mappings":""}
@@ -12,14 +12,16 @@ type __VLS_Props = {
12
12
  onDropzoneClickCallback?: (() => void) | undefined | false;
13
13
  hoverOnly?: boolean;
14
14
  };
15
- declare var __VLS_9: {
16
- props: {
17
- onClick: () => void;
15
+ declare const __VLS_template: () => {
16
+ __VLS_Slots: {
17
+ activator?: (props: {
18
+ props: {
19
+ onClick: () => void;
20
+ };
21
+ }) => any;
18
22
  };
19
23
  };
20
- type __VLS_Slots = {} & {
21
- activator?: (props: typeof __VLS_9) => any;
22
- };
24
+ type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
23
25
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
24
26
  activate: () => void;
25
27
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
@@ -35,7 +37,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
35
37
  hoverOnly: boolean;
36
38
  fileInputKey: number;
37
39
  useDropzone: boolean;
38
- dropzoneVariant: "fill" | "default" | "fullscreen";
40
+ dropzoneVariant: "default" | "fill" | "fullscreen";
39
41
  onDropzoneClickCallback: false | (() => void);
40
42
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
41
43
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1 +1 @@
1
- {"version":3,"file":"AFileInput.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","AFileDropzone","_renderSlot","AFileDropzone_default","_hoisted_1","BLOCK_DOUBLE_CLICK_MS","AFileInput_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","inputRef","ref","fileInputKeyLocal","blockDoubleClick","clickInput","useFormatAndSizeCheck","useAlerts","validateData","files","checked","checkFormatsAndSizes","onDropzoneDrop","showWarningT","onInputFileChange","event","payload","onFileDropzoneClick","isBoolean","isUndefined","watch","newValue","oldValue","openBlock","createElementBlock","Fragment","createBlock","renderSlot","_ctx","withModifiers"],"sources":["../../../../../src/domains/ui/file/components/AFileInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, withModifiers } from 'vue'\nimport { isBoolean, isUndefined } from '@/shared/utils/common'\nimport AFileDropzone from '@/domains/ui/file/components/AFileDropzone.vue'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n useDropzone?: boolean\n dropzoneVariant?: 'fill' | 'default' | 'fullscreen'\n onDropzoneClickCallback?: (() => void) | undefined | false // false for disable, undefined for browse files, otherwise custom callback is used\n hoverOnly?: boolean\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n useDropzone: false,\n dropzoneVariant: 'default',\n onDropzoneClickCallback: undefined,\n hoverOnly: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst BLOCK_DOUBLE_CLICK_MS = 200\n\nconst inputRef = ref<undefined | HTMLInputElement>(undefined)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst fileInputKeyLocal = ref(props.fileInputKey || 0)\nconst blockDoubleClick = ref(false)\n\nconst clickInput = () => {\n if (blockDoubleClick.value === true) {\n return\n }\n blockDoubleClick.value = true\n inputRef.value?.click()\n setTimeout(() => {\n blockDoubleClick.value = false\n }, BLOCK_DOUBLE_CLICK_MS)\n}\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\nconst { showWarningT } = useAlerts()\n\nconst validateData = (files: File[]) => {\n if (!props.multiple && files.length > 0) {\n const checked = checkFormatsAndSizes([files[0]!])\n emit('filesInput', checked)\n return\n }\n const checked = checkFormatsAndSizes(files)\n emit('filesInput', checked)\n}\n\nconst onDropzoneDrop = (files: File[]) => {\n if (props.multiple) {\n validateData(files)\n return\n }\n // One file is taken: the first the check lets through. Taken before the check, the first dropped lost a file\n // the check lets through whenever one it refuses was dropped before it.\n const checked = checkFormatsAndSizes(files)\n if (checked.length > 1) showWarningT('common.system.upload.onlyOneFile')\n emit('filesInput', checked.slice(0, 1))\n}\n\nconst onInputFileChange = (payload: Event) => {\n const event = payload as InputFileChangeEvent\n emit('change', event)\n validateData(Array.from(event.target?.files ?? []))\n // Handed over, or refused with its warning: emptied, the input tells of the same file when it is picked again. With\n // the value kept it told nothing until its host changed `fileInputKey`, which not every host is given.\n if (event.target) event.target.value = ''\n}\n\nconst onFileDropzoneClick = () => {\n if (isBoolean(props.onDropzoneClickCallback)) {\n return\n }\n if (isUndefined(props.onDropzoneClickCallback)) {\n clickInput()\n return\n }\n props.onDropzoneClickCallback()\n}\n\nwatch(\n () => props.fileInputKey,\n (newValue, oldValue) => {\n if (newValue === oldValue || isUndefined(newValue)) {\n return\n }\n fileInputKeyLocal.value = newValue\n }\n)\n\ndefineExpose({\n activate: clickInput,\n})\n</script>\n\n<template>\n <AFileDropzone\n v-if=\"useDropzone\"\n :variant=\"dropzoneVariant\"\n :hover-only=\"hoverOnly\"\n @click=\"onFileDropzoneClick\"\n @drop=\"onDropzoneDrop\"\n />\n <slot\n v-else\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => clickInput(), ['stop']) }\"\n />\n <input\n ref=\"inputRef\"\n :key=\"fileInputKeyLocal\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n hidden\n tabindex=\"-1\"\n type=\"file\"\n @change=\"onInputFileChange\"\n />\n</template>\n"],"mappings":";;;;;;A,gCAuCMQ,IAAwB,K;;;;;;;;;;;;;;;;;;;;;;;;;;EA5B9B,IAAMI,IAAQC,GAuBRC,IAAOH,GAOPI,IAAWC,EAAkC,KAAA,CAAS,GAEtDC,IAAoBD,EAAIJ,EAAM,gBAAgB,CAAC,GAC/CM,IAAmBF,EAAI,EAAK,GAE5BG,UAAmB;GACvB,AAAID,EAAiB,UAAU,OAG/B,EAAiB,QAAQ,IACzBH,EAAS,OAAO,MAAM,GACtB,iBAAiB;IACf,EAAiB,QAAQ;GAC3B,GAAGP,CAAqB;EAC1B,GAEM,EAAE,4BAAyBY,QACzBR,EAAM,cACNA,EAAM,QACd,GACM,EAAE,oBAAiBS,EAAU,GAE7BC,KAAgB,MAAkB;GACtC,IAAI,CAACV,EAAM,YAAYW,EAAM,SAAS,GAAG;IACvC,IAAMC,IAAUC,EAAqB,CAACF,EAAM,EAAG,CAAC;IAChD,EAAK,cAAcC,CAAO;IAC1B;GACF;GACA,IAAMA,IAAUC,EAAqBF,CAAK;GAC1C,EAAK,cAAcC,CAAO;EAC5B,GAEME,KAAkB,MAAkB;GACxC,IAAId,EAAM,UAAU;IAClB,EAAaW,CAAK;IAClB;GACF;GAGA,IAAMC,IAAUC,EAAqBF,CAAK;GAE1C,AADIC,EAAQ,SAAS,KAAGG,EAAa,kCAAkC,GACvEb,EAAK,cAAcU,EAAQ,MAAM,GAAG,CAAC,CAAC;EACxC,GAEMI,KAAqB,MAAmB;GAC5C,IAAMC,IAAQC;GAKd,AAJAhB,EAAK,UAAUe,CAAK,GACpBP,EAAa,MAAM,KAAKO,EAAM,QAAQ,SAAS,CAAC,CAAC,CAAC,GAG9CA,EAAM,WAAQ,EAAM,OAAO,QAAQ;EACzC,GAEME,UAA4B;GAChC,AAAIC,EAAUpB,EAAM,uBAAuB,MAGvCqB,EAAYrB,EAAM,uBAAuB,IAC3CO,EAAW,IAGbP,EAAM,wBAAwB;EAChC;E,OAEAsB,QACQtB,EAAM,eACX,GAAU,MAAa;GACtB,AAAIuB,MAAaC,KAAYH,EAAYE,CAAQ,MAGjD,EAAkB,QAAQA;EAC5B,CACF,GAEAzB,EAAa,EACX,UAAUS,EACZ,CAAC,I,2BAKSN,EAAA,eADRb,EAAA,GAAAG,EAMEC,GAAA;;GAJC,SAASS,EAAA;GACT,cAAYA,EAAA;GACZ,SAAOkB;GACP,QAAML;E,0CAETrB,EAIEqC,EAAA,QAAA,aAAA,EADC,OAAK,EAAA,SAAaC,QAAoBxB,EAAU,GAAA,CAAA,MAAA,CAAA,EAAA,E,wBAEnDnB,EAAA,GAAAC,EASE,SAAA;GARI,SAAA;GAAJ,KAAIc;GACH,KAAKE,EAAA;GACL,QAAQJ,EAAA;GACR,UAAUA,EAAA;GACX,QAAA;GACA,UAAS;GACT,MAAK;GACJ,UAAQe"}
1
+ {"version":3,"file":"AFileInput.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","AFileDropzone","_renderSlot","AFileDropzone_default","_hoisted_1","BLOCK_DOUBLE_CLICK_MS","AFileInput_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","inputRef","ref","fileInputKeyLocal","blockDoubleClick","clickInput","useFormatAndSizeCheck","useAlerts","validateData","files","checked","checkFormatsAndSizes","onDropzoneDrop","showWarningT","onInputFileChange","event","payload","onFileDropzoneClick","isBoolean","isUndefined","watch","newValue","oldValue","openBlock","createElementBlock","Fragment","createBlock","renderSlot","_ctx","withModifiers"],"sources":["../../../../../src/domains/ui/file/components/AFileInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, withModifiers } from 'vue'\nimport { isBoolean, isUndefined } from '@/shared/utils/common'\nimport AFileDropzone from '@/domains/ui/file/components/AFileDropzone.vue'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { useFormatAndSizeCheck } from '@/domains/ui/file/composables/formatAndSizeCheck'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nconst props = withDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n useDropzone?: boolean\n dropzoneVariant?: 'fill' | 'default' | 'fullscreen'\n onDropzoneClickCallback?: (() => void) | undefined | false // false for disable, undefined for browse files, otherwise custom callback is used\n hoverOnly?: boolean\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n useDropzone: false,\n dropzoneVariant: 'default',\n onDropzoneClickCallback: undefined,\n hoverOnly: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst BLOCK_DOUBLE_CLICK_MS = 200\n\nconst inputRef = ref<undefined | HTMLInputElement>(undefined)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst fileInputKeyLocal = ref(props.fileInputKey || 0)\nconst blockDoubleClick = ref(false)\n\nconst clickInput = () => {\n if (blockDoubleClick.value === true) {\n return\n }\n blockDoubleClick.value = true\n inputRef.value?.click()\n setTimeout(() => {\n blockDoubleClick.value = false\n }, BLOCK_DOUBLE_CLICK_MS)\n}\n\nconst { checkFormatsAndSizes } = useFormatAndSizeCheck(\n () => props.accept,\n () => props.maxSizes\n)\nconst { showWarningT } = useAlerts()\n\nconst validateData = (files: File[]) => {\n if (!props.multiple && files.length > 0) {\n const checked = checkFormatsAndSizes([files[0]!])\n emit('filesInput', checked)\n return\n }\n const checked = checkFormatsAndSizes(files)\n emit('filesInput', checked)\n}\n\nconst onDropzoneDrop = (files: File[]) => {\n if (props.multiple) {\n validateData(files)\n return\n }\n // Take the first file that passes the check. Taking the first dropped\n // file before the check lost a valid file when a refused one came first.\n const checked = checkFormatsAndSizes(files)\n if (checked.length > 1) showWarningT('common.system.upload.onlyOneFile')\n emit('filesInput', checked.slice(0, 1))\n}\n\nconst onInputFileChange = (payload: Event) => {\n const event = payload as InputFileChangeEvent\n emit('change', event)\n validateData(Array.from(event.target?.files ?? []))\n // Clear the input after handing over or refusing the file, so picking the same file again fires a change.\n // Not every host changes `fileInputKey` to reset it.\n if (event.target) event.target.value = ''\n}\n\nconst onFileDropzoneClick = () => {\n if (isBoolean(props.onDropzoneClickCallback)) {\n return\n }\n if (isUndefined(props.onDropzoneClickCallback)) {\n clickInput()\n return\n }\n props.onDropzoneClickCallback()\n}\n\nwatch(\n () => props.fileInputKey,\n (newValue, oldValue) => {\n if (newValue === oldValue || isUndefined(newValue)) {\n return\n }\n fileInputKeyLocal.value = newValue\n }\n)\n\ndefineExpose({\n activate: clickInput,\n})\n</script>\n\n<template>\n <AFileDropzone\n v-if=\"useDropzone\"\n :variant=\"dropzoneVariant\"\n :hover-only=\"hoverOnly\"\n @click=\"onFileDropzoneClick\"\n @drop=\"onDropzoneDrop\"\n />\n <slot\n v-else\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => clickInput(), ['stop']) }\"\n />\n <input\n ref=\"inputRef\"\n :key=\"fileInputKeyLocal\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n hidden\n tabindex=\"-1\"\n type=\"file\"\n @change=\"onInputFileChange\"\n />\n</template>\n"],"mappings":";;;;;;A,gCAuCMQ,IAAwB,K;;;;;;;;;;;;;;;;;;;;;;;;;;EA5B9B,IAAMI,IAAQC,GAuBRC,IAAOH,GAOPI,IAAWC,EAAkC,KAAA,CAAS,GAEtDC,IAAoBD,EAAIJ,EAAM,gBAAgB,CAAC,GAC/CM,IAAmBF,EAAI,EAAK,GAE5BG,UAAmB;GACvB,AAAID,EAAiB,UAAU,OAG/B,EAAiB,QAAQ,IACzBH,EAAS,OAAO,MAAM,GACtB,iBAAiB;IACf,EAAiB,QAAQ;GAC3B,GAAGP,CAAqB;EAC1B,GAEM,EAAE,4BAAyBY,QACzBR,EAAM,cACNA,EAAM,QACd,GACM,EAAE,oBAAiBS,EAAU,GAE7BC,KAAgB,MAAkB;GACtC,IAAI,CAACV,EAAM,YAAYW,EAAM,SAAS,GAAG;IACvC,IAAMC,IAAUC,EAAqB,CAACF,EAAM,EAAG,CAAC;IAChD,EAAK,cAAcC,CAAO;IAC1B;GACF;GACA,IAAMA,IAAUC,EAAqBF,CAAK;GAC1C,EAAK,cAAcC,CAAO;EAC5B,GAEME,KAAkB,MAAkB;GACxC,IAAId,EAAM,UAAU;IAClB,EAAaW,CAAK;IAClB;GACF;GAGA,IAAMC,IAAUC,EAAqBF,CAAK;GAE1C,AADIC,EAAQ,SAAS,KAAGG,EAAa,kCAAkC,GACvEb,EAAK,cAAcU,EAAQ,MAAM,GAAG,CAAC,CAAC;EACxC,GAEMI,KAAqB,MAAmB;GAC5C,IAAMC,IAAQC;GAKd,AAJAhB,EAAK,UAAUe,CAAK,GACpBP,EAAa,MAAM,KAAKO,EAAM,QAAQ,SAAS,CAAC,CAAC,CAAC,GAG9CA,EAAM,WAAQ,EAAM,OAAO,QAAQ;EACzC,GAEME,UAA4B;GAChC,AAAIC,EAAUpB,EAAM,uBAAuB,MAGvCqB,EAAYrB,EAAM,uBAAuB,IAC3CO,EAAW,IAGbP,EAAM,wBAAwB;EAChC;E,OAEAsB,QACQtB,EAAM,eACX,GAAU,MAAa;GACtB,AAAIuB,MAAaC,KAAYH,EAAYE,CAAQ,MAGjD,EAAkB,QAAQA;EAC5B,CACF,GAEAzB,EAAa,EACX,UAAUS,EACZ,CAAC,I,2BAKSN,EAAA,eADRb,EAAA,GAAAG,EAMEC,GAAA;;GAJC,SAASS,EAAA;GACT,cAAYA,EAAA;GACZ,SAAOkB;GACP,QAAML;E,0CAETrB,EAIEqC,EAAA,QAAA,aAAA,EADC,OAAK,EAAA,SAAaC,QAAoBxB,EAAU,GAAA,CAAA,MAAA,CAAA,EAAA,E,wBAEnDnB,EAAA,GAAAC,EASE,SAAA;GARI,SAAA;GAAJ,KAAIc;GACH,KAAKE,EAAA;GACL,QAAQJ,EAAA;GACR,UAAUA,EAAA;GACX,QAAA;GACA,UAAS;GACT,MAAK;GACJ,UAAQe"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFileInputDialog.js","names":["_sfc_main","AFileInputDialog_vue_vue_type_script_setup_true_lang_default","AFileInputDialog_default"],"sources":["../../../../../src/domains/ui/file/components/AFileInputDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport AFileInput from '@/domains/ui/file/components/AFileInput.vue'\nimport type { VBtn } from 'vuetify/components'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { nextTick, ref } from 'vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nwithDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n toolbarT?: string\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n toolbarT: 'common.button.upload',\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst modelValue = defineModel<boolean>({ default: false, required: false })\n\nconst onClose = () => {\n modelValue.value = false\n}\n\nconst { t } = useI18n()\n\nconst fileInputComponent = ref<InstanceType<typeof AFileInput> | null>(null)\n\nconst onFilesInput = (files: File[]) => {\n emit('filesInput', files)\n modelValue.value = false\n}\n\n// Opens the file choice straight away, as a click on the input would. The input lives in the dialog, so the dialog\n// opens first; the choice still comes within the same click, which the browser requires.\nconst activate = async () => {\n modelValue.value = true\n await nextTick()\n fileInputComponent.value?.activate()\n}\n\ndefineExpose({\n activate,\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"modelValue\"\n persistent\n :max-width=\"500\"\n @update:model-value=\"modelValue = $event\"\n >\n <template #activator=\"{ props: dialogProps }\">\n <slot\n name=\"activator\"\n :props=\"dialogProps\"\n >\n <VBtn\n v-bind=\"dialogProps\"\n :text=\"t('common.button.open')\"\n />\n </slot>\n </template>\n <VCard\n v-if=\"modelValue\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @cancel=\"onClose\">\n <slot name=\"title\">\n {{ t(toolbarT) }}\n </slot>\n </ADialogToolbar>\n <VCardText>\n <ARow>\n <AFileInput\n ref=\"fileInputComponent\"\n :file-input-key=\"fileInputKey\"\n :accept=\"accept\"\n :max-sizes=\"maxSizes\"\n :multiple=\"multiple\"\n use-dropzone\n @files-input=\"onFilesInput\"\n @change=\"emit('change', $event)\"\n />\n </ARow>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-close\"\n @click.stop=\"onClose\"\n >\n {{ t('common.button.close') }}\n </ABtnTertiary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFileInputDialog.js","names":["_sfc_main","AFileInputDialog_vue_vue_type_script_setup_true_lang_default","AFileInputDialog_default"],"sources":["../../../../../src/domains/ui/file/components/AFileInputDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport AFileInput from '@/domains/ui/file/components/AFileInput.vue'\nimport type { VBtn } from 'vuetify/components'\nimport type { InputFileChangeEvent } from '@/shared/types/ChangeEvent'\nimport { nextTick, ref } from 'vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\n\n/**\n * For accept and maxSizes check docs {@see useFormatAndSizeCheck}\n */\nwithDefaults(\n defineProps<{\n fileInputKey?: number | undefined\n accept?: string | undefined\n maxSizes?: Record<string, number> | undefined\n multiple?: boolean\n toolbarT?: string\n }>(),\n {\n fileInputKey: undefined,\n accept: undefined,\n maxSizes: undefined,\n multiple: false,\n toolbarT: 'common.button.upload',\n }\n)\n\nconst emit = defineEmits<{\n (e: 'change', event: InputFileChangeEvent): void\n (e: 'filesInput', files: File[]): void\n}>()\n\nconst modelValue = defineModel<boolean>({ default: false, required: false })\n\nconst onClose = () => {\n modelValue.value = false\n}\n\nconst { t } = useI18n()\n\nconst fileInputComponent = ref<InstanceType<typeof AFileInput> | null>(null)\n\nconst onFilesInput = (files: File[]) => {\n emit('filesInput', files)\n modelValue.value = false\n}\n\n// Opens the file picker like a click on the input. The input lives in the dialog, so the dialog opens first.\n// The picker must still open within the same click, which the browser requires.\nconst activate = async () => {\n modelValue.value = true\n await nextTick()\n fileInputComponent.value?.activate()\n}\n\ndefineExpose({\n activate,\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"modelValue\"\n persistent\n :max-width=\"500\"\n @update:model-value=\"modelValue = $event\"\n >\n <template #activator=\"{ props: dialogProps }\">\n <slot\n name=\"activator\"\n :props=\"dialogProps\"\n >\n <VBtn\n v-bind=\"dialogProps\"\n :text=\"t('common.button.open')\"\n />\n </slot>\n </template>\n <VCard\n v-if=\"modelValue\"\n data-cy=\"create-panel\"\n >\n <ADialogToolbar @cancel=\"onClose\">\n <slot name=\"title\">\n {{ t(toolbarT) }}\n </slot>\n </ADialogToolbar>\n <VCardText>\n <ARow>\n <AFileInput\n ref=\"fileInputComponent\"\n :file-input-key=\"fileInputKey\"\n :accept=\"accept\"\n :max-sizes=\"maxSizes\"\n :multiple=\"multiple\"\n use-dropzone\n @files-input=\"onFilesInput\"\n @change=\"emit('change', $event)\"\n />\n </ARow>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-close\"\n @click.stop=\"onClose\"\n >\n {{ t('common.button.close') }}\n </ABtnTertiary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}