@anzusystems/common-admin 2.0.0-rc.5 → 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/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 +27 -27
- 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":"uploadPresets.js","names":["HASH_LOAD_TIMEOUT","uploadSide","uploadPresetMembers","libraryUploadPreset","useCommonAdminCoreDamOptions","configName","damUploadStart","damClient","endPointImage","item","damUploadChunk","fileId","chunk","size","offset","onUploadProgress","damUploadFinish","sha","commonT","withTimeout","m","rusha","adminDamUploadPreset","app"],"sources":["../../../../../src/domains/dam/uploadQueue/presets/uploadPresets.ts"],"sourcesContent":["import type { AxiosProgressEvent } from 'axios'\nimport { commonT } from '@/plugins/i18n'\nimport type { DamUploadStartResponse, UploadQueueItem } from '@/domains/dam/types/UploadQueue'\nimport type { DocId } from '@/shared/types/common'\nimport { damUploadChunk, damUploadFinish, damUploadStart } from '@/domains/dam/api/uploadApi'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { withTimeout } from '@/domains/listEditor/utils/listEditorLoader'\n\nconst HASH_LOAD_TIMEOUT = 15_000\n\nexport type UploadSide = 'library' | 'adminDam'\n// Not exported from the library
|
|
1
|
+
{"version":3,"file":"uploadPresets.js","names":["HASH_LOAD_TIMEOUT","uploadSide","uploadPresetMembers","libraryUploadPreset","useCommonAdminCoreDamOptions","configName","damUploadStart","damClient","endPointImage","item","damUploadChunk","fileId","chunk","size","offset","onUploadProgress","damUploadFinish","sha","commonT","withTimeout","m","rusha","adminDamUploadPreset","app"],"sources":["../../../../../src/domains/dam/uploadQueue/presets/uploadPresets.ts"],"sourcesContent":["import type { AxiosProgressEvent } from 'axios'\nimport { commonT } from '@/plugins/i18n'\nimport type { DamUploadStartResponse, UploadQueueItem } from '@/domains/dam/types/UploadQueue'\nimport type { DocId } from '@/shared/types/common'\nimport { damUploadChunk, damUploadFinish, damUploadStart } from '@/domains/dam/api/uploadApi'\nimport { useCommonAdminCoreDamOptions } from '@/domains/dam/composables/commonAdminCoreDamOptions'\nimport { withTimeout } from '@/domains/listEditor/utils/listEditorLoader'\n\nconst HASH_LOAD_TIMEOUT = 15_000\n\nexport type UploadSide = 'library' | 'adminDam'\n// Not exported from the library, so only its own functions set them.\n// Nothing reads the side at runtime. A preset holds its members under the other symbol.\nexport const uploadSide = Symbol('uploadSide')\nexport const uploadPresetMembers = Symbol('uploadPresetMembers')\n\nexport interface UploadRunRequests {\n start(item: UploadQueueItem): Promise<DamUploadStartResponse>\n chunk(\n item: UploadQueueItem,\n fileId: DocId,\n chunk: File,\n size: number,\n offset: number,\n onUploadProgress: (event: AxiosProgressEvent) => void\n ): Promise<unknown>\n finish(item: UploadQueueItem, sha: string): Promise<unknown>\n}\n\n/** Texts a run writes into its row. Each side has its own. */\nexport interface UploadMessages {\n unknownError(): string\n /** Text for a field the server refused, by field name. */\n size(): string\n offset(): string\n mimeType(): string\n /** Prefix for a refused field that has no text of its own. */\n systemError(): string\n /** HTTP 400 on the last try of a chunk. */\n chunkValidationFailed(): string\n}\n\nexport interface UploadHash {\n update(data: ArrayBuffer): unknown\n digest(encoding: 'hex'): string\n}\n\ninterface UploadPresetMembers {\n requests: UploadRunRequests\n messages: UploadMessages\n apiTimeout: number | null | undefined\n loadHash(): Promise<UploadHash>\n /** Whether an empty file is started and finished, or refused before any request. */\n emptyFile: 'send' | 'reject'\n /** DAM configuration whose prv configuration bounds the chunks and whose last chunk size the upload starts from. */\n configName: string\n}\n\n/**\n * How one side uploads. Created only by `libraryUploadPreset()`\n * and `adminDamUploadPreset()`. Its contents are not public.\n */\nexport interface UploadPreset<S extends UploadSide = UploadSide> {\n readonly [uploadSide]: S\n readonly [uploadPresetMembers]: UploadPresetMembers\n}\n\nexport type UploadProgressCallback = (progress: number, speed: number, estimate: number) => void\n\nexport interface UploadRun<S extends UploadSide = UploadSide> {\n readonly [uploadSide]: S\n uploadInit(): Promise<unknown>\n upload(): Promise<unknown>\n /** Stops the run wherever it is and cancels the chunk in flight. */\n stop(): void\n /** Whether the finish request was sent. The server may complete the file whatever the response. */\n finishAttempted(): boolean\n}\n\n/**\n * Not exported from `src/lib.ts`. Default of `useUpload` (under `default`).\n * The library's API, texts and choices under DAM configuration `configName`.\n */\nexport function libraryUploadPreset(configName: string): UploadPreset<'library'> {\n // Chunks are sized against the app's DAM request timeout for this configuration, else the root one.\n // Without one (also `null` in a config file) the composable's default applies.\n const { damClient, endPointImage, apiTimeout } = useCommonAdminCoreDamOptions(configName)\n\n return {\n [uploadSide]: 'library',\n [uploadPresetMembers]: {\n requests: {\n start: (item) => damUploadStart(damClient, endPointImage, item),\n chunk: (item, fileId, chunk, size, offset, onUploadProgress) =>\n damUploadChunk(damClient, endPointImage, item, fileId, chunk, size, offset, onUploadProgress),\n finish: (item, sha) => damUploadFinish(damClient, endPointImage, item, sha),\n },\n messages: {\n unknownError: () => commonT('common.damImage.uploadErrors.unknownError'),\n size: () => commonT('common.damImage.uploadErrors.size'),\n offset: () => commonT('common.damImage.uploadErrors.offset'),\n mimeType: () => commonT('common.damImage.uploadErrors.mimeType'),\n systemError: () => commonT('common.damImage.uploadErrors.systemError'),\n chunkValidationFailed: () => commonT('common.damImage.uploadErrors.chunkValidationFailed'),\n },\n apiTimeout,\n // rusha loads when a file starts uploading, not on every page with the upload queue.\n // It loads before the asset is created, so a load failure fails the item without leaving an empty asset.\n loadHash: () =>\n withTimeout(import('rusha'), HASH_LOAD_TIMEOUT, `rusha did not load within ${HASH_LOAD_TIMEOUT} ms.`).then(\n (rusha) => rusha.default.createHash()\n ),\n emptyFile: 'reject',\n configName,\n },\n }\n}\n\n/** admin-dam's API, texts and choices. The application passes in its own parts. */\nexport function adminDamUploadPreset(app: {\n /** `uploadStart`, `uploadChunk`, `uploadFinish` of `fileApi.ts`: four asset types, admin-dam's addresses. */\n requests: UploadRunRequests\n /** `system.uploadErrors.*`. `chunkValidationFailed` uses its `unknownError`, which its store writes today. */\n messages: UploadMessages\n /** `envConfig.dam.apiTimeout`. */\n apiTimeout: number | null | undefined\n /** `() => Promise.resolve(rusha.createHash())`: rusha stays a static import of admin-dam. */\n loadHash(): Promise<UploadHash>\n}): UploadPreset<'adminDam'> {\n return {\n [uploadSide]: 'adminDam',\n [uploadPresetMembers]: {\n requests: app.requests,\n messages: app.messages,\n apiTimeout: app.apiTimeout,\n loadHash: () => app.loadHash(),\n emptyFile: 'send',\n configName: 'default',\n },\n }\n}\n"],"mappings":";;;;;;AAQA,IAAMA,IAAoB,MAKbC,IAAa,OAAO,YAAY,GAChCC,IAAsB,OAAO,qBAAqB;AAqE/D,SAAgBC,EAAoB,GAA6C;CAG/E,IAAM,EAAE,cAAW,kBAAe,kBAAeC,EAA6BC,CAAU;CAExF,OAAO;GACJJ,IAAa;GACbC,IAAsB;GACrB,UAAU;IACR,QAAQ,MAASI,EAAeC,GAAWC,GAAeC,CAAI;IAC9D,QAAQ,GAAM,GAAQ,GAAO,GAAM,GAAQ,MACzCC,EAAeH,GAAWC,GAAeC,GAAME,GAAQC,GAAOC,GAAMC,GAAQC,CAAgB;IAC9F,SAAS,GAAM,MAAQC,EAAgBT,GAAWC,GAAeC,GAAMQ,CAAG;GAC5E;GACA,UAAU;IACR,oBAAoBC,EAAQ,2CAA2C;IACvE,YAAYA,EAAQ,mCAAmC;IACvD,cAAcA,EAAQ,qCAAqC;IAC3D,gBAAgBA,EAAQ,uCAAuC;IAC/D,mBAAmBA,EAAQ,0CAA0C;IACrE,6BAA6BA,EAAQ,oDAAoD;GAC3F;GACA;GAGA,gBACEC,EAAY,OAAO,yCAAA,CAAA,MAAA,MAAA,kBAAAC,EAAA,OAAA,CAAA,GAAUpB,GAAmB,6BAA6BA,EAAkB,KAAK,CAAC,CAAC,MACnG,MAAUqB,EAAM,QAAQ,WAAW,CACtC;GACF,WAAW;GACX;EACF;CACF;AACF;AAGA,SAAgBC,EAAqB,GASR;CAC3B,OAAO;GACJrB,IAAa;GACbC,IAAsB;GACrB,UAAUqB,EAAI;GACd,UAAUA,EAAI;GACd,YAAYA,EAAI;GAChB,gBAAgBA,EAAI,SAAS;GAC7B,WAAW;GACX,YAAY;EACd;CACF;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type UploadPollMode = 'dense' | 'sparse';
|
|
2
2
|
export interface UploadPollModeSchedule {
|
|
3
|
-
/**
|
|
3
|
+
/** Ages of the youngest row at which the queue is read. */
|
|
4
4
|
marksMs: number[];
|
|
5
5
|
/** After the last mark: up to the age `untilMs`, every `everyMs`. */
|
|
6
6
|
tiers: Array<{
|
|
@@ -10,17 +10,17 @@ export interface UploadPollModeSchedule {
|
|
|
10
10
|
tailEveryMs: number;
|
|
11
11
|
}
|
|
12
12
|
export declare const UPLOAD_POLL_SCHEDULE: Record<UploadPollMode, UploadPollModeSchedule>;
|
|
13
|
-
/**
|
|
13
|
+
/** Minimum gap between two automatic reads of one queue. */
|
|
14
14
|
export declare const UPLOAD_POLL_MIN_GAP_MS: number;
|
|
15
|
-
/**
|
|
15
|
+
/** Wait after the 1st, 2nd, ... consecutive failed read. The last value applies to every further failure. */
|
|
16
16
|
export declare const UPLOAD_POLL_ERROR_LADDER_MS: number[];
|
|
17
|
-
/**
|
|
17
|
+
/** Row age after which the row shows a "processing takes too long" text. */
|
|
18
18
|
export declare const UPLOAD_POLL_SLOW_TEXT_AFTER_MS: number;
|
|
19
|
-
/**
|
|
19
|
+
/** Consecutive reads without the row's asset after which the row fails. */
|
|
20
20
|
export declare const UPLOAD_POLL_MISSING_LIMIT = 3;
|
|
21
|
-
/**
|
|
21
|
+
/** Consecutive failed reads after which the row shows a warning. */
|
|
22
22
|
export declare const UPLOAD_POLL_READ_FAILURE_LIMIT = 3;
|
|
23
|
-
/**
|
|
23
|
+
/** File notifications for one asset within this window are merged into one read. */
|
|
24
24
|
export declare const UPLOAD_NOTIFY_FILE_DELAY_MS = 250;
|
|
25
25
|
/** The backend can send the metadata notification before its transaction is committed. */
|
|
26
26
|
export declare const UPLOAD_NOTIFY_METADATA_DELAY_MS: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPollSchedule.js","names":["S","MIN","UPLOAD_POLL_SCHEDULE","s","UPLOAD_POLL_MIN_GAP_MS","UPLOAD_POLL_ERROR_LADDER_MS","UPLOAD_POLL_SLOW_TEXT_AFTER_MS","UPLOAD_NOTIFY_METADATA_DELAY_MS","firstDelay","mode","delayAfterRead","schedule","mark","markMs","ageMs","tier","candidate"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadPollSchedule.ts"],"sourcesContent":["export type UploadPollMode = 'dense' | 'sparse'\n\nexport interface UploadPollModeSchedule {\n /**
|
|
1
|
+
{"version":3,"file":"uploadPollSchedule.js","names":["S","MIN","UPLOAD_POLL_SCHEDULE","s","UPLOAD_POLL_MIN_GAP_MS","UPLOAD_POLL_ERROR_LADDER_MS","UPLOAD_POLL_SLOW_TEXT_AFTER_MS","UPLOAD_NOTIFY_METADATA_DELAY_MS","firstDelay","mode","delayAfterRead","schedule","mark","markMs","ageMs","tier","candidate"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadPollSchedule.ts"],"sourcesContent":["export type UploadPollMode = 'dense' | 'sparse'\n\nexport interface UploadPollModeSchedule {\n /** Ages of the youngest row at which the queue is read. */\n marksMs: number[]\n /** After the last mark: up to the age `untilMs`, every `everyMs`. */\n tiers: Array<{ untilMs: number; everyMs: number }>\n tailEveryMs: number\n}\n\nconst S = 1000\nconst MIN = 60 * S\n\n// `dense`: the poll is the only channel. `sparse`: the notifications are alive, the poll is their backup.\nexport const UPLOAD_POLL_SCHEDULE: Record<UploadPollMode, UploadPollModeSchedule> = {\n dense: {\n marksMs: [5, 10, 16, 23, 31, 40, 50, 60].map((s) => s * S),\n tiers: [\n { untilMs: 5 * MIN, everyMs: 30 * S },\n { untilMs: 20 * MIN, everyMs: 1 * MIN },\n { untilMs: 60 * MIN, everyMs: 2 * MIN },\n ],\n tailEveryMs: 10 * MIN,\n },\n sparse: {\n marksMs: [10, 30, 60].map((s) => s * S),\n tiers: [\n { untilMs: 5 * MIN, everyMs: 1 * MIN },\n { untilMs: 20 * MIN, everyMs: 3 * MIN },\n { untilMs: 60 * MIN, everyMs: 5 * MIN },\n ],\n tailEveryMs: 10 * MIN,\n },\n}\n\n/** Minimum gap between two automatic reads of one queue. */\nexport const UPLOAD_POLL_MIN_GAP_MS = 2 * S\n/** Wait after the 1st, 2nd, ... consecutive failed read. The last value applies to every further failure. */\nexport const UPLOAD_POLL_ERROR_LADDER_MS = [15, 30, 60, 120, 300].map((s) => s * S)\n/** Row age after which the row shows a \"processing takes too long\" text. */\nexport const UPLOAD_POLL_SLOW_TEXT_AFTER_MS = 20 * MIN\n/** Consecutive reads without the row's asset after which the row fails. */\nexport const UPLOAD_POLL_MISSING_LIMIT = 3\n/** Consecutive failed reads after which the row shows a warning. */\nexport const UPLOAD_POLL_READ_FAILURE_LIMIT = 3\n/** File notifications for one asset within this window are merged into one read. */\nexport const UPLOAD_NOTIFY_FILE_DELAY_MS = 250\n/** The backend can send the metadata notification before its transaction is committed. */\nexport const UPLOAD_NOTIFY_METADATA_DELAY_MS = 2 * S\nexport const UPLOAD_READ_BATCH_LIMIT = 50\n\nexport const firstDelay = (mode: UploadPollMode): number => UPLOAD_POLL_SCHEDULE[mode].marksMs[0]!\n\n/** The wait for the next read when the youngest row is `ageMs` old. */\nexport function delayAfterRead(ageMs: number, mode: UploadPollMode): number {\n const schedule = UPLOAD_POLL_SCHEDULE[mode]\n const mark = schedule.marksMs.find((markMs) => markMs > ageMs)\n if (mark !== undefined) return mark - ageMs\n const tier = schedule.tiers.find((candidate) => candidate.untilMs > ageMs)\n return tier ? tier.everyMs : schedule.tailEveryMs\n}\n"],"mappings":";AAUA,IAAMA,IAAI,KACJC,IAAM,KAAKD,GAGJE,IAAuE;CAClF,OAAO;EACL,SAAS;GAAC;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;EAAE,CAAC,CAAC,KAAK,MAAMC,IAAIH,CAAC;EACzD,OAAO;GACL;IAAE,SAAS,IAAIC;IAAK,SAAS,KAAKD;GAAE;GACpC;IAAE,SAAS,KAAKC;IAAK,SAAS,IAAIA;GAAI;GACtC;IAAE,SAAS,KAAKA;IAAK,SAAS,IAAIA;GAAI;EACxC;EACA,aAAa,KAAKA;CACpB;CACA,QAAQ;EACN,SAAS;GAAC;GAAI;GAAI;EAAE,CAAC,CAAC,KAAK,MAAME,IAAIH,CAAC;EACtC,OAAO;GACL;IAAE,SAAS,IAAIC;IAAK,SAAS,IAAIA;GAAI;GACrC;IAAE,SAAS,KAAKA;IAAK,SAAS,IAAIA;GAAI;GACtC;IAAE,SAAS,KAAKA;IAAK,SAAS,IAAIA;GAAI;EACxC;EACA,aAAa,KAAKA;CACpB;AACF,GAGaG,IAAyB,IAAIJ,GAE7BK,IAA8B;CAAC;CAAI;CAAI;CAAI;CAAK;AAAG,CAAC,CAAC,KAAK,MAAMF,IAAIH,CAAC,GAErEM,IAAiC,KAAKL,GAQtCM,IAAkC,IAAIP,GAGtCQ,KAAc,MAAiCN,EAAqBO,EAAK,CAAC,QAAQ;AAG/F,SAAgBC,EAAe,GAAe,GAA8B;CAC1E,IAAMC,IAAWT,EAAqBO,IAChCG,IAAOD,EAAS,QAAQ,MAAM,MAAWE,IAASC,CAAK;CAC7D,IAAIF,MAAS,KAAA,GAAW,OAAOA,IAAOE;CACtC,IAAMC,IAAOJ,EAAS,MAAM,MAAM,MAAcK,EAAU,UAAUF,CAAK;CACzE,OAAOC,IAAOA,EAAK,UAAUJ,EAAS;AACxC"}
|
|
@@ -7,13 +7,13 @@ export interface QueuePollerDeps {
|
|
|
7
7
|
read(trigger: 'tick' | 'visible'): Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
export interface QueuePoller {
|
|
10
|
-
/** A row
|
|
10
|
+
/** A row started being tracked. The next read happens no later than its first mark. */
|
|
11
11
|
rowAdded(): void;
|
|
12
|
-
/** The tab is visible again
|
|
12
|
+
/** The tab is visible again. Read immediately. */
|
|
13
13
|
readNow(trigger: 'visible'): void;
|
|
14
|
-
/**
|
|
14
|
+
/** Re-arms the timer after the tab is hidden, the mode changes or the queue stops tracking rows. */
|
|
15
15
|
reschedule(): void;
|
|
16
16
|
stop(): void;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
18
|
+
/** Tick timer of one queue. What a tick reads is decided by `deps.read`. */
|
|
19
19
|
export declare function createQueuePoller(deps: QueuePollerDeps): QueuePoller;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPoller.js","names":["createQueuePoller","nextAt","timer","inFlight","earlierAt","followUp","lastReadEndedAt","consecutiveFailures","stopped","scheduler","uploadSettlementRuntime","sooner","planned","candidate","disarm","goIdle","arm","onTimer","deps","runRead","failed","trigger","now","age","computed","UPLOAD_POLL_ERROR_LADDER_MS","delayAfterRead","soonest","UPLOAD_POLL_MIN_GAP_MS","firstDelay","mode","sinceRead"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadPoller.ts"],"sourcesContent":["import {\n delayAfterRead,\n firstDelay,\n UPLOAD_POLL_ERROR_LADDER_MS,\n UPLOAD_POLL_MIN_GAP_MS,\n type UploadPollMode,\n} from '@/domains/dam/uploadQueue/settlement/uploadPollSchedule'\nimport { uploadSettlementRuntime } from '@/domains/dam/uploadQueue/settlement/uploadSettlementRuntime'\n\nexport interface QueuePollerDeps {\n /** The age of the youngest tracked row of the queue in ms, or `null` when the queue tracks nothing. */\n youngestAgeMs(): number | null\n mode(): UploadPollMode\n /** One read of all the tracked rows of the queue. A rejection is a failed read. */\n read(trigger: 'tick' | 'visible'): Promise<void>\n}\n\nexport interface QueuePoller {\n /** A row
|
|
1
|
+
{"version":3,"file":"uploadPoller.js","names":["createQueuePoller","nextAt","timer","inFlight","earlierAt","followUp","lastReadEndedAt","consecutiveFailures","stopped","scheduler","uploadSettlementRuntime","sooner","planned","candidate","disarm","goIdle","arm","onTimer","deps","runRead","failed","trigger","now","age","computed","UPLOAD_POLL_ERROR_LADDER_MS","delayAfterRead","soonest","UPLOAD_POLL_MIN_GAP_MS","firstDelay","mode","sinceRead"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadPoller.ts"],"sourcesContent":["import {\n delayAfterRead,\n firstDelay,\n UPLOAD_POLL_ERROR_LADDER_MS,\n UPLOAD_POLL_MIN_GAP_MS,\n type UploadPollMode,\n} from '@/domains/dam/uploadQueue/settlement/uploadPollSchedule'\nimport { uploadSettlementRuntime } from '@/domains/dam/uploadQueue/settlement/uploadSettlementRuntime'\n\nexport interface QueuePollerDeps {\n /** The age of the youngest tracked row of the queue in ms, or `null` when the queue tracks nothing. */\n youngestAgeMs(): number | null\n mode(): UploadPollMode\n /** One read of all the tracked rows of the queue. A rejection is a failed read. */\n read(trigger: 'tick' | 'visible'): Promise<void>\n}\n\nexport interface QueuePoller {\n /** A row started being tracked. The next read happens no later than its first mark. */\n rowAdded(): void\n /** The tab is visible again. Read immediately. */\n readNow(trigger: 'visible'): void\n /** Re-arms the timer after the tab is hidden, the mode changes or the queue stops tracking rows. */\n reschedule(): void\n stop(): void\n}\n\n/** Tick timer of one queue. What a tick reads is decided by `deps.read`. */\nexport function createQueuePoller(deps: QueuePollerDeps): QueuePoller {\n let nextAt: number | null = null\n let timer: { handle: unknown } | null = null\n let inFlight = false\n // An earlier read requested while another read is in flight.\n let earlierAt: number | null = null\n let followUp = false\n let lastReadEndedAt: number | null = null\n let consecutiveFailures = 0\n let stopped = false\n\n const scheduler = () => uploadSettlementRuntime.scheduler\n const sooner = (planned: number | null, candidate: number) =>\n planned === null ? candidate : Math.min(planned, candidate)\n\n const disarm = () => {\n if (!timer) return\n scheduler().clearTimeout(timer.handle)\n timer = null\n }\n\n // The queue tracks nothing. Drop the plan for removed rows so a later failure restarts the error ladder.\n const goIdle = () => {\n disarm()\n nextAt = null\n earlierAt = null\n followUp = false\n consecutiveFailures = 0\n }\n\n const arm = () => {\n disarm()\n if (stopped || inFlight || nextAt === null) return\n // A hidden tab does not read. The planned time is kept for when the tab returns.\n if (!uploadSettlementRuntime.visibility.isVisible()) return\n timer = { handle: scheduler().setTimeout(onTimer, Math.max(0, nextAt - scheduler().now())) }\n }\n\n const onTimer = () => {\n timer = null\n if (stopped) return\n if (deps.youngestAgeMs() === null) {\n goIdle()\n return\n }\n if (!uploadSettlementRuntime.visibility.isVisible()) return\n void runRead('tick')\n }\n\n const runRead = async (trigger: 'tick' | 'visible') => {\n if (inFlight) {\n followUp = true\n return\n }\n disarm()\n nextAt = null\n inFlight = true\n let failed = false\n try {\n await deps.read(trigger)\n } catch {\n failed = true\n }\n inFlight = false\n if (stopped) return\n const now = scheduler().now()\n lastReadEndedAt = now\n consecutiveFailures = failed ? consecutiveFailures + 1 : 0\n const age = deps.youngestAgeMs()\n if (age === null) {\n goIdle()\n return\n }\n const computed = failed\n ? now + UPLOAD_POLL_ERROR_LADDER_MS[Math.min(consecutiveFailures, UPLOAD_POLL_ERROR_LADDER_MS.length) - 1]!\n : now + delayAfterRead(age, deps.mode())\n const soonest = now + UPLOAD_POLL_MIN_GAP_MS\n nextAt = followUp ? soonest : Math.max(soonest, sooner(earlierAt, computed))\n earlierAt = null\n followUp = false\n arm()\n }\n\n const rowAdded = () => {\n if (stopped) return\n const candidate = scheduler().now() + firstDelay(deps.mode())\n // A new row can only move the read earlier.\n if (inFlight) {\n earlierAt = sooner(earlierAt, candidate)\n return\n }\n nextAt = sooner(nextAt, candidate)\n arm()\n }\n\n const readNow = (trigger: 'visible') => {\n if (stopped) return\n if (inFlight) {\n followUp = true\n return\n }\n if (deps.youngestAgeMs() === null) {\n goIdle()\n return\n }\n const now = scheduler().now()\n if (lastReadEndedAt !== null && now - lastReadEndedAt < UPLOAD_POLL_MIN_GAP_MS) {\n nextAt = sooner(nextAt, lastReadEndedAt + UPLOAD_POLL_MIN_GAP_MS)\n arm()\n return\n }\n void runRead(trigger)\n }\n\n const reschedule = () => {\n // An in-flight read schedules the next one itself, using the mode current at that time.\n if (stopped || inFlight) return\n // Checked before the hidden-tab check. A queue that empties while hidden must not keep a plan for the return.\n const age = deps.youngestAgeMs()\n if (age === null) {\n goIdle()\n return\n }\n if (!uploadSettlementRuntime.visibility.isVisible()) {\n disarm()\n return\n }\n // An error-ladder wait is kept. The mode rhythm would schedule relative to the failed read.\n if (consecutiveFailures === 0) {\n const now = scheduler().now()\n const mode = deps.mode()\n const sinceRead = lastReadEndedAt === null ? null : now - lastReadEndedAt\n // The time the current mode would plan: from the last read, or from the first mark of a row added after it.\n // Never later than the time already planned.\n const candidate =\n sinceRead === null || age < sinceRead\n ? now - age + firstDelay(mode)\n : now - sinceRead + Math.max(UPLOAD_POLL_MIN_GAP_MS, delayAfterRead(age - sinceRead, mode))\n nextAt = sooner(nextAt, Math.max(now, candidate))\n }\n arm()\n }\n\n const stop = () => {\n stopped = true\n goIdle()\n }\n\n return { rowAdded, readNow, reschedule, stop }\n}\n"],"mappings":"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"}
|
|
@@ -5,55 +5,53 @@ import { UploadQueue, UploadQueueItem, UploadQueueKey } from '../../types/Upload
|
|
|
5
5
|
import { UploadRowRoleType, UploadSettlementProfile, UploadSettlementTarget } from './uploadSettlementTypes';
|
|
6
6
|
export interface UploadTrackState {
|
|
7
7
|
queueKey: UploadQueueKey;
|
|
8
|
-
/** When the row
|
|
8
|
+
/** When the row started waiting for the server, in scheduler time. */
|
|
9
9
|
eligibleSince: number;
|
|
10
|
-
/** The client
|
|
10
|
+
/** The client failed the row on its finish request. The server may still have finished the file. */
|
|
11
11
|
clientFailed: boolean;
|
|
12
|
-
/**
|
|
12
|
+
/** Consecutive successful reads that did not include the row's asset, or its file among the slots. */
|
|
13
13
|
misses: number;
|
|
14
|
-
/** Failed reads in a row. */
|
|
15
14
|
readFailures: number;
|
|
16
15
|
/**
|
|
17
|
-
* A failed read
|
|
18
|
-
*
|
|
16
|
+
* A failed read or a missing asset was already reported, and no read has found the asset since.
|
|
17
|
+
* Further failures are not reported.
|
|
19
18
|
*/
|
|
20
19
|
reported: boolean;
|
|
21
20
|
}
|
|
22
21
|
export interface UploadRowNotice {
|
|
23
|
-
/** The row has waited longer than
|
|
22
|
+
/** The row has waited longer than processing should take. */
|
|
24
23
|
slow: boolean;
|
|
25
|
-
/** The reads of the row keep failing. */
|
|
26
24
|
readWarning: boolean;
|
|
27
|
-
/** Which of the two the settlement
|
|
25
|
+
/** Which of the two notices the settlement wrote into `row.error`. */
|
|
28
26
|
shown: 'slow' | 'readWarning' | null;
|
|
29
|
-
/** The text
|
|
27
|
+
/** The text written then. If the row's message differs now, the error belongs to someone else. */
|
|
30
28
|
text: string | null;
|
|
31
29
|
}
|
|
32
|
-
/** What a read
|
|
30
|
+
/** What a read should do for one target. */
|
|
33
31
|
export interface UploadReadIntent {
|
|
34
|
-
/**
|
|
32
|
+
/** State carried by the event. It applies when the read shows no final state. */
|
|
35
33
|
hint: 'processed' | null;
|
|
36
34
|
/** When the row settles as processed, load its metadata as well. */
|
|
37
35
|
metadata: boolean;
|
|
38
|
-
/**
|
|
36
|
+
/** Set by the metadata notification. Metadata may arrive before the final state. */
|
|
39
37
|
early: boolean;
|
|
40
|
-
/**
|
|
38
|
+
/** The read tells a row with `settleOn: 'never'` that its file is processed. */
|
|
41
39
|
seen: boolean;
|
|
42
40
|
}
|
|
43
41
|
/** What the settlement remembers about rows. Every key is `toRaw(row)`. */
|
|
44
42
|
export interface UploadSettleMemory {
|
|
45
43
|
tracked: WeakMap<UploadQueueItem, UploadTrackState>;
|
|
46
|
-
/** The last write an event made into the row
|
|
44
|
+
/** The last write an event made into the row. A read started before it is stale. Never cleared. */
|
|
47
45
|
revision: WeakMap<UploadQueueItem, number>;
|
|
48
46
|
metadataLoaded: WeakSet<UploadQueueItem>;
|
|
49
|
-
/** Failed rows an event
|
|
47
|
+
/** Failed rows revived by an event. Their next read loads the metadata. */
|
|
50
48
|
reviveWithMetadata: WeakSet<UploadQueueItem>;
|
|
51
|
-
/** Failed rows a refresh may still change: given up by the client
|
|
49
|
+
/** Failed rows a refresh may still change: given up by the client, or left without their duplicate's original. */
|
|
52
50
|
refreshMayHelp: WeakSet<UploadQueueItem>;
|
|
53
|
-
/** Rows failed
|
|
51
|
+
/** Rows failed because too many reads found no asset, while the server settles them by nothing else. */
|
|
54
52
|
givenUpMissing: WeakSet<UploadQueueItem>;
|
|
55
53
|
notices: WeakMap<UploadQueueItem, UploadRowNotice>;
|
|
56
|
-
/**
|
|
54
|
+
/** Shared counter for revisions and read starts. */
|
|
57
55
|
clock: number;
|
|
58
56
|
}
|
|
59
57
|
export declare const createUploadSettleMemory: () => UploadSettleMemory;
|
|
@@ -63,33 +61,33 @@ export interface UploadSettleRow {
|
|
|
63
61
|
row: UploadQueueItem;
|
|
64
62
|
}
|
|
65
63
|
export interface UploadSettleOptions {
|
|
66
|
-
/** A row stopped being tracked, by a write or by the store. */
|
|
64
|
+
/** A row stopped being tracked, by a settlement write or by the store. */
|
|
67
65
|
onUntrack?(queueKey: UploadQueueKey): void;
|
|
68
|
-
/** The settlement was disposed of
|
|
66
|
+
/** The settlement was disposed. Results of an original read that arrive later are not written. */
|
|
69
67
|
isDisposed?(): boolean;
|
|
70
68
|
}
|
|
71
69
|
export declare const isFinalFileStatus: (status: AssetFileProcessStatusType | null | undefined) => status is "processed" | "duplicate" | "failed";
|
|
72
70
|
/**
|
|
73
|
-
* The state a read gives the
|
|
74
|
-
*
|
|
75
|
-
*
|
|
71
|
+
* The file state a read gives the target.
|
|
72
|
+
* An asset reports only its main file state. A final state from the asset wins, otherwise the event state applies.
|
|
73
|
+
* For another file (a slot) the asset says nothing, so only the event state applies.
|
|
76
74
|
*/
|
|
77
75
|
export declare const resolveReadStatus: (asset: AssetDetailItemDto, target: Pick<UploadSettlementTarget, "fileId">, intent: Pick<UploadReadIntent, "hint">) => AssetFileProcessStatusType | undefined;
|
|
78
76
|
export declare const clearRowError: (row: UploadQueueItem) => void;
|
|
79
77
|
export declare const isEmptyMetadataValue: (value: unknown) => boolean;
|
|
80
78
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
79
|
+
* First metadata load of a row. Values the user set earlier (via a queue mass operation) stay.
|
|
80
|
+
* Only empty lists and empty custom fields are filled.
|
|
83
81
|
*/
|
|
84
82
|
export declare function mergeLoadedMetadata(queue: UploadQueue, row: UploadQueueItem, asset: AssetDetailItemDto, caches: Pick<UploadSettlementProfile['caches'], 'addAuthors' | 'addKeywords'>): void;
|
|
85
83
|
/**
|
|
86
|
-
*
|
|
87
|
-
* once, whether or not
|
|
84
|
+
* Applies a read asset to a row without changing its state.
|
|
85
|
+
* `hadMetadata`: the row's metadata was loaded once, whether or not the form is shown now.
|
|
88
86
|
*/
|
|
89
87
|
export declare function decorateRow(row: UploadQueueItem, asset: AssetDetailItemDto, mainFile: AssetFile, role: UploadRowRoleType, hadMetadata: boolean): void;
|
|
90
88
|
/**
|
|
91
|
-
*
|
|
92
|
-
* of its own,
|
|
89
|
+
* Settlement writes: a read asset or a known state into queue rows.
|
|
90
|
+
* No timers and no reads of its own, except reading a duplicate's original.
|
|
93
91
|
*/
|
|
94
92
|
export declare function createUploadSettle(profile: UploadSettlementProfile, memory?: UploadSettleMemory, options?: UploadSettleOptions): {
|
|
95
93
|
memory: UploadSettleMemory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadSettle.js","names":["createUploadSettleMemory","isFinalFileStatus","status","AssetFileProcessStatus","resolveReadStatus","isNull","target","asset","intent","readStatus","clearRowError","AssetFileFailReasonDefault","isEmptyMetadataValue","isUndefined","value","isArray","mergeLoadedMetadata","useAssetSuggestions","row","customData","isObject","key","authorSuggestions","updateNewNames","queue","getAuthorConflicts","caches","decorateRow","mainFile","hadMetadata","role","UploadRowRole","markAsDuplicate","createUploadSettle","policyOf","profile","concerns","queueKey","purpose","byConfiguration","names","name","namedQueues","cachesOf","ids","fetchNames","queueKeys","rows","all","isStopped","UploadQueueItemStatus","isLive","raw","toRaw","item","isMarkedDuplicate","isDisposed","options","decorate","memory","revisionOf","bump","mark","isStale","startedAt","startRead","trackStateOf","untrack","state","setRefreshMayHelp","mayHelp","noticeOf","notice","dropNotice","showsOwnText","syncNotice","wants","text","clear","loadMetadata","settleProcessed","wasFailed","settleFailed","failReason","settleKnownFailed","entry","settleProcessedByEvent","announceProcessed","duplicateRows","eligible","policy","markDuplicates","marked","originFileId","assetType","file","error","becomeOriginals","DamAssetType","candidates","untouched","original","leftWithout","mightHelp","failsHere","settleDuplicate","targets","one","left","settleKnownDuplicate","tryLoadMetadata","applyAssetRead","duplicateSettled","maySettle","candidate","awaitsMetadata","withoutMetadata"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadSettle.ts"],"sourcesContent":["import { toRaw } from 'vue'\nimport type { DocIdNullable } from '@/shared/types/common'\nimport { type AssetDetailItemDto, DamAssetType, type DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport {\n type AssetFile,\n AssetFileFailReasonDefault,\n type AssetFileFailReasonType,\n type AssetFileNullable,\n AssetFileProcessStatus,\n type AssetFileProcessStatusType,\n} from '@/domains/dam/types/AssetFile'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport {\n UploadRowRole,\n type UploadRowRoleType,\n type UploadSettlementProfile,\n type UploadSettlementTarget,\n} from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\nimport { isArray, isNull, isObject, isUndefined } from '@/shared/utils/common'\n\nexport interface UploadTrackState {\n queueKey: UploadQueueKey\n /** When the row began to wait for the server, in the time of the scheduler. */\n eligibleSince: number\n /** The client gave the row up on its finish request; the server may have finished the file all the same. */\n clientFailed: boolean\n /** Successful reads in a row that did not carry the asset of the row, or its file among the slots. */\n misses: number\n /** Failed reads in a row. */\n readFailures: number\n /**\n * A failed read of the row was written down, or one that found no asset was let be reported, and no read has\n * brought its asset since: the next ones are not.\n */\n reported: boolean\n}\n\nexport interface UploadRowNotice {\n /** The row has waited longer than a processing should take. */\n slow: boolean\n /** The reads of the row keep failing. */\n readWarning: boolean\n /** Which of the two the settlement has written into `row.error`. */\n shown: 'slow' | 'readWarning' | null\n /** The text it wrote then. A row whose message is another one by now carries somebody else's error. */\n text: string | null\n}\n\n/** What a read is to do for one target. */\nexport interface UploadReadIntent {\n /** The state an event carried: it stands when the read itself shows no final state. */\n hint: 'processed' | null\n /** When the row settles as processed, load its metadata as well. */\n metadata: boolean\n /** The metadata notification: the metadata may come before the final state. */\n early: boolean\n /** A read that tells a row with `settleOn: 'never'` its file is processed. */\n seen: boolean\n}\n\n/** What the settlement remembers about rows. Every key is `toRaw(row)`. */\nexport interface UploadSettleMemory {\n tracked: WeakMap<UploadQueueItem, UploadTrackState>\n /** The last write an event made into the row; a read that started before it is stale. Never cleared. */\n revision: WeakMap<UploadQueueItem, number>\n metadataLoaded: WeakSet<UploadQueueItem>\n /** Failed rows an event has brought back: their next read loads the metadata. */\n reviveWithMetadata: WeakSet<UploadQueueItem>\n /** Failed rows a refresh may still change: given up by the client and asked about, or left without their original. */\n refreshMayHelp: WeakSet<UploadQueueItem>\n /** Rows failed by the read that was one too many to find no asset, as long as the server settles them by nothing else. */\n givenUpMissing: WeakSet<UploadQueueItem>\n notices: WeakMap<UploadQueueItem, UploadRowNotice>\n /** One counter for the revisions and the starts of the reads. */\n clock: number\n}\n\nexport const createUploadSettleMemory = (): UploadSettleMemory => ({\n tracked: new WeakMap(),\n revision: new WeakMap(),\n metadataLoaded: new WeakSet(),\n reviveWithMetadata: new WeakSet(),\n refreshMayHelp: new WeakSet(),\n givenUpMissing: new WeakSet(),\n notices: new WeakMap(),\n clock: 0,\n})\n\nexport interface UploadSettleRow {\n queueKey: UploadQueueKey\n queue: UploadQueue\n row: UploadQueueItem\n}\n\nexport interface UploadSettleOptions {\n /** A row stopped being tracked, by a write or by the store. */\n onUntrack?(queueKey: UploadQueueKey): void\n /** The settlement was disposed of: what a read of an original brings after that is written nowhere. */\n isDisposed?(): boolean\n}\n\nexport const isFinalFileStatus = (\n status: AssetFileProcessStatusType | null | undefined\n): status is 'processed' | 'duplicate' | 'failed' =>\n status === AssetFileProcessStatus.Processed ||\n status === AssetFileProcessStatus.Duplicate ||\n status === AssetFileProcessStatus.Failed\n\n/**\n * The state a read gives the file of the target. An asset carries the state of its main file alone: a final state\n * it shows stands, otherwise the state the event carried, when it carried one. Of another file (a slot beside the\n * main one) the asset says nothing, and only what the event carried stands.\n */\nexport const resolveReadStatus = (\n asset: AssetDetailItemDto,\n target: Pick<UploadSettlementTarget, 'fileId'>,\n intent: Pick<UploadReadIntent, 'hint'>\n): AssetFileProcessStatusType | undefined => {\n if (!isNull(target.fileId) && target.fileId !== asset.mainFile?.id) return intent.hint ?? undefined\n const readStatus = asset.mainFile?.fileAttributes?.status\n return isFinalFileStatus(readStatus) ? readStatus : (intent.hint ?? readStatus)\n}\n\nexport const clearRowError = (row: UploadQueueItem) => {\n row.error = { hasError: false, message: '', assetFileFailReason: AssetFileFailReasonDefault }\n}\n\n// Empty as the mass operations of the queue understand it.\nexport const isEmptyMetadataValue = (value: unknown) =>\n isUndefined(value) || isNull(value) || value === '' || (isArray(value) && !value.length)\n\n/**\n * The first load of the metadata of a row. What the user has put into the row before it (a mass operation of the\n * queue) stays: only the empty lists and the empty custom fields are filled.\n */\nexport function mergeLoadedMetadata(\n queue: UploadQueue,\n row: UploadQueueItem,\n asset: AssetDetailItemDto,\n caches: Pick<UploadSettlementProfile['caches'], 'addAuthors' | 'addKeywords'>\n) {\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n if (isEmptyMetadataValue(row.keywords)) row.keywords = [...(asset.keywords ?? [])]\n if (isEmptyMetadataValue(row.authors)) row.authors = [...(asset.authors ?? [])]\n const customData: Record<string, unknown> = isObject(asset.metadata.customData)\n ? { ...asset.metadata.customData }\n : {}\n if (isObject(row.customData)) {\n for (const [key, value] of Object.entries(row.customData)) {\n if (!isEmptyMetadataValue(value)) customData[key] = value\n }\n }\n row.customData = customData\n // Not fields of a mass operation: the server's.\n row.mainFileSingleUse = asset.mainFileSingleUse\n row.mainFileInternal = asset.mainFileInternal\n const authorSuggestions = asset.metadata.authorSuggestions ?? {}\n updateNewNames(authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(asset.metadata.keywordSuggestions ?? {}, queue.suggestions.newKeywordNames)\n row.authorConflicts = getAuthorConflicts(authorSuggestions)\n caches.addKeywords(row.keywords)\n caches.addAuthors(row.authors)\n caches.addAuthors(row.authorConflicts)\n}\n\n/**\n * What a read asset gives a row without a change of its state. `hadMetadata`: the metadata of the row was loaded\n * once, whether or not it has its form now.\n */\nexport function decorateRow(\n row: UploadQueueItem,\n asset: AssetDetailItemDto,\n mainFile: AssetFile,\n role: UploadRowRoleType,\n hadMetadata: boolean\n) {\n row.assetStatus = asset.attributes.assetStatus\n // Only when the row is the main file: a slot would take a preview describing another.\n if (!isNull(row.fileId) && row.fileId !== mainFile.id) return\n if (mainFile.links?.image_detail) row.imagePreview = mainFile.links.image_detail\n // Not on a mass-edit row, nor on one that has or had its metadata: there the switches are form fields the user\n // may have set, also on a row a failure took the form of and which gets it back.\n if (!row.canEditMetadata && !hadMetadata && role !== UploadRowRole.MassEdit) {\n row.mainFileSingleUse = asset.mainFileSingleUse\n row.mainFileInternal = asset.mainFileInternal\n }\n}\n\n// Both ways of settling a duplicate mark the row through here.\nconst markAsDuplicate = (row: UploadQueueItem) => {\n row.isDuplicate = true\n // Once, before anything may write the original over `assetId`.\n row.uploadedAssetId ??= row.assetId\n}\n\n/**\n * The writes of the settlement: a read asset or a known state into the rows of the queues. No timers and no reads\n * of its own, but for the original of a duplicate.\n */\nexport function createUploadSettle(\n profile: UploadSettlementProfile,\n memory: UploadSettleMemory = createUploadSettleMemory(),\n options: UploadSettleOptions = {}\n) {\n const policyOf = (row: UploadQueueItem) => profile.policyFor(profile.roleOf(row))\n\n /**\n * Whether the target concerns the row of the queue `queueKey`: by `matches` of the profile, and only in a queue of a\n * configuration the target names, where the profile says the configurations of the queues (`configOf`).\n */\n const concerns = (\n queueKey: UploadQueueKey,\n row: UploadQueueItem,\n target: UploadSettlementTarget,\n purpose: 'settle' | 'decorate' | 'metadata'\n ) =>\n (!profile.configOf || !target.configNames?.length || target.configNames.includes(profile.configOf(queueKey))) &&\n profile.matches(row, target, purpose)\n\n /**\n * The target once for each configuration it names, where it names several and the profile says the configurations\n * of its queues: what is read for it is read for each by itself, by a queue of that configuration, and written into\n * its rows alone. Otherwise the target itself.\n */\n const byConfiguration = (target: UploadSettlementTarget): UploadSettlementTarget[] => {\n const names = profile.configOf ? [...new Set(target.configNames ?? [])] : []\n return names.length > 1 ? names.map((name) => ({ ...target, configNames: [name] })) : [target]\n }\n\n // The queues whose rows were given names since the caches last fetched.\n const namedQueues = new Set<UploadQueueKey>()\n /** Where the names of the rows of the queue go: a profile with `configOf` is told the queue, one without as before. */\n const cachesOf = (\n queueKey: UploadQueueKey\n ): Pick<UploadSettlementProfile['caches'], 'addAuthors' | 'addKeywords'> => {\n namedQueues.add(queueKey)\n if (!profile.configOf) {\n return {\n addAuthors: (ids) => profile.caches.addAuthors(ids),\n addKeywords: (ids) => profile.caches.addKeywords(ids),\n }\n }\n return {\n addAuthors: (ids) => profile.caches.addAuthors(ids, queueKey),\n addKeywords: (ids) => profile.caches.addKeywords(ids, queueKey),\n }\n }\n /** The caches fetch: those of each queue given names since, or once without a queue for a profile without `configOf`. */\n const fetchNames = () => {\n const queueKeys = [...namedQueues]\n namedQueues.clear()\n if (!profile.configOf) {\n profile.caches.fetchAuthors()\n profile.caches.fetchKeywords()\n return\n }\n for (const queueKey of queueKeys) {\n profile.caches.fetchAuthors(queueKey)\n profile.caches.fetchKeywords(queueKey)\n }\n }\n\n /** The rows of all the queues, as they are now. */\n const rows = (): UploadSettleRow[] => {\n const all: UploadSettleRow[] = []\n for (const [queueKey, queue] of profile.queues()) {\n for (const row of queue.items) all.push({ queueKey, queue, row })\n }\n return all\n }\n\n // A stopped row is written by nothing. Asked anew after every wait: the row may be stopped meanwhile.\n const isStopped = (row: UploadQueueItem) => row.status === UploadQueueItemStatus.Stop\n\n const isLive = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n for (const [, queue] of profile.queues()) {\n if (toRaw(queue.items).some((item) => toRaw(item) === raw)) return true\n }\n return false\n }\n\n // A row marked as a duplicate is settled and read-only. A row that became its original is an editable row like\n // any other, and is not barred from anything.\n const isMarkedDuplicate = (row: UploadQueueItem) => row.isDuplicate && policyOf(row).duplicate === 'markDuplicate'\n const isDisposed = () => options.isDisposed?.() === true\n\n const decorate = (row: UploadQueueItem, asset: AssetDetailItemDto, mainFile: AssetFile) =>\n decorateRow(row, asset, mainFile, profile.roleOf(row), memory.metadataLoaded.has(toRaw(row)))\n\n const revisionOf = (row: UploadQueueItem) => memory.revision.get(toRaw(row)) ?? 0\n /** An event has written into the row: a read that started before this is stale for it. */\n const bump = (row: UploadQueueItem) => {\n const mark = ++memory.clock\n memory.revision.set(toRaw(row), mark)\n return mark\n }\n const isStale = (row: UploadQueueItem, startedAt: number) => startedAt <= revisionOf(row)\n /** The mark of a read that starts now. */\n const startRead = () => ++memory.clock\n\n const trackStateOf = (row: UploadQueueItem) => memory.tracked.get(toRaw(row))\n const untrack = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n const state = memory.tracked.get(raw)\n if (!state) return\n memory.tracked.delete(raw)\n options.onUntrack?.(state.queueKey)\n }\n\n /** Whether a refresh may still change a failed row; the store is told when that changes. */\n const setRefreshMayHelp = (queueKey: UploadQueueKey, row: UploadQueueItem, mayHelp: boolean) => {\n const raw = toRaw(row)\n if (memory.refreshMayHelp.has(raw) === mayHelp) return\n if (mayHelp) memory.refreshMayHelp.add(raw)\n else memory.refreshMayHelp.delete(raw)\n profile.hooks.onRefreshMayHelp?.(queueKey, row, mayHelp)\n }\n\n const noticeOf = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n let notice = memory.notices.get(raw)\n if (!notice) {\n notice = { slow: false, readWarning: false, shown: null, text: null }\n memory.notices.set(raw, notice)\n }\n return notice\n }\n const dropNotice = (row: UploadQueueItem) => memory.notices.delete(toRaw(row))\n // Whether the message of the row is still the text the settlement wrote into it. The store writes into\n // `row.error` as well (an upload that failed), and that error is not the settlement's to take away.\n const showsOwnText = (row: UploadQueueItem) => {\n const notice = memory.notices.get(toRaw(row))\n return !!notice?.shown && row.error.message === notice.text\n }\n\n /**\n * Writes into `row.error` the one of the two texts of the settlement that holds, or takes its own text away:\n * only its own, and only while it is still what the row says.\n * `clear` takes away an error the settlement did not write as well: the row has settled as processed.\n */\n const syncNotice = (row: UploadQueueItem, { clear = false }: { clear?: boolean } = {}) => {\n const notice = noticeOf(row)\n let wants: UploadRowNotice['shown'] = null\n if (\n notice.readWarning &&\n policyOf(row).metadata === 'load' &&\n !row.canEditMetadata &&\n !isMarkedDuplicate(row) &&\n row.status !== UploadQueueItemStatus.Failed\n ) {\n wants = 'readWarning'\n } else if (notice.slow && row.status === UploadQueueItemStatus.Processing) {\n wants = 'slow'\n }\n if (wants) {\n const text = wants === 'slow' ? profile.messages.processingTooLong(row) : profile.messages.readFailed(row)\n row.error.hasError = true\n row.error.message = text\n notice.shown = wants\n notice.text = text\n return\n }\n if (clear) {\n clearRowError(row)\n } else if (showsOwnText(row)) {\n // The text goes. The flag goes with it, unless the row has failed since: then the flag is the failure's.\n if (row.status === UploadQueueItemStatus.Failed) row.error = { ...row.error, message: '' }\n else clearRowError(row)\n }\n notice.shown = null\n notice.text = null\n }\n\n const loadMetadata = (\n { queueKey, queue, row }: Pick<UploadSettleRow, 'queueKey' | 'queue' | 'row'>,\n asset: AssetDetailItemDto\n ) => {\n mergeLoadedMetadata(queue, row, asset, cachesOf(queueKey))\n memory.metadataLoaded.add(toRaw(row))\n }\n\n const settleProcessed = (\n { queueKey, queue, row }: UploadSettleRow,\n asset: AssetDetailItemDto,\n mainFile: AssetFile,\n intent: UploadReadIntent\n ) => {\n const raw = toRaw(row)\n // The client marks an upload failed when one of its requests fails, and the server may have finished it all the\n // same. Such a row lost its form with the failure, and gets it back here, with its metadata.\n const wasFailed = row.status === UploadQueueItemStatus.Failed || memory.reviveWithMetadata.has(raw)\n row.status = UploadQueueItemStatus.Uploaded\n // A copy to the licence knows only its asset, and the image is built from the file id.\n if (isNull(row.fileId)) row.fileId = mainFile.id\n decorate(row, asset, mainFile)\n const notice = noticeOf(row)\n if (policyOf(row).metadata === 'load' && !isMarkedDuplicate(row) && (intent.metadata || wasFailed)) {\n // Loaded once, and never into a row whose form is on: it keeps what the user has typed since.\n if (!row.canEditMetadata && !memory.metadataLoaded.has(raw)) loadMetadata({ queueKey, queue, row }, asset)\n row.canEditMetadata = true\n notice.readWarning = false\n profile.hooks.afterMetadataLoaded?.(queueKey, row)\n }\n memory.reviveWithMetadata.delete(raw)\n memory.givenUpMissing.delete(raw)\n notice.slow = false\n syncNotice(row, { clear: true })\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n const settleFailed = (\n { queueKey, row }: Pick<UploadSettleRow, 'queueKey' | 'row'>,\n failReason: AssetFileFailReasonType\n ) => {\n row.status = UploadQueueItemStatus.Failed\n // Without the old text: the row prints a message over the reason, and the old one is not why.\n row.error = { hasError: true, message: '', assetFileFailReason: failReason }\n row.canEditMetadata = false\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n /** A failure the caller knows of, without a read. */\n const settleKnownFailed = (target: UploadSettlementTarget, failReason: AssetFileFailReasonType) => {\n for (const entry of rows()) {\n if (entry.row.status === UploadQueueItemStatus.Stop || !concerns(entry.queueKey, entry.row, target, 'settle')) {\n continue\n }\n settleFailed(entry, failReason)\n bump(entry.row)\n }\n }\n\n /**\n * The state of a `processed` event, written at once into the rows that settle on the event. Also what a tick\n * does for a slot row whose file the list of slots shows processed.\n */\n const settleProcessedByEvent = (target: UploadSettlementTarget) => {\n for (const { queueKey, row } of rows()) {\n if (row.status === UploadQueueItemStatus.Stop || policyOf(row).settleOn !== 'event') continue\n if (!concerns(queueKey, row, target, 'settle')) continue\n const raw = toRaw(row)\n if (row.status === UploadQueueItemStatus.Failed) memory.reviveWithMetadata.add(raw)\n memory.givenUpMissing.delete(raw)\n row.status = UploadQueueItemStatus.Uploaded\n // A row the client gave up on, which had its metadata by then, gets the form back as the user left it.\n if (!isMarkedDuplicate(row) && memory.metadataLoaded.has(raw)) row.canEditMetadata = true\n noticeOf(row).slow = false\n syncNotice(row, { clear: true })\n bump(row)\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n }\n\n /** A `processed` event for the rows whose state it does not change. */\n const announceProcessed = (target: UploadSettlementTarget) => {\n for (const { queueKey, row } of rows()) {\n if (row.status === UploadQueueItemStatus.Stop || policyOf(row).settleOn !== 'never') continue\n if (concerns(queueKey, row, target, 'decorate')) profile.hooks.onProcessedSeen?.(queueKey, row)\n }\n }\n\n const duplicateRows = (\n target: UploadSettlementTarget,\n policy: 'becomeOriginal' | 'markDuplicate',\n eligible: (row: UploadQueueItem) => boolean\n ) =>\n rows().filter(\n ({ queueKey, row }) =>\n row.status !== UploadQueueItemStatus.Stop &&\n eligible(row) &&\n policyOf(row).duplicate === policy &&\n concerns(queueKey, row, target, 'settle')\n )\n\n // The row stays, marked: settled first, completed from the original file afterwards, so the wait for that file\n // does not hold an upload slot.\n const markDuplicates = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean\n ) => {\n const marked: Array<{ row: UploadQueueItem; mark: number }> = []\n for (const { queueKey, row } of duplicateRows(target, 'markDuplicate', eligible)) {\n markAsDuplicate(row)\n row.status = UploadQueueItemStatus.Uploaded\n row.canEditMetadata = false\n clearRowError(row)\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n marked.push({ row, mark: bump(row) })\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n if (!marked.length || !originFileId || !assetType || !profile.readers.duplicateOriginFile) return\n let file: AssetFileNullable = null\n try {\n file = await profile.readers.duplicateOriginFile(originFileId, assetType)\n } catch (error) {\n console.error('uploadQueue: the duplicated file could not be read', error)\n }\n if (!file || isDisposed()) return\n for (const { row, mark } of marked) {\n // Only a row nothing has written into meanwhile, and which is still there.\n if (!isLive(row) || row.status === UploadQueueItemStatus.Stop || !row.isDuplicate) continue\n if (revisionOf(row) !== mark) continue\n row.fileId = file.id\n row.duplicateAssetId = file.asset\n row.mainFileSingleUse = file.flags.singleUse\n if (file.links?.image_detail) row.imagePreview = file.links.image_detail\n }\n }\n\n // The row becomes the original: its asset and file are replaced, and it takes the metadata of the original.\n // Answers whether the original could not be read and a row is left that a refresh may still help.\n const becomeOriginals = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean\n ): Promise<boolean> => {\n if (!originFileId || assetType !== DamAssetType.Image) return false\n // Noted before the original is asked for. After the wait only a row no event has written into meanwhile, which\n // is still in its queue and not stopped, is written: the caller that knows of a duplicate is outside the order\n // of the reads, and a later event must not be undone by an earlier answer.\n const candidates = duplicateRows(target, 'becomeOriginal', eligible).map((entry) => ({\n ...entry,\n mark: revisionOf(entry.row),\n }))\n if (!candidates.length) return false\n const untouched = () =>\n candidates.filter(({ row, mark }) => isLive(row) && !isStopped(row) && revisionOf(row) === mark)\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n let original: AssetDetailItemDto\n try {\n if (!profile.readers.duplicateOriginAsset) throw new Error('uploadSettlement: no reader of the original asset')\n original = await profile.readers.duplicateOriginAsset(originFileId, { queueKey: candidates[0]!.queueKey })\n } catch {\n if (isDisposed()) return false\n let leftWithout = false\n for (const { queueKey, row } of untouched()) {\n // Noted before the row is let go: one the client gave up on keeps its way back.\n const mightHelp = memory.refreshMayHelp.has(toRaw(row))\n // Whatever its state: the next tick would only try the same read again.\n untrack(row)\n // Only a row still waiting for this answer fails: a settled one must not be flipped back to failed.\n const failsHere = row.status === UploadQueueItemStatus.Processing\n if (failsHere) {\n row.status = UploadQueueItemStatus.Failed\n // Without a text the settlement had written into it: that is no longer what is wrong with the row.\n row.error = { ...row.error, hasError: true, message: showsOwnText(row) ? '' : row.error.message }\n row.canEditMetadata = false\n dropNotice(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n // Failed for a read that failed, not for its file: the refresh of the row asks for the original again.\n // Not a row that had failed before by the word of the server, which no refresh takes back.\n if (failsHere || mightHelp) {\n setRefreshMayHelp(queueKey, row, true)\n leftWithout = true\n }\n }\n return leftWithout\n }\n if (isDisposed()) return false\n for (const { queueKey, queue, row } of untouched()) {\n const authorSuggestions = original.metadata.authorSuggestions ?? {}\n markAsDuplicate(row)\n row.status = UploadQueueItemStatus.Uploaded\n clearRowError(row)\n row.fileId = originFileId\n row.duplicateAssetId = original.id\n row.assetStatus = original.attributes.assetStatus\n if (original.mainFile?.links?.image_detail) row.imagePreview = original.mainFile.links.image_detail\n row.keywords = [...(original.keywords ?? [])]\n row.authors = [...(original.authors ?? [])]\n row.customData = isObject(original.metadata.customData) ? { ...original.metadata.customData } : {}\n updateNewNames(authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(original.metadata.keywordSuggestions ?? {}, queue.suggestions.newKeywordNames)\n row.authorConflicts = getAuthorConflicts(authorSuggestions)\n const caches = cachesOf(queueKey)\n caches.addKeywords(row.keywords)\n caches.addAuthors(row.authors)\n caches.addAuthors(row.authorConflicts)\n row.assetId = original.id\n row.mainFileSingleUse = original.mainFileSingleUse\n row.mainFileInternal = original.mainFileInternal\n memory.metadataLoaded.add(toRaw(row))\n row.canEditMetadata = true\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n bump(row)\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n fetchNames()\n return false\n }\n\n /**\n * A duplicate file, for every row that passes `matches(…, 'settle')`, each by the policy of its role.\n * `eligible` leaves out the rows a read is stale for. Answers whether a row is left without the original of\n * its duplicate, which could not be read: a refresh may still help it.\n */\n const settleDuplicate = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean = () => true\n ) => {\n // Both begin at once, not one after the wait of the other: what each notes of its rows is noted now. The original\n // is read once for each configuration the target names, by a queue of it.\n const targets = byConfiguration(target)\n const [, leftWithout] = await Promise.all([\n markDuplicates(target, originFileId, assetType, eligible),\n targets.length === 1\n ? becomeOriginals(target, originFileId, assetType, eligible)\n : Promise.all(targets.map((one) => becomeOriginals(one, originFileId, assetType, eligible))).then((left) =>\n left.some(Boolean)\n ),\n ])\n return leftWithout\n }\n\n /** A duplicate the caller knows of, without a read of its asset. Never rejects. */\n const settleKnownDuplicate = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null\n ) => {\n try {\n await settleDuplicate(target, originFileId, assetType)\n } catch (error) {\n console.error('uploadQueue: the duplicate could not be settled', error)\n }\n }\n\n /** The metadata notification: the metadata and the form, whatever the state of the file. */\n const tryLoadMetadata = ({ queueKey, queue, row }: UploadSettleRow, asset: AssetDetailItemDto) => {\n if (policyOf(row).metadata !== 'load' || row.canEditMetadata) return\n // A marked duplicate is settled, and has no metadata of its own to miss.\n if (isMarkedDuplicate(row)) return\n // Nor has a row whose file failed, but the one that failed for want of this very metadata.\n if (row.status === UploadQueueItemStatus.Failed && profile.metadataGate?.(queueKey, row) !== 'load') return\n if (!memory.metadataLoaded.has(toRaw(row))) loadMetadata({ queueKey, queue, row }, asset)\n row.canEditMetadata = true\n noticeOf(row).readWarning = false\n syncNotice(row)\n profile.hooks.afterMetadataLoaded?.(queueKey, row)\n }\n\n /**\n * One read asset into every row it concerns. `startedAt` is the mark of the read: a row an event has written\n * into since keeps the state the event gave it. Answers as `settleDuplicate` does: whether a row is left\n * without the original of its duplicate.\n */\n const applyAssetRead = async (\n asset: AssetDetailItemDto,\n target: UploadSettlementTarget,\n intent: UploadReadIntent,\n startedAt: number\n ) => {\n const mainFile = asset.mainFile ?? null\n const status = resolveReadStatus(asset, target, intent)\n let duplicateSettled = false\n let leftWithout = false\n for (const entry of rows()) {\n const { queueKey, row } = entry\n // The read of a duplicate's original was awaited: the row may have left its queue meanwhile.\n if (duplicateSettled && !isLive(row)) continue\n if (isStopped(row)) continue\n\n // The state of the file and what completes the row, unless an event has written into the row since this\n // read was sent: the event knows more than this answer.\n if (!isStale(row, startedAt) && mainFile && concerns(queueKey, row, target, 'decorate')) {\n const maySettle = concerns(queueKey, row, target, 'settle')\n if (status === AssetFileProcessStatus.Processed) {\n if (policyOf(row).settleOn === 'never') {\n decorate(row, asset, mainFile)\n if (intent.seen) profile.hooks.onProcessedSeen?.(queueKey, row)\n } else if (maySettle) {\n settleProcessed(entry, asset, mainFile, intent)\n }\n } else if (status === AssetFileProcessStatus.Duplicate && maySettle) {\n // Once for all the rows of the target: the original is read once.\n if (!duplicateSettled) {\n duplicateSettled = true\n leftWithout = await settleDuplicate(\n target,\n mainFile.originAssetFile,\n asset.attributes.assetType,\n (candidate) => !isStale(candidate, startedAt)\n )\n if (isDisposed()) return leftWithout\n if (!isLive(row) || isStopped(row)) continue\n }\n } else if (status === AssetFileProcessStatus.Failed && maySettle) {\n settleFailed(entry, mainFile.fileAttributes.failReason)\n }\n }\n\n // Into such a row as well: the metadata is no state of the file. It is loaded once, whenever it comes, and a\n // row the event has failed or marked as a duplicate is refused there. Otherwise a `processed` event that\n // overtakes the read of the metadata notification would leave the row uploaded without its form for good.\n if (intent.early && concerns(queueKey, row, target, 'metadata')) tryLoadMetadata(entry, asset)\n }\n profile.hooks.onAssetRead?.(asset)\n return leftWithout\n }\n\n /**\n * An uploaded row still without its metadata, which its refresh would load. It is no longer tracked, and the reads\n * that find no asset are counted for it as for a row that waits.\n */\n const awaitsMetadata = (row: UploadQueueItem) =>\n row.status === UploadQueueItemStatus.Uploaded &&\n !row.canEditMetadata &&\n policyOf(row).metadata === 'load' &&\n !isMarkedDuplicate(row)\n\n /**\n * The asset of a row was missing from as many reads as it takes, of a tracked row or of one a refresh may still\n * help: a row still processing fails, an uploaded row still without its metadata fails with `assetGone`, any\n * other (a row the client gave up on, one left without the original of its duplicate) is only left alone.\n */\n const giveUpOnMissing = ({ queueKey, row }: Pick<UploadSettleRow, 'queueKey' | 'row'>) => {\n // There is no asset a refresh could read.\n setRefreshMayHelp(queueKey, row, false)\n const withoutMetadata = awaitsMetadata(row)\n if (row.status !== UploadQueueItemStatus.Processing && !withoutMetadata) {\n untrack(row)\n return\n }\n row.status = UploadQueueItemStatus.Failed\n row.error.hasError = true\n row.error.message = withoutMetadata\n ? (profile.messages.assetGone?.(row) ?? profile.messages.assetMissing(row))\n : profile.messages.assetMissing(row)\n row.canEditMetadata = false\n memory.givenUpMissing.add(toRaw(row))\n dropNotice(row)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n return {\n memory,\n policyOf,\n concerns,\n byConfiguration,\n fetchNames,\n rows,\n isLive,\n bump,\n isStale,\n startRead,\n trackStateOf,\n untrack,\n setRefreshMayHelp,\n noticeOf,\n syncNotice,\n applyAssetRead,\n settleProcessedByEvent,\n announceProcessed,\n settleFailed,\n settleKnownFailed,\n settleDuplicate,\n settleKnownDuplicate,\n awaitsMetadata,\n giveUpOnMissing,\n }\n}\n\nexport type UploadSettle = ReturnType<typeof createUploadSettle>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadSettle.js","names":["createUploadSettleMemory","isFinalFileStatus","status","AssetFileProcessStatus","resolveReadStatus","isNull","target","asset","intent","readStatus","clearRowError","AssetFileFailReasonDefault","isEmptyMetadataValue","isUndefined","value","isArray","mergeLoadedMetadata","useAssetSuggestions","row","customData","isObject","key","authorSuggestions","updateNewNames","queue","getAuthorConflicts","caches","decorateRow","mainFile","hadMetadata","role","UploadRowRole","markAsDuplicate","createUploadSettle","policyOf","profile","concerns","queueKey","purpose","byConfiguration","names","name","namedQueues","cachesOf","ids","fetchNames","queueKeys","rows","all","isStopped","UploadQueueItemStatus","isLive","raw","toRaw","item","isMarkedDuplicate","isDisposed","options","decorate","memory","revisionOf","bump","mark","isStale","startedAt","startRead","trackStateOf","untrack","state","setRefreshMayHelp","mayHelp","noticeOf","notice","dropNotice","showsOwnText","syncNotice","wants","text","clear","loadMetadata","settleProcessed","wasFailed","settleFailed","failReason","settleKnownFailed","entry","settleProcessedByEvent","announceProcessed","duplicateRows","eligible","policy","markDuplicates","marked","originFileId","assetType","file","error","becomeOriginals","DamAssetType","candidates","untouched","original","leftWithout","mightHelp","failsHere","settleDuplicate","targets","one","left","settleKnownDuplicate","tryLoadMetadata","applyAssetRead","duplicateSettled","maySettle","candidate","awaitsMetadata","withoutMetadata"],"sources":["../../../../../src/domains/dam/uploadQueue/settlement/uploadSettle.ts"],"sourcesContent":["import { toRaw } from 'vue'\nimport type { DocIdNullable } from '@/shared/types/common'\nimport { type AssetDetailItemDto, DamAssetType, type DamAssetTypeType } from '@/domains/dam/types/Asset'\nimport {\n type AssetFile,\n AssetFileFailReasonDefault,\n type AssetFileFailReasonType,\n type AssetFileNullable,\n AssetFileProcessStatus,\n type AssetFileProcessStatusType,\n} from '@/domains/dam/types/AssetFile'\nimport {\n type UploadQueue,\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport { useAssetSuggestions } from '@/domains/dam/uploadQueue/composables/assetSuggestions'\nimport {\n UploadRowRole,\n type UploadRowRoleType,\n type UploadSettlementProfile,\n type UploadSettlementTarget,\n} from '@/domains/dam/uploadQueue/settlement/uploadSettlementTypes'\nimport { isArray, isNull, isObject, isUndefined } from '@/shared/utils/common'\n\nexport interface UploadTrackState {\n queueKey: UploadQueueKey\n /** When the row started waiting for the server, in scheduler time. */\n eligibleSince: number\n /** The client failed the row on its finish request. The server may still have finished the file. */\n clientFailed: boolean\n /** Consecutive successful reads that did not include the row's asset, or its file among the slots. */\n misses: number\n readFailures: number\n /**\n * A failed read or a missing asset was already reported, and no read has found the asset since.\n * Further failures are not reported.\n */\n reported: boolean\n}\n\nexport interface UploadRowNotice {\n /** The row has waited longer than processing should take. */\n slow: boolean\n readWarning: boolean\n /** Which of the two notices the settlement wrote into `row.error`. */\n shown: 'slow' | 'readWarning' | null\n /** The text written then. If the row's message differs now, the error belongs to someone else. */\n text: string | null\n}\n\n/** What a read should do for one target. */\nexport interface UploadReadIntent {\n /** State carried by the event. It applies when the read shows no final state. */\n hint: 'processed' | null\n /** When the row settles as processed, load its metadata as well. */\n metadata: boolean\n /** Set by the metadata notification. Metadata may arrive before the final state. */\n early: boolean\n /** The read tells a row with `settleOn: 'never'` that its file is processed. */\n seen: boolean\n}\n\n/** What the settlement remembers about rows. Every key is `toRaw(row)`. */\nexport interface UploadSettleMemory {\n tracked: WeakMap<UploadQueueItem, UploadTrackState>\n /** The last write an event made into the row. A read started before it is stale. Never cleared. */\n revision: WeakMap<UploadQueueItem, number>\n metadataLoaded: WeakSet<UploadQueueItem>\n /** Failed rows revived by an event. Their next read loads the metadata. */\n reviveWithMetadata: WeakSet<UploadQueueItem>\n /** Failed rows a refresh may still change: given up by the client, or left without their duplicate's original. */\n refreshMayHelp: WeakSet<UploadQueueItem>\n /** Rows failed because too many reads found no asset, while the server settles them by nothing else. */\n givenUpMissing: WeakSet<UploadQueueItem>\n notices: WeakMap<UploadQueueItem, UploadRowNotice>\n /** Shared counter for revisions and read starts. */\n clock: number\n}\n\nexport const createUploadSettleMemory = (): UploadSettleMemory => ({\n tracked: new WeakMap(),\n revision: new WeakMap(),\n metadataLoaded: new WeakSet(),\n reviveWithMetadata: new WeakSet(),\n refreshMayHelp: new WeakSet(),\n givenUpMissing: new WeakSet(),\n notices: new WeakMap(),\n clock: 0,\n})\n\nexport interface UploadSettleRow {\n queueKey: UploadQueueKey\n queue: UploadQueue\n row: UploadQueueItem\n}\n\nexport interface UploadSettleOptions {\n /** A row stopped being tracked, by a settlement write or by the store. */\n onUntrack?(queueKey: UploadQueueKey): void\n /** The settlement was disposed. Results of an original read that arrive later are not written. */\n isDisposed?(): boolean\n}\n\nexport const isFinalFileStatus = (\n status: AssetFileProcessStatusType | null | undefined\n): status is 'processed' | 'duplicate' | 'failed' =>\n status === AssetFileProcessStatus.Processed ||\n status === AssetFileProcessStatus.Duplicate ||\n status === AssetFileProcessStatus.Failed\n\n/**\n * The file state a read gives the target.\n * An asset reports only its main file state. A final state from the asset wins, otherwise the event state applies.\n * For another file (a slot) the asset says nothing, so only the event state applies.\n */\nexport const resolveReadStatus = (\n asset: AssetDetailItemDto,\n target: Pick<UploadSettlementTarget, 'fileId'>,\n intent: Pick<UploadReadIntent, 'hint'>\n): AssetFileProcessStatusType | undefined => {\n if (!isNull(target.fileId) && target.fileId !== asset.mainFile?.id) return intent.hint ?? undefined\n const readStatus = asset.mainFile?.fileAttributes?.status\n return isFinalFileStatus(readStatus) ? readStatus : (intent.hint ?? readStatus)\n}\n\nexport const clearRowError = (row: UploadQueueItem) => {\n row.error = { hasError: false, message: '', assetFileFailReason: AssetFileFailReasonDefault }\n}\n\n// \"Empty\" as the queue's mass operations define it.\nexport const isEmptyMetadataValue = (value: unknown) =>\n isUndefined(value) || isNull(value) || value === '' || (isArray(value) && !value.length)\n\n/**\n * First metadata load of a row. Values the user set earlier (via a queue mass operation) stay.\n * Only empty lists and empty custom fields are filled.\n */\nexport function mergeLoadedMetadata(\n queue: UploadQueue,\n row: UploadQueueItem,\n asset: AssetDetailItemDto,\n caches: Pick<UploadSettlementProfile['caches'], 'addAuthors' | 'addKeywords'>\n) {\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n if (isEmptyMetadataValue(row.keywords)) row.keywords = [...(asset.keywords ?? [])]\n if (isEmptyMetadataValue(row.authors)) row.authors = [...(asset.authors ?? [])]\n const customData: Record<string, unknown> = isObject(asset.metadata.customData)\n ? { ...asset.metadata.customData }\n : {}\n if (isObject(row.customData)) {\n for (const [key, value] of Object.entries(row.customData)) {\n if (!isEmptyMetadataValue(value)) customData[key] = value\n }\n }\n row.customData = customData\n // Not mass-operation fields. These come from the server.\n row.mainFileSingleUse = asset.mainFileSingleUse\n row.mainFileInternal = asset.mainFileInternal\n const authorSuggestions = asset.metadata.authorSuggestions ?? {}\n updateNewNames(authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(asset.metadata.keywordSuggestions ?? {}, queue.suggestions.newKeywordNames)\n row.authorConflicts = getAuthorConflicts(authorSuggestions)\n caches.addKeywords(row.keywords)\n caches.addAuthors(row.authors)\n caches.addAuthors(row.authorConflicts)\n}\n\n/**\n * Applies a read asset to a row without changing its state.\n * `hadMetadata`: the row's metadata was loaded once, whether or not the form is shown now.\n */\nexport function decorateRow(\n row: UploadQueueItem,\n asset: AssetDetailItemDto,\n mainFile: AssetFile,\n role: UploadRowRoleType,\n hadMetadata: boolean\n) {\n row.assetStatus = asset.attributes.assetStatus\n // Only for the main-file row. A slot row would get a preview of another file.\n if (!isNull(row.fileId) && row.fileId !== mainFile.id) return\n if (mainFile.links?.image_detail) row.imagePreview = mainFile.links.image_detail\n // Skip mass-edit rows and rows that have or had metadata. There these switches are form fields the user may have set.\n // This includes a row that lost its form on failure and gets it back.\n if (!row.canEditMetadata && !hadMetadata && role !== UploadRowRole.MassEdit) {\n row.mainFileSingleUse = asset.mainFileSingleUse\n row.mainFileInternal = asset.mainFileInternal\n }\n}\n\n// Both duplicate policies mark the row through here.\nconst markAsDuplicate = (row: UploadQueueItem) => {\n row.isDuplicate = true\n // Set once, before anything can overwrite `assetId` with the original.\n row.uploadedAssetId ??= row.assetId\n}\n\n/**\n * Settlement writes: a read asset or a known state into queue rows.\n * No timers and no reads of its own, except reading a duplicate's original.\n */\nexport function createUploadSettle(\n profile: UploadSettlementProfile,\n memory: UploadSettleMemory = createUploadSettleMemory(),\n options: UploadSettleOptions = {}\n) {\n const policyOf = (row: UploadQueueItem) => profile.policyFor(profile.roleOf(row))\n\n /**\n * Whether the target concerns a row of queue `queueKey`, by the profile's `matches`.\n * When the profile provides `configOf`, only queues of a configuration the target names match.\n */\n const concerns = (\n queueKey: UploadQueueKey,\n row: UploadQueueItem,\n target: UploadSettlementTarget,\n purpose: 'settle' | 'decorate' | 'metadata'\n ) =>\n (!profile.configOf || !target.configNames?.length || target.configNames.includes(profile.configOf(queueKey))) &&\n profile.matches(row, target, purpose)\n\n /**\n * Splits the target per named configuration when it names several and the profile provides `configOf`.\n * Each copy is read separately, by a queue of that configuration, and written only into its rows.\n * Otherwise returns the target itself.\n */\n const byConfiguration = (target: UploadSettlementTarget): UploadSettlementTarget[] => {\n const names = profile.configOf ? [...new Set(target.configNames ?? [])] : []\n return names.length > 1 ? names.map((name) => ({ ...target, configNames: [name] })) : [target]\n }\n\n // Queues whose rows got names since the caches last fetched.\n const namedQueues = new Set<UploadQueueKey>()\n /** Where the row names go. A profile with `configOf` is given the queue key, one without is not. */\n const cachesOf = (\n queueKey: UploadQueueKey\n ): Pick<UploadSettlementProfile['caches'], 'addAuthors' | 'addKeywords'> => {\n namedQueues.add(queueKey)\n if (!profile.configOf) {\n return {\n addAuthors: (ids) => profile.caches.addAuthors(ids),\n addKeywords: (ids) => profile.caches.addKeywords(ids),\n }\n }\n return {\n addAuthors: (ids) => profile.caches.addAuthors(ids, queueKey),\n addKeywords: (ids) => profile.caches.addKeywords(ids, queueKey),\n }\n }\n /** Fetches caches for each queue that got names, or once without a queue for a profile without `configOf`. */\n const fetchNames = () => {\n const queueKeys = [...namedQueues]\n namedQueues.clear()\n if (!profile.configOf) {\n profile.caches.fetchAuthors()\n profile.caches.fetchKeywords()\n return\n }\n for (const queueKey of queueKeys) {\n profile.caches.fetchAuthors(queueKey)\n profile.caches.fetchKeywords(queueKey)\n }\n }\n\n /** All queue rows at this moment. */\n const rows = (): UploadSettleRow[] => {\n const all: UploadSettleRow[] = []\n for (const [queueKey, queue] of profile.queues()) {\n for (const row of queue.items) all.push({ queueKey, queue, row })\n }\n return all\n }\n\n // Nothing writes into a stopped row. Check again after every await: the row may have been stopped meanwhile.\n const isStopped = (row: UploadQueueItem) => row.status === UploadQueueItemStatus.Stop\n\n const isLive = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n for (const [, queue] of profile.queues()) {\n if (toRaw(queue.items).some((item) => toRaw(item) === raw)) return true\n }\n return false\n }\n\n // A row marked as a duplicate is settled and read-only.\n // A row that became its original is a normal editable row.\n const isMarkedDuplicate = (row: UploadQueueItem) => row.isDuplicate && policyOf(row).duplicate === 'markDuplicate'\n const isDisposed = () => options.isDisposed?.() === true\n\n const decorate = (row: UploadQueueItem, asset: AssetDetailItemDto, mainFile: AssetFile) =>\n decorateRow(row, asset, mainFile, profile.roleOf(row), memory.metadataLoaded.has(toRaw(row)))\n\n const revisionOf = (row: UploadQueueItem) => memory.revision.get(toRaw(row)) ?? 0\n /** An event wrote into the row. Reads started before this are stale for it. */\n const bump = (row: UploadQueueItem) => {\n const mark = ++memory.clock\n memory.revision.set(toRaw(row), mark)\n return mark\n }\n const isStale = (row: UploadQueueItem, startedAt: number) => startedAt <= revisionOf(row)\n /** Mark of a read starting now. */\n const startRead = () => ++memory.clock\n\n const trackStateOf = (row: UploadQueueItem) => memory.tracked.get(toRaw(row))\n const untrack = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n const state = memory.tracked.get(raw)\n if (!state) return\n memory.tracked.delete(raw)\n options.onUntrack?.(state.queueKey)\n }\n\n /** Whether a refresh may still change a failed row. The store is notified on change. */\n const setRefreshMayHelp = (queueKey: UploadQueueKey, row: UploadQueueItem, mayHelp: boolean) => {\n const raw = toRaw(row)\n if (memory.refreshMayHelp.has(raw) === mayHelp) return\n if (mayHelp) memory.refreshMayHelp.add(raw)\n else memory.refreshMayHelp.delete(raw)\n profile.hooks.onRefreshMayHelp?.(queueKey, row, mayHelp)\n }\n\n const noticeOf = (row: UploadQueueItem) => {\n const raw = toRaw(row)\n let notice = memory.notices.get(raw)\n if (!notice) {\n notice = { slow: false, readWarning: false, shown: null, text: null }\n memory.notices.set(raw, notice)\n }\n return notice\n }\n const dropNotice = (row: UploadQueueItem) => memory.notices.delete(toRaw(row))\n // Whether the row message is still the text the settlement wrote.\n // The store also writes `row.error` (failed upload), and the settlement must not clear that error.\n const showsOwnText = (row: UploadQueueItem) => {\n const notice = memory.notices.get(toRaw(row))\n return !!notice?.shown && row.error.message === notice.text\n }\n\n /**\n * Writes the applicable settlement text into `row.error`, or removes its own text.\n * Only its own text, and only while the row still shows it.\n * `clear` also removes an error the settlement did not write, because the row settled as processed.\n */\n const syncNotice = (row: UploadQueueItem, { clear = false }: { clear?: boolean } = {}) => {\n const notice = noticeOf(row)\n let wants: UploadRowNotice['shown'] = null\n if (\n notice.readWarning &&\n policyOf(row).metadata === 'load' &&\n !row.canEditMetadata &&\n !isMarkedDuplicate(row) &&\n row.status !== UploadQueueItemStatus.Failed\n ) {\n wants = 'readWarning'\n } else if (notice.slow && row.status === UploadQueueItemStatus.Processing) {\n wants = 'slow'\n }\n if (wants) {\n const text = wants === 'slow' ? profile.messages.processingTooLong(row) : profile.messages.readFailed(row)\n row.error.hasError = true\n row.error.message = text\n notice.shown = wants\n notice.text = text\n return\n }\n if (clear) {\n clearRowError(row)\n } else if (showsOwnText(row)) {\n // Remove the text. Also clear the flag, unless the row has failed since. Then the flag belongs to the failure.\n if (row.status === UploadQueueItemStatus.Failed) row.error = { ...row.error, message: '' }\n else clearRowError(row)\n }\n notice.shown = null\n notice.text = null\n }\n\n const loadMetadata = (\n { queueKey, queue, row }: Pick<UploadSettleRow, 'queueKey' | 'queue' | 'row'>,\n asset: AssetDetailItemDto\n ) => {\n mergeLoadedMetadata(queue, row, asset, cachesOf(queueKey))\n memory.metadataLoaded.add(toRaw(row))\n }\n\n const settleProcessed = (\n { queueKey, queue, row }: UploadSettleRow,\n asset: AssetDetailItemDto,\n mainFile: AssetFile,\n intent: UploadReadIntent\n ) => {\n const raw = toRaw(row)\n // The client marks an upload failed when one of its requests fails, but the server may still finish it.\n // Such a row lost its form on failure and gets it back here, with its metadata.\n const wasFailed = row.status === UploadQueueItemStatus.Failed || memory.reviveWithMetadata.has(raw)\n row.status = UploadQueueItemStatus.Uploaded\n // A licence copy knows only its asset. The image is built from the file id.\n if (isNull(row.fileId)) row.fileId = mainFile.id\n decorate(row, asset, mainFile)\n const notice = noticeOf(row)\n if (policyOf(row).metadata === 'load' && !isMarkedDuplicate(row) && (intent.metadata || wasFailed)) {\n // Loaded once, and never into a row with the form shown, so user input is kept.\n if (!row.canEditMetadata && !memory.metadataLoaded.has(raw)) loadMetadata({ queueKey, queue, row }, asset)\n row.canEditMetadata = true\n notice.readWarning = false\n profile.hooks.afterMetadataLoaded?.(queueKey, row)\n }\n memory.reviveWithMetadata.delete(raw)\n memory.givenUpMissing.delete(raw)\n notice.slow = false\n syncNotice(row, { clear: true })\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n const settleFailed = (\n { queueKey, row }: Pick<UploadSettleRow, 'queueKey' | 'row'>,\n failReason: AssetFileFailReasonType\n ) => {\n row.status = UploadQueueItemStatus.Failed\n // Drop the old text. The row shows a message for the reason, and the old text is not the cause.\n row.error = { hasError: true, message: '', assetFileFailReason: failReason }\n row.canEditMetadata = false\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n /** A failure known by the caller, without a read. */\n const settleKnownFailed = (target: UploadSettlementTarget, failReason: AssetFileFailReasonType) => {\n for (const entry of rows()) {\n if (entry.row.status === UploadQueueItemStatus.Stop || !concerns(entry.queueKey, entry.row, target, 'settle')) {\n continue\n }\n settleFailed(entry, failReason)\n bump(entry.row)\n }\n }\n\n /**\n * Applies a `processed` event immediately to rows that settle on the event.\n * A tick also uses it for a slot row whose file the slot list shows processed.\n */\n const settleProcessedByEvent = (target: UploadSettlementTarget) => {\n for (const { queueKey, row } of rows()) {\n if (row.status === UploadQueueItemStatus.Stop || policyOf(row).settleOn !== 'event') continue\n if (!concerns(queueKey, row, target, 'settle')) continue\n const raw = toRaw(row)\n if (row.status === UploadQueueItemStatus.Failed) memory.reviveWithMetadata.add(raw)\n memory.givenUpMissing.delete(raw)\n row.status = UploadQueueItemStatus.Uploaded\n // A row the client gave up on that already had metadata gets its form back as the user left it.\n if (!isMarkedDuplicate(row) && memory.metadataLoaded.has(raw)) row.canEditMetadata = true\n noticeOf(row).slow = false\n syncNotice(row, { clear: true })\n bump(row)\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n }\n\n /** Handles a `processed` event for rows whose state it does not change. */\n const announceProcessed = (target: UploadSettlementTarget) => {\n for (const { queueKey, row } of rows()) {\n if (row.status === UploadQueueItemStatus.Stop || policyOf(row).settleOn !== 'never') continue\n if (concerns(queueKey, row, target, 'decorate')) profile.hooks.onProcessedSeen?.(queueKey, row)\n }\n }\n\n const duplicateRows = (\n target: UploadSettlementTarget,\n policy: 'becomeOriginal' | 'markDuplicate',\n eligible: (row: UploadQueueItem) => boolean\n ) =>\n rows().filter(\n ({ queueKey, row }) =>\n row.status !== UploadQueueItemStatus.Stop &&\n eligible(row) &&\n policyOf(row).duplicate === policy &&\n concerns(queueKey, row, target, 'settle')\n )\n\n // The row stays and is marked. It is settled first and completed from the original file later.\n // This way the wait for that file does not hold an upload slot.\n const markDuplicates = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean\n ) => {\n const marked: Array<{ row: UploadQueueItem; mark: number }> = []\n for (const { queueKey, row } of duplicateRows(target, 'markDuplicate', eligible)) {\n markAsDuplicate(row)\n row.status = UploadQueueItemStatus.Uploaded\n row.canEditMetadata = false\n clearRowError(row)\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n marked.push({ row, mark: bump(row) })\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n if (!marked.length || !originFileId || !assetType || !profile.readers.duplicateOriginFile) return\n let file: AssetFileNullable = null\n try {\n file = await profile.readers.duplicateOriginFile(originFileId, assetType)\n } catch (error) {\n console.error('uploadQueue: the duplicated file could not be read', error)\n }\n if (!file || isDisposed()) return\n for (const { row, mark } of marked) {\n // Only rows still present and not written into meanwhile.\n if (!isLive(row) || row.status === UploadQueueItemStatus.Stop || !row.isDuplicate) continue\n if (revisionOf(row) !== mark) continue\n row.fileId = file.id\n row.duplicateAssetId = file.asset\n row.mainFileSingleUse = file.flags.singleUse\n if (file.links?.image_detail) row.imagePreview = file.links.image_detail\n }\n }\n\n // The row becomes the original: its asset and file are replaced and it takes the original's metadata.\n // Returns whether the original could not be read and a row remains that a refresh may still help.\n const becomeOriginals = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean\n ): Promise<boolean> => {\n if (!originFileId || assetType !== DamAssetType.Image) return false\n // Recorded before requesting the original. After the await, only rows still in\n // their queue, not stopped and not written by an event meanwhile are written.\n // The caller that reports a duplicate is outside the read\n // ordering, so an earlier answer must not undo a later event.\n const candidates = duplicateRows(target, 'becomeOriginal', eligible).map((entry) => ({\n ...entry,\n mark: revisionOf(entry.row),\n }))\n if (!candidates.length) return false\n const untouched = () =>\n candidates.filter(({ row, mark }) => isLive(row) && !isStopped(row) && revisionOf(row) === mark)\n const { updateNewNames, getAuthorConflicts } = useAssetSuggestions()\n let original: AssetDetailItemDto\n try {\n if (!profile.readers.duplicateOriginAsset) throw new Error('uploadSettlement: no reader of the original asset')\n original = await profile.readers.duplicateOriginAsset(originFileId, { queueKey: candidates[0]!.queueKey })\n } catch {\n if (isDisposed()) return false\n let leftWithout = false\n for (const { queueKey, row } of untouched()) {\n // Read before untracking, so a row the client gave up on keeps its way back.\n const mightHelp = memory.refreshMayHelp.has(toRaw(row))\n // Untrack regardless of state. The next tick would only retry the same read.\n untrack(row)\n // Only a row still waiting for this answer fails: a settled one must not be flipped back to failed.\n const failsHere = row.status === UploadQueueItemStatus.Processing\n if (failsHere) {\n row.status = UploadQueueItemStatus.Failed\n // Drop a text the settlement wrote. It no longer describes what is wrong with the row.\n row.error = { ...row.error, hasError: true, message: showsOwnText(row) ? '' : row.error.message }\n row.canEditMetadata = false\n dropNotice(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n // Failed because a read failed, not the file. A row refresh requests the original again.\n // Not for a row the server had already failed, which no refresh can undo.\n if (failsHere || mightHelp) {\n setRefreshMayHelp(queueKey, row, true)\n leftWithout = true\n }\n }\n return leftWithout\n }\n if (isDisposed()) return false\n for (const { queueKey, queue, row } of untouched()) {\n const authorSuggestions = original.metadata.authorSuggestions ?? {}\n markAsDuplicate(row)\n row.status = UploadQueueItemStatus.Uploaded\n clearRowError(row)\n row.fileId = originFileId\n row.duplicateAssetId = original.id\n row.assetStatus = original.attributes.assetStatus\n if (original.mainFile?.links?.image_detail) row.imagePreview = original.mainFile.links.image_detail\n row.keywords = [...(original.keywords ?? [])]\n row.authors = [...(original.authors ?? [])]\n row.customData = isObject(original.metadata.customData) ? { ...original.metadata.customData } : {}\n updateNewNames(authorSuggestions, queue.suggestions.newAuthorNames)\n updateNewNames(original.metadata.keywordSuggestions ?? {}, queue.suggestions.newKeywordNames)\n row.authorConflicts = getAuthorConflicts(authorSuggestions)\n const caches = cachesOf(queueKey)\n caches.addKeywords(row.keywords)\n caches.addAuthors(row.authors)\n caches.addAuthors(row.authorConflicts)\n row.assetId = original.id\n row.mainFileSingleUse = original.mainFileSingleUse\n row.mainFileInternal = original.mainFileInternal\n memory.metadataLoaded.add(toRaw(row))\n row.canEditMetadata = true\n dropNotice(row)\n memory.reviveWithMetadata.delete(toRaw(row))\n memory.givenUpMissing.delete(toRaw(row))\n bump(row)\n setRefreshMayHelp(queueKey, row, false)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n fetchNames()\n return false\n }\n\n /**\n * Handles a duplicate file for every row passing `matches(…, 'settle')`, by the policy of its role.\n * `eligible` excludes rows the read is stale for.\n * Returns whether a row is left without its duplicate's original\n * because it could not be read. A refresh may still help it.\n */\n const settleDuplicate = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null,\n eligible: (row: UploadQueueItem) => boolean = () => true\n ) => {\n // Both start at once, not one after the other, so each records its rows now.\n // The original is read once per configuration the target names, by a queue of that configuration.\n const targets = byConfiguration(target)\n const [, leftWithout] = await Promise.all([\n markDuplicates(target, originFileId, assetType, eligible),\n targets.length === 1\n ? becomeOriginals(target, originFileId, assetType, eligible)\n : Promise.all(targets.map((one) => becomeOriginals(one, originFileId, assetType, eligible))).then((left) =>\n left.some(Boolean)\n ),\n ])\n return leftWithout\n }\n\n /** A duplicate known by the caller, without reading its asset. Never rejects. */\n const settleKnownDuplicate = async (\n target: UploadSettlementTarget,\n originFileId: DocIdNullable,\n assetType: DamAssetTypeType | null\n ) => {\n try {\n await settleDuplicate(target, originFileId, assetType)\n } catch (error) {\n console.error('uploadQueue: the duplicate could not be settled', error)\n }\n }\n\n /** Metadata notification: loads the metadata and the form, regardless of the file state. */\n const tryLoadMetadata = ({ queueKey, queue, row }: UploadSettleRow, asset: AssetDetailItemDto) => {\n if (policyOf(row).metadata !== 'load' || row.canEditMetadata) return\n // A marked duplicate is settled and has no metadata of its own to load.\n if (isMarkedDuplicate(row)) return\n // Skip a row whose file failed, except one that failed for lack of this metadata.\n if (row.status === UploadQueueItemStatus.Failed && profile.metadataGate?.(queueKey, row) !== 'load') return\n if (!memory.metadataLoaded.has(toRaw(row))) loadMetadata({ queueKey, queue, row }, asset)\n row.canEditMetadata = true\n noticeOf(row).readWarning = false\n syncNotice(row)\n profile.hooks.afterMetadataLoaded?.(queueKey, row)\n }\n\n /**\n * Applies one read asset to every row it concerns. `startedAt` is the read mark.\n * A row written by an event since keeps the event's state.\n * Returns like `settleDuplicate`: whether a row is left without its duplicate's original.\n */\n const applyAssetRead = async (\n asset: AssetDetailItemDto,\n target: UploadSettlementTarget,\n intent: UploadReadIntent,\n startedAt: number\n ) => {\n const mainFile = asset.mainFile ?? null\n const status = resolveReadStatus(asset, target, intent)\n let duplicateSettled = false\n let leftWithout = false\n for (const entry of rows()) {\n const { queueKey, row } = entry\n // The duplicate's original read was awaited. The row may have left its queue meanwhile.\n if (duplicateSettled && !isLive(row)) continue\n if (isStopped(row)) continue\n\n // Apply the file state and row details unless an event wrote\n // into the row after this read started. The event is newer.\n if (!isStale(row, startedAt) && mainFile && concerns(queueKey, row, target, 'decorate')) {\n const maySettle = concerns(queueKey, row, target, 'settle')\n if (status === AssetFileProcessStatus.Processed) {\n if (policyOf(row).settleOn === 'never') {\n decorate(row, asset, mainFile)\n if (intent.seen) profile.hooks.onProcessedSeen?.(queueKey, row)\n } else if (maySettle) {\n settleProcessed(entry, asset, mainFile, intent)\n }\n } else if (status === AssetFileProcessStatus.Duplicate && maySettle) {\n // Once for all rows of the target. The original is read only once.\n if (!duplicateSettled) {\n duplicateSettled = true\n leftWithout = await settleDuplicate(\n target,\n mainFile.originAssetFile,\n asset.attributes.assetType,\n (candidate) => !isStale(candidate, startedAt)\n )\n if (isDisposed()) return leftWithout\n if (!isLive(row) || isStopped(row)) continue\n }\n } else if (status === AssetFileProcessStatus.Failed && maySettle) {\n settleFailed(entry, mainFile.fileAttributes.failReason)\n }\n }\n\n // Applied to such a row as well, because metadata is not file state. It loads once, whenever it arrives.\n // Rows the event failed or marked as duplicate are refused there.\n // Otherwise a `processed` event that overtakes the metadata read would leave the row uploaded without its form.\n if (intent.early && concerns(queueKey, row, target, 'metadata')) tryLoadMetadata(entry, asset)\n }\n profile.hooks.onAssetRead?.(asset)\n return leftWithout\n }\n\n /**\n * An uploaded row without its metadata, which a refresh would load.\n * It is no longer tracked, but reads that find no asset are still counted for it.\n */\n const awaitsMetadata = (row: UploadQueueItem) =>\n row.status === UploadQueueItemStatus.Uploaded &&\n !row.canEditMetadata &&\n policyOf(row).metadata === 'load' &&\n !isMarkedDuplicate(row)\n\n /**\n * The row's asset was missing from enough reads, for a tracked row or one a refresh may still help.\n * A processing row fails. An uploaded row without metadata fails with `assetGone`.\n * Any other row (given up by the client, or left without its duplicate's original) is left alone.\n */\n const giveUpOnMissing = ({ queueKey, row }: Pick<UploadSettleRow, 'queueKey' | 'row'>) => {\n // There is no asset a refresh could read.\n setRefreshMayHelp(queueKey, row, false)\n const withoutMetadata = awaitsMetadata(row)\n if (row.status !== UploadQueueItemStatus.Processing && !withoutMetadata) {\n untrack(row)\n return\n }\n row.status = UploadQueueItemStatus.Failed\n row.error.hasError = true\n row.error.message = withoutMetadata\n ? (profile.messages.assetGone?.(row) ?? profile.messages.assetMissing(row))\n : profile.messages.assetMissing(row)\n row.canEditMetadata = false\n memory.givenUpMissing.add(toRaw(row))\n dropNotice(row)\n untrack(row)\n profile.hooks.onRowFinal(queueKey, row)\n }\n\n return {\n memory,\n policyOf,\n concerns,\n byConfiguration,\n fetchNames,\n rows,\n isLive,\n bump,\n isStale,\n startRead,\n trackStateOf,\n untrack,\n setRefreshMayHelp,\n noticeOf,\n syncNotice,\n applyAssetRead,\n settleProcessedByEvent,\n announceProcessed,\n settleFailed,\n settleKnownFailed,\n settleDuplicate,\n settleKnownDuplicate,\n awaitsMetadata,\n giveUpOnMissing,\n }\n}\n\nexport type UploadSettle = ReturnType<typeof createUploadSettle>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { UploadSettlement, UploadSettlementProfile } from './uploadSettlementTypes';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Settlement for the rows of one store: tracks rows waiting for the server and coordinates all reads.
|
|
4
|
+
* Reads start from a queue tick, a notification or a row refresh.
|
|
5
5
|
*/
|
|
6
6
|
export declare function createUploadSettlement(profile: UploadSettlementProfile): UploadSettlement;
|