@anzusystems/common-admin 2.0.0-rc.4 → 2.0.0-rc.6

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 (680) hide show
  1. package/README.md +1 -1
  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.vue.d.ts +17 -15
  424. package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
  425. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  426. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
  427. package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
  428. package/dist/domains/filters/composables/filterFactory.js +38 -31
  429. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  430. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  431. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
  432. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
  433. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  434. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
  435. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  436. package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
  437. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  438. package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
  439. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  440. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  441. package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
  442. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  443. package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
  444. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  445. package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
  446. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  447. package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
  448. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
  449. package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
  450. package/dist/domains/job/api/jobApi.js.map +1 -1
  451. package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
  452. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  453. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  454. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  455. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
  456. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  457. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  458. package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
  459. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  460. package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
  461. package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
  462. package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
  463. package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
  464. package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
  465. package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
  466. package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
  467. package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
  468. package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
  469. package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
  470. package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
  471. package/dist/domains/log/api/logApi.d.ts +2 -3
  472. package/dist/domains/log/api/logApi.js.map +1 -1
  473. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  474. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  475. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  476. package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
  477. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  478. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  479. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  480. package/dist/domains/log/components/ALogListView.js.map +1 -1
  481. package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
  482. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  483. package/dist/domains/log/composables/logActions.d.ts +4 -5
  484. package/dist/domains/log/composables/logActions.js.map +1 -1
  485. package/dist/domains/log/composables/logType.d.ts +6 -7
  486. package/dist/domains/log/composables/logType.js.map +1 -1
  487. package/dist/domains/log/filter/logFilter.d.ts +8 -11
  488. package/dist/domains/log/filter/logFilter.js.map +1 -1
  489. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  490. package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
  491. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  492. package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
  493. package/dist/domains/permission/composables/permissionActions.js.map +1 -1
  494. package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
  495. package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
  496. package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
  497. package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
  498. package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
  499. package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
  500. package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
  501. package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
  502. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  503. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
  504. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  505. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  506. package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
  507. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  508. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  509. package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
  510. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  511. package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
  512. package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
  513. package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
  514. package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
  515. package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
  516. package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
  517. package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
  518. package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
  519. package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
  520. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  521. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  522. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  523. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  524. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  525. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  526. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
  527. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
  528. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
  529. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
  530. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  531. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  532. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
  533. package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
  534. package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
  535. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  536. package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
  537. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  538. package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
  539. package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
  540. package/dist/domains/system/components/AAlerts.js.map +1 -1
  541. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  542. package/dist/domains/system/composables/alerts.js.map +1 -1
  543. package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
  544. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  545. package/dist/domains/system/composables/languageSettings.js.map +1 -1
  546. package/dist/domains/system/composables/loginStatus.js.map +1 -1
  547. package/dist/domains/system/composables/navigationError.d.ts +6 -8
  548. package/dist/domains/system/composables/navigationError.js.map +1 -1
  549. package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
  550. package/dist/domains/system/composables/pageNavigation.js.map +1 -1
  551. package/dist/domains/system/composables/recordActions.d.ts +14 -22
  552. package/dist/domains/system/composables/recordActions.js.map +1 -1
  553. package/dist/domains/system/composables/recordPage.d.ts +23 -38
  554. package/dist/domains/system/composables/recordPage.js.map +1 -1
  555. package/dist/domains/system/composables/routeHistory.d.ts +4 -5
  556. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  557. package/dist/domains/system/composables/sentry.js.map +1 -1
  558. package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
  559. package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
  560. package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
  561. package/dist/domains/system/store/datatablePageStore.js +10 -3
  562. package/dist/domains/system/store/datatablePageStore.js.map +1 -1
  563. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  564. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  565. package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
  566. package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
  567. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  568. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
  569. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
  570. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  571. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  572. package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
  573. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  574. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  575. package/dist/domains/ui/components/ACard.js.map +1 -1
  576. package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
  577. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
  578. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  579. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  580. package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
  581. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
  582. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  583. package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
  584. package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
  585. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  586. package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
  587. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  588. package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
  589. package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
  590. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  591. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  592. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  593. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
  594. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  595. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
  596. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  597. package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
  598. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  600. package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
  601. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
  602. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  603. package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
  604. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  606. package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
  607. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  608. package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
  609. package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
  610. package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
  611. package/dist/domains/ui/view/components/ALoginView.js +1 -1
  612. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  613. package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
  614. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  615. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  616. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  617. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  618. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  619. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
  620. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
  621. package/dist/lib.d.ts +2 -2
  622. package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
  623. package/dist/plugins/commonVuetifyConfig.js.map +1 -1
  624. package/dist/plugins/i18n.d.ts +4 -5
  625. package/dist/plugins/i18n.js.map +1 -1
  626. package/dist/plugins/pluginOptions.d.ts +4 -2
  627. package/dist/plugins/pluginOptions.js.map +1 -1
  628. package/dist/plugins/webfontloader.js.map +1 -1
  629. package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
  630. package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
  631. package/dist/shared/error/AnzuError.d.ts +3 -5
  632. package/dist/shared/error/AnzuError.js.map +1 -1
  633. package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
  634. package/dist/shared/error/AuthUnavailableError.js.map +1 -1
  635. package/dist/shared/error/isInCauseChain.d.ts +2 -2
  636. package/dist/shared/error/isInCauseChain.js.map +1 -1
  637. package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
  638. package/dist/shared/types/Validation.d.ts +4 -5
  639. package/dist/shared/types/common.d.ts +1 -3
  640. package/dist/shared/types/globalComponents.d.ts +5 -6
  641. package/dist/shared/utils/common.js.map +1 -1
  642. package/dist/shared/utils/datetime.d.ts +0 -1
  643. package/dist/shared/utils/datetime.js.map +1 -1
  644. package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
  645. package/dist/shared/utils/datetimePickerValue.js.map +1 -1
  646. package/dist/shared/utils/development.d.ts +3 -3
  647. package/dist/shared/utils/development.js.map +1 -1
  648. package/dist/shared/utils/envConfig.d.ts +4 -4
  649. package/dist/shared/utils/envConfig.js.map +1 -1
  650. package/dist/shared/utils/json.d.ts +1 -1
  651. package/dist/shared/utils/json.js.map +1 -1
  652. package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
  653. package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
  654. package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
  655. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
  656. package/dist/testing/appShell.d.ts +11 -11
  657. package/dist/testing/appShell.js.map +1 -1
  658. package/dist/testing/closeButtons.d.ts +9 -11
  659. package/dist/testing/closeButtons.js.map +1 -1
  660. package/dist/testing/declaredDependencies.d.ts +7 -7
  661. package/dist/testing/declaredDependencies.js.map +1 -1
  662. package/dist/testing/generatedRoutes.d.ts +6 -11
  663. package/dist/testing/generatedRoutes.js.map +1 -1
  664. package/dist/testing/routeHistory.d.ts +5 -12
  665. package/dist/testing/routeHistory.js.map +1 -1
  666. package/dist/testing/sortableLists.d.ts +16 -21
  667. package/dist/testing/sortableLists.js.map +1 -1
  668. package/dist/testing/typedRouter.d.ts +0 -1
  669. package/dist/testing/typedRouter.js.map +1 -1
  670. package/package.json +26 -26
  671. package/src/eslint/adminConfig.mjs +19 -27
  672. package/src/eslint/globalComponentNames.mjs +3 -4
  673. package/src/eslint/oxlint.mjs +7 -20
  674. package/src/eslint/plugin.d.mts +2 -4
  675. package/src/eslint/plugin.mjs +18 -34
  676. package/src/eslint/validRouteName.mjs +6 -7
  677. package/src/vite/devWatch.mjs +30 -43
  678. package/src/vite/index.d.mts +5 -5
  679. package/src/vite/sentry.mjs +7 -12
  680. package/src/vite/sourcemaps.mjs +4 -8
@@ -16,18 +16,20 @@ type __VLS_Props = {
16
16
  closable?: boolean;
17
17
  customTitleFn?: (cachedItem: any, defaultTitle: string, displayTextPath: string, fallbackIdText: boolean) => string | undefined;
18
18
  };
19
- declare var __VLS_1: {}, __VLS_3: {
20
- id: string | number;
21
- }, __VLS_18: {
22
- id: string | number;
23
- };
24
- type __VLS_Slots = {} & {
25
- empty?: (props: typeof __VLS_1) => any;
26
- } & {
27
- unresolved?: (props: typeof __VLS_3) => any;
28
- } & {
29
- unresolved?: (props: typeof __VLS_18) => any;
19
+ declare const __VLS_template: () => {
20
+ __VLS_Slots: {
21
+ empty?: (props: {}) => any;
22
+ } & {
23
+ unresolved?: (props: {
24
+ id: string | number;
25
+ }) => any;
26
+ } & {
27
+ unresolved?: (props: {
28
+ id: string | number;
29
+ }) => any;
30
+ };
30
31
  };
32
+ type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
31
33
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
32
34
  close: (id: string | number | null | undefined) => any;
33
35
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_createCommentVNode","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve has only its placeholder to show: its id, and no link to a\n// detail that would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_createCommentVNode","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve shows only its id placeholder.\n// It gets no link, because its detail would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import e from "../../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./ACachedUserChip.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  // src/domains/cached/components/ACachedUserChip.vue
5
- var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-c7614d6b"]]);
5
+ var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-c2700907"]]);
6
6
  export { n as default };
7
7
 
8
8
  //# sourceMappingURL=ACachedUserChip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedUserChip.js","names":["_sfc_main","_plugin_vue_export_helper_default","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","ACachedUserChip_default"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * The label, for a cache whose users carry a better one than `person.fullName` (a nickname). `any`,\n * because it reads the admin's own user, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** The name of the close, where Vuetify's defaults make the chip closable: \"Remove\", unless the admin names it. */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as it does in `defineCached`: a blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose: each admin maps its own users into the cache, and a mapper that\n// leaves the name or the e-mail out falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ACachedUserChip.js","names":["_sfc_main","_plugin_vue_export_helper_default","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","ACachedUserChip_default"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.\n * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** Label of the close button when Vuetify defaults make the chip closable. Defaults to \"Remove\". */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as in `defineCached`. A blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose. Each admin maps its own users into the cache.\n// A mapper that omits the name or e-mail falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":""}
@@ -8,12 +8,12 @@ type __VLS_Props = {
8
8
  routeName?: string | undefined;
9
9
  externalUrlTemplate?: string | undefined;
10
10
  /**
11
- * The label, for a cache whose users carry a better one than `person.fullName` (a nickname). `any`,
12
- * because it reads the admin's own user, which `AnzuUserMinimal` does not describe.
11
+ * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.
12
+ * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.
13
13
  */
14
14
  titleFn?: ((user: CachedItem<any>) => string) | undefined;
15
15
  disableClick?: boolean;
16
- /** The name of the close, where Vuetify's defaults make the chip closable: "Remove", unless the admin names it. */
16
+ /** Label of the close button when Vuetify defaults make the chip closable. Defaults to "Remove". */
17
17
  closeLabel?: string;
18
18
  };
19
19
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedUserChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_component_VTooltip","_normalizeClass","_withModifiers","AAnzuUserAvatar","_createCommentVNode","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","router","useRouter","useCachedItem","text","computed","user","cached","clickable","unresolved","appendIcon","COMMON_CONFIG","onClick","replaceUrlParameters","openBlock","createElementBlock","unref","createBlock","VChip","withCtx","createTextVNode","toDisplayString","createVNode","VTooltip","t","normalizeClass","withModifiers","loaded","createCommentVNode","VProgressCircular"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * The label, for a cache whose users carry a better one than `person.fullName` (a nickname). `any`,\n * because it reads the admin's own user, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** The name of the close, where Vuetify's defaults make the chip closable: \"Remove\", unless the admin names it. */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as it does in `defineCached`: a blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose: each admin maps its own users into the cache, and a mapper that\n// leaves the name or the e-mail out falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,IAAMmB,IAAQC,GAyBR,EAAE,SAAMC,EAAQ,GAChBC,IAASC,EAAU,GAEnB,EAAE,WAAQ,WAAQ,kBAAeC,QAAqBL,EAAM,KAAKA,EAAM,YAAYA,EAAM,EAAE,IAAI,KAAA,CAAU,GAIzGM,IAAOC,QAAe;GAC1B,IAAMC,IAAOC,EAAO;GAMpB,OALKD,KACSR,EAAM,UAAUA,EAAM,QAAQQ,CAAI,IAAI,QAEhDA,EAAK,QAAQ,WAAiBA,EAAK,OAAO,WAC1CA,EAAK,QAAcA,EAAK,MAAM,MAAM,GAAG,CAAC,CAAC,KACtC,MAAMR,EAAM,MALD;EAMpB,CAAC,GAEKU,IAAYH,QACV,CAACP,EAAM,gBAAgB,CAACW,EAAW,SAAS,CAAC,EAAEX,EAAM,uBAAuBA,EAAM,UAC1F,GAEMY,IAAaL,QAAe;GAChC,IAAKG,EAAU,OACf,OAAOV,EAAM,sBAAsBa,EAAc,KAAK,KAAK,gBAAgBA,EAAc,KAAK,KAAK;EACrG,CAAC,GAEKC,UAAgB;GACpB,AAAKJ,EAAU,SAAUV,EAAM,OAC3BA,EAAM,sBACR,OAAO,KAAKe,EAAqBf,EAAM,qBAAqB,EAAE,IAAIA,EAAM,GAAG,CAAC,GAAG,QAAQ,IAGrFA,EAAM,aAAWG,EAAO,KAAK;IAAE,MAAMH,EAAM;IAAW,QAAQ,EAAE,IAAIA,EAAM,GAAG;GAAE,CAAC;EACtF;E,kBAIEnB,EAAA,GAAAC,EAyCM,OAzCNe,GAyCM,CAxCSI,EAAA,KAEAlB,EAAA4B,CAAA,KADb9B,EAAA,GAAAG,EAcQC,GAAA;;GAZN,OAAM;GACN,MAAK;GACJ,eAAagB,EAAA;GACd,WAAQ;;GACT,SAAAf,QACE,CADFC,EAAA,OACEC,EAAGa,EAAA,EAAE,IAAG,KACT,CAAA,GAAAZ,EAKWC,GAAA;IAJT,WAAU;IACV,UAAS;;IAET,SAAAJ,QAAgD,CAA7CC,EAAAC,EAAAL,EAAA2C,CAAA,CAAC,CAAA,uCAAA,CAAA,GAAA,CAAA,C;;;;E,2BAGR7C,EAAA,GAAAG,EAuBQC,GAAA;;GArBN,OAAKM,EAAA,CAAC,QACEmB,EAAA,QAAS,KAAA,eAAA,CAAA;GACjB,MAAK;GACJ,eAAaE,EAAA;GACb,eAAaX,EAAA;GACb,SAAKT,EAAOsB,GAAO,CAAA,MAAA,CAAA;;GAEpB,SAAA5B,QAKE;IAJMH,EAAA8C,CAAA,KADRhD,EAAA,GAAAG,EAKES,GAAA;;KAHC,MAAMV,EAAA0B,CAAA;KACP,mBAAgB;KACf,MAAM;;IACPtB,EAAA,MACFC,EAAGkB,EAAA,KAAI,IAAG,KACV,CAAA;IACSvB,EAAA8C,CAAA,I,aADThD,EAAA,GAAAG,EAMEW,GAAA;;KAJC,MAAM;KACN,OAAO;KACR,eAAA;KACA,OAAM;;;;;;;;E,OArCVd,EAAA,GAAAC,EAAyB,QAAAgB,GAAR,GAAC,E"}
1
+ {"version":3,"file":"ACachedUserChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_component_VTooltip","_normalizeClass","_withModifiers","AAnzuUserAvatar","_createCommentVNode","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","router","useRouter","useCachedItem","text","computed","user","cached","clickable","unresolved","appendIcon","COMMON_CONFIG","onClick","replaceUrlParameters","openBlock","createElementBlock","unref","createBlock","VChip","withCtx","createTextVNode","toDisplayString","createVNode","VTooltip","t","normalizeClass","withModifiers","loaded","createCommentVNode","VProgressCircular"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.\n * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** Label of the close button when Vuetify defaults make the chip closable. Defaults to \"Remove\". */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as in `defineCached`. A blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose. Each admin maps its own users into the cache.\n// A mapper that omits the name or e-mail falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,IAAMmB,IAAQC,GAyBR,EAAE,SAAMC,EAAQ,GAChBC,IAASC,EAAU,GAEnB,EAAE,WAAQ,WAAQ,kBAAeC,QAAqBL,EAAM,KAAKA,EAAM,YAAYA,EAAM,EAAE,IAAI,KAAA,CAAU,GAIzGM,IAAOC,QAAe;GAC1B,IAAMC,IAAOC,EAAO;GAMpB,OALKD,KACSR,EAAM,UAAUA,EAAM,QAAQQ,CAAI,IAAI,QAEhDA,EAAK,QAAQ,WAAiBA,EAAK,OAAO,WAC1CA,EAAK,QAAcA,EAAK,MAAM,MAAM,GAAG,CAAC,CAAC,KACtC,MAAMR,EAAM,MALD;EAMpB,CAAC,GAEKU,IAAYH,QACV,CAACP,EAAM,gBAAgB,CAACW,EAAW,SAAS,CAAC,EAAEX,EAAM,uBAAuBA,EAAM,UAC1F,GAEMY,IAAaL,QAAe;GAChC,IAAKG,EAAU,OACf,OAAOV,EAAM,sBAAsBa,EAAc,KAAK,KAAK,gBAAgBA,EAAc,KAAK,KAAK;EACrG,CAAC,GAEKC,UAAgB;GACpB,AAAKJ,EAAU,SAAUV,EAAM,OAC3BA,EAAM,sBACR,OAAO,KAAKe,EAAqBf,EAAM,qBAAqB,EAAE,IAAIA,EAAM,GAAG,CAAC,GAAG,QAAQ,IAGrFA,EAAM,aAAWG,EAAO,KAAK;IAAE,MAAMH,EAAM;IAAW,QAAQ,EAAE,IAAIA,EAAM,GAAG;GAAE,CAAC;EACtF;E,kBAIEnB,EAAA,GAAAC,EAyCM,OAzCNe,GAyCM,CAxCSI,EAAA,KAEAlB,EAAA4B,CAAA,KADb9B,EAAA,GAAAG,EAcQC,GAAA;;GAZN,OAAM;GACN,MAAK;GACJ,eAAagB,EAAA;GACd,WAAQ;;GACT,SAAAf,QACE,CADFC,EAAA,OACEC,EAAGa,EAAA,EAAE,IAAG,KACT,CAAA,GAAAZ,EAKWC,GAAA;IAJT,WAAU;IACV,UAAS;;IAET,SAAAJ,QAAgD,CAA7CC,EAAAC,EAAAL,EAAA2C,CAAA,CAAC,CAAA,uCAAA,CAAA,GAAA,CAAA,C;;;;E,2BAGR7C,EAAA,GAAAG,EAuBQC,GAAA;;GArBN,OAAKM,EAAA,CAAC,QACEmB,EAAA,QAAS,KAAA,eAAA,CAAA;GACjB,MAAK;GACJ,eAAaE,EAAA;GACb,eAAaX,EAAA;GACb,SAAKT,EAAOsB,GAAO,CAAA,MAAA,CAAA;;GAEpB,SAAA5B,QAKE;IAJMH,EAAA8C,CAAA,KADRhD,EAAA,GAAAG,EAKES,GAAA;;KAHC,MAAMV,EAAA0B,CAAA;KACP,mBAAgB;KACf,MAAM;;IACPtB,EAAA,MACFC,EAAGkB,EAAA,KAAI,IAAG,KACV,CAAA;IACSvB,EAAA8C,CAAA,I,aADThD,EAAA,GAAAG,EAMEW,GAAA;;KAJC,MAAM;KACN,OAAO;KACR,eAAA;KACA,OAAM;;;;;;;;E,OArCVd,EAAA,GAAAC,EAAyB,QAAAgB,GAAR,GAAC,E"}
@@ -4,16 +4,16 @@ import { CachedItem } from './defineCached';
4
4
  import { UserAndTimeTrackingUsers } from '../../../shared/types/UserAndTimeTracking';
5
5
  export interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {
6
6
  /**
7
- * The admin's user cache composable, e.g. its `useCachedUsers`. Invoked inside the component's
8
- * setup, once, so the cache resolves in component scope.
7
+ * The admin's user cache composable, e.g. its `useCachedUsers`.
8
+ * Called once inside the component's setup, so the cache resolves in component scope.
9
9
  */
10
10
  useCachedUsers: () => UserAndTimeTrackingUsers<U>;
11
11
  /**
12
- * Named route of a user's detail (e.g. `'/(common)/users/[id]'`); without it the chip is no link. A function is read
13
- * on each render, so the link can follow the current user's permission for that route.
12
+ * Named route of a user's detail, e.g. `'/(common)/users/[id]'`. Without it the chip is not a link.
13
+ * A function is read on each render, so the link can follow the current user's permission for that route.
14
14
  */
15
15
  userRouteName?: string | (() => string | undefined);
16
- /** A user's detail in another admin, `:id` replaced; opens in a new tab. */
16
+ /** URL of a user's detail in another admin, with `:id` replaced. Opens in a new tab. */
17
17
  userExternalUrlTemplate?: string;
18
18
  /** The chip's label, for users that carry a better one than `person.fullName`. */
19
19
  userTitleFn?: (user: CachedItem<U>) => string;
@@ -21,11 +21,11 @@ export interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinima
21
21
  name?: string;
22
22
  }
23
23
  /**
24
- * Builds an admin's created / modified rows from its user cache and routes, so each admin's
25
- * `XTrackingFields.vue` is a single factory call over `AUserAndTimeTrackingFields`, as each
26
- * `CachedXChip.vue` is over `ACachedChip`. `hide-*` and the `user` slot fall through.
24
+ * Builds an admin's created / modified rows from its user cache and routes.
25
+ * Each admin's `XTrackingFields.vue` becomes one factory call over
26
+ * `AUserAndTimeTrackingFields`. `hide-*` props and the `user` slot fall through.
27
27
  *
28
- * Use in an SFC's plain `<script lang="ts">` (not `setup`):
28
+ * Use in an SFC's plain `<script lang="ts">`, not `setup`:
29
29
  * ```ts
30
30
  * export default createUserAndTimeTrackingFields({
31
31
  * useCachedUsers,
@@ -1 +1 @@
1
- {"version":3,"file":"createUserAndTimeTrackingFields.js","names":["AUserAndTimeTrackingFields","AUserAndTimeTrackingFields_default","createUserAndTimeTrackingFields","defineComponent","options","users","h","props","isFunction","attrs","slots"],"sources":["../../../../src/domains/cached/composables/createUserAndTimeTrackingFields.ts"],"sourcesContent":["import { type Component, defineComponent, h, type PropType } from 'vue'\nimport { isFunction } from '@/shared/utils/common'\nimport AUserAndTimeTrackingFields from '@/domains/ui/components/AUserAndTimeTrackingFields.vue'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\n\nexport interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {\n /**\n * The admin's user cache composable, e.g. its `useCachedUsers`. Invoked inside the component's\n * setup, once, so the cache resolves in component scope.\n */\n useCachedUsers: () => UserAndTimeTrackingUsers<U>\n /**\n * Named route of a user's detail (e.g. `'/(common)/users/[id]'`); without it the chip is no link. A function is read\n * on each render, so the link can follow the current user's permission for that route.\n */\n userRouteName?: string | (() => string | undefined)\n /** A user's detail in another admin, `:id` replaced; opens in a new tab. */\n userExternalUrlTemplate?: string\n /** The chip's label, for users that carry a better one than `person.fullName`. */\n userTitleFn?: (user: CachedItem<U>) => string\n /** Component name for devtools / warnings. */\n name?: string\n}\n\n/**\n * Builds an admin's created / modified rows from its user cache and routes, so each admin's\n * `XTrackingFields.vue` is a single factory call over `AUserAndTimeTrackingFields`, as each\n * `CachedXChip.vue` is over `ACachedChip`. `hide-*` and the `user` slot fall through.\n *\n * Use in an SFC's plain `<script lang=\"ts\">` (not `setup`):\n * ```ts\n * export default createUserAndTimeTrackingFields({\n * useCachedUsers,\n * userRouteName: '/(common)/users/[id]',\n * })\n * ```\n */\nexport function createUserAndTimeTrackingFields<U extends AnzuUserMinimal = AnzuUserMinimal>(\n options: CreateUserAndTimeTrackingFieldsOptions<U>\n): Component {\n return defineComponent({\n name: options.name ?? 'UserAndTimeTrackingFields',\n inheritAttrs: false,\n props: {\n data: { type: Object as PropType<UserAndTimeTrackingData>, required: true },\n },\n setup(props, { attrs, slots }) {\n const users = options.useCachedUsers()\n return () =>\n h(\n AUserAndTimeTrackingFields,\n {\n data: props.data,\n users,\n userRouteName: isFunction(options.userRouteName) ? options.userRouteName() : options.userRouteName,\n userExternalUrlTemplate: options.userExternalUrlTemplate,\n userTitleFn: options.userTitleFn,\n ...attrs,\n },\n slots\n )\n },\n })\n}\n"],"mappings":";;;;AAuCA,SAAgBE,EACd,GACW;CACX,OAAOC,EAAgB;EACrB,MAAMC,EAAQ,QAAQ;EACtB,cAAc;EACd,OAAO,EACL,MAAM;GAAE,MAAM;GAA6C,UAAU;EAAK,EAC5E;EACA,MAAM,GAAO,EAAE,UAAO,YAAS;GAC7B,IAAMC,IAAQD,EAAQ,eAAe;GACrC,aACEE,EACEN,GACA;IACE,MAAMO,EAAM;IACZ;IACA,eAAeC,EAAWJ,EAAQ,aAAa,IAAIA,EAAQ,cAAc,IAAIA,EAAQ;IACrF,yBAAyBA,EAAQ;IACjC,aAAaA,EAAQ;IACrB,GAAGK;GACL,GACAC,CACF;EACJ;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"createUserAndTimeTrackingFields.js","names":["AUserAndTimeTrackingFields","AUserAndTimeTrackingFields_default","createUserAndTimeTrackingFields","defineComponent","options","users","h","props","isFunction","attrs","slots"],"sources":["../../../../src/domains/cached/composables/createUserAndTimeTrackingFields.ts"],"sourcesContent":["import { type Component, defineComponent, h, type PropType } from 'vue'\nimport { isFunction } from '@/shared/utils/common'\nimport AUserAndTimeTrackingFields from '@/domains/ui/components/AUserAndTimeTrackingFields.vue'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\n\nexport interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {\n /**\n * The admin's user cache composable, e.g. its `useCachedUsers`.\n * Called once inside the component's setup, so the cache resolves in component scope.\n */\n useCachedUsers: () => UserAndTimeTrackingUsers<U>\n /**\n * Named route of a user's detail, e.g. `'/(common)/users/[id]'`. Without it the chip is not a link.\n * A function is read on each render, so the link can follow the current user's permission for that route.\n */\n userRouteName?: string | (() => string | undefined)\n /** URL of a user's detail in another admin, with `:id` replaced. Opens in a new tab. */\n userExternalUrlTemplate?: string\n /** The chip's label, for users that carry a better one than `person.fullName`. */\n userTitleFn?: (user: CachedItem<U>) => string\n /** Component name for devtools / warnings. */\n name?: string\n}\n\n/**\n * Builds an admin's created / modified rows from its user cache and routes.\n * Each admin's `XTrackingFields.vue` becomes one factory call over\n * `AUserAndTimeTrackingFields`. `hide-*` props and the `user` slot fall through.\n *\n * Use in an SFC's plain `<script lang=\"ts\">`, not `setup`:\n * ```ts\n * export default createUserAndTimeTrackingFields({\n * useCachedUsers,\n * userRouteName: '/(common)/users/[id]',\n * })\n * ```\n */\nexport function createUserAndTimeTrackingFields<U extends AnzuUserMinimal = AnzuUserMinimal>(\n options: CreateUserAndTimeTrackingFieldsOptions<U>\n): Component {\n return defineComponent({\n name: options.name ?? 'UserAndTimeTrackingFields',\n inheritAttrs: false,\n props: {\n data: { type: Object as PropType<UserAndTimeTrackingData>, required: true },\n },\n setup(props, { attrs, slots }) {\n const users = options.useCachedUsers()\n return () =>\n h(\n AUserAndTimeTrackingFields,\n {\n data: props.data,\n users,\n userRouteName: isFunction(options.userRouteName) ? options.userRouteName() : options.userRouteName,\n userExternalUrlTemplate: options.userExternalUrlTemplate,\n userTitleFn: options.userTitleFn,\n ...attrs,\n },\n slots\n )\n },\n })\n}\n"],"mappings":";;;;AAuCA,SAAgBE,EACd,GACW;CACX,OAAOC,EAAgB;EACrB,MAAMC,EAAQ,QAAQ;EACtB,cAAc;EACd,OAAO,EACL,MAAM;GAAE,MAAM;GAA6C,UAAU;EAAK,EAC5E;EACA,MAAM,GAAO,EAAE,UAAO,YAAS;GAC7B,IAAMC,IAAQD,EAAQ,eAAe;GACrC,aACEE,EACEN,GACA;IACE,MAAMO,EAAM;IACZ;IACA,eAAeC,EAAWJ,EAAQ,aAAa,IAAIA,EAAQ,cAAc,IAAIA,EAAQ;IACrF,yBAAyBA,EAAQ;IACjC,aAAaA,EAAQ;IACrB,GAAGK;GACL,GACAC,CACF;EACJ;CACF,CAAC;AACH"}
@@ -2,14 +2,14 @@ import { Ref } from 'vue';
2
2
  import { DocId, IntegerId } from '../../../shared/types/common';
3
3
  /**
4
4
  * Why a fetch settled without resolving an item:
5
- * - `notFound` -- the server answered and the item was not among the results,
6
- * - `forbidden` -- the user may not read it (403); asking again in this session cannot change that,
7
- * - `error` -- anything else: the network, a timeout, a 5xx, a 401 before the session is renewed, and a
8
- * 404 of the whole request, which is a route or a proxy answering rather than an item missing.
5
+ * - `notFound`: the server answered and the item was not among the results.
6
+ * - `forbidden`: the user may not read it (403). Asking again in this session cannot change that.
7
+ * - `error`: anything else. Network, timeout, 5xx, a 401 before session renewal,
8
+ * or a 404 of the whole request (a route or proxy answering, not a missing item).
9
9
  */
10
10
  export type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error';
11
11
  /**
12
- * `_unresolved`: the fetch settled without resolving the item, `_unresolvedReason` says why.
12
+ * `_unresolved`: the fetch settled without resolving the item. `_unresolvedReason` says why.
13
13
  * Whether a later `add()` asks again depends on the reason (see `defineCached`).
14
14
  */
15
15
  export type CachedItem<T extends object> = T & {
@@ -19,15 +19,17 @@ export type CachedItem<T extends object> = T & {
19
19
  };
20
20
  export interface DefineCachedOptions {
21
21
  /**
22
- * Ask again, on the next `add()`, for an id the server did not return. Defaults to `true`: an entity
23
- * can be created after the first lookup. A cache of users passes `false` -- an id missing from the
24
- * table (a system user of another backend) would otherwise be asked for on every page showing it.
22
+ * Ask again on the next `add()` for an id the server did not return. Defaults
23
+ * to `true`, because an entity can be created after the first lookup.
24
+ * A user cache passes `false`. Otherwise an id missing from the table (a
25
+ * system user of another backend) is requested on every page that shows it.
25
26
  */
26
27
  retryNotFound?: boolean;
27
28
  /**
28
- * How many ids one call of `fetchCallback` gets, each call committed on its own. Defaults to
29
- * `FETCH_BY_IDS_BATCH_SIZE`. A backend that takes fewer ids a request needs its own limit here: split
30
- * inside the callback, a failing part would take the parts already loaded with it.
29
+ * How many ids one `fetchCallback` call gets. Each call is
30
+ * committed on its own. Defaults to `FETCH_BY_IDS_BATCH_SIZE`.
31
+ * A backend with a lower per-request limit sets it here. Splitting inside
32
+ * the callback would make one failing part discard the parts already loaded.
31
33
  */
32
34
  batchSize?: number;
33
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"defineCached.js","names":["isForbidden","isAnzuApiForbiddenError","error","apiErrorStatus","unresolvedReason","isQuiet","isInCauseChain","cause","AnzuApiCancelledError","SessionExpiredError","AuthUnavailableError","defineCached","options","batchSize","cache","ref","toFetch","pinned","inFlight","useSentry","isCached","item","id","isUndefined","retryNotFound","add","args","toAdd","i","arg","isArray","j","prune","mapIdToMinimal","addManual","data","idProp","mapFullToMinimal","addManualMinimal","incoming","protectedIds","overflow","maxLimit","removed","key","value","updateMap","updateToFetch","ids","markUnresolved","reason","fetchBatch","res","fetchCallback","runBatches","items","failures","start","runQueue","run","apiFetch","logFailure","logError","debouncedFetch","useDebounceFn","pending","own","others","other","count"],"sources":["../../../../src/domains/cached/composables/defineCached.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useSentry } from '@/domains/system/composables/sentry'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport { FETCH_BY_IDS_BATCH_SIZE } from '@/domains/api/composables/useApiFetchByIds'\nimport { isAnzuApiForbiddenError } from '@/shared/error/AnzuApiForbiddenError'\nimport { AnzuApiCancelledError } from '@/shared/error/AnzuApiCancelledError'\nimport { SessionExpiredError } from '@/shared/error/SessionExpiredError'\nimport { AuthUnavailableError } from '@/shared/error/AuthUnavailableError'\nimport { isInCauseChain } from '@/shared/error/isInCauseChain'\nimport { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNAUTHORIZED } from '@/shared/statusCodes'\n\n/**\n * Why a fetch settled without resolving an item:\n * - `notFound` -- the server answered and the item was not among the results,\n * - `forbidden` -- the user may not read it (403); asking again in this session cannot change that,\n * - `error` -- anything else: the network, a timeout, a 5xx, a 401 before the session is renewed, and a\n * 404 of the whole request, which is a route or a proxy answering rather than an item missing.\n */\nexport type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error'\n\n/**\n * `_unresolved`: the fetch settled without resolving the item, `_unresolvedReason` says why.\n * Whether a later `add()` asks again depends on the reason (see `defineCached`).\n */\nexport type CachedItem<T extends object> = T & {\n _loaded: boolean\n _unresolved?: boolean\n _unresolvedReason?: CachedUnresolvedReason\n}\n\nexport interface DefineCachedOptions {\n /**\n * Ask again, on the next `add()`, for an id the server did not return. Defaults to `true`: an entity\n * can be created after the first lookup. A cache of users passes `false` -- an id missing from the\n * table (a system user of another backend) would otherwise be asked for on every page showing it.\n */\n retryNotFound?: boolean\n /**\n * How many ids one call of `fetchCallback` gets, each call committed on its own. Defaults to\n * `FETCH_BY_IDS_BATCH_SIZE`. A backend that takes fewer ids a request needs its own limit here: split\n * inside the callback, a failing part would take the parts already loaded with it.\n */\n batchSize?: number\n}\n\n// A rejected 403 arrives mapped as `AnzuApiForbiddenError`, which carries no status of its own.\nconst isForbidden = (error: unknown) =>\n isAnzuApiForbiddenError(error) || apiErrorStatus(error) === HTTP_STATUS_FORBIDDEN\n\nconst unresolvedReason = (error: unknown): CachedUnresolvedReason => (isForbidden(error) ? 'forbidden' : 'error')\n\n/**\n * Not a failure to write down: the user may not (403), nobody is logged in (401, or a session found\n * gone on the way out), the auth service did not answer, or the request was stopped. The api layer\n * keeps 401, 403 and an expired session out of its log itself, and writes an unavailable auth service\n * down with the request it stopped; for a cache all of them are the session, not the fetch.\n */\nconst isQuiet = (error: unknown) =>\n isForbidden(error) ||\n apiErrorStatus(error) === HTTP_STATUS_UNAUTHORIZED ||\n isInCauseChain(\n error,\n (cause) =>\n cause instanceof AnzuApiCancelledError ||\n cause instanceof SessionExpiredError ||\n cause instanceof AuthUnavailableError\n )\n\nexport type AddToCachedArgs<T extends DocId | IntegerId> =\n | Array<T | null | undefined>\n | Array<Array<T | null | undefined> | T | null | undefined>\n\n/**\n * @template I Identifier type\n * @template T Source type\n * @template M Minimal type\n */\nexport function defineCached<\n I extends DocId | IntegerId,\n T extends Record<DocId | IntegerId, any>,\n M extends Record<DocId | IntegerId, any>,\n>(\n mapFullToMinimal: (source: T) => M,\n mapIdToMinimal: (id: I) => M,\n fetchCallback: (ids: I[]) => Promise<T[]>,\n idProp = 'id',\n maxLimit = 1000,\n options: DefineCachedOptions = {}\n) {\n const { retryNotFound = true } = options\n const batchSize =\n options.batchSize && options.batchSize >= 1 ? Math.floor(options.batchSize) : FETCH_BY_IDS_BATCH_SIZE\n const cache: Ref<Map<I, CachedItem<M>>> = ref(new Map())\n const toFetch = ref(new Set()) as Ref<Set<I>>\n // The ids something shows, each with how many show it (`pin`): the cache drops none of them to stay within its\n // limit, and goes over it while more than that many are shown. Dropped, a name a chip showed turned it into a\n // spinner till something added the id again.\n const pinned = new Map<I, number>()\n // Settles, never rejects: a run that failed still hands over what its earlier batches loaded.\n const inFlight = new Set<Promise<{ items: T[]; failures: unknown[] }>>()\n const { logError } = useSentry()\n\n /**\n * Unresolved items are never retried from the queue itself, only on the next `add()`, and only\n * when asking again can help: a failure (`error`) always, a missing item (`notFound`) unless the\n * cache opted out, a forbidden one never.\n */\n const isCached = (id: I) => {\n const item = cache.value.get(id)\n if (isUndefined(item)) return false\n if (item._unresolved !== true) return true\n if (item._unresolvedReason === 'forbidden') return true\n if (item._unresolvedReason === 'notFound') return !retryNotFound\n return false\n }\n\n // Falsy, not only null/undefined: `get`, `has` and `isLoaded` treat 0 and '' as no id, and a blank\n // factory record (`createdBy: 0`) would otherwise be sent to the server as `filter_in[id]=0`.\n const add = (...args: AddToCachedArgs<I>) => {\n const toAdd = new Set<I>()\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (!arg) continue\n if (isArray(arg)) {\n for (let j = 0; j < arg.length; j++) {\n const item = arg[j]\n if (!item) continue\n if (!isCached(item)) toAdd.add(item)\n }\n continue\n }\n if (!isCached(arg)) toAdd.add(arg)\n }\n if (toAdd.size === 0) return\n prune(toAdd)\n toAdd.forEach((id) => {\n cache.value.set(id, {\n ...mapIdToMinimal(id),\n _loaded: false,\n })\n toFetch.value.add(id)\n })\n }\n\n // Out of the queue as well: an id added and then supplied by hand would still be fetched, and the\n // answer would overwrite what the caller just put in.\n const addManual = (data: T) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...mapFullToMinimal(data),\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n const addManualMinimal = (data: M) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...data,\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n /**\n * Drops only as many oldest terminal entries as the overflow requires; dropping every one\n * of them would send currently rendered chips back to their loading state. A pinned entry is\n * never dropped.\n * Must include `_unresolved`, otherwise repeated failures grow the cache past `maxLimit`.\n */\n const prune = (protectedIds?: Set<I>) => {\n let incoming = 0\n if (protectedIds) {\n // Re-queued unresolved ids are already in the cache and do not grow it.\n for (const id of protectedIds) if (!cache.value.has(id)) incoming += 1\n }\n const overflow = cache.value.size + incoming - maxLimit\n if (overflow <= 0) return\n let removed = 0\n for (const [key, value] of cache.value) {\n if (removed >= overflow) break\n if (protectedIds?.has(key) || pinned.has(key)) continue\n if (value._loaded || value._unresolved) {\n cache.value.delete(key)\n removed += 1\n }\n }\n }\n\n const updateMap = (data: T[]) => {\n prune()\n for (const item of data) {\n cache.value.set(item[idProp] as I, {\n ...mapFullToMinimal(item),\n _loaded: true,\n })\n }\n }\n\n const updateToFetch = (ids: Array<I>) => {\n for (const id of ids) {\n toFetch.value.delete(id)\n }\n }\n\n const markUnresolved = (ids: Array<I>, reason: CachedUnresolvedReason) => {\n for (const id of ids) {\n const item = cache.value.get(id)\n if (isUndefined(item) || item._loaded) continue\n cache.value.set(id, { ...item, _unresolved: true, _unresolvedReason: reason })\n }\n }\n\n const fetchBatch = async (ids: I[]): Promise<T[]> => {\n try {\n // Awaited inside the `try`: a callback that throws before it returns a promise (a dam client\n // that is not configured) has to settle its ids too, or they would spin for good.\n const res = await fetchCallback(ids)\n updateMap(res)\n markUnresolved(ids, 'notFound')\n // Back within the limit once the batch is settled: the ids added and still on their way could not be dropped\n // till then, and a large add left the cache over its limit for good, also when the batch failed.\n prune()\n return res\n } catch (error: unknown) {\n markUnresolved(ids, unresolvedReason(error))\n prune()\n throw error\n }\n }\n\n // In the batches the api helpers would split the request into anyway, one after another, each\n // committed on its own: a failing batch leaves the ones before it loaded instead of taking them along.\n const runBatches = async (ids: I[]) => {\n const items: T[] = []\n const failures: unknown[] = []\n for (let start = 0; start < ids.length; start += batchSize) {\n try {\n items.push(...(await fetchBatch(ids.slice(start, start + batchSize))))\n } catch (error: unknown) {\n failures.push(error)\n }\n }\n return { items, failures }\n }\n\n /** Fetches the queue; settles with what loaded and every batch's failure, never rejects. */\n const runQueue = async () => {\n if (toFetch.value.size === 0) return { items: [] as T[], failures: [] as unknown[] }\n const ids = Array.from(toFetch.value)\n // Drained before the request, not after it. A batch that starts while this one is in flight --\n // a slow answer outlasting the debounce, the `maxWait` timer, an `immediateFetch()` -- would\n // otherwise send the same ids again. Draining at all keeps a failing batch from being resent.\n updateToFetch(ids)\n const run = runBatches(ids)\n inFlight.add(run)\n try {\n return await run\n } finally {\n inFlight.delete(run)\n }\n }\n\n async function apiFetch() {\n const { items, failures } = await runQueue()\n if (failures.length > 0) throw failures[0]\n return items\n }\n\n const logFailure = (error: unknown) => {\n if (isQuiet(error)) return\n logError(error instanceof Error ? error : new Error(String(error)), {\n level: 'warning',\n tags: { cachedFetch: 'failed' },\n })\n }\n\n // Caught inside the debounced callback, not on the promise it returns: the maxWait timer\n // is a second invocation path whose promise never reaches the caller, so a rejection\n // there would escape as an unhandled rejection.\n const debouncedFetch = useDebounceFn(\n async () => {\n try {\n // Every batch's failure, not only the first: a 403 in one would otherwise hide a timeout in\n // the next.\n const { items, failures } = await runQueue()\n failures.forEach(logFailure)\n return items\n } catch (error: unknown) {\n logFailure(error)\n return [] as T[]\n }\n },\n 1500,\n { maxWait: 5000 }\n )\n\n /**\n * Debounced fetch for best performance.\n * For general usage.\n *\n * Called fire-and-forget, so it never rejects. Use `immediateFetch()` to handle errors.\n */\n const fetch = () => {\n return debouncedFetch()\n }\n\n /**\n * Immediate fetch with no debounce and with result in promise.\n * Use for special cases.\n *\n * Waits for the batches already in flight as well and resolves with their items: their ids are out\n * of the queue, and a caller reading the result (to add the relations of what it fetched) would miss\n * them. It rejects only when its own batch fails; an id whose batch in flight failed is not in the\n * result -- check `isUnresolved(id)` for it.\n */\n const immediateFetch = async () => {\n const pending = Array.from(inFlight)\n const own = await apiFetch()\n const others = await Promise.all(pending)\n return [...own, ...others.flatMap((other) => other.items)]\n }\n\n /** Something shows the item of `id`: the cache keeps it till as many `unpin` have come. */\n const pin = (id: I | null | undefined) => {\n if (!id) return\n pinned.set(id, (pinned.get(id) ?? 0) + 1)\n }\n\n /** What showed the item of `id` no longer does. The cache goes back within its limit once none is left. */\n const unpin = (id: I | null | undefined) => {\n if (!id) return\n const count = pinned.get(id)\n if (isUndefined(count)) return\n if (count > 1) {\n pinned.set(id, count - 1)\n return\n }\n pinned.delete(id)\n prune()\n }\n\n const get = (id: I | null | undefined) => {\n if (!id) return undefined\n return cache.value.get(id)\n }\n\n const has = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.has(id)\n }\n\n const clear = () => {\n return cache.value.clear()\n }\n\n const isLoaded = (id: I | null | undefined): boolean => {\n if (!id) return false\n const item = cache.value.get(id)\n if (!item) return false\n return item._loaded\n }\n\n /** Terminal counterpart of `isLoaded`: the fetch settled without resolving the item. */\n const isUnresolved = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.get(id)?._unresolved === true\n }\n\n return {\n cache,\n toFetch,\n fetch,\n immediateFetch,\n add,\n addManual,\n addManualMinimal,\n pin,\n unpin,\n has,\n get,\n clear,\n isLoaded,\n isUnresolved,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"defineCached.js","names":["isForbidden","isAnzuApiForbiddenError","error","apiErrorStatus","unresolvedReason","isQuiet","isInCauseChain","cause","AnzuApiCancelledError","SessionExpiredError","AuthUnavailableError","defineCached","options","batchSize","cache","ref","toFetch","pinned","inFlight","useSentry","isCached","item","id","isUndefined","retryNotFound","add","args","toAdd","i","arg","isArray","j","prune","mapIdToMinimal","addManual","data","idProp","mapFullToMinimal","addManualMinimal","incoming","protectedIds","overflow","maxLimit","removed","key","value","updateMap","updateToFetch","ids","markUnresolved","reason","fetchBatch","res","fetchCallback","runBatches","items","failures","start","runQueue","run","apiFetch","logFailure","logError","debouncedFetch","useDebounceFn","pending","own","others","other","count"],"sources":["../../../../src/domains/cached/composables/defineCached.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useSentry } from '@/domains/system/composables/sentry'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport { FETCH_BY_IDS_BATCH_SIZE } from '@/domains/api/composables/useApiFetchByIds'\nimport { isAnzuApiForbiddenError } from '@/shared/error/AnzuApiForbiddenError'\nimport { AnzuApiCancelledError } from '@/shared/error/AnzuApiCancelledError'\nimport { SessionExpiredError } from '@/shared/error/SessionExpiredError'\nimport { AuthUnavailableError } from '@/shared/error/AuthUnavailableError'\nimport { isInCauseChain } from '@/shared/error/isInCauseChain'\nimport { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNAUTHORIZED } from '@/shared/statusCodes'\n\n/**\n * Why a fetch settled without resolving an item:\n * - `notFound`: the server answered and the item was not among the results.\n * - `forbidden`: the user may not read it (403). Asking again in this session cannot change that.\n * - `error`: anything else. Network, timeout, 5xx, a 401 before session renewal,\n * or a 404 of the whole request (a route or proxy answering, not a missing item).\n */\nexport type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error'\n\n/**\n * `_unresolved`: the fetch settled without resolving the item. `_unresolvedReason` says why.\n * Whether a later `add()` asks again depends on the reason (see `defineCached`).\n */\nexport type CachedItem<T extends object> = T & {\n _loaded: boolean\n _unresolved?: boolean\n _unresolvedReason?: CachedUnresolvedReason\n}\n\nexport interface DefineCachedOptions {\n /**\n * Ask again on the next `add()` for an id the server did not return. Defaults\n * to `true`, because an entity can be created after the first lookup.\n * A user cache passes `false`. Otherwise an id missing from the table (a\n * system user of another backend) is requested on every page that shows it.\n */\n retryNotFound?: boolean\n /**\n * How many ids one `fetchCallback` call gets. Each call is\n * committed on its own. Defaults to `FETCH_BY_IDS_BATCH_SIZE`.\n * A backend with a lower per-request limit sets it here. Splitting inside\n * the callback would make one failing part discard the parts already loaded.\n */\n batchSize?: number\n}\n\n// A rejected 403 arrives mapped as `AnzuApiForbiddenError`, which carries no status of its own.\nconst isForbidden = (error: unknown) =>\n isAnzuApiForbiddenError(error) || apiErrorStatus(error) === HTTP_STATUS_FORBIDDEN\n\nconst unresolvedReason = (error: unknown): CachedUnresolvedReason => (isForbidden(error) ? 'forbidden' : 'error')\n\n/**\n * Errors not worth logging: 403, no logged-in user (401 or a\n * session gone), auth service not answering, or an aborted request.\n * The api layer already handles logging of these. For a cache they concern the session, not the fetch.\n */\nconst isQuiet = (error: unknown) =>\n isForbidden(error) ||\n apiErrorStatus(error) === HTTP_STATUS_UNAUTHORIZED ||\n isInCauseChain(\n error,\n (cause) =>\n cause instanceof AnzuApiCancelledError ||\n cause instanceof SessionExpiredError ||\n cause instanceof AuthUnavailableError\n )\n\nexport type AddToCachedArgs<T extends DocId | IntegerId> =\n | Array<T | null | undefined>\n | Array<Array<T | null | undefined> | T | null | undefined>\n\n/**\n * @template I Identifier type\n * @template T Source type\n * @template M Minimal type\n */\nexport function defineCached<\n I extends DocId | IntegerId,\n T extends Record<DocId | IntegerId, any>,\n M extends Record<DocId | IntegerId, any>,\n>(\n mapFullToMinimal: (source: T) => M,\n mapIdToMinimal: (id: I) => M,\n fetchCallback: (ids: I[]) => Promise<T[]>,\n idProp = 'id',\n maxLimit = 1000,\n options: DefineCachedOptions = {}\n) {\n const { retryNotFound = true } = options\n const batchSize =\n options.batchSize && options.batchSize >= 1 ? Math.floor(options.batchSize) : FETCH_BY_IDS_BATCH_SIZE\n const cache: Ref<Map<I, CachedItem<M>>> = ref(new Map())\n const toFetch = ref(new Set()) as Ref<Set<I>>\n // Ids currently shown, each with its show count (`pin`). The cache\n // never drops them to stay within its limit and may exceed it.\n // Dropping one turned a chip's name back into a spinner until the id was added again.\n const pinned = new Map<I, number>()\n // Settles, never rejects. A failed run still hands over what its earlier batches loaded.\n const inFlight = new Set<Promise<{ items: T[]; failures: unknown[] }>>()\n const { logError } = useSentry()\n\n /**\n * Unresolved items are never retried from the queue, only on the next `add()`, and only when retrying can help.\n * `error` always retries, `notFound` unless the cache opted out, `forbidden` never.\n */\n const isCached = (id: I) => {\n const item = cache.value.get(id)\n if (isUndefined(item)) return false\n if (item._unresolved !== true) return true\n if (item._unresolvedReason === 'forbidden') return true\n if (item._unresolvedReason === 'notFound') return !retryNotFound\n return false\n }\n\n // Falsy, not only null/undefined. `get`, `has` and `isLoaded` treat 0 and '' as no id.\n // Otherwise a blank factory record (`createdBy: 0`) is sent to the server as `filter_in[id]=0`.\n const add = (...args: AddToCachedArgs<I>) => {\n const toAdd = new Set<I>()\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (!arg) continue\n if (isArray(arg)) {\n for (let j = 0; j < arg.length; j++) {\n const item = arg[j]\n if (!item) continue\n if (!isCached(item)) toAdd.add(item)\n }\n continue\n }\n if (!isCached(arg)) toAdd.add(arg)\n }\n if (toAdd.size === 0) return\n prune(toAdd)\n toAdd.forEach((id) => {\n cache.value.set(id, {\n ...mapIdToMinimal(id),\n _loaded: false,\n })\n toFetch.value.add(id)\n })\n }\n\n // Remove it from the queue too. Otherwise a queued id supplied by\n // hand is still fetched, and the answer overwrites the caller's data.\n const addManual = (data: T) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...mapFullToMinimal(data),\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n const addManualMinimal = (data: M) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...data,\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n /**\n * Drops only as many oldest terminal entries as the overflow\n * requires. Dropping all would send rendered chips back to loading.\n * Pinned entries are never dropped.\n * Must include `_unresolved` entries, otherwise repeated failures grow the cache past `maxLimit`.\n */\n const prune = (protectedIds?: Set<I>) => {\n let incoming = 0\n if (protectedIds) {\n // Re-queued unresolved ids are already in the cache and do not grow it.\n for (const id of protectedIds) if (!cache.value.has(id)) incoming += 1\n }\n const overflow = cache.value.size + incoming - maxLimit\n if (overflow <= 0) return\n let removed = 0\n for (const [key, value] of cache.value) {\n if (removed >= overflow) break\n if (protectedIds?.has(key) || pinned.has(key)) continue\n if (value._loaded || value._unresolved) {\n cache.value.delete(key)\n removed += 1\n }\n }\n }\n\n const updateMap = (data: T[]) => {\n prune()\n for (const item of data) {\n cache.value.set(item[idProp] as I, {\n ...mapFullToMinimal(item),\n _loaded: true,\n })\n }\n }\n\n const updateToFetch = (ids: Array<I>) => {\n for (const id of ids) {\n toFetch.value.delete(id)\n }\n }\n\n const markUnresolved = (ids: Array<I>, reason: CachedUnresolvedReason) => {\n for (const id of ids) {\n const item = cache.value.get(id)\n if (isUndefined(item) || item._loaded) continue\n cache.value.set(id, { ...item, _unresolved: true, _unresolvedReason: reason })\n }\n }\n\n const fetchBatch = async (ids: I[]): Promise<T[]> => {\n try {\n // Awaited inside the `try`. A callback that throws before returning a promise\n // (e.g. an unconfigured dam client) must settle its ids too, or they spin forever.\n const res = await fetchCallback(ids)\n updateMap(res)\n markUnresolved(ids, 'notFound')\n // Prune once the batch settles. Ids in flight cannot be dropped before that.\n // Without this, a large add left the cache over its limit for good, also when the batch failed.\n prune()\n return res\n } catch (error: unknown) {\n markUnresolved(ids, unresolvedReason(error))\n prune()\n throw error\n }\n }\n\n // Fetches in the same batches the api helpers would use, sequentially, each committed on its own.\n // A failing batch then leaves earlier batches loaded.\n const runBatches = async (ids: I[]) => {\n const items: T[] = []\n const failures: unknown[] = []\n for (let start = 0; start < ids.length; start += batchSize) {\n try {\n items.push(...(await fetchBatch(ids.slice(start, start + batchSize))))\n } catch (error: unknown) {\n failures.push(error)\n }\n }\n return { items, failures }\n }\n\n /** Fetches the queue; settles with what loaded and every batch's failure, never rejects. */\n const runQueue = async () => {\n if (toFetch.value.size === 0) return { items: [] as T[], failures: [] as unknown[] }\n const ids = Array.from(toFetch.value)\n // Drained before the request, not after. Otherwise a batch\n // started while this one is in flight resends the same ids.\n // That happens with a slow answer outlasting the debounce, the `maxWait` timer, or `immediateFetch()`.\n // Draining also keeps a failing batch from being resent.\n updateToFetch(ids)\n const run = runBatches(ids)\n inFlight.add(run)\n try {\n return await run\n } finally {\n inFlight.delete(run)\n }\n }\n\n async function apiFetch() {\n const { items, failures } = await runQueue()\n if (failures.length > 0) throw failures[0]\n return items\n }\n\n const logFailure = (error: unknown) => {\n if (isQuiet(error)) return\n logError(error instanceof Error ? error : new Error(String(error)), {\n level: 'warning',\n tags: { cachedFetch: 'failed' },\n })\n }\n\n // Caught inside the debounced callback, not on its returned promise.\n // The `maxWait` timer is a second invocation path whose promise\n // never reaches the caller, so a rejection there would be unhandled.\n const debouncedFetch = useDebounceFn(\n async () => {\n try {\n // Log every batch's failure, not only the first. A 403 in one would otherwise hide a timeout in the next.\n const { items, failures } = await runQueue()\n failures.forEach(logFailure)\n return items\n } catch (error: unknown) {\n logFailure(error)\n return [] as T[]\n }\n },\n 1500,\n { maxWait: 5000 }\n )\n\n /**\n * Debounced fetch for general use.\n * Called fire-and-forget, so it never rejects. Use `immediateFetch()` to handle errors.\n */\n const fetch = () => {\n return debouncedFetch()\n }\n\n /**\n * Immediate fetch without debounce, returning the result.\n * Also waits for batches already in flight and includes their items, since\n * their ids are out of the queue and callers adding relations would miss them.\n * Rejects only when its own batch fails. An id whose in-flight batch\n * failed is missing from the result; check `isUnresolved(id)`.\n */\n const immediateFetch = async () => {\n const pending = Array.from(inFlight)\n const own = await apiFetch()\n const others = await Promise.all(pending)\n return [...own, ...others.flatMap((other) => other.items)]\n }\n\n /** Marks the item of `id` as shown. The cache keeps it until a matching number of `unpin` calls. */\n const pin = (id: I | null | undefined) => {\n if (!id) return\n pinned.set(id, (pinned.get(id) ?? 0) + 1)\n }\n\n /** Marks the item of `id` as no longer shown. The cache returns within its limit once no pins are left. */\n const unpin = (id: I | null | undefined) => {\n if (!id) return\n const count = pinned.get(id)\n if (isUndefined(count)) return\n if (count > 1) {\n pinned.set(id, count - 1)\n return\n }\n pinned.delete(id)\n prune()\n }\n\n const get = (id: I | null | undefined) => {\n if (!id) return undefined\n return cache.value.get(id)\n }\n\n const has = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.has(id)\n }\n\n const clear = () => {\n return cache.value.clear()\n }\n\n const isLoaded = (id: I | null | undefined): boolean => {\n if (!id) return false\n const item = cache.value.get(id)\n if (!item) return false\n return item._loaded\n }\n\n /** Terminal counterpart of `isLoaded`: the fetch settled without resolving the item. */\n const isUnresolved = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.get(id)?._unresolved === true\n }\n\n return {\n cache,\n toFetch,\n fetch,\n immediateFetch,\n add,\n addManual,\n addManualMinimal,\n pin,\n unpin,\n has,\n get,\n clear,\n isLoaded,\n isUnresolved,\n }\n}\n"],"mappings":"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"}
@@ -1,20 +1,19 @@
1
1
  import { ComputedRef } from 'vue';
2
2
  import { DocId, IntegerId } from '../../../shared/types/common';
3
- /** How a component that shows an item of a cache keeps it there, and has it asked for (`useCachedItem`). */
3
+ /** How a component showing a cached item keeps it pinned and requests it (`useCachedItem`). */
4
4
  export interface CachedItemPinning<I extends DocId | IntegerId> {
5
- /** The id the component shows the item of; none while it shows none (it is given a title of its own). */
5
+ /** Id of the shown item. None while the component shows none, e.g. when it has its own title. */
6
6
  id: () => I | null | undefined;
7
- /** `pin` and `unpin` of the cache (`defineCached`). */
8
7
  pin: (id: I) => void;
9
8
  unpin: (id: I) => void;
10
- /** Adds the id to the cache and has it fetched, for an id the cache does not have: one its page never added. */
9
+ /** Adds the id to the cache and fetches it, for an id its page never added. */
11
10
  askFor: (id: I) => void;
12
11
  }
13
12
  /**
14
- * `pinning`: the item shown is pinned in its cache while the component shows it, from the start and across a change
15
- * of its id, and let go as the component goes. The cache, which keeps 1 000 items, drops no pinned one: a chip whose
16
- * name it had dropped spun till something added the id again. An id the cache does not have is asked for once, as it
17
- * is shown.
13
+ * `pinning`: the shown item stays pinned in its cache while the
14
+ * component shows it, across id changes, and is released on unmount.
15
+ * The cache (1 000 items) never drops pinned items. Without this a chip spun after its item was dropped.
16
+ * An id the cache does not have is requested once when shown.
18
17
  */
19
18
  export declare function useCachedItem<T extends {
20
19
  _loaded?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useCachedItem.js","names":["useCachedItem","pinning","shown","watch","before","id","getter","onScopeDispose","cached","computed","value"],"sources":["../../../../src/domains/cached/composables/useCachedItem.ts"],"sourcesContent":["import { type ComputedRef, computed, onScopeDispose, watch } from 'vue'\nimport type { DocId, IntegerId } from '@/shared/types/common'\n\n/** How a component that shows an item of a cache keeps it there, and has it asked for (`useCachedItem`). */\nexport interface CachedItemPinning<I extends DocId | IntegerId> {\n /** The id the component shows the item of; none while it shows none (it is given a title of its own). */\n id: () => I | null | undefined\n /** `pin` and `unpin` of the cache (`defineCached`). */\n pin: (id: I) => void\n unpin: (id: I) => void\n /** Adds the id to the cache and has it fetched, for an id the cache does not have: one its page never added. */\n askFor: (id: I) => void\n}\n\n/**\n * `pinning`: the item shown is pinned in its cache while the component shows it, from the start and across a change\n * of its id, and let go as the component goes. The cache, which keeps 1 000 items, drops no pinned one: a chip whose\n * name it had dropped spun till something added the id again. An id the cache does not have is asked for once, as it\n * is shown.\n */\nexport function useCachedItem<\n T extends { _loaded?: boolean; _unresolved?: boolean },\n I extends DocId | IntegerId = DocId | IntegerId,\n>(\n getter: () => T | undefined,\n pinning?: CachedItemPinning<I>\n): { cached: ComputedRef<T | undefined>; loaded: ComputedRef<boolean>; unresolved: ComputedRef<boolean> } {\n if (pinning) {\n let shown: I | null = null\n watch(\n pinning.id,\n (id) => {\n // The new one first: let go first, the one shown before could have the new one dropped.\n const before = shown\n shown = id || null\n if (shown) pinning.pin(shown)\n if (before) pinning.unpin(before)\n if (shown && getter() === undefined) pinning.askFor(shown)\n },\n { immediate: true }\n )\n onScopeDispose(() => {\n if (shown) pinning.unpin(shown)\n shown = null\n })\n }\n const cached = computed<T | undefined>(() => {\n const value = getter()\n if (!value) return undefined\n // `_unresolved` settles the item: return the placeholder so consumers stop showing a spinner.\n return value._loaded !== false || value._unresolved === true ? value : undefined\n })\n const loaded = computed(() => cached.value !== undefined)\n // Apart from `loaded`, because the placeholder is all an unresolved item has: a consumer reading\n // its fields would draw an empty chip.\n const unresolved = computed(() => cached.value?._unresolved === true)\n\n return { cached, loaded, unresolved }\n}\n"],"mappings":";;AAoBA,SAAgBA,EAId,GACA,GACwG;CACxG,IAAIC,GAAS;EACX,IAAIC,IAAkB;EAatB,AAZAC,EACEF,EAAQ,KACP,MAAO;GAEN,IAAMG,IAASF;GAIf,AAHA,IAAQG,KAAM,MACVH,KAAOD,EAAQ,IAAIC,CAAK,GACxBE,KAAQH,EAAQ,MAAMG,CAAM,GAC5BF,KAASI,EAAO,MAAM,KAAA,KAAWL,EAAQ,OAAOC,CAAK;EAC3D,GACA,EAAE,WAAW,GAAK,CACpB,GACAK,QAAqB;GAEnB,AADIL,KAAOD,EAAQ,MAAMC,CAAK,GAC9B,IAAQ;EACV,CAAC;CACH;CACA,IAAMM,IAASC,QAA8B;EAC3C,IAAMC,IAAQJ,EAAO;EACrB,IAAKI,GAEL,OAAOA,EAAM,YAAY,MAASA,EAAM,gBAAgB,KAAOA,IAAQ,KAAA;CACzE,CAAC;CAMD,OAAO;EAAE;EAAQ,QALFD,QAAeD,EAAO,UAAU,KAAA,CAK9B;EAAQ,YAFNC,QAAeD,EAAO,OAAO,gBAAgB,EAEvC;CAAW;AACtC"}
1
+ {"version":3,"file":"useCachedItem.js","names":["useCachedItem","pinning","shown","watch","before","id","getter","onScopeDispose","cached","computed","value"],"sources":["../../../../src/domains/cached/composables/useCachedItem.ts"],"sourcesContent":["import { type ComputedRef, computed, onScopeDispose, watch } from 'vue'\nimport type { DocId, IntegerId } from '@/shared/types/common'\n\n/** How a component showing a cached item keeps it pinned and requests it (`useCachedItem`). */\nexport interface CachedItemPinning<I extends DocId | IntegerId> {\n /** Id of the shown item. None while the component shows none, e.g. when it has its own title. */\n id: () => I | null | undefined\n pin: (id: I) => void\n unpin: (id: I) => void\n /** Adds the id to the cache and fetches it, for an id its page never added. */\n askFor: (id: I) => void\n}\n\n/**\n * `pinning`: the shown item stays pinned in its cache while the\n * component shows it, across id changes, and is released on unmount.\n * The cache (1 000 items) never drops pinned items. Without this a chip spun after its item was dropped.\n * An id the cache does not have is requested once when shown.\n */\nexport function useCachedItem<\n T extends { _loaded?: boolean; _unresolved?: boolean },\n I extends DocId | IntegerId = DocId | IntegerId,\n>(\n getter: () => T | undefined,\n pinning?: CachedItemPinning<I>\n): { cached: ComputedRef<T | undefined>; loaded: ComputedRef<boolean>; unresolved: ComputedRef<boolean> } {\n if (pinning) {\n let shown: I | null = null\n watch(\n pinning.id,\n (id) => {\n // Pin the new id first. Unpinning the old one first could let the cache drop the new one.\n const before = shown\n shown = id || null\n if (shown) pinning.pin(shown)\n if (before) pinning.unpin(before)\n if (shown && getter() === undefined) pinning.askFor(shown)\n },\n { immediate: true }\n )\n onScopeDispose(() => {\n if (shown) pinning.unpin(shown)\n shown = null\n })\n }\n const cached = computed<T | undefined>(() => {\n const value = getter()\n if (!value) return undefined\n // `_unresolved` settles the item: return the placeholder so consumers stop showing a spinner.\n return value._loaded !== false || value._unresolved === true ? value : undefined\n })\n const loaded = computed(() => cached.value !== undefined)\n // Separate from `loaded`, because an unresolved item is only a placeholder.\n // A consumer reading its fields would draw an empty chip.\n const unresolved = computed(() => cached.value?._unresolved === true)\n\n return { cached, loaded, unresolved }\n}\n"],"mappings":";;AAmBA,SAAgBA,EAId,GACA,GACwG;CACxG,IAAIC,GAAS;EACX,IAAIC,IAAkB;EAatB,AAZAC,EACEF,EAAQ,KACP,MAAO;GAEN,IAAMG,IAASF;GAIf,AAHA,IAAQG,KAAM,MACVH,KAAOD,EAAQ,IAAIC,CAAK,GACxBE,KAAQH,EAAQ,MAAMG,CAAM,GAC5BF,KAASI,EAAO,MAAM,KAAA,KAAWL,EAAQ,OAAOC,CAAK;EAC3D,GACA,EAAE,WAAW,GAAK,CACpB,GACAK,QAAqB;GAEnB,AADIL,KAAOD,EAAQ,MAAMC,CAAK,GAC9B,IAAQ;EACV,CAAC;CACH;CACA,IAAMM,IAASC,QAA8B;EAC3C,IAAMC,IAAQJ,EAAO;EACrB,IAAKI,GAEL,OAAOA,EAAM,YAAY,MAASA,EAAM,gBAAgB,KAAOA,IAAQ,KAAA;CACzE,CAAC;CAMD,OAAO;EAAE;EAAQ,QALFD,QAAeD,EAAO,UAAU,KAAA,CAK9B;EAAQ,YAFNC,QAAeD,EAAO,OAAO,gBAAgB,EAEvC;CAAW;AACtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ACollabLockedByUser.js","names":["_sfc_main","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","ACollabLockedByUser_default"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it. A user the cache resolves later (after an `_unresolved` placeholder)\n // arrives as a new, loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ACollabLockedByUser.js","names":["_sfc_main","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","ACollabLockedByUser_default"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it.\n // A user resolved later (after an `_unresolved` placeholder) arrives as\n // a new loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_createBlock","_component_VBadge","_withCtx","_createVNode","_component_VIcon","AAnzuUserAvatar","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","props","__props","cached","shallowRef","loaded","cachedUsers","unref","useI18n","item","computed","isNumber","tooltip","prefix","t","watch","newValue","openBlock","createElementBlock","isNull","isUndefined","Fragment","createBlock","VBadge","withCtx","createVNode","VIcon","VProgressCircular"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it. A user the cache resolves later (after an `_unresolved` placeholder)\n // arrives as a new, loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EASA,IAAMe,IAAQC,GAWRC,IAASC,EAAwC,KAAA,CAAS,GAC1DC,IAASD,EAAoB,EAAK,GAGlCE,IAAcC,EAAMN,EAAM,KAAK,GAC/B,EAAE,SAAMO,EAAQ,GAEhBC,IAAOC,QAAe;GAC1B,IAAIC,EAASV,EAAM,EAAE,KAAKA,EAAM,KAAK,GACnC,OAAOK,EAAY,IAAIL,EAAM,EAAE;EAGnC,CAAC,GAEKW,IAAUF,QAAe;GAC7B,IAAIG,IAAS;GAIb,IAHIZ,EAAM,gBACR,IAASa,EAAE,yBAAyB,IAAI,OAEtCL,EAAK,OACP,OAAOA,EAAK,MAAM,OAAO,SAAS,SAC9BI,IAASJ,EAAK,MAAM,OAAO,WAC3BI,IAASJ,EAAK,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC;EAG7C,CAAC;E,OAEDM,EACEN,IACC,MAAa;GAGZ,CAAI,GAAO,SAASN,EAAO,OAAO,OAAOa,GAAU,MAAOA,GAAU,aACpE,EAAO,QAAQ,IACf,EAAO,QAAQ,KAAA,GACX,IAAYA,CAAQ,KAAM,CAACA,EAAS,WAAWA,EAAS,gBAAgB,QAC5E,EAAO,QAAQA,GACf,EAAO,QAAQ;EACjB,GACA,EAAE,WAAW,GAAK,CACpB,I,UAIE9B,EAAA,GAAAC,EAwCM,OAxCNW,GAwCM,CAvCQV,EAAA+B,CAAA,CAAM,CAACjB,EAAA,EAAE,KAAKd,EAAAgC,CAAA,CAAW,CAAClB,EAAA,EAAE,KAAxChB,EAAA,GAAAC,EAA6C,QAAAY,CAAA,KACxBM,EAAA,SAArBnB,EAAA,GAAAC,EA8BWE,GAAA,EAAA,KAAA,EAAA,GAAA,CA5BDa,EAAA,eADRhB,EAAA,GAAAI,EAsBSC,GAAA;;GApBP,UAAS;GACT,OAAM;GACL,OAAO;GACP,aAAW;GACX,QAAQ;GACR,YAAU;GACV,YAAU;;GAEA,OAAKC,QAKZ,CAJFC,EAIEC,GAAA;IAHA,OAAM;IACL,MAAM;IACP,MAAK;;GAGT,SAAAF,QAIE,CAJFC,EAIEE,GAAA;IAHC,MAAMQ,EAAA,SAAU,KAAA;IAChB,MAAM;IACN,SAASS,EAAA;;;E,OAGd1B,EAAA,GAAAI,EAKEK,GAAA;;GAHC,MAAMQ,EAAA,SAAU,KAAA;GAChB,MAAM;GACN,SAASS,EAAA;E,4CAGd1B,EAAA,GAAAI,EAMEM,GAAA;;GAJC,MAAM;GACN,OAAO;GACR,eAAA;GACA,OAAM"}
1
+ {"version":3,"file":"ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_createBlock","_component_VBadge","_withCtx","_createVNode","_component_VIcon","AAnzuUserAvatar","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","props","__props","cached","shallowRef","loaded","cachedUsers","unref","useI18n","item","computed","isNumber","tooltip","prefix","t","watch","newValue","openBlock","createElementBlock","isNull","isUndefined","Fragment","createBlock","VBadge","withCtx","createVNode","VIcon","VProgressCircular"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it.\n // A user resolved later (after an `_unresolved` placeholder) arrives as\n // a new loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EASA,IAAMe,IAAQC,GAWRC,IAASC,EAAwC,KAAA,CAAS,GAC1DC,IAASD,EAAoB,EAAK,GAGlCE,IAAcC,EAAMN,EAAM,KAAK,GAC/B,EAAE,SAAMO,EAAQ,GAEhBC,IAAOC,QAAe;GAC1B,IAAIC,EAASV,EAAM,EAAE,KAAKA,EAAM,KAAK,GACnC,OAAOK,EAAY,IAAIL,EAAM,EAAE;EAGnC,CAAC,GAEKW,IAAUF,QAAe;GAC7B,IAAIG,IAAS;GAIb,IAHIZ,EAAM,gBACR,IAASa,EAAE,yBAAyB,IAAI,OAEtCL,EAAK,OACP,OAAOA,EAAK,MAAM,OAAO,SAAS,SAC9BI,IAASJ,EAAK,MAAM,OAAO,WAC3BI,IAASJ,EAAK,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC;EAG7C,CAAC;E,OAEDM,EACEN,IACC,MAAa;GAIZ,CAAI,GAAO,SAASN,EAAO,OAAO,OAAOa,GAAU,MAAOA,GAAU,aACpE,EAAO,QAAQ,IACf,EAAO,QAAQ,KAAA,GACX,IAAYA,CAAQ,KAAM,CAACA,EAAS,WAAWA,EAAS,gBAAgB,QAC5E,EAAO,QAAQA,GACf,EAAO,QAAQ;EACjB,GACA,EAAE,WAAW,GAAK,CACpB,I,UAIE9B,EAAA,GAAAC,EAwCM,OAxCNW,GAwCM,CAvCQV,EAAA+B,CAAA,CAAM,CAACjB,EAAA,EAAE,KAAKd,EAAAgC,CAAA,CAAW,CAAClB,EAAA,EAAE,KAAxChB,EAAA,GAAAC,EAA6C,QAAAY,CAAA,KACxBM,EAAA,SAArBnB,EAAA,GAAAC,EA8BWE,GAAA,EAAA,KAAA,EAAA,GAAA,CA5BDa,EAAA,eADRhB,EAAA,GAAAI,EAsBSC,GAAA;;GApBP,UAAS;GACT,OAAM;GACL,OAAO;GACP,aAAW;GACX,QAAQ;GACR,YAAU;GACV,YAAU;;GAEA,OAAKC,QAKZ,CAJFC,EAIEC,GAAA;IAHA,OAAM;IACL,MAAM;IACP,MAAK;;GAGT,SAAAF,QAIE,CAJFC,EAIEE,GAAA;IAHC,MAAMQ,EAAA,SAAU,KAAA;IAChB,MAAM;IACN,SAASS,EAAA;;;E,OAGd1B,EAAA,GAAAI,EAKEK,GAAA;;GAHC,MAAMQ,EAAA,SAAU,KAAA;GAChB,MAAM;GACN,SAASS,EAAA;E,4CAGd1B,EAAA,GAAAI,EAMEM,GAAA;;GAJC,MAAM;GACN,OAAO;GACR,eAAA;GACA,OAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"collabAnyDataChange.js","names":["useCollabAnyDataChange","useCommonAdminCollabOptions","useCollabCurrentUserId","useCollabStateInternal","changeEventBus","useCollabRoomDataChangeEventBus","fieldLockStatusEventBus","useCollabFieldLockStatusEventBus","anyChangeCallback","ref","unsubscribeCollabAnyDataChangeListener","anyChangeEventBusListener","event","room","isUndefined","payload","tryOnBeforeUnmount","disableAutoUnsubscribe","isDefined","callback","collabOptions","collabSocket","roomInfo","collabRoomInfoState","CollabStatus","field","data","object","unref","objectToUpdate","cloneDeep","options","statusEvent","error","setFieldLockUnanswered","isCollabFailedChangeRoomLockCallback","response","createFieldLockStatusPayload","CollabFieldLockType","CollabFieldLockStatus","isCollabSuccessChangeRoomLockCallback","collabFieldLocksState","locks","lock","collabFieldDataBufferState","fieldLockMaybeHeld","currentUserId"],"sources":["../../../../src/domains/collab/composables/collabAnyDataChange.ts"],"sourcesContent":["import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/domains/collab/types/Collab'\nimport { type MaybeRef, ref, unref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n CollabFieldLockType,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/domains/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport { useCollabStateInternal } from '@/domains/collab/composables/collabState'\nimport { useCollabCurrentUserId } from '@/domains/collab/composables/collabCurrentUserId'\nimport { cloneDeep, isDefined, isUndefined } from '@/shared/utils/common'\nimport { objectSetValueByPath } from '@/shared/utils/object'\n\nexport function useCollabAnyDataChange(room: CollabRoom, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { currentUserId } = useCollabCurrentUserId()\n const {\n collabSocket,\n collabFieldLocksState,\n collabFieldDataBufferState,\n collabRoomInfoState,\n setFieldLockUnanswered,\n fieldLockMaybeHeld,\n } = useCollabStateInternal()\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n\n const anyChangeCallback = ref<undefined | ((field: CollabFieldName, payload: CollabFieldDataEnvelope) => void)>()\n const unsubscribeCollabAnyDataChangeListener = ref<undefined | Fn>()\n\n const anyChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (event.room !== room || isUndefined(payload) || isUndefined(anyChangeCallback.value)) {\n return\n }\n anyChangeCallback.value(event.field, payload)\n }\n\n const addCollabAnyDataChangeListener = (\n callback: (field: CollabFieldName, data: CollabFieldDataEnvelope) => void\n ) => {\n anyChangeCallback.value = callback\n unsubscribeCollabAnyDataChangeListener.value = changeEventBus.on(anyChangeEventBusListener)\n }\n\n const changeCollabAnyData = (field: CollabFieldName, data: CollabFieldData, callback: Fn | undefined = undefined) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n if (!isUndefined(callback)) callback()\n })\n }\n\n const objectSetDataByField = <T extends object>(\n field: CollabFieldName,\n data: CollabFieldDataEnvelope,\n objectToUpdate: MaybeRef<T>\n ) => {\n const object = unref(objectToUpdate)\n switch (data.type) {\n case 'json':\n {\n objectSetValueByPath(object, field, cloneDeep(data.value))\n }\n break\n default: {\n objectSetValueByPath(object, field, data.value)\n }\n }\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabAnyDataChangeListener.value)) {\n unsubscribeCollabAnyDataChangeListener.value()\n }\n })\n\n const acquireCollabAnyLock = (field: CollabFieldName, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error) setFieldLockUnanswered(room, field, true)\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(response.locks ? Object.entries(response.locks) : [])\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabAnyLock = (\n field: CollabFieldName,\n data: CollabFieldData,\n options: Partial<CollabFieldLockOptions> = {}\n ) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n // As `useCollabField` does: a lock held while the other editor left is released on the server too.\n if (!collabSocket.value.connected || !fieldLockMaybeHeld(room, field, currentUserId.value)) return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n setFieldLockUnanswered(room, field, false)\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n if (response.locks) {\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n return {\n addCollabAnyDataChangeListener,\n unsubscribeCollabAnyDataChangeListener,\n changeCollabAnyData,\n objectSetDataByField,\n acquireCollabAnyLock,\n releaseCollabAnyLock,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"collabAnyDataChange.js","names":["useCollabAnyDataChange","useCommonAdminCollabOptions","useCollabCurrentUserId","useCollabStateInternal","changeEventBus","useCollabRoomDataChangeEventBus","fieldLockStatusEventBus","useCollabFieldLockStatusEventBus","anyChangeCallback","ref","unsubscribeCollabAnyDataChangeListener","anyChangeEventBusListener","event","room","isUndefined","payload","tryOnBeforeUnmount","disableAutoUnsubscribe","isDefined","callback","collabOptions","collabSocket","roomInfo","collabRoomInfoState","CollabStatus","field","data","object","unref","objectToUpdate","cloneDeep","options","statusEvent","error","setFieldLockUnanswered","isCollabFailedChangeRoomLockCallback","response","createFieldLockStatusPayload","CollabFieldLockType","CollabFieldLockStatus","isCollabSuccessChangeRoomLockCallback","collabFieldLocksState","locks","lock","collabFieldDataBufferState","fieldLockMaybeHeld","currentUserId"],"sources":["../../../../src/domains/collab/composables/collabAnyDataChange.ts"],"sourcesContent":["import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/domains/collab/types/Collab'\nimport { type MaybeRef, ref, unref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n CollabFieldLockType,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/domains/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport { useCollabStateInternal } from '@/domains/collab/composables/collabState'\nimport { useCollabCurrentUserId } from '@/domains/collab/composables/collabCurrentUserId'\nimport { cloneDeep, isDefined, isUndefined } from '@/shared/utils/common'\nimport { objectSetValueByPath } from '@/shared/utils/object'\n\nexport function useCollabAnyDataChange(room: CollabRoom, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { currentUserId } = useCollabCurrentUserId()\n const {\n collabSocket,\n collabFieldLocksState,\n collabFieldDataBufferState,\n collabRoomInfoState,\n setFieldLockUnanswered,\n fieldLockMaybeHeld,\n } = useCollabStateInternal()\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n\n const anyChangeCallback = ref<undefined | ((field: CollabFieldName, payload: CollabFieldDataEnvelope) => void)>()\n const unsubscribeCollabAnyDataChangeListener = ref<undefined | Fn>()\n\n const anyChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (event.room !== room || isUndefined(payload) || isUndefined(anyChangeCallback.value)) {\n return\n }\n anyChangeCallback.value(event.field, payload)\n }\n\n const addCollabAnyDataChangeListener = (\n callback: (field: CollabFieldName, data: CollabFieldDataEnvelope) => void\n ) => {\n anyChangeCallback.value = callback\n unsubscribeCollabAnyDataChangeListener.value = changeEventBus.on(anyChangeEventBusListener)\n }\n\n const changeCollabAnyData = (field: CollabFieldName, data: CollabFieldData, callback: Fn | undefined = undefined) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n if (!isUndefined(callback)) callback()\n })\n }\n\n const objectSetDataByField = <T extends object>(\n field: CollabFieldName,\n data: CollabFieldDataEnvelope,\n objectToUpdate: MaybeRef<T>\n ) => {\n const object = unref(objectToUpdate)\n switch (data.type) {\n case 'json':\n {\n objectSetValueByPath(object, field, cloneDeep(data.value))\n }\n break\n default: {\n objectSetValueByPath(object, field, data.value)\n }\n }\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabAnyDataChangeListener.value)) {\n unsubscribeCollabAnyDataChangeListener.value()\n }\n })\n\n const acquireCollabAnyLock = (field: CollabFieldName, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error) setFieldLockUnanswered(room, field, true)\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(response.locks ? Object.entries(response.locks) : [])\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabAnyLock = (\n field: CollabFieldName,\n data: CollabFieldData,\n options: Partial<CollabFieldLockOptions> = {}\n ) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n // As in `useCollabField`: a lock held while the other editor left must be released on the server too.\n if (!collabSocket.value.connected || !fieldLockMaybeHeld(room, field, currentUserId.value)) return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n setFieldLockUnanswered(room, field, false)\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n if (response.locks) {\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n return {\n addCollabAnyDataChangeListener,\n unsubscribeCollabAnyDataChangeListener,\n changeCollabAnyData,\n objectSetDataByField,\n acquireCollabAnyLock,\n releaseCollabAnyLock,\n }\n}\n"],"mappings":"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"}
@@ -2,9 +2,11 @@ import { CollabFieldData, CollabFieldDataEnvelope, CollabFieldLockOptions, Colla
2
2
  import { CollabFieldLockStatusPayload } from './collabEventBus';
3
3
  import { Fn } from '@vueuse/core';
4
4
  /**
5
- * `reacquireWhenActive`: a lock the component asked for and has not released is asked for again whenever the room
6
- * turns active — back after a lost connection, whose server let it go, or joined by another editor while this one was
7
- * alone and asked for none. For a field that holds the lock while it has the focus.
5
+ * `reacquireWhenActive`: a lock the component requested and has
6
+ * not released is requested again whenever the room turns active.
7
+ * This covers a reconnect, where the server released it, and
8
+ * another editor joining while this one was alone and held none.
9
+ * For a field that holds the lock while focused.
8
10
  */
9
11
  export declare function useCollabField(room: CollabRoom, field: CollabFieldName, disableAutoUnsubscribe?: boolean, reacquireWhenActive?: boolean): {
10
12
  addCollabFieldDataChangeListener: (callback: (data: CollabFieldDataEnvelope) => void) => void;