@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/README.md +4 -0
  2. package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
  3. package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
  4. package/dist/common-admin.css +1 -1
  5. package/dist/common-admin.js +282 -282
  6. package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
  7. package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  9. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
  10. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  12. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
  13. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  15. package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
  16. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  22. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
  23. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  25. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
  26. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  28. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
  29. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  31. package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
  32. package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  34. package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
  35. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  37. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  39. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
  40. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  42. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  44. package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
  45. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  47. package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  49. package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
  50. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
  52. package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
  53. package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
  54. package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
  55. package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
  56. package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
  57. package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
  58. package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
  59. package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
  60. package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
  61. package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
  62. package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
  63. package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
  64. package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
  65. package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
  66. package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
  67. package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
  68. package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
  69. package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
  70. package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
  71. package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
  72. package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
  73. package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
  74. package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
  75. package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
  76. package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
  77. package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
  78. package/dist/domains/api/composables/defineApiClient.js.map +1 -1
  79. package/dist/domains/api/composables/request.d.ts +18 -48
  80. package/dist/domains/api/composables/request.js.map +1 -1
  81. package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
  82. package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
  83. package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
  84. package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
  85. package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
  86. package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
  87. package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
  88. package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
  89. package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
  90. package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
  91. package/dist/domains/api/composables/useApiRequest.js.map +1 -1
  92. package/dist/domains/api/utils/apiErrors.d.ts +28 -55
  93. package/dist/domains/api/utils/apiErrors.js.map +1 -1
  94. package/dist/domains/api/utils/listBody.d.ts +22 -43
  95. package/dist/domains/api/utils/listBody.js.map +1 -1
  96. package/dist/domains/auth/components/Acl.js.map +1 -1
  97. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
  99. package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
  100. package/dist/domains/auth/composables/defineAuth.js.map +1 -1
  101. package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
  102. package/dist/domains/auth/composables/refreshSession.js.map +1 -1
  103. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  104. package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
  105. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/domains/cached/components/ACachedUserChip.js +1 -1
  107. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  108. package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
  109. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
  111. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
  112. package/dist/domains/cached/composables/defineCached.d.ts +13 -11
  113. package/dist/domains/cached/composables/defineCached.js.map +1 -1
  114. package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
  115. package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
  116. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  117. package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
  119. package/dist/domains/collab/composables/collabField.d.ts +5 -3
  120. package/dist/domains/collab/composables/collabField.js.map +1 -1
  121. package/dist/domains/collab/composables/collabInit.js +58 -54
  122. package/dist/domains/collab/composables/collabInit.js.map +1 -1
  123. package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
  124. package/dist/domains/collab/composables/collabRecovery.js +99 -0
  125. package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
  126. package/dist/domains/collab/composables/collabRoom.js +106 -106
  127. package/dist/domains/collab/composables/collabRoom.js.map +1 -1
  128. package/dist/domains/collab/composables/collabState.d.ts +11 -4
  129. package/dist/domains/collab/composables/collabState.js +34 -25
  130. package/dist/domains/collab/composables/collabState.js.map +1 -1
  131. package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
  132. package/dist/domains/collab/types/Collab.d.ts +31 -5
  133. package/dist/domains/collab/types/Collab.js +23 -11
  134. package/dist/domains/collab/types/Collab.js.map +1 -1
  135. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  136. package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
  137. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  139. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  141. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
  142. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
  144. package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
  145. package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
  146. package/dist/domains/dam/api/damAssetApi.js.map +1 -1
  147. package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
  148. package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
  149. package/dist/domains/dam/api/damConstants.js.map +1 -1
  150. package/dist/domains/dam/api/damEndPoints.js.map +1 -1
  151. package/dist/domains/dam/api/damImageApi.js.map +1 -1
  152. package/dist/domains/dam/api/uploadApi.js.map +1 -1
  153. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  154. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
  155. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  157. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  158. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  159. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
  160. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
  162. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  163. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  165. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  167. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  169. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
  170. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  172. package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
  173. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  175. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
  176. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  178. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  179. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  180. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
  182. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
  183. package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
  184. package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
  185. package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
  186. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
  187. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
  188. package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
  189. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  190. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
  191. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  193. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
  194. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  196. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
  197. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  199. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  200. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  201. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
  202. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  203. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  204. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  205. package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
  206. package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
  207. package/dist/domains/dam/author/api/authorApi.js.map +1 -1
  208. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  209. package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
  210. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  212. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
  213. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  215. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  216. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
  217. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  218. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
  219. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  221. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
  222. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
  224. package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
  225. package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
  226. package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
  227. package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
  228. package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
  229. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  230. package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
  232. package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
  233. package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
  234. package/dist/domains/dam/composables/damConfigName.js.map +1 -1
  235. package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
  236. package/dist/domains/dam/composables/damNotifications.js.map +1 -1
  237. package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
  238. package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
  239. package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
  240. package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
  241. package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
  242. package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
  243. package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
  244. package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
  245. package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
  246. package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
  247. package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
  248. package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
  249. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
  250. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
  251. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  252. package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
  253. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  254. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  255. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
  257. package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
  258. package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
  259. package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
  260. package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
  261. package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
  262. package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
  263. package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
  264. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
  265. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
  266. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  267. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  269. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  270. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  271. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  273. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  274. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
  275. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
  276. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  277. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
  278. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  279. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  280. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
  281. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  283. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
  284. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  285. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  286. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
  287. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  289. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
  290. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  291. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  292. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  293. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  294. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  295. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
  296. package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
  297. package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
  298. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
  299. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
  300. package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
  301. package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
  302. package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
  303. package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
  304. package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
  305. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
  306. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
  307. package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
  308. package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
  309. package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
  310. package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
  311. package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
  312. package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
  313. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  314. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
  315. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  317. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
  318. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  319. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
  320. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  321. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
  322. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  323. package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
  324. package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
  325. package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
  326. package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
  327. package/dist/domains/dam/types/Asset.d.ts +1 -1
  328. package/dist/domains/dam/types/Asset.js.map +1 -1
  329. package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
  330. package/dist/domains/dam/types/UploadQueue.js.map +1 -1
  331. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  332. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  334. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
  335. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  336. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  337. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  338. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  339. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  340. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  341. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
  342. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  343. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  344. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
  345. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  347. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  348. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  349. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
  350. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  351. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  352. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
  353. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  354. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
  355. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
  356. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
  357. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
  358. package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
  359. package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
  360. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
  361. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
  362. package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
  363. package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
  364. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
  365. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
  366. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
  367. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
  368. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
  369. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
  370. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
  371. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
  372. package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
  373. package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
  374. package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
  375. package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
  376. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
  377. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
  378. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
  379. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
  380. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
  381. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
  382. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
  383. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
  384. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
  385. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
  386. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
  387. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
  388. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
  389. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
  390. package/dist/domains/dam/user/api/userApi.d.ts +2 -2
  391. package/dist/domains/dam/user/api/userApi.js.map +1 -1
  392. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  393. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
  394. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  395. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  396. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
  397. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  398. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  399. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
  400. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  401. package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
  402. package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
  403. package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
  404. package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
  405. package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
  406. package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
  407. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  408. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  409. package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
  410. package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
  411. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  412. package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  413. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  414. package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  415. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  416. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  417. package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
  418. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  419. package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
  420. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  421. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  422. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  423. package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
  424. package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
  425. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
  426. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  427. package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
  428. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  429. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
  430. package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
  431. package/dist/domains/filters/composables/filterFactory.js +38 -31
  432. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  433. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  434. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
  435. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
  436. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  437. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
  438. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  439. package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
  440. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  441. package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
  442. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  443. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  444. package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
  445. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  446. package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
  447. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  448. package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
  449. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  450. package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
  451. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
  452. package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
  453. package/dist/domains/job/api/jobApi.js.map +1 -1
  454. package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
  455. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  456. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  457. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  458. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
  459. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  460. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  461. package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
  462. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  463. package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
  464. package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
  465. package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
  466. package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
  467. package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
  468. package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
  469. package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
  470. package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
  471. package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
  472. package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
  473. package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
  474. package/dist/domains/log/api/logApi.d.ts +2 -3
  475. package/dist/domains/log/api/logApi.js.map +1 -1
  476. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  477. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  478. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  479. package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
  480. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  481. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  482. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  483. package/dist/domains/log/components/ALogListView.js.map +1 -1
  484. package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
  485. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  486. package/dist/domains/log/composables/logActions.d.ts +4 -5
  487. package/dist/domains/log/composables/logActions.js.map +1 -1
  488. package/dist/domains/log/composables/logType.d.ts +6 -7
  489. package/dist/domains/log/composables/logType.js.map +1 -1
  490. package/dist/domains/log/filter/logFilter.d.ts +8 -11
  491. package/dist/domains/log/filter/logFilter.js.map +1 -1
  492. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  493. package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
  494. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  495. package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
  496. package/dist/domains/permission/composables/permissionActions.js.map +1 -1
  497. package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
  498. package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
  499. package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
  500. package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
  501. package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
  502. package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
  503. package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
  504. package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
  505. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  506. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
  507. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  508. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  509. package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
  510. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  511. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  512. package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
  513. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  514. package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
  515. package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
  516. package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
  517. package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
  518. package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
  519. package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
  520. package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
  521. package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
  522. package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
  523. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  524. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  525. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  526. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  527. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  528. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  529. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
  530. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
  531. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
  532. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
  533. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  534. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  535. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
  536. package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
  537. package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
  538. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  539. package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
  540. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  541. package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
  542. package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
  543. package/dist/domains/system/components/AAlerts.js.map +1 -1
  544. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  545. package/dist/domains/system/composables/alerts.js.map +1 -1
  546. package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
  547. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  548. package/dist/domains/system/composables/languageSettings.js.map +1 -1
  549. package/dist/domains/system/composables/loginStatus.js.map +1 -1
  550. package/dist/domains/system/composables/navigationError.d.ts +6 -8
  551. package/dist/domains/system/composables/navigationError.js.map +1 -1
  552. package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
  553. package/dist/domains/system/composables/pageNavigation.js.map +1 -1
  554. package/dist/domains/system/composables/recordActions.d.ts +14 -22
  555. package/dist/domains/system/composables/recordActions.js.map +1 -1
  556. package/dist/domains/system/composables/recordPage.d.ts +23 -38
  557. package/dist/domains/system/composables/recordPage.js.map +1 -1
  558. package/dist/domains/system/composables/routeHistory.d.ts +4 -5
  559. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  560. package/dist/domains/system/composables/sentry.js.map +1 -1
  561. package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
  562. package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
  563. package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
  564. package/dist/domains/system/store/datatablePageStore.js +10 -3
  565. package/dist/domains/system/store/datatablePageStore.js.map +1 -1
  566. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  567. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  568. package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
  569. package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
  570. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  571. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
  572. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
  573. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  574. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  575. package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
  576. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  577. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  578. package/dist/domains/ui/components/ACard.js.map +1 -1
  579. package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
  580. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
  581. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  582. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  583. package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
  584. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
  585. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  586. package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
  587. package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
  588. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  589. package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
  590. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  591. package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
  592. package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
  593. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  594. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  595. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  596. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
  597. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  598. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
  599. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  600. package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
  601. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  602. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  603. package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
  604. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  606. package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
  607. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  608. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  609. package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
  610. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  611. package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
  612. package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
  613. package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
  614. package/dist/domains/ui/view/components/ALoginView.js +1 -1
  615. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  616. package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
  617. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  618. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  619. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  620. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  621. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  622. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
  623. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
  624. package/dist/lib.d.ts +2 -2
  625. package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
  626. package/dist/plugins/commonVuetifyConfig.js.map +1 -1
  627. package/dist/plugins/i18n.d.ts +4 -5
  628. package/dist/plugins/i18n.js.map +1 -1
  629. package/dist/plugins/pluginOptions.d.ts +4 -2
  630. package/dist/plugins/pluginOptions.js.map +1 -1
  631. package/dist/plugins/webfontloader.js.map +1 -1
  632. package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
  633. package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
  634. package/dist/shared/error/AnzuError.d.ts +3 -5
  635. package/dist/shared/error/AnzuError.js.map +1 -1
  636. package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
  637. package/dist/shared/error/AuthUnavailableError.js.map +1 -1
  638. package/dist/shared/error/isInCauseChain.d.ts +2 -2
  639. package/dist/shared/error/isInCauseChain.js.map +1 -1
  640. package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
  641. package/dist/shared/types/Validation.d.ts +4 -5
  642. package/dist/shared/types/common.d.ts +1 -3
  643. package/dist/shared/types/globalComponents.d.ts +5 -6
  644. package/dist/shared/utils/common.js.map +1 -1
  645. package/dist/shared/utils/datetime.d.ts +0 -1
  646. package/dist/shared/utils/datetime.js.map +1 -1
  647. package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
  648. package/dist/shared/utils/datetimePickerValue.js.map +1 -1
  649. package/dist/shared/utils/development.d.ts +3 -3
  650. package/dist/shared/utils/development.js.map +1 -1
  651. package/dist/shared/utils/envConfig.d.ts +4 -4
  652. package/dist/shared/utils/envConfig.js.map +1 -1
  653. package/dist/shared/utils/json.d.ts +1 -1
  654. package/dist/shared/utils/json.js.map +1 -1
  655. package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
  656. package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
  657. package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
  658. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
  659. package/dist/testing/appShell.d.ts +11 -11
  660. package/dist/testing/appShell.js.map +1 -1
  661. package/dist/testing/closeButtons.d.ts +9 -11
  662. package/dist/testing/closeButtons.js.map +1 -1
  663. package/dist/testing/declaredDependencies.d.ts +7 -7
  664. package/dist/testing/declaredDependencies.js.map +1 -1
  665. package/dist/testing/generatedRoutes.d.ts +6 -11
  666. package/dist/testing/generatedRoutes.js.map +1 -1
  667. package/dist/testing/routeHistory.d.ts +5 -12
  668. package/dist/testing/routeHistory.js.map +1 -1
  669. package/dist/testing/sortableLists.d.ts +16 -21
  670. package/dist/testing/sortableLists.js.map +1 -1
  671. package/dist/testing/typedRouter.d.ts +0 -1
  672. package/dist/testing/typedRouter.js.map +1 -1
  673. package/package.json +39 -29
  674. package/src/e2e/conventions.d.mts +4 -0
  675. package/src/e2e/conventions.mjs +15 -0
  676. package/src/e2e/index.d.mts +8 -0
  677. package/src/e2e/index.mjs +1 -0
  678. package/src/e2e/routeWalk.d.mts +43 -0
  679. package/src/e2e/routeWalk.mjs +606 -0
  680. package/src/e2e/types.d.mts +161 -0
  681. package/src/eslint/adminConfig.mjs +19 -27
  682. package/src/eslint/globalComponentNames.mjs +3 -4
  683. package/src/eslint/oxlint.mjs +7 -20
  684. package/src/eslint/plugin.d.mts +2 -4
  685. package/src/eslint/plugin.mjs +18 -34
  686. package/src/eslint/validRouteName.mjs +6 -7
  687. package/src/vite/devWatch.mjs +30 -43
  688. package/src/vite/index.d.mts +5 -5
  689. package/src/vite/sentry.mjs +7 -12
  690. package/src/vite/sourcemaps.mjs +4 -8
@@ -1 +1 @@
1
- {"version":3,"file":"uploadQueueItemRefresh.js","names":["REFRESH_WARNING_KEYS","WARNING_OF","refreshMayStillHelp","item","UploadQueueItemStatus","refreshMayHelp","refreshAndSay","statusBefore","key","ask","gone","changedInto","createUploadQueueItemRefresh","refreshing","ref","queue","failed","useUploadQueueItemRefresh","uploadQueuesStore","useUploadQueuesStore","useAlerts","assetId","isUndefined","queueKey","configName","showWarningT"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { type UploadQueueItem, UploadQueueItemStatus, type UploadQueueKey } from '@/domains/dam/types/UploadQueue'\nimport type { UploadQueueListBinding } from '@/domains/dam/uploadQueue/components/uploadQueueBindings'\nimport type { UploadRefreshOutcome } from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\nimport { useUploadQueuesStore } from '@/domains/dam/uploadQueue/store/uploadQueuesStore'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport type { DocId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\n// How long an item of the queue waits before it offers refresh.\nexport const SHOW_REFRESH_AFTER_SECONDS = 20\n\n/** The warnings of a refresh, the message keys a host's `warn` is handed. */\nexport const REFRESH_WARNING_KEYS = {\n pendingT: 'common.damImage.queueItem.stillUploadingOrProcessing',\n failedT: 'common.damImage.queueItem.refreshFailed',\n assetGoneT: 'common.damImage.queueItem.assetGone',\n originalUnreadT: 'common.damImage.queueItem.duplicateOriginalUnread',\n} as const\nexport type UploadRefreshWarningKey = (typeof REFRESH_WARNING_KEYS)[keyof typeof REFRESH_WARNING_KEYS]\n\n// Why the item is as it was: the file is not done yet, or what asking again may mend, by its cause.\nconst WARNING_OF: Partial<Record<UploadRefreshOutcome, UploadRefreshWarningKey>> = {\n pending: REFRESH_WARNING_KEYS.pendingT,\n error: REFRESH_WARNING_KEYS.failedT,\n missing: REFRESH_WARNING_KEYS.assetGoneT,\n originalUnread: REFRESH_WARNING_KEYS.originalUnreadT,\n}\n\n/**\n * Whether a refresh may still change the item, as the row offers it: a failed one as its host says, an uploaded\n * one while it waits for its metadata, one still on its way or processed always, a stopped one never.\n */\nconst refreshMayStillHelp = (item: UploadQueueItem, refreshMayHelp: (item: UploadQueueItem) => boolean) => {\n switch (item.status) {\n case UploadQueueItemStatus.Failed:\n return refreshMayHelp(item)\n case UploadQueueItemStatus.Uploaded:\n return !item.canEditMetadata && !item.isDuplicate\n case UploadQueueItemStatus.Stop:\n return false\n default:\n return true\n }\n}\n\n/**\n * One refresh, and what the user is told of it. `item` is the one whose refresh was pressed, where the caller has\n * it, `gone` whether it was taken out of its queue meanwhile, and `refreshMayHelp` whether a refresh may still\n * change it once it has failed.\n */\nconst refreshAndSay = async (\n refreshing: Ref<boolean>,\n ask: () => Promise<UploadRefreshOutcome>,\n warn: UploadQueueListBinding['warn'],\n item: UploadQueueItem | undefined,\n gone: () => boolean,\n refreshMayHelp: (item: UploadQueueItem) => boolean\n) => {\n refreshing.value = true\n const statusBefore = item?.status\n try {\n const key = WARNING_OF[await ask()]\n if (!key) return\n if (item) {\n // Taken out of its queue meanwhile: the word would be about a row nobody sees any more.\n if (gone()) return\n // Uploaded, stopped or failed while the read was on its way, by what overtook it or by this very read: what\n // the read found is about the row as it was before, and the row shows what became of it. Only the press that\n // left it without the original of its duplicate says why, as the row keeps its refresh for that.\n const changedInto = item.status === statusBefore ? null : item.status\n if (changedInto === UploadQueueItemStatus.Uploaded || changedInto === UploadQueueItemStatus.Stop) return\n if (changedInto === UploadQueueItemStatus.Failed && key !== REFRESH_WARNING_KEYS.originalUnreadT) return\n // And only while pressing again may still help it: not a failed row with no refresh left, nor an uploaded\n // one that has its form.\n if (!refreshMayStillHelp(item, refreshMayHelp)) return\n }\n warn(key)\n } finally {\n refreshing.value = false\n }\n}\n\n/** The refresh of the rows of a list, over what its host binds: the host asks, and says what came of it. */\nexport function createUploadQueueItemRefresh(\n queue: Pick<UploadQueueListBinding, 'items' | 'refresh' | 'refreshMayHelp' | 'warn'>\n) {\n const refreshing = ref(false)\n const gone = (item: UploadQueueItem) => !queue.items().includes(item)\n\n const refreshItem = async (item: UploadQueueItem) => {\n // A row that is no longer in the list is not asked about.\n if (gone(item)) return\n await refreshAndSay(\n refreshing,\n () => queue.refresh(item),\n (key) => queue.warn(key),\n item,\n () => gone(item),\n (failed) => queue.refreshMayHelp(failed)\n )\n }\n\n return { refreshing, refreshItem }\n}\n\n/**\n * The refresh of an item of the upload queue: asks what became of its file, and settles the item accordingly.\n * The store asks with the client of the configuration of the queue, and settles the rows of its queues: those of the\n * queue `queueKey` of the refresh, or of the configuration `configName` where none is given.\n */\nexport function useUploadQueueItemRefresh(configName: string) {\n const uploadQueuesStore = useUploadQueuesStore()\n const { showWarningT } = useAlerts()\n const refreshing = ref(false)\n\n /**\n * `item` is the one whose refresh was pressed and `queueKey` the queue it was pressed in, where the caller has\n * them: the warnings of a failure and of a file not done yet go by them.\n */\n const refreshItem = (assetId: DocId, item?: UploadQueueItem, queueKey?: UploadQueueKey) =>\n refreshAndSay(\n refreshing,\n () => uploadQueuesStore.refreshAsset(assetId, isUndefined(queueKey) ? configName : { queueKey }),\n (key) => showWarningT(key),\n item,\n // A removed item keeps its status unless it was still waiting or being sent: that it is gone is read from\n // its queue.\n () => !!item && !isUndefined(queueKey) && !uploadQueuesStore.getQueueItems(queueKey).includes(item),\n (failed) => uploadQueuesStore.refreshMayHelp(failed)\n )\n\n return { refreshing, refreshItem }\n}\n"],"mappings":";;;;;;AAaA,IAAaA,IAAuB;CAClC,UAAU;CACV,SAAS;CACT,YAAY;CACZ,iBAAiB;AACnB,GAIMC,IAA6E;CACjF,SAASD,EAAqB;CAC9B,OAAOA,EAAqB;CAC5B,SAASA,EAAqB;CAC9B,gBAAgBA,EAAqB;AACvC,GAMME,KAAuB,GAAuB,MAAuD;CACzG,QAAQC,EAAK,QAAb;EACE,KAAKC,EAAsB,QACzB,OAAOC,EAAeF,CAAI;EAC5B,KAAKC,EAAsB,UACzB,OAAO,CAACD,EAAK,mBAAmB,CAACA,EAAK;EACxC,KAAKC,EAAsB,MACzB,OAAO;EACT,SACE,OAAO;CACX;AACF,GAOME,IAAgB,OACpB,GACA,GACA,GACA,GACA,GACA,MACG;CACH,EAAW,QAAQ;CACnB,IAAMC,IAAeJ,GAAM;CAC3B,IAAI;EACF,IAAMK,IAAMP,EAAW,MAAMQ,EAAI;EACjC,IAAI,CAACD,GAAK;EACV,IAAIL,GAAM;GAER,IAAIO,EAAK,GAAG;GAIZ,IAAMC,IAAcR,EAAK,WAAWI,IAAe,OAAOJ,EAAK;GAK/D,IAJIQ,MAAgBP,EAAsB,YAAYO,MAAgBP,EAAsB,QACxFO,MAAgBP,EAAsB,UAAUI,MAAQR,EAAqB,mBAG7E,CAACE,EAAoBC,GAAME,CAAc,GAAG;EAClD;EACA,EAAKG,CAAG;CACV,UAAU;EACR,EAAW,QAAQ;CACrB;AACF;AAGA,SAAgBI,EACd,GACA;CACA,IAAMC,IAAaC,EAAI,EAAK,GACtBJ,KAAQ,MAA0B,CAACK,EAAM,MAAM,CAAC,CAAC,SAASZ,CAAI;CAepE,OAAO;EAAE;EAAY,oBAbM,MAA0B;GAEnD,AAAIO,EAAKP,CAAI,KACb,MAAMG,EACJO,SACME,EAAM,QAAQZ,CAAI,IACvB,MAAQY,EAAM,KAAKP,CAAG,GACvBL,SACMO,EAAKP,CAAI,IACd,MAAWY,EAAM,eAAeC,CAAM,CACzC;EACF;CAEiC;AACnC;AAOA,SAAgBC,EAA0B,GAAoB;CAC5D,IAAMC,IAAoBC,EAAqB,GACzC,EAAE,oBAAiBC,EAAU,GAC7BP,IAAaC,EAAI,EAAK;CAkB5B,OAAO;EAAE;EAAY,cAZA,GAAgB,GAAwB,MAC3DR,EACEO,SACMK,EAAkB,aAAaG,GAASC,EAAYC,CAAQ,IAAIC,IAAa,EAAE,YAAS,CAAC,IAC9F,MAAQC,EAAajB,CAAG,GACzBL,SAGM,CAAC,CAACA,KAAQ,CAACmB,EAAYC,CAAQ,KAAK,CAACL,EAAkB,cAAcK,CAAQ,CAAC,CAAC,SAASpB,CAAI,IACjG,MAAWe,EAAkB,eAAeF,CAAM,CACrD;CAE+B;AACnC"}
1
+ {"version":3,"file":"uploadQueueItemRefresh.js","names":["REFRESH_WARNING_KEYS","WARNING_OF","refreshMayStillHelp","item","UploadQueueItemStatus","refreshMayHelp","refreshAndSay","statusBefore","key","ask","gone","changedInto","createUploadQueueItemRefresh","refreshing","ref","queue","failed","useUploadQueueItemRefresh","uploadQueuesStore","useUploadQueuesStore","useAlerts","assetId","isUndefined","queueKey","configName","showWarningT"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { type UploadQueueItem, UploadQueueItemStatus, type UploadQueueKey } from '@/domains/dam/types/UploadQueue'\nimport type { UploadQueueListBinding } from '@/domains/dam/uploadQueue/components/uploadQueueBindings'\nimport type { UploadRefreshOutcome } from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\nimport { useUploadQueuesStore } from '@/domains/dam/uploadQueue/store/uploadQueuesStore'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport type { DocId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nexport const SHOW_REFRESH_AFTER_SECONDS = 20\n\n/** Message keys passed to the host's `warn` after a refresh. */\nexport const REFRESH_WARNING_KEYS = {\n pendingT: 'common.damImage.queueItem.stillUploadingOrProcessing',\n failedT: 'common.damImage.queueItem.refreshFailed',\n assetGoneT: 'common.damImage.queueItem.assetGone',\n originalUnreadT: 'common.damImage.queueItem.duplicateOriginalUnread',\n} as const\nexport type UploadRefreshWarningKey = (typeof REFRESH_WARNING_KEYS)[keyof typeof REFRESH_WARNING_KEYS]\n\n// Warning per refresh outcome: the file is not done yet, or what a new refresh may fix.\nconst WARNING_OF: Partial<Record<UploadRefreshOutcome, UploadRefreshWarningKey>> = {\n pending: REFRESH_WARNING_KEYS.pendingT,\n error: REFRESH_WARNING_KEYS.failedT,\n missing: REFRESH_WARNING_KEYS.assetGoneT,\n originalUnread: REFRESH_WARNING_KEYS.originalUnreadT,\n}\n\n/**\n * Whether a refresh may still change the item.\n * Failed: as the host's `refreshMayHelp` says. Uploaded: only while it waits for metadata.\n * Waiting, uploading or processing: always. Stopped: never.\n */\nconst refreshMayStillHelp = (item: UploadQueueItem, refreshMayHelp: (item: UploadQueueItem) => boolean) => {\n switch (item.status) {\n case UploadQueueItemStatus.Failed:\n return refreshMayHelp(item)\n case UploadQueueItemStatus.Uploaded:\n return !item.canEditMetadata && !item.isDuplicate\n case UploadQueueItemStatus.Stop:\n return false\n default:\n return true\n }\n}\n\n/**\n * Runs one refresh and warns the user about the result.\n * `item` is the row whose refresh was pressed, if the caller has it. `gone` tells whether it left its queue meanwhile.\n * `refreshMayHelp` tells whether a refresh may still change a failed item.\n */\nconst refreshAndSay = async (\n refreshing: Ref<boolean>,\n ask: () => Promise<UploadRefreshOutcome>,\n warn: UploadQueueListBinding['warn'],\n item: UploadQueueItem | undefined,\n gone: () => boolean,\n refreshMayHelp: (item: UploadQueueItem) => boolean\n) => {\n refreshing.value = true\n const statusBefore = item?.status\n try {\n const key = WARNING_OF[await ask()]\n if (!key) return\n if (item) {\n // Removed from its queue meanwhile: a warning would be about a row nobody sees.\n if (gone()) return\n // The status changed while the read was in flight, by another event or by this read.\n // The result describes the old row, and the row already shows the new state.\n // Only a failure that keeps the refresh button, such as a missing duplicate original, gets a warning.\n const changedInto = item.status === statusBefore ? null : item.status\n if (changedInto === UploadQueueItemStatus.Uploaded || changedInto === UploadQueueItemStatus.Stop) return\n if (changedInto === UploadQueueItemStatus.Failed && key !== REFRESH_WARNING_KEYS.originalUnreadT) return\n // Warn only while pressing again may still help.\n // Not for a failed row with no refresh left, nor an uploaded row that has its form.\n if (!refreshMayStillHelp(item, refreshMayHelp)) return\n }\n warn(key)\n } finally {\n refreshing.value = false\n }\n}\n\n/** Refresh for the rows of a list. The host binding does the request and shows the warnings. */\nexport function createUploadQueueItemRefresh(\n queue: Pick<UploadQueueListBinding, 'items' | 'refresh' | 'refreshMayHelp' | 'warn'>\n) {\n const refreshing = ref(false)\n const gone = (item: UploadQueueItem) => !queue.items().includes(item)\n\n const refreshItem = async (item: UploadQueueItem) => {\n if (gone(item)) return\n await refreshAndSay(\n refreshing,\n () => queue.refresh(item),\n (key) => queue.warn(key),\n item,\n () => gone(item),\n (failed) => queue.refreshMayHelp(failed)\n )\n }\n\n return { refreshing, refreshItem }\n}\n\n/**\n * Refresh of an upload queue item: asks the server what became of its file and updates the item.\n * Uses the client of the queue's configuration. Updates rows of queue\n * `queueKey`, or of configuration `configName` when no key is given.\n */\nexport function useUploadQueueItemRefresh(configName: string) {\n const uploadQueuesStore = useUploadQueuesStore()\n const { showWarningT } = useAlerts()\n const refreshing = ref(false)\n\n /**\n * `item` and `queueKey` are the pressed row and its queue, if the caller has them.\n * The warnings for a failure and for an unfinished file depend on them.\n */\n const refreshItem = (assetId: DocId, item?: UploadQueueItem, queueKey?: UploadQueueKey) =>\n refreshAndSay(\n refreshing,\n () => uploadQueuesStore.refreshAsset(assetId, isUndefined(queueKey) ? configName : { queueKey }),\n (key) => showWarningT(key),\n item,\n // A removed item keeps its status unless it was waiting or uploading.\n // So removal is detected by checking its queue.\n () => !!item && !isUndefined(queueKey) && !uploadQueuesStore.getQueueItems(queueKey).includes(item),\n (failed) => uploadQueuesStore.refreshMayHelp(failed)\n )\n\n return { refreshing, refreshItem }\n}\n"],"mappings":";;;;;;AAYA,IAAaA,IAAuB;CAClC,UAAU;CACV,SAAS;CACT,YAAY;CACZ,iBAAiB;AACnB,GAIMC,IAA6E;CACjF,SAASD,EAAqB;CAC9B,OAAOA,EAAqB;CAC5B,SAASA,EAAqB;CAC9B,gBAAgBA,EAAqB;AACvC,GAOME,KAAuB,GAAuB,MAAuD;CACzG,QAAQC,EAAK,QAAb;EACE,KAAKC,EAAsB,QACzB,OAAOC,EAAeF,CAAI;EAC5B,KAAKC,EAAsB,UACzB,OAAO,CAACD,EAAK,mBAAmB,CAACA,EAAK;EACxC,KAAKC,EAAsB,MACzB,OAAO;EACT,SACE,OAAO;CACX;AACF,GAOME,IAAgB,OACpB,GACA,GACA,GACA,GACA,GACA,MACG;CACH,EAAW,QAAQ;CACnB,IAAMC,IAAeJ,GAAM;CAC3B,IAAI;EACF,IAAMK,IAAMP,EAAW,MAAMQ,EAAI;EACjC,IAAI,CAACD,GAAK;EACV,IAAIL,GAAM;GAER,IAAIO,EAAK,GAAG;GAIZ,IAAMC,IAAcR,EAAK,WAAWI,IAAe,OAAOJ,EAAK;GAK/D,IAJIQ,MAAgBP,EAAsB,YAAYO,MAAgBP,EAAsB,QACxFO,MAAgBP,EAAsB,UAAUI,MAAQR,EAAqB,mBAG7E,CAACE,EAAoBC,GAAME,CAAc,GAAG;EAClD;EACA,EAAKG,CAAG;CACV,UAAU;EACR,EAAW,QAAQ;CACrB;AACF;AAGA,SAAgBI,EACd,GACA;CACA,IAAMC,IAAaC,EAAI,EAAK,GACtBJ,KAAQ,MAA0B,CAACK,EAAM,MAAM,CAAC,CAAC,SAASZ,CAAI;CAcpE,OAAO;EAAE;EAAY,oBAZM,MAA0B;GACnD,AAAIO,EAAKP,CAAI,KACb,MAAMG,EACJO,SACME,EAAM,QAAQZ,CAAI,IACvB,MAAQY,EAAM,KAAKP,CAAG,GACvBL,SACMO,EAAKP,CAAI,IACd,MAAWY,EAAM,eAAeC,CAAM,CACzC;EACF;CAEiC;AACnC;AAOA,SAAgBC,EAA0B,GAAoB;CAC5D,IAAMC,IAAoBC,EAAqB,GACzC,EAAE,oBAAiBC,EAAU,GAC7BP,IAAaC,EAAI,EAAK;CAkB5B,OAAO;EAAE;EAAY,cAZA,GAAgB,GAAwB,MAC3DR,EACEO,SACMK,EAAkB,aAAaG,GAASC,EAAYC,CAAQ,IAAIC,IAAa,EAAE,YAAS,CAAC,IAC9F,MAAQC,EAAajB,CAAG,GACzBL,SAGM,CAAC,CAACA,KAAQ,CAACmB,EAAYC,CAAQ,KAAK,CAACL,EAAkB,cAAcK,CAAQ,CAAC,CAAC,SAASpB,CAAI,IACjG,MAAWe,EAAkB,eAAeF,CAAM,CACrD;CAE+B;AACnC"}
@@ -1,12 +1,11 @@
1
1
  import { UploadQueueItem } from '../../types/UploadQueue';
2
2
  import { UploadMessages, UploadPreset, UploadProgressCallback, UploadRun, UploadSide } from '../presets/uploadPresets';
3
- /** The text of a validation answer (422 with `fields`): one line per field, in the texts of the side. */
3
+ /** Message for a validation error (422 with `fields`): one line per field, in the side's texts. */
4
4
  export declare function uploadValidationMessage(error: unknown, messages: UploadMessages): string;
5
- /** One run for both sides; without a set it is the library's. Public as `useDamUpload`. */
5
+ /** Run for either side. Without a preset it uses the library's. Public as `useDamUpload`. */
6
6
  export declare function useUpload(queueItem: UploadQueueItem, uploadCallback?: UploadProgressCallback, preset?: undefined): UploadRun<'library'> & {
7
7
  stopSpeedCheck(): void;
8
8
  };
9
- /** The run of the side of the set. */
10
9
  export declare function useUpload<S extends UploadSide>(queueItem: UploadQueueItem, uploadCallback: UploadProgressCallback | undefined, preset: UploadPreset<S>): UploadRun<S> & {
11
10
  stopSpeedCheck(): void;
12
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"uploadService.js","names":["axios","CHUNK_MAX_RETRY","CHUNK_RETRY_INTERVAL","CHUNK_RETRY_MULTIPLY","uploadValidationMessage","error","messages","data","errorMessages","key","values","readFile","partial","file","offset","size","reader","e","result","resolve","reject","sleep","ms","stoppedError","chunkBoundsLoaded","useDamConfigStoreOf","configName","minSize","maxSize","useUpload","set","preset","libraryUploadPreset","uploadPresetMembers","fileSize","ref","meter","useUploadMeter","uploadCallback","sha","finishAttempted","stopRequested","useDamUploadChunkSize","apiTimeout","stopped","queueItem","UploadQueueItemStatus","uploadChunk","onUploadProgress","chunkFile","requests","exception","processAndUploadChunk","arrayBuffer","lastChunkSize","sleepTime","attempt","hash","lastAttempt","axiosErrorResponseHasValidationData","updateChunkSize","stopSpeedCheck","uploadInit","sendable","emptyFile","loadHash","res","err","upload","filesize","isUndefined","uploadedChunk","stop","uploadSide","uploadStop"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/uploadService.ts"],"sourcesContent":["import { ref } from 'vue'\nimport axios from 'axios'\nimport {\n type AnzuApiValidationResponseData,\n axiosErrorResponseHasValidationData,\n} from '@/shared/error/AnzuApiValidationError'\nimport { type UploadQueueItem, UploadQueueItemStatus } from '@/domains/dam/types/UploadQueue'\nimport { NEW_LINE_MARK } from '@/domains/system/composables/alerts'\nimport { isUndefined } from '@/shared/utils/common'\nimport { useDamUploadChunkSize } from '@/domains/dam/uploadQueue/composables/damUploadChunkSize'\nimport { useDamConfigStoreOf } from '@/domains/dam/config/store/damConfigStore'\nimport { useUploadMeter } from '@/domains/dam/uploadQueue/composables/uploadMeter'\nimport {\n libraryUploadPreset,\n type UploadHash,\n type UploadMessages,\n type UploadPreset,\n uploadPresetMembers,\n type UploadProgressCallback,\n type UploadRun,\n uploadSide,\n type UploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\n\n// const CHUNK_MAX_RETRY = 6\nconst CHUNK_MAX_RETRY = 4\nconst CHUNK_RETRY_INTERVAL = 1000\nconst CHUNK_RETRY_MULTIPLY = 3\n\n/** The text of a validation answer (422 with `fields`): one line per field, in the texts of the side. */\nexport function uploadValidationMessage(error: unknown, messages: UploadMessages): string {\n if (!axios.isAxiosError(error) || !error.response || !error.response.data) return messages.unknownError()\n const data = error.response.data as Partial<AnzuApiValidationResponseData>\n const errorMessages: string[] = []\n for (const [key, values] of Object.entries(data.fields ?? {})) {\n switch (key) {\n case 'size':\n errorMessages.push(messages.size())\n break\n case 'offset':\n errorMessages.push(messages.offset())\n break\n case 'mimeType':\n errorMessages.push(messages.mimeType())\n break\n default:\n errorMessages.push(messages.systemError() + ': ' + key + ' - ' + values.join(','))\n }\n }\n return errorMessages.length > 0 ? errorMessages.join(NEW_LINE_MARK) : messages.unknownError()\n}\n\nconst readFile = async (offset: number, size: number, file: File): Promise<{ data: ArrayBuffer; offset: number }> => {\n return new Promise((resolve, reject) => {\n const partial = file.slice(offset, offset + size)\n const reader = new FileReader()\n reader.onload = function (e) {\n if (e.target?.readyState === FileReader.DONE) {\n const result = e.target.result\n if (result instanceof ArrayBuffer) {\n resolve({ data: result, offset: offset })\n } else {\n reject(new Error('FileReader result is not an ArrayBuffer'))\n }\n }\n }\n reader.onerror = function (e) {\n reject(e)\n }\n reader.readAsArrayBuffer(partial)\n })\n}\n\nconst sleep = (ms: number) => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nconst stoppedError = () => new Error('Upload stopped')\n\n// The bounds of the chunks come with the prv configuration of the DAM configuration, 0 and 0 till it is loaded: a chunk\n// sized by them is of no bytes.\nconst chunkBoundsLoaded = (configName: string) => {\n const { minSize, maxSize } = useDamConfigStoreOf(configName).damPrvConfig.settings.imageChunkConfig\n return minSize > 0 && maxSize > 0\n}\n\n/** One run for both sides; without a set it is the library's. Public as `useDamUpload`. */\nexport function useUpload(\n queueItem: UploadQueueItem,\n uploadCallback?: UploadProgressCallback,\n preset?: undefined\n): UploadRun<'library'> & { stopSpeedCheck(): void }\n/** The run of the side of the set. */\nexport function useUpload<S extends UploadSide>(\n queueItem: UploadQueueItem,\n uploadCallback: UploadProgressCallback | undefined,\n preset: UploadPreset<S>\n): UploadRun<S> & { stopSpeedCheck(): void }\nexport function useUpload(\n queueItem: UploadQueueItem,\n uploadCallback?: UploadProgressCallback,\n preset?: UploadPreset\n): UploadRun & { stopSpeedCheck(): void } {\n // Made only when none is given: it reads the options of the plugin, which a side with a set of its own need not\n // have.\n // Without a preset, as `useUpload` is public: the library's, under `default`.\n const set = preset ?? libraryUploadPreset('default')\n const { requests, messages, apiTimeout, loadHash, emptyFile, configName } = set[uploadPresetMembers]\n const fileSize = ref(0)\n\n const meter = useUploadMeter(uploadCallback)\n let sha: UploadHash | undefined\n // Once the finish request went out the server may complete the file, whatever becomes of the answer.\n let finishAttempted = false\n // Set by `stop()`; the queue may stop a run by the status of its row instead, and every check reads both.\n let stopRequested = false\n const { updateChunkSize, lastChunkSize } = useDamUploadChunkSize(apiTimeout ?? undefined, configName)\n\n // A call, not an inline comparison: TypeScript keeps a status narrowed across the awaits in between.\n const stopped = () => stopRequested || queueItem.status === UploadQueueItemStatus.Stop\n\n const uploadChunk = async (chunkFile: File, offset: number) => {\n return new Promise((resolve, reject) => {\n const onUploadProgress = meter.attempt(chunkFile.size)\n if (!queueItem.fileId) {\n reject()\n return\n }\n requests\n .chunk(queueItem, queueItem.fileId, chunkFile, chunkFile.size, offset, onUploadProgress)\n .then((result) => {\n resolve(result)\n })\n .catch((exception) => {\n reject(exception)\n })\n })\n }\n\n const processAndUploadChunk = async (offset: number, hash: UploadHash): Promise<File> => {\n if (stopped()) return Promise.reject(stoppedError())\n updateChunkSize(queueItem.progress.speed)\n let arrayBuffer: { data: ArrayBuffer; offset: number } = await readFile(\n offset,\n lastChunkSize.value,\n queueItem.file!\n )\n let chunkFile = new File([arrayBuffer.data], queueItem.file!.name, {\n type: queueItem.file!.type,\n })\n\n // Stop between chunks has no request to cancel: the controller below would be a fresh one.\n if (stopped()) return Promise.reject(stoppedError())\n queueItem.currentChunkIndex = offset\n queueItem.latestChunkAbortController = new AbortController()\n\n let sleepTime = CHUNK_RETRY_INTERVAL\n let attempt = 0\n do {\n attempt++\n // A chunk of no bytes takes the upload no further: the upload fails at once, without the tries of a chunk.\n if (chunkFile.size === 0) return Promise.reject(new Error('uploadService: a chunk of no bytes'))\n try {\n await uploadChunk(chunkFile, offset)\n meter.chunkDone(chunkFile.size)\n hash.update(arrayBuffer.data)\n\n return chunkFile\n } catch (error) {\n meter.attemptFailed()\n if (axios.isCancel(error) || stopped()) return Promise.reject(error)\n const lastAttempt = attempt >= CHUNK_MAX_RETRY\n // Check for 400 Bad Request error on last attempt\n if (lastAttempt && axios.isAxiosError(error) && error.response?.status === 400) {\n queueItem.error.message = messages.chunkValidationFailed()\n return Promise.reject(error)\n }\n\n if (axiosErrorResponseHasValidationData(error as Error)) {\n queueItem.error.message = uploadValidationMessage(error, messages)\n return Promise.reject(error)\n }\n\n // Before the work for an attempt that never happens: the loop ends here.\n if (lastAttempt) break\n\n if (updateChunkSize(queueItem.progress.speed)) {\n arrayBuffer = await readFile(offset, lastChunkSize.value, queueItem.file!)\n chunkFile = new File([arrayBuffer.data], queueItem.file!.name, {\n type: queueItem.file!.type,\n })\n }\n\n await sleep(sleepTime)\n // A stop in the pause had no request to cancel.\n if (stopped()) return Promise.reject(stoppedError())\n sleepTime *= CHUNK_RETRY_MULTIPLY\n }\n } while (attempt < CHUNK_MAX_RETRY)\n return Promise.reject('Unable to upload chunk, max tries exceeded')\n }\n\n const stopSpeedCheck = () => meter.stop()\n\n const uploadInit = async () => {\n // Refused before anything is asked: the DAM is not asked to create an asset no chunk can fill.\n if (!chunkBoundsLoaded(configName)) {\n throw new Error(`uploadService: the chunk bounds of the DAM configuration \"${configName}\" are not loaded`)\n }\n const sendable = !!queueItem.file && (emptyFile === 'send' || queueItem.file.size > 0)\n // Taken before the first await: the queue starts every item it still sees waiting, and it looks again after\n // each file it adds.\n if (sendable) queueItem.status = UploadQueueItemStatus.Uploading\n const hash = await loadHash()\n // Stop has no request to cancel while the hash is prepared, so it is checked once the hash is here.\n if (stopped()) throw stoppedError()\n sha = hash\n return new Promise((resolve, reject) => {\n if (!queueItem.file) {\n reject(new Error('uploadService: the queue item has no file'))\n return\n }\n if (!sendable) {\n reject(new Error('Empty file'))\n return\n }\n fileSize.value = queueItem.file.size\n queueItem.status = UploadQueueItemStatus.Uploading\n requests\n .start(queueItem)\n .then((res) => {\n // Without both identifiers there is nothing to send the chunks to, nor an asset to ask about: the\n // upload fails here, as when the start is refused, not after a round of tries that send nothing.\n if (!res?.id || !res?.asset) {\n reject(new Error('uploadService: the start answer names no file or no asset'))\n return\n }\n queueItem.assetId = res.asset\n queueItem.fileId = res.id\n // A stop asked for while this was on the wire; the asset it created stays on the server.\n if (stopped()) {\n reject(stoppedError())\n return\n }\n resolve(queueItem)\n })\n .catch((err) => {\n reject(err)\n })\n })\n }\n\n const upload = async () => {\n meter.start(fileSize.value)\n\n // Every way out but the finish answered stops the meter: no later second reports on a run that failed.\n try {\n const filesize = queueItem.file?.size\n const hash = sha\n if (isUndefined(filesize) || isUndefined(hash)) throw undefined\n // A stop while the asset was being created had no chunk request to cancel either.\n if (stopped()) throw stoppedError()\n\n let i = 0\n while (i < filesize) {\n const uploadedChunk = await processAndUploadChunk(i, hash)\n i += uploadedChunk.size\n }\n\n meter.lastChunkSent()\n if (stopped()) throw stoppedError()\n finishAttempted = true\n return await requests.finish(queueItem, hash.digest('hex'))\n } catch (error) {\n stopSpeedCheck()\n throw error\n }\n }\n\n const stop = () => {\n stopRequested = true\n stopSpeedCheck()\n queueItem.latestChunkAbortController?.abort()\n }\n\n return {\n [uploadSide]: set[uploadSide],\n uploadInit,\n upload,\n stop,\n stopSpeedCheck,\n finishAttempted: () => finishAttempted,\n }\n}\n\nexport const uploadStop = (abortController: AbortController) => {\n abortController.abort()\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"uploadService.js","names":["axios","CHUNK_MAX_RETRY","CHUNK_RETRY_INTERVAL","CHUNK_RETRY_MULTIPLY","uploadValidationMessage","error","messages","data","errorMessages","key","values","readFile","partial","file","offset","size","reader","e","result","resolve","reject","sleep","ms","stoppedError","chunkBoundsLoaded","useDamConfigStoreOf","configName","minSize","maxSize","useUpload","set","preset","libraryUploadPreset","uploadPresetMembers","fileSize","ref","meter","useUploadMeter","uploadCallback","sha","finishAttempted","stopRequested","useDamUploadChunkSize","apiTimeout","stopped","queueItem","UploadQueueItemStatus","uploadChunk","onUploadProgress","chunkFile","requests","exception","processAndUploadChunk","arrayBuffer","lastChunkSize","sleepTime","attempt","hash","lastAttempt","axiosErrorResponseHasValidationData","updateChunkSize","stopSpeedCheck","uploadInit","sendable","emptyFile","loadHash","res","err","upload","filesize","isUndefined","uploadedChunk","stop","uploadSide","uploadStop"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/uploadService.ts"],"sourcesContent":["import { ref } from 'vue'\nimport axios from 'axios'\nimport {\n type AnzuApiValidationResponseData,\n axiosErrorResponseHasValidationData,\n} from '@/shared/error/AnzuApiValidationError'\nimport { type UploadQueueItem, UploadQueueItemStatus } from '@/domains/dam/types/UploadQueue'\nimport { NEW_LINE_MARK } from '@/domains/system/composables/alerts'\nimport { isUndefined } from '@/shared/utils/common'\nimport { useDamUploadChunkSize } from '@/domains/dam/uploadQueue/composables/damUploadChunkSize'\nimport { useDamConfigStoreOf } from '@/domains/dam/config/store/damConfigStore'\nimport { useUploadMeter } from '@/domains/dam/uploadQueue/composables/uploadMeter'\nimport {\n libraryUploadPreset,\n type UploadHash,\n type UploadMessages,\n type UploadPreset,\n uploadPresetMembers,\n type UploadProgressCallback,\n type UploadRun,\n uploadSide,\n type UploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\n\nconst CHUNK_MAX_RETRY = 4\nconst CHUNK_RETRY_INTERVAL = 1000\nconst CHUNK_RETRY_MULTIPLY = 3\n\n/** Message for a validation error (422 with `fields`): one line per field, in the side's texts. */\nexport function uploadValidationMessage(error: unknown, messages: UploadMessages): string {\n if (!axios.isAxiosError(error) || !error.response || !error.response.data) return messages.unknownError()\n const data = error.response.data as Partial<AnzuApiValidationResponseData>\n const errorMessages: string[] = []\n for (const [key, values] of Object.entries(data.fields ?? {})) {\n switch (key) {\n case 'size':\n errorMessages.push(messages.size())\n break\n case 'offset':\n errorMessages.push(messages.offset())\n break\n case 'mimeType':\n errorMessages.push(messages.mimeType())\n break\n default:\n errorMessages.push(messages.systemError() + ': ' + key + ' - ' + values.join(','))\n }\n }\n return errorMessages.length > 0 ? errorMessages.join(NEW_LINE_MARK) : messages.unknownError()\n}\n\nconst readFile = async (offset: number, size: number, file: File): Promise<{ data: ArrayBuffer; offset: number }> => {\n return new Promise((resolve, reject) => {\n const partial = file.slice(offset, offset + size)\n const reader = new FileReader()\n reader.onload = function (e) {\n if (e.target?.readyState === FileReader.DONE) {\n const result = e.target.result\n if (result instanceof ArrayBuffer) {\n resolve({ data: result, offset: offset })\n } else {\n reject(new Error('FileReader result is not an ArrayBuffer'))\n }\n }\n }\n reader.onerror = function (e) {\n reject(e)\n }\n reader.readAsArrayBuffer(partial)\n })\n}\n\nconst sleep = (ms: number) => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nconst stoppedError = () => new Error('Upload stopped')\n\n// Chunk bounds come from the DAM prv configuration and are 0 and 0 until it loads.\n// A chunk sized by them would be empty.\nconst chunkBoundsLoaded = (configName: string) => {\n const { minSize, maxSize } = useDamConfigStoreOf(configName).damPrvConfig.settings.imageChunkConfig\n return minSize > 0 && maxSize > 0\n}\n\n/** Run for either side. Without a preset it uses the library's. Public as `useDamUpload`. */\nexport function useUpload(\n queueItem: UploadQueueItem,\n uploadCallback?: UploadProgressCallback,\n preset?: undefined\n): UploadRun<'library'> & { stopSpeedCheck(): void }\nexport function useUpload<S extends UploadSide>(\n queueItem: UploadQueueItem,\n uploadCallback: UploadProgressCallback | undefined,\n preset: UploadPreset<S>\n): UploadRun<S> & { stopSpeedCheck(): void }\nexport function useUpload(\n queueItem: UploadQueueItem,\n uploadCallback?: UploadProgressCallback,\n preset?: UploadPreset\n): UploadRun & { stopSpeedCheck(): void } {\n // The library preset is created only when none is given. It reads\n // the plugin options, which a side with its own preset may not have.\n // `useUpload` is public, so the fallback is the library's `default` preset.\n const set = preset ?? libraryUploadPreset('default')\n const { requests, messages, apiTimeout, loadHash, emptyFile, configName } = set[uploadPresetMembers]\n const fileSize = ref(0)\n\n const meter = useUploadMeter(uploadCallback)\n let sha: UploadHash | undefined\n // Once the finish request is sent, the server may complete the file whatever the response.\n let finishAttempted = false\n // Set by `stop()`; the queue may stop a run by the status of its row instead, and every check reads both.\n let stopRequested = false\n const { updateChunkSize, lastChunkSize } = useDamUploadChunkSize(apiTimeout ?? undefined, configName)\n\n // A call, not an inline comparison: TypeScript keeps a status narrowed across the awaits in between.\n const stopped = () => stopRequested || queueItem.status === UploadQueueItemStatus.Stop\n\n const uploadChunk = async (chunkFile: File, offset: number) => {\n return new Promise((resolve, reject) => {\n const onUploadProgress = meter.attempt(chunkFile.size)\n if (!queueItem.fileId) {\n reject()\n return\n }\n requests\n .chunk(queueItem, queueItem.fileId, chunkFile, chunkFile.size, offset, onUploadProgress)\n .then((result) => {\n resolve(result)\n })\n .catch((exception) => {\n reject(exception)\n })\n })\n }\n\n const processAndUploadChunk = async (offset: number, hash: UploadHash): Promise<File> => {\n if (stopped()) return Promise.reject(stoppedError())\n updateChunkSize(queueItem.progress.speed)\n let arrayBuffer: { data: ArrayBuffer; offset: number } = await readFile(\n offset,\n lastChunkSize.value,\n queueItem.file!\n )\n let chunkFile = new File([arrayBuffer.data], queueItem.file!.name, {\n type: queueItem.file!.type,\n })\n\n // Stop between chunks has no request to cancel: the controller below would be a fresh one.\n if (stopped()) return Promise.reject(stoppedError())\n queueItem.currentChunkIndex = offset\n queueItem.latestChunkAbortController = new AbortController()\n\n let sleepTime = CHUNK_RETRY_INTERVAL\n let attempt = 0\n do {\n attempt++\n // An empty chunk cannot advance the upload. Fail at once, without chunk retries.\n if (chunkFile.size === 0) return Promise.reject(new Error('uploadService: a chunk of no bytes'))\n try {\n await uploadChunk(chunkFile, offset)\n meter.chunkDone(chunkFile.size)\n hash.update(arrayBuffer.data)\n\n return chunkFile\n } catch (error) {\n meter.attemptFailed()\n if (axios.isCancel(error) || stopped()) return Promise.reject(error)\n const lastAttempt = attempt >= CHUNK_MAX_RETRY\n if (lastAttempt && axios.isAxiosError(error) && error.response?.status === 400) {\n queueItem.error.message = messages.chunkValidationFailed()\n return Promise.reject(error)\n }\n\n if (axiosErrorResponseHasValidationData(error as Error)) {\n queueItem.error.message = uploadValidationMessage(error, messages)\n return Promise.reject(error)\n }\n\n // Break before the work for an attempt that never happens.\n if (lastAttempt) break\n\n if (updateChunkSize(queueItem.progress.speed)) {\n arrayBuffer = await readFile(offset, lastChunkSize.value, queueItem.file!)\n chunkFile = new File([arrayBuffer.data], queueItem.file!.name, {\n type: queueItem.file!.type,\n })\n }\n\n await sleep(sleepTime)\n // A stop during the pause had no request to cancel.\n if (stopped()) return Promise.reject(stoppedError())\n sleepTime *= CHUNK_RETRY_MULTIPLY\n }\n } while (attempt < CHUNK_MAX_RETRY)\n return Promise.reject('Unable to upload chunk, max tries exceeded')\n }\n\n const stopSpeedCheck = () => meter.stop()\n\n const uploadInit = async () => {\n // Refuse before any request, so the DAM does not create an asset no chunk can fill.\n if (!chunkBoundsLoaded(configName)) {\n throw new Error(`uploadService: the chunk bounds of the DAM configuration \"${configName}\" are not loaded`)\n }\n const sendable = !!queueItem.file && (emptyFile === 'send' || queueItem.file.size > 0)\n // Set before the first await. The queue starts every item it\n // still sees waiting, and rechecks after each added file.\n if (sendable) queueItem.status = UploadQueueItemStatus.Uploading\n const hash = await loadHash()\n // Stop has no request to cancel while the hash is prepared, so it is checked once the hash is here.\n if (stopped()) throw stoppedError()\n sha = hash\n return new Promise((resolve, reject) => {\n if (!queueItem.file) {\n reject(new Error('uploadService: the queue item has no file'))\n return\n }\n if (!sendable) {\n reject(new Error('Empty file'))\n return\n }\n fileSize.value = queueItem.file.size\n queueItem.status = UploadQueueItemStatus.Uploading\n requests\n .start(queueItem)\n .then((res) => {\n // Without both ids there is nowhere to send chunks and no asset to ask about.\n // Fail here like a refused start, not after a round of retries that send nothing.\n if (!res?.id || !res?.asset) {\n reject(new Error('uploadService: the start answer names no file or no asset'))\n return\n }\n queueItem.assetId = res.asset\n queueItem.fileId = res.id\n // Stop requested while the start request was in flight. The created asset stays on the server.\n if (stopped()) {\n reject(stoppedError())\n return\n }\n resolve(queueItem)\n })\n .catch((err) => {\n reject(err)\n })\n })\n }\n\n const upload = async () => {\n meter.start(fileSize.value)\n\n // Every exit except a successful finish stops the speed meter, so a failed run reports no later progress.\n try {\n const filesize = queueItem.file?.size\n const hash = sha\n if (isUndefined(filesize) || isUndefined(hash)) throw undefined\n // A stop during asset creation had no chunk request to cancel.\n if (stopped()) throw stoppedError()\n\n let i = 0\n while (i < filesize) {\n const uploadedChunk = await processAndUploadChunk(i, hash)\n i += uploadedChunk.size\n }\n\n meter.lastChunkSent()\n if (stopped()) throw stoppedError()\n finishAttempted = true\n return await requests.finish(queueItem, hash.digest('hex'))\n } catch (error) {\n stopSpeedCheck()\n throw error\n }\n }\n\n const stop = () => {\n stopRequested = true\n stopSpeedCheck()\n queueItem.latestChunkAbortController?.abort()\n }\n\n return {\n [uploadSide]: set[uploadSide],\n uploadInit,\n upload,\n stop,\n stopSpeedCheck,\n finishAttempted: () => finishAttempted,\n }\n}\n\nexport const uploadStop = (abortController: AbortController) => {\n abortController.abort()\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { UploadQueueKey } from '../../types/UploadQueue';
2
2
  /**
3
- * For an upload dialog, from its setup: drawn till it is unmounted. Gone with its widget (the editor sent out of the
4
- * article during an upload), the last dialog of its queue forgets that dialog named: the app kept the name, and the next
5
- * widget of that queue opened the dialog at once. Not while another dialog of the queue is still drawn: the name closed
6
- * that one as well. The queue itself is left as it is.
3
+ * Call from an upload dialog's setup. It counts as drawn until unmounted.
4
+ * When the last dialog of a queue unmounts with its widget (e.g. the editor leaves the article during an
5
+ * upload), the open-dialog name is cleared. Otherwise the next widget of that queue opened the dialog at once.
6
+ * Not while another dialog of the queue is drawn, because clearing
7
+ * the name would close it too. The queue itself is not changed.
7
8
  */
8
9
  export declare function useUploadQueueDialogDrawn(queueKey: UploadQueueKey): void;
9
10
  export declare function useUploadQueueDialog(): {
@@ -1 +1 @@
1
- {"version":3,"file":"useUploadQueueDialog.js","names":["uploadQueueDialog","ref","uploadQueueDialogSaving","uploadQueueSidebar","dialogsDrawn","useUploadQueueDialogDrawn","queueKey","onBeforeUnmount","left","useUploadQueueDialog","useUploadQueuesStore"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/useUploadQueueDialog.ts"],"sourcesContent":["import { onBeforeUnmount, ref } from 'vue'\nimport type { UploadQueueKey } from '@/domains/dam/types/UploadQueue'\nimport { useUploadQueuesStore } from '@/domains/dam/uploadQueue/store/uploadQueuesStore'\n\nconst uploadQueueDialog = ref<UploadQueueKey | null>(null)\n// The queue whose dialog is saving right now. \"Save and apply\" ends with the queue emptied: its host takes no file\n// for that queue meanwhile, through an entry of its own, as the dialog takes none through its \"+\" and its dropzone.\nconst uploadQueueDialogSaving = ref<UploadQueueKey | null>(null)\nconst uploadQueueSidebar = ref(false)\n// The upload dialogs drawn now, by their queue: two widgets of one queue key each draw theirs.\nconst dialogsDrawn = new Map<UploadQueueKey, number>()\n\n/**\n * For an upload dialog, from its setup: drawn till it is unmounted. Gone with its widget (the editor sent out of the\n * article during an upload), the last dialog of its queue forgets that dialog named: the app kept the name, and the next\n * widget of that queue opened the dialog at once. Not while another dialog of the queue is still drawn: the name closed\n * that one as well. The queue itself is left as it is.\n */\nexport function useUploadQueueDialogDrawn(queueKey: UploadQueueKey) {\n dialogsDrawn.set(queueKey, (dialogsDrawn.get(queueKey) ?? 0) + 1)\n onBeforeUnmount(() => {\n const left = (dialogsDrawn.get(queueKey) ?? 1) - 1\n if (left > 0) return void dialogsDrawn.set(queueKey, left)\n dialogsDrawn.delete(queueKey)\n if (uploadQueueDialog.value === queueKey) uploadQueueDialog.value = null\n })\n}\n\nexport function useUploadQueueDialog() {\n const toggleUploadQueueSidebar = () => {\n uploadQueueSidebar.value = !uploadQueueSidebar.value\n }\n\n /**\n * Before files or the copy of an asset are added to the queue `queueKey` from outside its dialog. A queue no dialog\n * names holds only the rows a dialog that went away with its widget left there (the editor sent out of the article\n * during an upload), and the dialog opened for the new file showed the first of them, the old file, and its \"save and\n * apply\" handed the widget that one. Such a queue is stopped first: the uploads of its rows stop, and an asset an\n * upload has made stays in the DAM.\n */\n const stopQueueLeftBehind = (queueKey: UploadQueueKey) => {\n if (uploadQueueDialog.value !== queueKey) useUploadQueuesStore().stopUpload(queueKey)\n }\n\n return {\n toggleUploadQueueSidebar,\n stopQueueLeftBehind,\n uploadQueueDialog,\n uploadQueueDialogSaving,\n uploadQueueSidebar,\n }\n}\n"],"mappings":";;;AAIA,IAAMA,IAAoBC,EAA2B,IAAI,GAGnDC,IAA0BD,EAA2B,IAAI,GACzDE,IAAqBF,EAAI,EAAK,GAE9BG,oBAAe,IAAI,IAA4B;AAQrD,SAAgBC,EAA0B,GAA0B;CAElE,AADAD,EAAa,IAAIE,IAAWF,EAAa,IAAIE,CAAQ,KAAK,KAAK,CAAC,GAChEC,QAAsB;EACpB,IAAMC,KAAQJ,EAAa,IAAIE,CAAQ,KAAK,KAAK;EACjD,IAAIE,IAAO,GAAG,OAAO,KAAKJ,EAAa,IAAIE,GAAUE,CAAI;EAEzD,AADAJ,EAAa,OAAOE,CAAQ,GACxBN,EAAkB,UAAUM,MAAU,EAAkB,QAAQ;CACtE,CAAC;AACH;AAEA,SAAgBG,IAAuB;CAgBrC,OAAO;EACL,gCAhBqC;GACrC,EAAmB,QAAQ,CAACN,EAAmB;EACjD;EAeE,sBAN2B,MAA6B;GACxD,AAAIH,EAAkB,UAAUM,KAAUI,EAAqB,CAAC,CAAC,WAAWJ,CAAQ;EACtF;EAKE;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useUploadQueueDialog.js","names":["uploadQueueDialog","ref","uploadQueueDialogSaving","uploadQueueSidebar","dialogsDrawn","useUploadQueueDialogDrawn","queueKey","onBeforeUnmount","left","useUploadQueueDialog","useUploadQueuesStore"],"sources":["../../../../../src/domains/dam/uploadQueue/composables/useUploadQueueDialog.ts"],"sourcesContent":["import { onBeforeUnmount, ref } from 'vue'\nimport type { UploadQueueKey } from '@/domains/dam/types/UploadQueue'\nimport { useUploadQueuesStore } from '@/domains/dam/uploadQueue/store/uploadQueuesStore'\n\nconst uploadQueueDialog = ref<UploadQueueKey | null>(null)\n// Queue whose dialog is saving now. \"Save and apply\" ends with the queue emptied.\n// Meanwhile the host accepts no file for that queue, as the dialog accepts none through \"+\" and its dropzone.\nconst uploadQueueDialogSaving = ref<UploadQueueKey | null>(null)\nconst uploadQueueSidebar = ref(false)\n// Count of upload dialogs drawn per queue. Two widgets with one queue key each draw their own.\nconst dialogsDrawn = new Map<UploadQueueKey, number>()\n\n/**\n * Call from an upload dialog's setup. It counts as drawn until unmounted.\n * When the last dialog of a queue unmounts with its widget (e.g. the editor leaves the article during an\n * upload), the open-dialog name is cleared. Otherwise the next widget of that queue opened the dialog at once.\n * Not while another dialog of the queue is drawn, because clearing\n * the name would close it too. The queue itself is not changed.\n */\nexport function useUploadQueueDialogDrawn(queueKey: UploadQueueKey) {\n dialogsDrawn.set(queueKey, (dialogsDrawn.get(queueKey) ?? 0) + 1)\n onBeforeUnmount(() => {\n const left = (dialogsDrawn.get(queueKey) ?? 1) - 1\n if (left > 0) return void dialogsDrawn.set(queueKey, left)\n dialogsDrawn.delete(queueKey)\n if (uploadQueueDialog.value === queueKey) uploadQueueDialog.value = null\n })\n}\n\nexport function useUploadQueueDialog() {\n const toggleUploadQueueSidebar = () => {\n uploadQueueSidebar.value = !uploadQueueSidebar.value\n }\n\n /**\n * Call before adding files or an asset copy to queue `queueKey` from outside its dialog.\n * A queue no dialog names holds only rows left by a dialog that unmounted with its widget.\n * The new dialog then showed the old file and \"save and apply\" handed it to the widget.\n * So such a queue is stopped first. Its uploads stop, and assets already created stay in the DAM.\n */\n const stopQueueLeftBehind = (queueKey: UploadQueueKey) => {\n if (uploadQueueDialog.value !== queueKey) useUploadQueuesStore().stopUpload(queueKey)\n }\n\n return {\n toggleUploadQueueSidebar,\n stopQueueLeftBehind,\n uploadQueueDialog,\n uploadQueueDialogSaving,\n uploadQueueSidebar,\n }\n}\n"],"mappings":";;;AAIA,IAAMA,IAAoBC,EAA2B,IAAI,GAGnDC,IAA0BD,EAA2B,IAAI,GACzDE,IAAqBF,EAAI,EAAK,GAE9BG,oBAAe,IAAI,IAA4B;AASrD,SAAgBC,EAA0B,GAA0B;CAElE,AADAD,EAAa,IAAIE,IAAWF,EAAa,IAAIE,CAAQ,KAAK,KAAK,CAAC,GAChEC,QAAsB;EACpB,IAAMC,KAAQJ,EAAa,IAAIE,CAAQ,KAAK,KAAK;EACjD,IAAIE,IAAO,GAAG,OAAO,KAAKJ,EAAa,IAAIE,GAAUE,CAAI;EAEzD,AADAJ,EAAa,OAAOE,CAAQ,GACxBN,EAAkB,UAAUM,MAAU,EAAkB,QAAQ;CACtE,CAAC;AACH;AAEA,SAAgBG,IAAuB;CAerC,OAAO;EACL,gCAfqC;GACrC,EAAmB,QAAQ,CAACN,EAAmB;EACjD;EAcE,sBAN2B,MAA6B;GACxD,AAAIH,EAAkB,UAAUM,KAAUI,EAAqB,CAAC,CAAC,WAAWJ,CAAQ;EACtF;EAKE;EACA;EACA;CACF;AACF"}
@@ -2,7 +2,8 @@ import { UploadSide } from '../presets/uploadPresets';
2
2
  import { UploadQueueCore, UploadQueuePreset } from './uploadQueueCoreTypes';
3
3
  export declare const UPLOAD_QUEUE_ITEM_CHUNK_SIZE = 10485760;
4
4
  /**
5
- * The upload queue of a store: its queues as the store holds them, two uploads at a time per queue, the run of each
6
- * row, how a row leaves, and the settlement of the rows the server works on. Made in the setup of the store.
5
+ * Upload queue of a store: its queues, two uploads at a time per queue,
6
+ * each row's run, row removal, and settlement of rows the server processes.
7
+ * Created in the store setup.
7
8
  */
8
9
  export declare function createUploadQueueCore<S extends UploadSide>(preset: UploadQueuePreset<S>): UploadQueueCore;
@@ -1 +1 @@
1
- {"version":3,"file":"uploadQueueCore.js","names":["axios","QUEUE_MAX_PARALLEL_UPLOADS","UPLOAD_QUEUE_ITEM_CHUNK_SIZE","queueItemSequence","isRefusal","status","error","apiErrorStatus","isUndefined","isUnderWay","UploadQueueItemStatus","createUploadQueueCore","profile","preset","uploadQueuePresetMembers","stopHandles","refreshableRows","reactive","settlementProfile","settlement","createUploadSettlement","queues","hooks","row","stopRun","queueKey","recalculateQueueCounts","processUpload","refreshable","mayHelp","toRaw","getCurrentScope","onScopeDispose","getQueue","getQueueItems","getQueueItemsByStatus","item","getQueueTotalCount","getQueueProcessedCount","getQueueFileInputKey","getQueueItemsTypes","types","uniqueKey","prefix","emptyQueue","createQueue","addQueueItem","addRow","queue","setUploadSpeed","progress","estimate","speed","forceReloadFileInput","waitingItems","freeSlots","queueItemUploadStart","track","rowTracked","options","run","runnerFor","failure","onClientFailure","stopRow","removeByIndex","index","rowRemoved","stopItemUpload","currentIndex","stopUpload","uploading","clearQueue","refreshMayHelp"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueCore.ts"],"sourcesContent":["import axios from 'axios'\nimport { getCurrentScope, onScopeDispose, reactive, toRaw } from 'vue'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { createUploadSettlement } from '@/domains/dam/uploadQueue/settlement/uploadSettlement'\nimport type { UploadRun, UploadSide } from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport {\n type UploadQueueCore,\n type UploadQueuePreset,\n uploadQueuePresetMembers,\n} from '@/domains/dam/uploadQueue/core/uploadQueueCoreTypes'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst QUEUE_MAX_PARALLEL_UPLOADS = 2\n\nexport const UPLOAD_QUEUE_ITEM_CHUNK_SIZE = 10485760\n\n// A file name is not unique, nor is an asset added twice: rows that share a `:key` have Vue patch the wrong one.\n// One count for every core of the page.\nlet queueItemSequence = 0\n\n// An answer of the server that says no (4xx). The requests of an upload reject with the error of axios as it is.\nconst isRefusal = (error: unknown) => {\n const status = axios.isAxiosError(error) ? error.response?.status : apiErrorStatus(error)\n\n return !isUndefined(status) && status >= 400 && status < 500\n}\n\n// Waiting for its turn, being sent, or with the server: not settled yet, one way or the other.\nconst isUnderWay = (status: UploadQueueItemStatusType) =>\n status === UploadQueueItemStatus.Waiting ||\n status === UploadQueueItemStatus.Uploading ||\n status === UploadQueueItemStatus.Processing\n\n/**\n * The upload queue of a store: its queues as the store holds them, two uploads at a time per queue, the run of each\n * row, how a row leaves, and the settlement of the rows the server works on. Made in the setup of the store.\n */\nexport function createUploadQueueCore<S extends UploadSide>(preset: UploadQueuePreset<S>): UploadQueueCore {\n const {\n queues,\n settlement: profile,\n runnerFor,\n onClientFailure,\n rowTracked,\n rowRemoved,\n refreshable,\n } = preset[uploadQueuePresetMembers]\n\n // The runs still going, by their row as the core got it: a stop reaches a run also between its chunks.\n const stopHandles = new WeakMap<UploadQueueItem, () => void>()\n // The failed rows a refresh may still change, as the settlement tells them. Reactive, for the rows that show it.\n const refreshableRows = reactive(new WeakSet<UploadQueueItem>())\n\n const { hooks, ...settlementProfile } = profile\n const settlement = createUploadSettlement({\n ...settlementProfile,\n queues: () => queues.entries(),\n hooks: {\n ...hooks,\n onRowFinal: (queueKey, row) => {\n // Z26: the server takes a failed file nowhere, so what is left of it is not sent. Its place is free below,\n // and with the run stopped no third file goes out beside two.\n if (row.status === UploadQueueItemStatus.Failed && stopHandles.has(row)) stopRun(row)\n hooks?.onRowFinal?.(queueKey, row)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n },\n ...(refreshable && {\n onRefreshMayHelp: (queueKey: UploadQueueKey, row: UploadQueueItem, mayHelp: boolean) => {\n if (mayHelp) refreshableRows.add(toRaw(row))\n else refreshableRows.delete(toRaw(row))\n hooks?.onRefreshMayHelp?.(queueKey, row, mayHelp)\n },\n }),\n },\n })\n\n // A store disposed of leaves nothing behind: no timer of a poll, no listener for the tab or for the socket.\n if (getCurrentScope()) onScopeDispose(() => settlement.dispose())\n\n function getQueue(queueKey: UploadQueueKey) {\n return queues.get(queueKey) ?? null\n }\n\n function getQueueItems(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.items ?? []\n }\n\n function getQueueItemsByStatus(queueKey: UploadQueueKey, status: UploadQueueItemStatusType) {\n return getQueueItems(queueKey).filter((item) => item.status === status)\n }\n\n function getQueueTotalCount(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.totalCount ?? 0\n }\n\n function getQueueProcessedCount(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.processedCount ?? 0\n }\n\n function getQueueFileInputKey(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.fileInputKey ?? -1\n }\n\n function getQueueItemsTypes(queueKey: UploadQueueKey) {\n const types: Array<DamAssetTypeType> = []\n for (const item of getQueueItems(queueKey)) {\n if (!types.includes(item.assetType)) types.push(item.assetType)\n }\n return types\n }\n\n function uniqueKey(prefix: string) {\n return `${prefix}_${++queueItemSequence}`\n }\n\n function emptyQueue(fileInputKey: number): UploadQueue {\n return {\n items: [],\n totalCount: 0,\n processedCount: 0,\n fileInputKey,\n suggestions: { newKeywordNames: new Set<string>(), newAuthorNames: new Set<string>() },\n }\n }\n\n function createQueue(queueKey: UploadQueueKey) {\n if (!queues.get(queueKey)) queues.set(queueKey, emptyQueue(0))\n }\n\n // Into a queue that is not there: nothing, as for the counts below.\n function addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem) {\n queues.get(queueKey)?.items.push(item)\n }\n\n function addRow(queueKey: UploadQueueKey, item: UploadQueueItem) {\n createQueue(queueKey)\n addQueueItem(queueKey, item)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n\n function recalculateQueueCounts(queueKey: UploadQueueKey) {\n const queue = queues.get(queueKey)\n if (!queue) return\n queue.totalCount = queue.items.length\n queue.processedCount =\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploaded).length +\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Failed).length\n }\n\n function setUploadSpeed(item: UploadQueueItem, progress: number, speed: number, estimate: number) {\n item.progress.progressPercent = progress\n item.progress.remainingTime = estimate\n item.progress.speed = speed\n }\n\n function forceReloadFileInput(queueKey: UploadQueueKey) {\n createQueue(queueKey)\n const queue = queues.get(queueKey)\n if (!queue) return\n queue.fileInputKey++\n }\n\n function processUpload(queueKey: UploadQueueKey) {\n const waitingItems = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Waiting)\n if (waitingItems.length === 0) return\n const freeSlots =\n QUEUE_MAX_PARALLEL_UPLOADS - getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading).length\n waitingItems.slice(0, Math.max(freeSlots, 0)).forEach((item) => queueItemUploadStart(item, queueKey))\n }\n\n function track(queueKey: UploadQueueKey, item: UploadQueueItem, options?: { clientFailed?: boolean }) {\n rowTracked?.(queueKey, item)\n settlement.track(queueKey, item, options)\n }\n\n async function queueItemUploadStart(item: UploadQueueItem, queueKey: UploadQueueKey) {\n // A row whose run is under way already: one that cannot be sent stays waiting while its hash loads, and the\n // queue looks again after each file it adds.\n if (stopHandles.has(item)) return\n let run: UploadRun<S> | undefined\n try {\n // Made here: a set that cannot make the run fails its row as a failed upload does. Thrown past this, it left\n // the row waiting, to be started and to throw again with every row after it.\n run = runnerFor(item, queueKey)(item, (progress, speed, estimate) => {\n setUploadSpeed(item, progress, speed, estimate)\n })\n stopHandles.set(item, run.stop)\n await run.uploadInit()\n await run.upload()\n stopHandles.delete(item)\n // Not a row its notification has settled meanwhile, nor a stopped one.\n if (item.status === UploadQueueItemStatus.Processing) track(queueKey, item)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n } catch (error) {\n stopHandles.delete(item)\n // Stopped: it is gone from the queue, or the queue goes, and whatever stopped it started the next one. Uploaded:\n // the processed notification beat the answer to the finish request, and its settlement counted the queue.\n if (item.status === UploadQueueItemStatus.Stop || item.status === UploadQueueItemStatus.Uploaded) return\n // Failed before its request was, by the settlement, which stopped the run and counted the queue: the row keeps\n // the reason of the server, nothing is written over it and nothing told (Z26).\n if (item.status === UploadQueueItemStatus.Failed) return\n // Read before anything is written into the row: whether its reason was told already is among the failed rows.\n const failure = onClientFailure?.(queueKey, item, error)\n item.error.hasError = true\n if (failure) item.error.message = failure.message\n item.status = UploadQueueItemStatus.Failed\n // Its metadata event comes while the file still sends, and had enabled the form.\n item.canEditMetadata = false\n failure?.alert()\n // The finish request went out, so the server may complete the file all the same: the row is asked about for as\n // long as it stays in the queue. Not when the server answered that request with a refusal: it is sent once,\n // and a file the server has refused to finish it will not finish.\n if (run?.finishAttempted() && !isRefusal(error)) {\n track(queueKey, item, { clientFailed: true })\n }\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n }\n\n // A row on its way, or one whose upload still runs although the server has settled it, is stopped: its run, also\n // between chunks, and the chunk on the wire. A settled row without a run stays as it is.\n function stopRow(item: UploadQueueItem) {\n if (!isUnderWay(item.status) && !stopHandles.has(item)) return\n item.status = UploadQueueItemStatus.Stop\n stopRun(item)\n }\n\n function stopRun(item: UploadQueueItem) {\n stopHandles.get(item)?.()\n stopHandles.delete(item)\n item.latestChunkAbortController?.abort()\n }\n\n function removeByIndex(queueKey: UploadQueueKey, index: number) {\n const queue = queues.get(queueKey)\n const item = queue?.items[index]\n if (!queue || !item) return\n stopRow(item)\n // The poll of the queue no longer asks about it, nor does a read a notification asked for on its behalf.\n settlement.untrack(item)\n rowRemoved?.(queueKey, item)\n queue.items.splice(index, 1)\n recalculateQueueCounts(queueKey)\n // Its run, if any, ends without starting the next row: the place is free now.\n processUpload(queueKey)\n }\n\n function stopItemUpload(queueKey: UploadQueueKey, item: UploadQueueItem) {\n const queue = queues.get(queueKey)\n if (!queue || queue.items.length === 0) return\n item.status = UploadQueueItemStatus.Stop\n settlement.untrack(item)\n stopRun(item)\n // By identity: the position the caller saw the row at is another row's once the list has changed.\n const currentIndex = queue.items.indexOf(item)\n if (currentIndex > -1) removeByIndex(queueKey, currentIndex)\n processUpload(queueKey)\n }\n\n function stopUpload(queueKey: UploadQueueKey) {\n const queue = queues.get(queueKey)\n if (!queue) return\n if (queue.items.length === 0) {\n // Emptied row by row, the queue still has its idle poll: it goes with the queue.\n settlement.dropQueue(queueKey)\n return\n }\n const uploading = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading)\n queue.items.forEach((item) => {\n item.status = UploadQueueItemStatus.Stop\n stopHandles.get(item)?.()\n stopHandles.delete(item)\n })\n uploading.forEach((item) => item.latestChunkAbortController?.abort())\n clearQueue(queueKey)\n forceReloadFileInput(queueKey)\n }\n\n // Also of a queue that is not there: it is made, empty.\n function clearQueue(queueKey: UploadQueueKey) {\n queues.get(queueKey)?.items.forEach((item) => {\n rowRemoved?.(queueKey, item)\n stopRow(item)\n })\n // Before the queue is replaced: its rows are no longer asked about.\n settlement.dropQueue(queueKey)\n queues.set(queueKey, emptyQueue(getQueueFileInputKey(queueKey) + 1))\n }\n\n function refreshMayHelp(item: UploadQueueItem) {\n return item.status === UploadQueueItemStatus.Failed && refreshableRows.has(toRaw(item))\n }\n\n return {\n settlement,\n roleOf: (item) => profile.roleOf(item),\n getQueue,\n getQueueItems,\n getQueueItemsByStatus,\n getQueueTotalCount,\n getQueueProcessedCount,\n getQueueFileInputKey,\n getQueueItemsTypes,\n uniqueKey,\n createQueue,\n addQueueItem,\n addRow,\n recalculateQueueCounts,\n setUploadSpeed,\n forceReloadFileInput,\n processUpload,\n queueItemUploadStart,\n track,\n removeByIndex,\n stopItemUpload,\n stopUpload,\n clearQueue,\n refreshMayHelp,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"uploadQueueCore.js","names":["axios","QUEUE_MAX_PARALLEL_UPLOADS","UPLOAD_QUEUE_ITEM_CHUNK_SIZE","queueItemSequence","isRefusal","status","error","apiErrorStatus","isUndefined","isUnderWay","UploadQueueItemStatus","createUploadQueueCore","profile","preset","uploadQueuePresetMembers","stopHandles","refreshableRows","reactive","settlementProfile","settlement","createUploadSettlement","queues","hooks","row","stopRun","queueKey","recalculateQueueCounts","processUpload","refreshable","mayHelp","toRaw","getCurrentScope","onScopeDispose","getQueue","getQueueItems","getQueueItemsByStatus","item","getQueueTotalCount","getQueueProcessedCount","getQueueFileInputKey","getQueueItemsTypes","types","uniqueKey","prefix","emptyQueue","createQueue","addQueueItem","addRow","queue","setUploadSpeed","progress","estimate","speed","forceReloadFileInput","waitingItems","freeSlots","queueItemUploadStart","track","rowTracked","options","run","runnerFor","failure","onClientFailure","stopRow","removeByIndex","index","rowRemoved","stopItemUpload","currentIndex","stopUpload","uploading","clearQueue","refreshMayHelp"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueCore.ts"],"sourcesContent":["import axios from 'axios'\nimport { getCurrentScope, onScopeDispose, reactive, toRaw } from 'vue'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { createUploadSettlement } from '@/domains/dam/uploadQueue/settlement/uploadSettlement'\nimport type { UploadRun, UploadSide } from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport {\n type UploadQueueCore,\n type UploadQueuePreset,\n uploadQueuePresetMembers,\n} from '@/domains/dam/uploadQueue/core/uploadQueueCoreTypes'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst QUEUE_MAX_PARALLEL_UPLOADS = 2\n\nexport const UPLOAD_QUEUE_ITEM_CHUNK_SIZE = 10485760\n\n// File names and added assets are not unique. Rows sharing a `:key` make Vue patch the wrong row.\n// One counter for all cores on the page.\nlet queueItemSequence = 0\n\n// A 4xx server refusal. Upload requests reject with the raw axios error.\nconst isRefusal = (error: unknown) => {\n const status = axios.isAxiosError(error) ? error.response?.status : apiErrorStatus(error)\n\n return !isUndefined(status) && status >= 400 && status < 500\n}\n\nconst isUnderWay = (status: UploadQueueItemStatusType) =>\n status === UploadQueueItemStatus.Waiting ||\n status === UploadQueueItemStatus.Uploading ||\n status === UploadQueueItemStatus.Processing\n\n/**\n * Upload queue of a store: its queues, two uploads at a time per queue,\n * each row's run, row removal, and settlement of rows the server processes.\n * Created in the store setup.\n */\nexport function createUploadQueueCore<S extends UploadSide>(preset: UploadQueuePreset<S>): UploadQueueCore {\n const {\n queues,\n settlement: profile,\n runnerFor,\n onClientFailure,\n rowTracked,\n rowRemoved,\n refreshable,\n } = preset[uploadQueuePresetMembers]\n\n // Active runs by row, so a stop also reaches a run between chunks.\n const stopHandles = new WeakMap<UploadQueueItem, () => void>()\n // Failed rows a refresh may still change, as reported by the settlement. Reactive so rows can show it.\n const refreshableRows = reactive(new WeakSet<UploadQueueItem>())\n\n const { hooks, ...settlementProfile } = profile\n const settlement = createUploadSettlement({\n ...settlementProfile,\n queues: () => queues.entries(),\n hooks: {\n ...hooks,\n onRowFinal: (queueKey, row) => {\n // Z26: the server discards a failed file, so its remaining chunks are not sent.\n // Stopping the run frees its slot, so no third upload runs beside two.\n if (row.status === UploadQueueItemStatus.Failed && stopHandles.has(row)) stopRun(row)\n hooks?.onRowFinal?.(queueKey, row)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n },\n ...(refreshable && {\n onRefreshMayHelp: (queueKey: UploadQueueKey, row: UploadQueueItem, mayHelp: boolean) => {\n if (mayHelp) refreshableRows.add(toRaw(row))\n else refreshableRows.delete(toRaw(row))\n hooks?.onRefreshMayHelp?.(queueKey, row, mayHelp)\n },\n }),\n },\n })\n\n // A disposed store leaves no poll timer and no tab or socket listener.\n if (getCurrentScope()) onScopeDispose(() => settlement.dispose())\n\n function getQueue(queueKey: UploadQueueKey) {\n return queues.get(queueKey) ?? null\n }\n\n function getQueueItems(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.items ?? []\n }\n\n function getQueueItemsByStatus(queueKey: UploadQueueKey, status: UploadQueueItemStatusType) {\n return getQueueItems(queueKey).filter((item) => item.status === status)\n }\n\n function getQueueTotalCount(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.totalCount ?? 0\n }\n\n function getQueueProcessedCount(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.processedCount ?? 0\n }\n\n function getQueueFileInputKey(queueKey: UploadQueueKey) {\n return queues.get(queueKey)?.fileInputKey ?? -1\n }\n\n function getQueueItemsTypes(queueKey: UploadQueueKey) {\n const types: Array<DamAssetTypeType> = []\n for (const item of getQueueItems(queueKey)) {\n if (!types.includes(item.assetType)) types.push(item.assetType)\n }\n return types\n }\n\n function uniqueKey(prefix: string) {\n return `${prefix}_${++queueItemSequence}`\n }\n\n function emptyQueue(fileInputKey: number): UploadQueue {\n return {\n items: [],\n totalCount: 0,\n processedCount: 0,\n fileInputKey,\n suggestions: { newKeywordNames: new Set<string>(), newAuthorNames: new Set<string>() },\n }\n }\n\n function createQueue(queueKey: UploadQueueKey) {\n if (!queues.get(queueKey)) queues.set(queueKey, emptyQueue(0))\n }\n\n // Adding to a missing queue does nothing, as for the counts below.\n function addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem) {\n queues.get(queueKey)?.items.push(item)\n }\n\n function addRow(queueKey: UploadQueueKey, item: UploadQueueItem) {\n createQueue(queueKey)\n addQueueItem(queueKey, item)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n\n function recalculateQueueCounts(queueKey: UploadQueueKey) {\n const queue = queues.get(queueKey)\n if (!queue) return\n queue.totalCount = queue.items.length\n queue.processedCount =\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploaded).length +\n getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Failed).length\n }\n\n function setUploadSpeed(item: UploadQueueItem, progress: number, speed: number, estimate: number) {\n item.progress.progressPercent = progress\n item.progress.remainingTime = estimate\n item.progress.speed = speed\n }\n\n function forceReloadFileInput(queueKey: UploadQueueKey) {\n createQueue(queueKey)\n const queue = queues.get(queueKey)\n if (!queue) return\n queue.fileInputKey++\n }\n\n function processUpload(queueKey: UploadQueueKey) {\n const waitingItems = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Waiting)\n if (waitingItems.length === 0) return\n const freeSlots =\n QUEUE_MAX_PARALLEL_UPLOADS - getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading).length\n waitingItems.slice(0, Math.max(freeSlots, 0)).forEach((item) => queueItemUploadStart(item, queueKey))\n }\n\n function track(queueKey: UploadQueueKey, item: UploadQueueItem, options?: { clientFailed?: boolean }) {\n rowTracked?.(queueKey, item)\n settlement.track(queueKey, item, options)\n }\n\n async function queueItemUploadStart(item: UploadQueueItem, queueKey: UploadQueueKey) {\n // Run already started. A row that cannot be sent stays waiting while\n // its hash loads, and the queue rechecks after each added file.\n if (stopHandles.has(item)) return\n let run: UploadRun<S> | undefined\n try {\n // Created inside the try so a preset that cannot create the run fails the row like a failed upload.\n // Otherwise the row stayed waiting and threw again on every start, with every row after it.\n run = runnerFor(item, queueKey)(item, (progress, speed, estimate) => {\n setUploadSpeed(item, progress, speed, estimate)\n })\n stopHandles.set(item, run.stop)\n await run.uploadInit()\n await run.upload()\n stopHandles.delete(item)\n // Skip a row its notification has settled meanwhile, and a stopped row.\n if (item.status === UploadQueueItemStatus.Processing) track(queueKey, item)\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n } catch (error) {\n stopHandles.delete(item)\n // Stopped: it left the queue or the queue is going, and whatever stopped it started the next row.\n // Uploaded: the processed notification arrived before the finish response, and its settlement counted the queue.\n if (item.status === UploadQueueItemStatus.Stop || item.status === UploadQueueItemStatus.Uploaded) return\n // Already failed by the settlement, which stopped the run and counted the queue.\n // The row keeps the server's reason. Nothing is overwritten or alerted (Z26).\n if (item.status === UploadQueueItemStatus.Failed) return\n // Call before writing to the row: whether the reason was already reported is read from the failed rows.\n const failure = onClientFailure?.(queueKey, item, error)\n item.error.hasError = true\n if (failure) item.error.message = failure.message\n item.status = UploadQueueItemStatus.Failed\n // Its metadata event arrives while the file is still uploading and had enabled the form.\n item.canEditMetadata = false\n failure?.alert()\n // The finish request was sent, so the server may still complete\n // the file. Keep tracking the row while it stays in the queue.\n // Not after a refusal: finish is sent once, and the server will not finish a file it refused.\n if (run?.finishAttempted() && !isRefusal(error)) {\n track(queueKey, item, { clientFailed: true })\n }\n recalculateQueueCounts(queueKey)\n processUpload(queueKey)\n }\n }\n\n // Stops a row that is under way, or whose run continues after the server\n // settled it. Stops the run, also between chunks, and the chunk in flight.\n // A settled row without a run is left as is.\n function stopRow(item: UploadQueueItem) {\n if (!isUnderWay(item.status) && !stopHandles.has(item)) return\n item.status = UploadQueueItemStatus.Stop\n stopRun(item)\n }\n\n function stopRun(item: UploadQueueItem) {\n stopHandles.get(item)?.()\n stopHandles.delete(item)\n item.latestChunkAbortController?.abort()\n }\n\n function removeByIndex(queueKey: UploadQueueKey, index: number) {\n const queue = queues.get(queueKey)\n const item = queue?.items[index]\n if (!queue || !item) return\n stopRow(item)\n // Neither the queue poll nor a read requested by a notification asks about it any more.\n settlement.untrack(item)\n rowRemoved?.(queueKey, item)\n queue.items.splice(index, 1)\n recalculateQueueCounts(queueKey)\n // Its run, if any, ends without starting the next row, so start it here.\n processUpload(queueKey)\n }\n\n function stopItemUpload(queueKey: UploadQueueKey, item: UploadQueueItem) {\n const queue = queues.get(queueKey)\n if (!queue || queue.items.length === 0) return\n item.status = UploadQueueItemStatus.Stop\n settlement.untrack(item)\n stopRun(item)\n // By identity: the index the caller saw may belong to another row once the list changed.\n const currentIndex = queue.items.indexOf(item)\n if (currentIndex > -1) removeByIndex(queueKey, currentIndex)\n processUpload(queueKey)\n }\n\n function stopUpload(queueKey: UploadQueueKey) {\n const queue = queues.get(queueKey)\n if (!queue) return\n if (queue.items.length === 0) {\n // A queue emptied row by row still has its idle poll. Drop it with the queue.\n settlement.dropQueue(queueKey)\n return\n }\n const uploading = getQueueItemsByStatus(queueKey, UploadQueueItemStatus.Uploading)\n queue.items.forEach((item) => {\n item.status = UploadQueueItemStatus.Stop\n stopHandles.get(item)?.()\n stopHandles.delete(item)\n })\n uploading.forEach((item) => item.latestChunkAbortController?.abort())\n clearQueue(queueKey)\n forceReloadFileInput(queueKey)\n }\n\n // A missing queue is created empty.\n function clearQueue(queueKey: UploadQueueKey) {\n queues.get(queueKey)?.items.forEach((item) => {\n rowRemoved?.(queueKey, item)\n stopRow(item)\n })\n // Before replacing the queue, so its rows are no longer polled.\n settlement.dropQueue(queueKey)\n queues.set(queueKey, emptyQueue(getQueueFileInputKey(queueKey) + 1))\n }\n\n function refreshMayHelp(item: UploadQueueItem) {\n return item.status === UploadQueueItemStatus.Failed && refreshableRows.has(toRaw(item))\n }\n\n return {\n settlement,\n roleOf: (item) => profile.roleOf(item),\n getQueue,\n getQueueItems,\n getQueueItemsByStatus,\n getQueueTotalCount,\n getQueueProcessedCount,\n getQueueFileInputKey,\n getQueueItemsTypes,\n uniqueKey,\n createQueue,\n addQueueItem,\n addRow,\n recalculateQueueCounts,\n setUploadSpeed,\n forceReloadFileInput,\n processUpload,\n queueItemUploadStart,\n track,\n removeByIndex,\n stopItemUpload,\n stopUpload,\n clearQueue,\n refreshMayHelp,\n }\n}\n"],"mappings":"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"}
@@ -3,17 +3,20 @@ import { UploadQueue, UploadQueueItem, UploadQueueItemStatusType, UploadQueueKey
3
3
  import { uploadSide, UploadProgressCallback, UploadRun, UploadSide } from '../presets/uploadPresets';
4
4
  import { UploadRowRoleType, UploadSettlement, UploadSettlementProfile } from '../settlement/uploadSettlementTypes';
5
5
  export declare const uploadQueuePresetMembers: unique symbol;
6
- /** The settlement profile of a store (step 2). The core adds `queues` and, after `hooks.onRowFinal`, counts the queue and starts the next row. */
6
+ /**
7
+ * Settlement profile of a store (step 2). The core adds `queues`, and
8
+ * after `hooks.onRowFinal` it counts the queue and starts the next row.
9
+ */
7
10
  export type UploadQueueSettlementProfile = Omit<UploadSettlementProfile, 'queues' | 'hooks'> & {
8
11
  hooks?: Partial<UploadSettlementProfile['hooks']>;
9
12
  };
10
- /** The queues of a store as the core reads and writes them, from the state of the store at that moment. */
13
+ /** Queue access for the core, read from the store state at call time. */
11
14
  export interface UploadQueueContainer {
12
15
  get(queueKey: UploadQueueKey): UploadQueue | undefined;
13
16
  set(queueKey: UploadQueueKey, queue: UploadQueue): void;
14
17
  entries(): Iterable<[UploadQueueKey, UploadQueue]>;
15
18
  }
16
- /** What a failed run writes into its row, and the alert sent once the row is marked. */
19
+ /** What a failed run writes into its row, and the alert sent after the row is marked. */
17
20
  export interface UploadQueueClientFailure {
18
21
  message: string;
19
22
  alert(): void;
@@ -21,7 +24,7 @@ export interface UploadQueueClientFailure {
21
24
  interface UploadQueuePresetMembers<S extends UploadSide> {
22
25
  queues: UploadQueueContainer;
23
26
  settlement: UploadQueueSettlementProfile;
24
- /** What sends the row: an upload, or in admin-dam the import of a row of an external provider. */
27
+ /** Creates the row's run: an upload, or in admin-dam an external provider import. */
25
28
  runnerFor(item: UploadQueueItem, queueKey: UploadQueueKey): (item: UploadQueueItem, onProgress: UploadProgressCallback) => UploadRun<S>;
26
29
  /** Read before the core writes anything into the failed row. */
27
30
  onClientFailure?(queueKey: UploadQueueKey, item: UploadQueueItem, error: unknown): UploadQueueClientFailure;
@@ -45,7 +48,7 @@ export interface UploadQueueCore {
45
48
  getQueueProcessedCount(queueKey: UploadQueueKey): number;
46
49
  getQueueFileInputKey(queueKey: UploadQueueKey): number;
47
50
  getQueueItemsTypes(queueKey: UploadQueueKey): DamAssetTypeType[];
48
- /** `prefix` and a number no other row of this page has. */
51
+ /** `prefix` plus a number unique on this page. */
49
52
  uniqueKey(prefix: string): string;
50
53
  createQueue(queueKey: UploadQueueKey): void;
51
54
  addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem): void;
@@ -1 +1 @@
1
- {"version":3,"file":"uploadQueueCoreTypes.js","names":["uploadQueuePresetMembers"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueCoreTypes.ts"],"sourcesContent":["import type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport type {\n UploadQueue,\n UploadQueueItem,\n UploadQueueItemStatusType,\n UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport type {\n uploadSide,\n UploadProgressCallback,\n UploadRun,\n UploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport type {\n UploadRowRoleType,\n UploadSettlement,\n UploadSettlementProfile,\n} from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\n\n// Not exported from the library: only its own functions put the members on a set of the core.\nexport const uploadQueuePresetMembers = Symbol('uploadQueuePresetMembers')\n\n/** The settlement profile of a store (step 2). The core adds `queues` and, after `hooks.onRowFinal`, counts the queue and starts the next row. */\nexport type UploadQueueSettlementProfile = Omit<UploadSettlementProfile, 'queues' | 'hooks'> & {\n hooks?: Partial<UploadSettlementProfile['hooks']>\n}\n\n/** The queues of a store as the core reads and writes them, from the state of the store at that moment. */\nexport interface UploadQueueContainer {\n get(queueKey: UploadQueueKey): UploadQueue | undefined\n set(queueKey: UploadQueueKey, queue: UploadQueue): void\n entries(): Iterable<[UploadQueueKey, UploadQueue]>\n}\n\n/** What a failed run writes into its row, and the alert sent once the row is marked. */\nexport interface UploadQueueClientFailure {\n message: string\n alert(): void\n}\n\ninterface UploadQueuePresetMembers<S extends UploadSide> {\n queues: UploadQueueContainer\n settlement: UploadQueueSettlementProfile\n /** What sends the row: an upload, or in admin-dam the import of a row of an external provider. */\n runnerFor(\n item: UploadQueueItem,\n queueKey: UploadQueueKey\n ): (item: UploadQueueItem, onProgress: UploadProgressCallback) => UploadRun<S>\n /** Read before the core writes anything into the failed row. */\n onClientFailure?(queueKey: UploadQueueKey, item: UploadQueueItem, error: unknown): UploadQueueClientFailure\n rowTracked?(queueKey: UploadQueueKey, item: UploadQueueItem): void\n rowRemoved?(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** Whether the core keeps the failed rows a refresh may still change. */\n refreshable: boolean\n}\n\n/** What a store hands its core. Made only by `libraryQueuePreset()` and `adminDamQueuePreset()`. */\nexport interface UploadQueuePreset<S extends UploadSide = UploadSide> {\n readonly [uploadSide]: S\n readonly [uploadQueuePresetMembers]: UploadQueuePresetMembers<S>\n}\n\nexport interface UploadQueueCore {\n settlement: UploadSettlement\n roleOf(item: UploadQueueItem): UploadRowRoleType\n\n getQueue(queueKey: UploadQueueKey): UploadQueue | null\n getQueueItems(queueKey: UploadQueueKey): UploadQueueItem[]\n getQueueItemsByStatus(queueKey: UploadQueueKey, status: UploadQueueItemStatusType): UploadQueueItem[]\n getQueueTotalCount(queueKey: UploadQueueKey): number\n getQueueProcessedCount(queueKey: UploadQueueKey): number\n getQueueFileInputKey(queueKey: UploadQueueKey): number\n getQueueItemsTypes(queueKey: UploadQueueKey): DamAssetTypeType[]\n\n /** `prefix` and a number no other row of this page has. */\n uniqueKey(prefix: string): string\n createQueue(queueKey: UploadQueueKey): void\n addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** Makes the queue if need be, adds the row, counts, starts what may start. */\n addRow(queueKey: UploadQueueKey, item: UploadQueueItem): void\n recalculateQueueCounts(queueKey: UploadQueueKey): void\n setUploadSpeed(item: UploadQueueItem, progress: number, speed: number, estimate: number): void\n forceReloadFileInput(queueKey: UploadQueueKey): void\n\n processUpload(queueKey: UploadQueueKey): void\n queueItemUploadStart(item: UploadQueueItem, queueKey: UploadQueueKey): Promise<void>\n track(queueKey: UploadQueueKey, item: UploadQueueItem, options?: { clientFailed?: boolean }): void\n\n removeByIndex(queueKey: UploadQueueKey, index: number): void\n stopItemUpload(queueKey: UploadQueueKey, item: UploadQueueItem): void\n stopUpload(queueKey: UploadQueueKey): void\n clearQueue(queueKey: UploadQueueKey): void\n\n /** Whether a refresh may still change a failed row. Filled only with the library's preset. */\n refreshMayHelp(item: UploadQueueItem): boolean\n}\n"],"mappings":";AAoBA,IAAaA,IAA2B,OAAO,0BAA0B"}
1
+ {"version":3,"file":"uploadQueueCoreTypes.js","names":["uploadQueuePresetMembers"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueCoreTypes.ts"],"sourcesContent":["import type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport type {\n UploadQueue,\n UploadQueueItem,\n UploadQueueItemStatusType,\n UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport type {\n uploadSide,\n UploadProgressCallback,\n UploadRun,\n UploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport type {\n UploadRowRoleType,\n UploadSettlement,\n UploadSettlementProfile,\n} from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\n\n// Not exported from the library, so only its own functions can set these members.\nexport const uploadQueuePresetMembers = Symbol('uploadQueuePresetMembers')\n\n/**\n * Settlement profile of a store (step 2). The core adds `queues`, and\n * after `hooks.onRowFinal` it counts the queue and starts the next row.\n */\nexport type UploadQueueSettlementProfile = Omit<UploadSettlementProfile, 'queues' | 'hooks'> & {\n hooks?: Partial<UploadSettlementProfile['hooks']>\n}\n\n/** Queue access for the core, read from the store state at call time. */\nexport interface UploadQueueContainer {\n get(queueKey: UploadQueueKey): UploadQueue | undefined\n set(queueKey: UploadQueueKey, queue: UploadQueue): void\n entries(): Iterable<[UploadQueueKey, UploadQueue]>\n}\n\n/** What a failed run writes into its row, and the alert sent after the row is marked. */\nexport interface UploadQueueClientFailure {\n message: string\n alert(): void\n}\n\ninterface UploadQueuePresetMembers<S extends UploadSide> {\n queues: UploadQueueContainer\n settlement: UploadQueueSettlementProfile\n /** Creates the row's run: an upload, or in admin-dam an external provider import. */\n runnerFor(\n item: UploadQueueItem,\n queueKey: UploadQueueKey\n ): (item: UploadQueueItem, onProgress: UploadProgressCallback) => UploadRun<S>\n /** Read before the core writes anything into the failed row. */\n onClientFailure?(queueKey: UploadQueueKey, item: UploadQueueItem, error: unknown): UploadQueueClientFailure\n rowTracked?(queueKey: UploadQueueKey, item: UploadQueueItem): void\n rowRemoved?(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** Whether the core keeps the failed rows a refresh may still change. */\n refreshable: boolean\n}\n\n/** What a store hands its core. Made only by `libraryQueuePreset()` and `adminDamQueuePreset()`. */\nexport interface UploadQueuePreset<S extends UploadSide = UploadSide> {\n readonly [uploadSide]: S\n readonly [uploadQueuePresetMembers]: UploadQueuePresetMembers<S>\n}\n\nexport interface UploadQueueCore {\n settlement: UploadSettlement\n roleOf(item: UploadQueueItem): UploadRowRoleType\n\n getQueue(queueKey: UploadQueueKey): UploadQueue | null\n getQueueItems(queueKey: UploadQueueKey): UploadQueueItem[]\n getQueueItemsByStatus(queueKey: UploadQueueKey, status: UploadQueueItemStatusType): UploadQueueItem[]\n getQueueTotalCount(queueKey: UploadQueueKey): number\n getQueueProcessedCount(queueKey: UploadQueueKey): number\n getQueueFileInputKey(queueKey: UploadQueueKey): number\n getQueueItemsTypes(queueKey: UploadQueueKey): DamAssetTypeType[]\n\n /** `prefix` plus a number unique on this page. */\n uniqueKey(prefix: string): string\n createQueue(queueKey: UploadQueueKey): void\n addQueueItem(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** Makes the queue if need be, adds the row, counts, starts what may start. */\n addRow(queueKey: UploadQueueKey, item: UploadQueueItem): void\n recalculateQueueCounts(queueKey: UploadQueueKey): void\n setUploadSpeed(item: UploadQueueItem, progress: number, speed: number, estimate: number): void\n forceReloadFileInput(queueKey: UploadQueueKey): void\n\n processUpload(queueKey: UploadQueueKey): void\n queueItemUploadStart(item: UploadQueueItem, queueKey: UploadQueueKey): Promise<void>\n track(queueKey: UploadQueueKey, item: UploadQueueItem, options?: { clientFailed?: boolean }): void\n\n removeByIndex(queueKey: UploadQueueKey, index: number): void\n stopItemUpload(queueKey: UploadQueueKey, item: UploadQueueItem): void\n stopUpload(queueKey: UploadQueueKey): void\n clearQueue(queueKey: UploadQueueKey): void\n\n /** Whether a refresh may still change a failed row. Filled only with the library's preset. */\n refreshMayHelp(item: UploadQueueItem): boolean\n}\n"],"mappings":";AAoBA,IAAaA,IAA2B,OAAO,0BAA0B"}
@@ -2,13 +2,13 @@ import { CustomDataValue } from '../../../customDataForm/types/CustomDataForm';
2
2
  import { DamAssetTypeType } from '../../types/Asset';
3
3
  import { UploadQueueItem } from '../../types/UploadQueue';
4
4
  import { DocId } from '../../../../shared/types/common';
5
- /** Only into the rows of the asset type of the field. */
5
+ /** Fills only rows of the field's asset type. */
6
6
  export declare function fillCustomDataValue(items: UploadQueueItem[], data: {
7
7
  assetType: DamAssetTypeType;
8
8
  elementProperty: string;
9
9
  value: CustomDataValue;
10
10
  }, forceReplace?: boolean): void;
11
- /** `accepts`: the rows that may take them; without it, every row. */
11
+ /** `accepts`: rows that may take them. Without it, every row. */
12
12
  export declare function fillKeywords(items: UploadQueueItem[], value: DocId[], forceReplace?: boolean, accepts?: (item: UploadQueueItem) => boolean): void;
13
- /** `accepts`: the rows that may take them; without it, every row. */
13
+ /** `accepts`: rows that may take them. Without it, every row. */
14
14
  export declare function fillAuthors(items: UploadQueueItem[], value: DocId[], forceReplace?: boolean, accepts?: (item: UploadQueueItem) => boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"uploadQueueFill.js","names":["fillCustomDataValue","item","items","data","current","empty","isUndefined","isNull","isArray","forceReplace","fillKeywords","accepts","value","fillAuthors"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueFill.ts"],"sourcesContent":["import type { CustomDataValue } from '@/domains/customDataForm/types/CustomDataForm'\nimport type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport type { UploadQueueItem } from '@/domains/dam/types/UploadQueue'\nimport type { DocId } from '@/shared/types/common'\nimport { isArray, isNull, isUndefined } from '@/shared/utils/common'\n\n// The mass operations of an upload queue, over the rows they are given. They read only `assetType`, `customData`,\n// `keywords` and `authors` of a row. Public as `uploadQueueFillCustomDataValue`, `…Keywords`, `…Authors`.\n// Each filled row gets a list of its own (Z24): one list shared by the rows, and by the form it came from, would\n// change in all of them with an edit of any.\n\n/** Only into the rows of the asset type of the field. */\nexport function fillCustomDataValue(\n items: UploadQueueItem[],\n data: { assetType: DamAssetTypeType; elementProperty: string; value: CustomDataValue },\n forceReplace = false\n) {\n for (const item of items) {\n if (item.assetType !== data.assetType) continue\n const current = item.customData[data.elementProperty]\n // `null` is how a value saved empty comes back; a field of several values is empty as an empty list.\n const empty = isUndefined(current) || isNull(current) || current === '' || (isArray(current) && !current.length)\n if (forceReplace || empty) {\n item.customData[data.elementProperty] = isArray(data.value) ? data.value.slice() : data.value\n }\n }\n}\n\n/** `accepts`: the rows that may take them; without it, every row. */\nexport function fillKeywords(\n items: UploadQueueItem[],\n value: DocId[],\n forceReplace = false,\n accepts?: (item: UploadQueueItem) => boolean\n) {\n for (const item of items) {\n if (accepts && !accepts(item)) continue\n if (forceReplace || isUndefined(item.keywords) || item.keywords.length === 0) {\n item.keywords = [...value]\n }\n }\n}\n\n/** `accepts`: the rows that may take them; without it, every row. */\nexport function fillAuthors(\n items: UploadQueueItem[],\n value: DocId[],\n forceReplace = false,\n accepts?: (item: UploadQueueItem) => boolean\n) {\n for (const item of items) {\n if (accepts && !accepts(item)) continue\n if (forceReplace || isUndefined(item.authors) || item.authors.length === 0) {\n item.authors = [...value]\n }\n }\n}\n"],"mappings":";;AAYA,SAAgBA,EACd,GACA,GACA,IAAe,IACf;CACA,KAAK,IAAMC,KAAQC,GAAO;EACxB,IAAID,EAAK,cAAcE,EAAK,WAAW;EACvC,IAAMC,IAAUH,EAAK,WAAWE,EAAK,kBAE/BE,IAAQC,EAAYF,CAAO,KAAKG,EAAOH,CAAO,KAAKA,MAAY,MAAOI,EAAQJ,CAAO,KAAK,CAACA,EAAQ;EACzG,CAAIK,KAAgBJ,OAClB,EAAK,WAAWF,EAAK,mBAAmBK,EAAQL,EAAK,KAAK,IAAIA,EAAK,MAAM,MAAM,IAAIA,EAAK;CAE5F;AACF;AAGA,SAAgBO,EACd,GACA,GACA,IAAe,IACf,GACA;CACA,KAAK,IAAMT,KAAQC,GACjB,CAAI,MAAYS,EAAQV,CAAI,OACxBQ,KAAgBH,EAAYL,EAAK,QAAQ,KAAKA,EAAK,SAAS,WAAW,OACzE,EAAK,WAAW,CAAC,GAAGW,CAAK;AAG/B;AAGA,SAAgBC,EACd,GACA,GACA,IAAe,IACf,GACA;CACA,KAAK,IAAMZ,KAAQC,GACjB,CAAI,MAAYS,EAAQV,CAAI,OACxBQ,KAAgBH,EAAYL,EAAK,OAAO,KAAKA,EAAK,QAAQ,WAAW,OACvE,EAAK,UAAU,CAAC,GAAGW,CAAK;AAG9B"}
1
+ {"version":3,"file":"uploadQueueFill.js","names":["fillCustomDataValue","item","items","data","current","empty","isUndefined","isNull","isArray","forceReplace","fillKeywords","accepts","value","fillAuthors"],"sources":["../../../../../src/domains/dam/uploadQueue/core/uploadQueueFill.ts"],"sourcesContent":["import type { CustomDataValue } from '@/domains/customDataForm/types/CustomDataForm'\nimport type { DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport type { UploadQueueItem } from '@/domains/dam/types/UploadQueue'\nimport type { DocId } from '@/shared/types/common'\nimport { isArray, isNull, isUndefined } from '@/shared/utils/common'\n\n// Bulk operations of an upload queue over the given rows. They\n// read only `assetType`, `customData`, `keywords` and `authors`.\n// Public as `uploadQueueFillCustomDataValue`, `…Keywords`, `…Authors`.\n// Each filled row gets its own list (Z24). A list shared by rows\n// and the source form would change in all of them on any edit.\n\n/** Fills only rows of the field's asset type. */\nexport function fillCustomDataValue(\n items: UploadQueueItem[],\n data: { assetType: DamAssetTypeType; elementProperty: string; value: CustomDataValue },\n forceReplace = false\n) {\n for (const item of items) {\n if (item.assetType !== data.assetType) continue\n const current = item.customData[data.elementProperty]\n // A value saved empty comes back as `null`. A multi-value field is empty as an empty list.\n const empty = isUndefined(current) || isNull(current) || current === '' || (isArray(current) && !current.length)\n if (forceReplace || empty) {\n item.customData[data.elementProperty] = isArray(data.value) ? data.value.slice() : data.value\n }\n }\n}\n\n/** `accepts`: rows that may take them. Without it, every row. */\nexport function fillKeywords(\n items: UploadQueueItem[],\n value: DocId[],\n forceReplace = false,\n accepts?: (item: UploadQueueItem) => boolean\n) {\n for (const item of items) {\n if (accepts && !accepts(item)) continue\n if (forceReplace || isUndefined(item.keywords) || item.keywords.length === 0) {\n item.keywords = [...value]\n }\n }\n}\n\n/** `accepts`: rows that may take them. Without it, every row. */\nexport function fillAuthors(\n items: UploadQueueItem[],\n value: DocId[],\n forceReplace = false,\n accepts?: (item: UploadQueueItem) => boolean\n) {\n for (const item of items) {\n if (accepts && !accepts(item)) continue\n if (forceReplace || isUndefined(item.authors) || item.authors.length === 0) {\n item.authors = [...value]\n }\n }\n}\n"],"mappings":";;AAaA,SAAgBA,EACd,GACA,GACA,IAAe,IACf;CACA,KAAK,IAAMC,KAAQC,GAAO;EACxB,IAAID,EAAK,cAAcE,EAAK,WAAW;EACvC,IAAMC,IAAUH,EAAK,WAAWE,EAAK,kBAE/BE,IAAQC,EAAYF,CAAO,KAAKG,EAAOH,CAAO,KAAKA,MAAY,MAAOI,EAAQJ,CAAO,KAAK,CAACA,EAAQ;EACzG,CAAIK,KAAgBJ,OAClB,EAAK,WAAWF,EAAK,mBAAmBK,EAAQL,EAAK,KAAK,IAAIA,EAAK,MAAM,MAAM,IAAIA,EAAK;CAE5F;AACF;AAGA,SAAgBO,EACd,GACA,GACA,IAAe,IACf,GACA;CACA,KAAK,IAAMT,KAAQC,GACjB,CAAI,MAAYS,EAAQV,CAAI,OACxBQ,KAAgBH,EAAYL,EAAK,QAAQ,KAAKA,EAAK,SAAS,WAAW,OACzE,EAAK,WAAW,CAAC,GAAGW,CAAK;AAG/B;AAGA,SAAgBC,EACd,GACA,GACA,IAAe,IACf,GACA;CACA,KAAK,IAAMZ,KAAQC,GACjB,CAAI,MAAYS,EAAQV,CAAI,OACxBQ,KAAgBH,EAAYL,EAAK,OAAO,KAAKA,EAAK,QAAQ,WAAW,OACvE,EAAK,UAAU,CAAC,GAAGW,CAAK;AAG9B"}
@@ -2,14 +2,17 @@ import { Ref } from 'vue';
2
2
  import { UploadQueue, UploadQueueItem, UploadQueueKey } from '../../types/UploadQueue';
3
3
  import { UploadProgressCallback, UploadRun } from './uploadPresets';
4
4
  import { UploadQueuePreset, UploadQueueSettlementProfile } from '../core/uploadQueueCoreTypes';
5
- /** Not exported from `src/lib.ts`: only the library store uses it. Every row is uploaded, under the configuration of its queue. */
5
+ /**
6
+ * Not exported from `src/lib.ts`. Only the library store uses
7
+ * it. Every row is uploaded under its queue's configuration.
8
+ */
6
9
  export declare function libraryQueuePreset(store: {
7
10
  queues: Ref<Map<UploadQueueKey, UploadQueue>>;
8
11
  settlement: UploadQueueSettlementProfile;
9
- /** The DAM configuration the queue was made under, `default` for one the store does not know. */
12
+ /** DAM configuration the queue was created under, `default` for a queue the store does not know. */
10
13
  configOf(queueKey: UploadQueueKey): string;
11
14
  }): UploadQueuePreset<'library'>;
12
- /** admin-dam's queue: what it shows and does that the library does not. The store hands in what is its own. */
15
+ /** admin-dam's queue behavior beyond the library. The store passes in its own parts. */
13
16
  export declare function adminDamQueuePreset(store: {
14
17
  queues: Ref<Record<UploadQueueKey, UploadQueue>>;
15
18
  settlement: UploadQueueSettlementProfile;
@@ -17,7 +20,7 @@ export declare function adminDamQueuePreset(store: {
17
20
  upload(item: UploadQueueItem, onProgress: UploadProgressCallback): UploadRun<'adminDam'>;
18
21
  /** The run of an `ExternalProviderAsset` row: `adminDamImportRun(externalProviderImport(item).importInit)`. */
19
22
  importRun(item: UploadQueueItem): UploadRun<'adminDam'>;
20
- /** `resolveUploadErrorMessage`: the text of a failed upload. */
23
+ /** `resolveUploadErrorMessage`. */
21
24
  failureMessage(error: unknown): string;
22
25
  /** `showError` of the store's `useAlerts()`: one alert per reason. */
23
26
  alert(message: string): void;
@@ -26,5 +29,5 @@ export declare function adminDamQueuePreset(store: {
26
29
  /** `metadataFailures.delete(metadataFailureKey(queueKey, item))`. */
27
30
  rowRemoved(queueKey: UploadQueueKey, item: UploadQueueItem): void;
28
31
  }): UploadQueuePreset<'adminDam'>;
29
- /** The run of an import: its request is all there is; `upload` and `stop` do nothing, never `finishAttempted`. */
32
+ /** Run of an import: only its request. `upload` and `stop` do nothing, and `finishAttempted` is always false. */
30
33
  export declare function adminDamImportRun(uploadInit: () => Promise<unknown>): UploadRun<'adminDam'>;
@@ -1 +1 @@
1
- {"version":3,"file":"queuePresets.js","names":["mapQueues","queues","queueKey","queue","objectQueues","libraryQueuePreset","uploadSide","uploadQueuePresetMembers","store","useUpload","item","onProgress","libraryUploadPreset","adminDamQueuePreset","UploadQueueItemType","row","message","error","alreadyReported","failedItem","UploadQueueItemStatus","adminDamImportRun"],"sources":["../../../../../src/domains/dam/uploadQueue/presets/queuePresets.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n UploadQueueItemType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { useUpload } from '@/domains/dam/uploadQueue/composables/uploadService'\nimport {\n libraryUploadPreset,\n type UploadProgressCallback,\n type UploadRun,\n uploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport {\n type UploadQueueContainer,\n type UploadQueuePreset,\n uploadQueuePresetMembers,\n type UploadQueueSettlementProfile,\n} from '@/domains/dam/uploadQueue/core/uploadQueueCoreTypes'\n\nconst mapQueues = (queues: Ref<Map<UploadQueueKey, UploadQueue>>): UploadQueueContainer => ({\n get: (queueKey) => queues.value.get(queueKey),\n set: (queueKey, queue) => {\n queues.value.set(queueKey, queue)\n },\n entries: () => queues.value.entries(),\n})\n\n// By `in`, as the store has always looked: a key named after a member of `Object.prototype` finds that member.\nconst objectQueues = (queues: Ref<Record<UploadQueueKey, UploadQueue>>): UploadQueueContainer => ({\n get: (queueKey) => (queueKey in queues.value ? queues.value[queueKey] : undefined),\n set: (queueKey, queue) => {\n queues.value[queueKey] = queue\n },\n entries: () => Object.entries(queues.value),\n})\n\n/** Not exported from `src/lib.ts`: only the library store uses it. Every row is uploaded, under the configuration of its queue. */\nexport function libraryQueuePreset(store: {\n queues: Ref<Map<UploadQueueKey, UploadQueue>>\n settlement: UploadQueueSettlementProfile\n /** The DAM configuration the queue was made under, `default` for one the store does not know. */\n configOf(queueKey: UploadQueueKey): string\n}): UploadQueuePreset<'library'> {\n return {\n [uploadSide]: 'library',\n [uploadQueuePresetMembers]: {\n queues: mapQueues(store.queues),\n settlement: store.settlement,\n runnerFor: (_item, queueKey) => (item, onProgress) =>\n useUpload(item, onProgress, libraryUploadPreset(store.configOf(queueKey))),\n refreshable: true,\n },\n }\n}\n\n/** admin-dam's queue: what it shows and does that the library does not. The store hands in what is its own. */\nexport function adminDamQueuePreset(store: {\n queues: Ref<Record<UploadQueueKey, UploadQueue>>\n settlement: UploadQueueSettlementProfile\n /** `useUpload` of admin-dam's `uploadService.ts`. */\n upload(item: UploadQueueItem, onProgress: UploadProgressCallback): UploadRun<'adminDam'>\n /** The run of an `ExternalProviderAsset` row: `adminDamImportRun(externalProviderImport(item).importInit)`. */\n importRun(item: UploadQueueItem): UploadRun<'adminDam'>\n /** `resolveUploadErrorMessage`: the text of a failed upload. */\n failureMessage(error: unknown): string\n /** `showError` of the store's `useAlerts()`: one alert per reason. */\n alert(message: string): void\n /** `handedOver.add(toRaw(item))`. */\n rowTracked(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** `metadataFailures.delete(metadataFailureKey(queueKey, item))`. */\n rowRemoved(queueKey: UploadQueueKey, item: UploadQueueItem): void\n}): UploadQueuePreset<'adminDam'> {\n const queues = objectQueues(store.queues)\n return {\n [uploadSide]: 'adminDam',\n [uploadQueuePresetMembers]: {\n queues,\n settlement: store.settlement,\n runnerFor: (item) =>\n item.type === UploadQueueItemType.ExternalProviderAsset\n ? (row) => store.importRun(row)\n : (row, onProgress) => store.upload(row, onProgress),\n onClientFailure: (queueKey, _item, error) => {\n const message = store.failureMessage(error)\n // One alert per reason: a licence that refuses uploads fails every file in the batch.\n const alreadyReported = (queues.get(queueKey)?.items ?? []).some(\n (failedItem) => failedItem.status === UploadQueueItemStatus.Failed && failedItem.error.message === message\n )\n return {\n message,\n alert: () => {\n if (!alreadyReported) store.alert(message)\n },\n }\n },\n rowTracked: (queueKey, item) => store.rowTracked(queueKey, item),\n rowRemoved: (queueKey, item) => store.rowRemoved(queueKey, item),\n refreshable: false,\n },\n }\n}\n\n/** The run of an import: its request is all there is; `upload` and `stop` do nothing, never `finishAttempted`. */\nexport function adminDamImportRun(uploadInit: () => Promise<unknown>): UploadRun<'adminDam'> {\n return {\n [uploadSide]: 'adminDam',\n uploadInit,\n upload: () => Promise.resolve(),\n stop: () => {},\n finishAttempted: () => false,\n }\n}\n"],"mappings":";;;;;AAsBA,IAAMA,KAAa,OAAyE;CAC1F,MAAM,MAAaC,EAAO,MAAM,IAAIC,CAAQ;CAC5C,MAAM,GAAU,MAAU;EACxB,EAAO,MAAM,IAAIA,GAAUC,CAAK;CAClC;CACA,eAAeF,EAAO,MAAM,QAAQ;AACtC,IAGMG,KAAgB,OAA4E;CAChG,MAAM,MAAcF,KAAYD,EAAO,QAAQA,EAAO,MAAMC,KAAY,KAAA;CACxE,MAAM,GAAU,MAAU;EACxB,EAAO,MAAMA,KAAYC;CAC3B;CACA,eAAe,OAAO,QAAQF,EAAO,KAAK;AAC5C;AAGA,SAAgBI,EAAmB,GAKF;CAC/B,OAAO;GACJC,IAAa;GACbC,IAA2B;GAC1B,QAAQP,EAAUQ,EAAM,MAAM;GAC9B,YAAYA,EAAM;GAClB,YAAY,GAAO,OAAc,GAAM,MACrCC,EAAUC,GAAMC,GAAYC,EAAoBJ,EAAM,SAASN,CAAQ,CAAC,CAAC;GAC3E,aAAa;EACf;CACF;AACF;AAGA,SAAgBW,EAAoB,GAeF;CAChC,IAAMZ,IAASG,EAAaI,EAAM,MAAM;CACxC,OAAO;GACJF,IAAa;GACbC,IAA2B;GAC1B;GACA,YAAYC,EAAM;GAClB,YAAY,MACVE,EAAK,SAASI,EAAoB,yBAC7B,MAAQN,EAAM,UAAUO,CAAG,KAC3B,GAAK,MAAeP,EAAM,OAAOO,GAAKJ,CAAU;GACvD,kBAAkB,GAAU,GAAO,MAAU;IAC3C,IAAMK,IAAUR,EAAM,eAAeS,CAAK,GAEpCC,KAAmBjB,EAAO,IAAIC,CAAQ,CAAC,EAAE,SAAS,CAAC,EAAA,CAAG,MACzD,MAAeiB,EAAW,WAAWC,EAAsB,UAAUD,EAAW,MAAM,YAAYH,CACrG;IACA,OAAO;KACL;KACA,aAAa;MACX,AAAKE,KAAiBV,EAAM,MAAMQ,CAAO;KAC3C;IACF;GACF;GACA,aAAa,GAAU,MAASR,EAAM,WAAWN,GAAUQ,CAAI;GAC/D,aAAa,GAAU,MAASF,EAAM,WAAWN,GAAUQ,CAAI;GAC/D,aAAa;EACf;CACF;AACF;AAGA,SAAgBW,EAAkB,GAA2D;CAC3F,OAAO;GACJf,IAAa;EACd;EACA,cAAc,QAAQ,QAAQ;EAC9B,YAAY,CAAC;EACb,uBAAuB;CACzB;AACF"}
1
+ {"version":3,"file":"queuePresets.js","names":["mapQueues","queues","queueKey","queue","objectQueues","libraryQueuePreset","uploadSide","uploadQueuePresetMembers","store","useUpload","item","onProgress","libraryUploadPreset","adminDamQueuePreset","UploadQueueItemType","row","message","error","alreadyReported","failedItem","UploadQueueItemStatus","adminDamImportRun"],"sources":["../../../../../src/domains/dam/uploadQueue/presets/queuePresets.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n UploadQueueItemType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { useUpload } from '@/domains/dam/uploadQueue/composables/uploadService'\nimport {\n libraryUploadPreset,\n type UploadProgressCallback,\n type UploadRun,\n uploadSide,\n} from '@/domains/dam/uploadQueue/presets/uploadPresets'\nimport {\n type UploadQueueContainer,\n type UploadQueuePreset,\n uploadQueuePresetMembers,\n type UploadQueueSettlementProfile,\n} from '@/domains/dam/uploadQueue/core/uploadQueueCoreTypes'\n\nconst mapQueues = (queues: Ref<Map<UploadQueueKey, UploadQueue>>): UploadQueueContainer => ({\n get: (queueKey) => queues.value.get(queueKey),\n set: (queueKey, queue) => {\n queues.value.set(queueKey, queue)\n },\n entries: () => queues.value.entries(),\n})\n\n// Uses `in` as the store always did, so a key named after an `Object.prototype` member finds that member.\nconst objectQueues = (queues: Ref<Record<UploadQueueKey, UploadQueue>>): UploadQueueContainer => ({\n get: (queueKey) => (queueKey in queues.value ? queues.value[queueKey] : undefined),\n set: (queueKey, queue) => {\n queues.value[queueKey] = queue\n },\n entries: () => Object.entries(queues.value),\n})\n\n/**\n * Not exported from `src/lib.ts`. Only the library store uses\n * it. Every row is uploaded under its queue's configuration.\n */\nexport function libraryQueuePreset(store: {\n queues: Ref<Map<UploadQueueKey, UploadQueue>>\n settlement: UploadQueueSettlementProfile\n /** DAM configuration the queue was created under, `default` for a queue the store does not know. */\n configOf(queueKey: UploadQueueKey): string\n}): UploadQueuePreset<'library'> {\n return {\n [uploadSide]: 'library',\n [uploadQueuePresetMembers]: {\n queues: mapQueues(store.queues),\n settlement: store.settlement,\n runnerFor: (_item, queueKey) => (item, onProgress) =>\n useUpload(item, onProgress, libraryUploadPreset(store.configOf(queueKey))),\n refreshable: true,\n },\n }\n}\n\n/** admin-dam's queue behavior beyond the library. The store passes in its own parts. */\nexport function adminDamQueuePreset(store: {\n queues: Ref<Record<UploadQueueKey, UploadQueue>>\n settlement: UploadQueueSettlementProfile\n /** `useUpload` of admin-dam's `uploadService.ts`. */\n upload(item: UploadQueueItem, onProgress: UploadProgressCallback): UploadRun<'adminDam'>\n /** The run of an `ExternalProviderAsset` row: `adminDamImportRun(externalProviderImport(item).importInit)`. */\n importRun(item: UploadQueueItem): UploadRun<'adminDam'>\n /** `resolveUploadErrorMessage`. */\n failureMessage(error: unknown): string\n /** `showError` of the store's `useAlerts()`: one alert per reason. */\n alert(message: string): void\n /** `handedOver.add(toRaw(item))`. */\n rowTracked(queueKey: UploadQueueKey, item: UploadQueueItem): void\n /** `metadataFailures.delete(metadataFailureKey(queueKey, item))`. */\n rowRemoved(queueKey: UploadQueueKey, item: UploadQueueItem): void\n}): UploadQueuePreset<'adminDam'> {\n const queues = objectQueues(store.queues)\n return {\n [uploadSide]: 'adminDam',\n [uploadQueuePresetMembers]: {\n queues,\n settlement: store.settlement,\n runnerFor: (item) =>\n item.type === UploadQueueItemType.ExternalProviderAsset\n ? (row) => store.importRun(row)\n : (row, onProgress) => store.upload(row, onProgress),\n onClientFailure: (queueKey, _item, error) => {\n const message = store.failureMessage(error)\n // One alert per reason: a licence that refuses uploads fails every file in the batch.\n const alreadyReported = (queues.get(queueKey)?.items ?? []).some(\n (failedItem) => failedItem.status === UploadQueueItemStatus.Failed && failedItem.error.message === message\n )\n return {\n message,\n alert: () => {\n if (!alreadyReported) store.alert(message)\n },\n }\n },\n rowTracked: (queueKey, item) => store.rowTracked(queueKey, item),\n rowRemoved: (queueKey, item) => store.rowRemoved(queueKey, item),\n refreshable: false,\n },\n }\n}\n\n/** Run of an import: only its request. `upload` and `stop` do nothing, and `finishAttempted` is always false. */\nexport function adminDamImportRun(uploadInit: () => Promise<unknown>): UploadRun<'adminDam'> {\n return {\n [uploadSide]: 'adminDam',\n uploadInit,\n upload: () => Promise.resolve(),\n stop: () => {},\n finishAttempted: () => false,\n }\n}\n"],"mappings":";;;;;AAsBA,IAAMA,KAAa,OAAyE;CAC1F,MAAM,MAAaC,EAAO,MAAM,IAAIC,CAAQ;CAC5C,MAAM,GAAU,MAAU;EACxB,EAAO,MAAM,IAAIA,GAAUC,CAAK;CAClC;CACA,eAAeF,EAAO,MAAM,QAAQ;AACtC,IAGMG,KAAgB,OAA4E;CAChG,MAAM,MAAcF,KAAYD,EAAO,QAAQA,EAAO,MAAMC,KAAY,KAAA;CACxE,MAAM,GAAU,MAAU;EACxB,EAAO,MAAMA,KAAYC;CAC3B;CACA,eAAe,OAAO,QAAQF,EAAO,KAAK;AAC5C;AAMA,SAAgBI,EAAmB,GAKF;CAC/B,OAAO;GACJC,IAAa;GACbC,IAA2B;GAC1B,QAAQP,EAAUQ,EAAM,MAAM;GAC9B,YAAYA,EAAM;GAClB,YAAY,GAAO,OAAc,GAAM,MACrCC,EAAUC,GAAMC,GAAYC,EAAoBJ,EAAM,SAASN,CAAQ,CAAC,CAAC;GAC3E,aAAa;EACf;CACF;AACF;AAGA,SAAgBW,EAAoB,GAeF;CAChC,IAAMZ,IAASG,EAAaI,EAAM,MAAM;CACxC,OAAO;GACJF,IAAa;GACbC,IAA2B;GAC1B;GACA,YAAYC,EAAM;GAClB,YAAY,MACVE,EAAK,SAASI,EAAoB,yBAC7B,MAAQN,EAAM,UAAUO,CAAG,KAC3B,GAAK,MAAeP,EAAM,OAAOO,GAAKJ,CAAU;GACvD,kBAAkB,GAAU,GAAO,MAAU;IAC3C,IAAMK,IAAUR,EAAM,eAAeS,CAAK,GAEpCC,KAAmBjB,EAAO,IAAIC,CAAQ,CAAC,EAAE,SAAS,CAAC,EAAA,CAAG,MACzD,MAAeiB,EAAW,WAAWC,EAAsB,UAAUD,EAAW,MAAM,YAAYH,CACrG;IACA,OAAO;KACL;KACA,aAAa;MACX,AAAKE,KAAiBV,EAAM,MAAMQ,CAAO;KAC3C;IACF;GACF;GACA,aAAa,GAAU,MAASR,EAAM,WAAWN,GAAUQ,CAAI;GAC/D,aAAa,GAAU,MAASF,EAAM,WAAWN,GAAUQ,CAAI;GAC/D,aAAa;EACf;CACF;AACF;AAGA,SAAgBW,EAAkB,GAA2D;CAC3F,OAAO;GACJf,IAAa;EACd;EACA,cAAc,QAAQ,QAAQ;EAC9B,YAAY,CAAC;EACb,uBAAuB;CACzB;AACF"}
@@ -4,20 +4,19 @@ import { DocId } from '../../../../shared/types/common';
4
4
  export type UploadSide = 'library' | 'adminDam';
5
5
  export declare const uploadSide: unique symbol;
6
6
  export declare const uploadPresetMembers: unique symbol;
7
- /** What a run asks the server. */
8
7
  export interface UploadRunRequests {
9
8
  start(item: UploadQueueItem): Promise<DamUploadStartResponse>;
10
9
  chunk(item: UploadQueueItem, fileId: DocId, chunk: File, size: number, offset: number, onUploadProgress: (event: AxiosProgressEvent) => void): Promise<unknown>;
11
10
  finish(item: UploadQueueItem, sha: string): Promise<unknown>;
12
11
  }
13
- /** The texts a run writes into its row. Each side keeps its own. */
12
+ /** Texts a run writes into its row. Each side has its own. */
14
13
  export interface UploadMessages {
15
14
  unknownError(): string;
16
- /** A field the server refused, by its name. */
15
+ /** Text for a field the server refused, by field name. */
17
16
  size(): string;
18
17
  offset(): string;
19
18
  mimeType(): string;
20
- /** Put before the name of a refused field there is no text for. */
19
+ /** Prefix for a refused field that has no text of its own. */
21
20
  systemError(): string;
22
21
  /** HTTP 400 on the last try of a chunk. */
23
22
  chunkValidationFailed(): string;
@@ -31,12 +30,15 @@ interface UploadPresetMembers {
31
30
  messages: UploadMessages;
32
31
  apiTimeout: number | null | undefined;
33
32
  loadHash(): Promise<UploadHash>;
34
- /** Whether a file of no bytes is started and finished, or refused before anything is asked. */
33
+ /** Whether an empty file is started and finished, or refused before any request. */
35
34
  emptyFile: 'send' | 'reject';
36
- /** The DAM configuration whose prv configuration bounds the chunks, and whose last chunk size the upload starts from. */
35
+ /** DAM configuration whose prv configuration bounds the chunks and whose last chunk size the upload starts from. */
37
36
  configName: string;
38
37
  }
39
- /** How one side uploads. Made only by `libraryUploadPreset()` and `adminDamUploadPreset()`; what it holds is not public. */
38
+ /**
39
+ * How one side uploads. Created only by `libraryUploadPreset()`
40
+ * and `adminDamUploadPreset()`. Its contents are not public.
41
+ */
40
42
  export interface UploadPreset<S extends UploadSide = UploadSide> {
41
43
  readonly [uploadSide]: S;
42
44
  readonly [uploadPresetMembers]: UploadPresetMembers;
@@ -46,21 +48,21 @@ export interface UploadRun<S extends UploadSide = UploadSide> {
46
48
  readonly [uploadSide]: S;
47
49
  uploadInit(): Promise<unknown>;
48
50
  upload(): Promise<unknown>;
49
- /** Stops the run wherever it is, and cancels the chunk on the wire. */
51
+ /** Stops the run wherever it is and cancels the chunk in flight. */
50
52
  stop(): void;
51
- /** Whether the finish request went out: the server may complete the file whatever became of the answer. */
53
+ /** Whether the finish request was sent. The server may complete the file whatever the response. */
52
54
  finishAttempted(): boolean;
53
55
  }
54
56
  /**
55
- * Not exported from `src/lib.ts`; the default of `useUpload` (under `default`). The library's API, texts and choices,
56
- * under the DAM configuration `configName`.
57
+ * Not exported from `src/lib.ts`. Default of `useUpload` (under `default`).
58
+ * The library's API, texts and choices under DAM configuration `configName`.
57
59
  */
58
60
  export declare function libraryUploadPreset(configName: string): UploadPreset<'library'>;
59
- /** admin-dam's API, texts and choices. What is the application's own, the application hands in. */
61
+ /** admin-dam's API, texts and choices. The application passes in its own parts. */
60
62
  export declare function adminDamUploadPreset(app: {
61
63
  /** `uploadStart`, `uploadChunk`, `uploadFinish` of `fileApi.ts`: four asset types, admin-dam's addresses. */
62
64
  requests: UploadRunRequests;
63
- /** `system.uploadErrors.*`; as `chunkValidationFailed` its `unknownError`, which its store writes today. */
65
+ /** `system.uploadErrors.*`. `chunkValidationFailed` uses its `unknownError`, which its store writes today. */
64
66
  messages: UploadMessages;
65
67
  /** `envConfig.dam.apiTimeout`. */
66
68
  apiTimeout: number | null | undefined;