@anzusystems/common-admin 2.0.0-rc.4 → 2.0.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +26 -26
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- 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\
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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":";;;;;;;;;;;AAyBA,IAAMC,IAAkB,GAClBC,IAAuB,KACvBC,IAAuB;AAG7B,SAAgBC,EAAwB,GAAgB,GAAkC;CACxF,IAAI,CAACJ,EAAM,aAAaK,CAAK,KAAK,CAACA,EAAM,YAAY,CAACA,EAAM,SAAS,MAAM,OAAOC,EAAS,aAAa;CACxG,IAAMC,IAAOF,EAAM,SAAS,MACtBG,IAA0B,CAAC;CACjC,KAAK,IAAM,CAACC,GAAKC,MAAW,OAAO,QAAQH,EAAK,UAAU,CAAC,CAAC,GAC1D,QAAQE,GAAR;EACE,KAAK;GACH,EAAc,KAAKH,EAAS,KAAK,CAAC;GAClC;EACF,KAAK;GACH,EAAc,KAAKA,EAAS,OAAO,CAAC;GACpC;EACF,KAAK;GACH,EAAc,KAAKA,EAAS,SAAS,CAAC;GACtC;EACF,SACE,EAAc,KAAKA,EAAS,YAAY,IAAI,OAAOG,IAAM,QAAQC,EAAO,KAAK,GAAG,CAAC;CACrF;CAEF,OAAOF,EAAc,SAAS,IAAIA,EAAc,KAAA,IAAkB,IAAIF,EAAS,aAAa;AAC9F;AAEA,IAAMK,IAAW,OAAO,GAAgB,GAAc,MAC7C,IAAI,SAAS,GAAS,MAAW;CACtC,IAAMC,IAAUC,EAAK,MAAMC,GAAQA,IAASC,CAAI,GAC1CC,IAAS,IAAI,WAAW;CAc9B,AAbA,EAAO,SAAS,SAAU,GAAG;EAC3B,IAAIC,EAAE,QAAQ,eAAe,WAAW,MAAM;GAC5C,IAAMC,IAASD,EAAE,OAAO;GACxB,AAAIC,aAAkB,cACpBC,EAAQ;IAAE,MAAMD;IAAgB;GAAO,CAAC,IAExCE,EAAO,gBAAI,MAAM,yCAAyC,CAAC;EAE/D;CACF,GACA,EAAO,UAAU,SAAU,GAAG;EAC5B,EAAO,CAAC;CACV,GACAJ,EAAO,kBAAkBJ,CAAO;AAClC,CAAC,GAGGS,KAAS,MACN,IAAI,SAAS,MAAY,WAAWF,GAASG,CAAE,CAAC,GAGnDC,UAAqB,gBAAI,MAAM,gBAAgB,GAI/CC,KAAqB,MAAuB;CAChD,IAAM,EAAE,YAAS,eAAYC,EAAoBC,CAAU,CAAC,CAAC,aAAa,SAAS;CACnF,OAAOC,IAAU,KAAKC,IAAU;AAClC;AAcA,SAAgBC,EACd,GACA,GACA,GACwC;CAIxC,IAAMC,IAAMC,KAAUC,EAAoB,SAAS,GAC7C,EAAE,aAAU,aAAU,eAAY,aAAU,cAAW,kBAAeF,EAAIG,IAC1EC,IAAWC,EAAI,CAAC,GAEhBC,IAAQC,EAAeC,CAAc,GACvCC,GAEAC,IAAkB,IAElBC,IAAgB,IACd,EAAE,oBAAiB,qBAAkBC,EAAsBC,KAAc,KAAA,GAAWjB,CAAU,GAG9FkB,UAAgBH,KAAiBI,EAAU,WAAWC,EAAsB,MAE5EC,IAAc,OAAO,GAAiB,MACnC,IAAI,SAAS,GAAS,MAAW;EACtC,IAAMC,IAAmBZ,EAAM,QAAQa,EAAU,IAAI;EACrD,AAAKJ,EAAU,SAIfK,EACG,MAAML,GAAWA,EAAU,QAAQI,GAAWA,EAAU,MAAMnC,GAAQkC,CAAgB,CAAC,CACvF,MAAM,MAAW;GAChB,EAAQ9B,CAAM;EAChB,CAAC,CAAC,CACD,OAAO,MAAc;GACpB,EAAOiC,CAAS;EAClB,CAAC,IAVD/B,EAAO;CAWX,CAAC,GAGGgC,IAAwB,OAAO,GAAgB,MAAoC;EACvF,IAAIR,EAAQ,GAAG,OAAO,QAAQ,OAAOrB,EAAa,CAAC;EACnD,EAAgBsB,EAAU,SAAS,KAAK;EACxC,IAAIQ,IAAqD,MAAM1C,EAC7DG,GACAwC,EAAc,OACdT,EAAU,IACZ,GACII,IAAY,IAAI,KAAK,CAACI,EAAY,IAAI,GAAGR,EAAU,KAAM,MAAM,EACjE,MAAMA,EAAU,KAAM,KACxB,CAAC;EAGD,IAAID,EAAQ,GAAG,OAAO,QAAQ,OAAOrB,EAAa,CAAC;EAEnD,AADA,EAAU,oBAAoBT,GAC9B,EAAU,6BAA6B,IAAI,gBAAgB;EAE3D,IAAIyC,IAAYrD,GACZsD,IAAU;EACd,GAAG;GAGD,IAFA,KAEIP,EAAU,SAAS,GAAG,OAAO,QAAQ,OAAO,gBAAI,MAAM,oCAAoC,CAAC;GAC/F,IAAI;IAKF,OAJA,MAAMF,EAAYE,GAAWnC,CAAM,GACnCsB,EAAM,UAAUa,EAAU,IAAI,GAC9BQ,EAAK,OAAOJ,EAAY,IAAI,GAErBJ;GACT,SAAS5C,GAAO;IAEd,IADA+B,EAAM,cAAc,GAChBpC,EAAM,SAASK,CAAK,KAAKuC,EAAQ,GAAG,OAAO,QAAQ,OAAOvC,CAAK;IACnE,IAAMqD,IAAcF,KAAWvD;IAE/B,IAAIyD,KAAe1D,EAAM,aAAaK,CAAK,KAAKA,EAAM,UAAU,WAAW,KAEzE,OADA,EAAU,MAAM,UAAUC,EAAS,sBAAsB,GAClD,QAAQ,OAAOD,CAAK;IAG7B,IAAIsD,EAAoCtD,CAAc,GAEpD,OADA,EAAU,MAAM,UAAUD,EAAwBC,GAAOC,CAAQ,GAC1D,QAAQ,OAAOD,CAAK;IAI7B,IAAIqD,GAAa;IAWjB,IATIE,EAAgBf,EAAU,SAAS,KAAK,MAC1C,IAAc,MAAMlC,EAASG,GAAQwC,EAAc,OAAOT,EAAU,IAAK,GACzE,IAAY,IAAI,KAAK,CAACQ,EAAY,IAAI,GAAGR,EAAU,KAAM,MAAM,EAC7D,MAAMA,EAAU,KAAM,KACxB,CAAC,IAGH,MAAMxB,EAAMkC,CAAS,GAEjBX,EAAQ,GAAG,OAAO,QAAQ,OAAOrB,EAAa,CAAC;IACnD,KAAapB;GACf;EACF,SAASqD,IAAUvD;EACnB,OAAO,QAAQ,OAAO,4CAA4C;CACpE,GAEM4D,UAAuBzB,EAAM,KAAK,GAElC0B,IAAa,YAAY;EAE7B,IAAI,CAACtC,EAAkBE,CAAU,GAC/B,MAAU,MAAM,6DAA6DA,EAAW,iBAAiB;EAE3G,IAAMqC,IAAW,CAAC,CAAClB,EAAU,SAASmB,MAAc,UAAUnB,EAAU,KAAK,OAAO;EAGpF,AAAIkB,MAAU,EAAU,SAASjB,EAAsB;EACvD,IAAMW,IAAO,MAAMQ,EAAS;EAE5B,IAAIrB,EAAQ,GAAG,MAAMrB,EAAa;EAElC,OADA,IAAMkC,GACC,IAAI,SAAS,GAAS,MAAW;GACtC,AAAKZ,EAAU,OAIVkB,KAIL,EAAS,QAAQlB,EAAU,KAAK,MAChC,EAAU,SAASC,EAAsB,WACzCI,EACG,MAAML,CAAS,CAAC,CAChB,MAAM,MAAQ;IAGb,AAAI,CAACqB,GAAK,MAAM,CAACA,GAAK,QACpB9C,EAAO,gBAAI,MAAM,2DAA2D,CAAC,KAG/E,EAAU,UAAU8C,EAAI,OACxB,EAAU,SAASA,EAAI,IAEnBtB,EAAQ,IACVxB,EAAOG,EAAa,CAAC,IAGvBJ,EAAQ0B,CAAS;GACnB,CAAC,CAAC,CACD,OAAO,MAAQ;IACd,EAAOsB,CAAG;GACZ,CAAC,KAzBD/C,EAAO,gBAAI,MAAM,YAAY,CAAC,IAJ9BA,EAAO,gBAAI,MAAM,2CAA2C,CAAC;EA8BjE,CAAC;CACH,GAEMgD,IAAS,YAAY;EACzB,EAAM,MAAMlC,EAAS,KAAK;EAG1B,IAAI;GACF,IAAMmC,IAAWxB,EAAU,MAAM,MAC3BY,IAAOlB;GACb,IAAI+B,EAAYD,CAAQ,KAAKC,EAAYb,CAAI,GAAG,MAAM,KAAA;GAEtD,IAAIb,EAAQ,GAAG,MAAMrB,EAAa;GAElC,IAAI,IAAI;GACR,OAAO,IAAI8C,IAAU;IACnB,IAAME,IAAgB,MAAMnB,EAAsB,GAAGK,CAAI;IACzD,KAAKc,EAAc;GACrB;GAGA,IADAnC,EAAM,cAAc,GAChBQ,EAAQ,GAAG,MAAMrB,EAAa;GAElC,OADA,IAAkB,IACX,MAAM2B,EAAS,OAAOL,GAAWY,EAAK,OAAO,KAAK,CAAC;EAC5D,SAASpD,GAAO;GAEd,MADAwD,EAAe,GACTxD;EACR;CACF,GAEMmE,UAAa;EAGjB,AAFA,IAAgB,IAChBX,EAAe,GACfhB,EAAU,4BAA4B,MAAM;CAC9C;CAEA,OAAO;GACJ4B,IAAa3C,EAAI2C;EAClB;EACA;EACA;EACA;EACA,uBAAuBjC;CACzB;AACF;AAEA,IAAakC,KAAc,MAAqC;CAC9D,EAAgB,MAAM;AACxB"}
|
|
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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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//
|
|
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
|
-
*
|
|
6
|
-
* row,
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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
|
-
/**
|
|
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`
|
|
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
|
|
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
|
-
/**
|
|
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`:
|
|
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`:
|
|
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//
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
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//
|
|
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
|
-
/**
|
|
12
|
+
/** Texts a run writes into its row. Each side has its own. */
|
|
14
13
|
export interface UploadMessages {
|
|
15
14
|
unknownError(): string;
|
|
16
|
-
/**
|
|
15
|
+
/** Text for a field the server refused, by field name. */
|
|
17
16
|
size(): string;
|
|
18
17
|
offset(): string;
|
|
19
18
|
mimeType(): string;
|
|
20
|
-
/**
|
|
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
|
|
33
|
+
/** Whether an empty file is started and finished, or refused before any request. */
|
|
35
34
|
emptyFile: 'send' | 'reject';
|
|
36
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
51
|
+
/** Stops the run wherever it is and cancels the chunk in flight. */
|
|
50
52
|
stop(): void;
|
|
51
|
-
/** Whether the finish request
|
|
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
|
|
56
|
-
* under
|
|
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.
|
|
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
|
|
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;
|