@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- 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.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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 +39 -29
- package/src/e2e/conventions.d.mts +4 -0
- package/src/e2e/conventions.mjs +15 -0
- package/src/e2e/index.d.mts +8 -0
- package/src/e2e/index.mjs +1 -0
- package/src/e2e/routeWalk.d.mts +43 -0
- package/src/e2e/routeWalk.mjs +606 -0
- package/src/e2e/types.d.mts +161 -0
- 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
|
@@ -16,18 +16,20 @@ type __VLS_Props = {
|
|
|
16
16
|
closable?: boolean;
|
|
17
17
|
customTitleFn?: (cachedItem: any, defaultTitle: string, displayTextPath: string, fallbackIdText: boolean) => string | undefined;
|
|
18
18
|
};
|
|
19
|
-
declare
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} & {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
declare const __VLS_template: () => {
|
|
20
|
+
__VLS_Slots: {
|
|
21
|
+
empty?: (props: {}) => any;
|
|
22
|
+
} & {
|
|
23
|
+
unresolved?: (props: {
|
|
24
|
+
id: string | number;
|
|
25
|
+
}) => any;
|
|
26
|
+
} & {
|
|
27
|
+
unresolved?: (props: {
|
|
28
|
+
id: string | number;
|
|
29
|
+
}) => any;
|
|
30
|
+
};
|
|
30
31
|
};
|
|
32
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
31
33
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
32
34
|
close: (id: string | number | null | undefined) => any;
|
|
33
35
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_createCommentVNode","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve
|
|
1
|
+
{"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_createCommentVNode","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve shows only its id placeholder.\n// It gets no link, because its detail would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import e from "../../../_virtual/_plugin-vue_export-helper.js";
|
|
|
2
2
|
import t from "./ACachedUserChip.vue_vue_type_script_setup_true_lang.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
// src/domains/cached/components/ACachedUserChip.vue
|
|
5
|
-
var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-
|
|
5
|
+
var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-c2700907"]]);
|
|
6
6
|
export { n as default };
|
|
7
7
|
|
|
8
8
|
//# sourceMappingURL=ACachedUserChip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACachedUserChip.js","names":["_sfc_main","_plugin_vue_export_helper_default","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","ACachedUserChip_default"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n *
|
|
1
|
+
{"version":3,"file":"ACachedUserChip.js","names":["_sfc_main","_plugin_vue_export_helper_default","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","ACachedUserChip_default"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.\n * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** Label of the close button when Vuetify defaults make the chip closable. Defaults to \"Remove\". */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as in `defineCached`. A blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose. Each admin maps its own users into the cache.\n// A mapper that omits the name or e-mail falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":""}
|
|
@@ -8,12 +8,12 @@ type __VLS_Props = {
|
|
|
8
8
|
routeName?: string | undefined;
|
|
9
9
|
externalUrlTemplate?: string | undefined;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* because it reads the admin's own user, which `AnzuUserMinimal` does not describe.
|
|
11
|
+
* Label for caches whose users carry a better one than `person.fullName`, such as a nickname.
|
|
12
|
+
* `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.
|
|
13
13
|
*/
|
|
14
14
|
titleFn?: ((user: CachedItem<any>) => string) | undefined;
|
|
15
15
|
disableClick?: boolean;
|
|
16
|
-
/**
|
|
16
|
+
/** Label of the close button when Vuetify defaults make the chip closable. Defaults to "Remove". */
|
|
17
17
|
closeLabel?: string;
|
|
18
18
|
};
|
|
19
19
|
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACachedUserChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_component_VTooltip","_normalizeClass","_withModifiers","AAnzuUserAvatar","_createCommentVNode","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","router","useRouter","useCachedItem","text","computed","user","cached","clickable","unresolved","appendIcon","COMMON_CONFIG","onClick","replaceUrlParameters","openBlock","createElementBlock","unref","createBlock","VChip","withCtx","createTextVNode","toDisplayString","createVNode","VTooltip","t","normalizeClass","withModifiers","loaded","createCommentVNode","VProgressCircular"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n *
|
|
1
|
+
{"version":3,"file":"ACachedUserChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_component_VTooltip","_normalizeClass","_withModifiers","AAnzuUserAvatar","_createCommentVNode","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","router","useRouter","useCachedItem","text","computed","user","cached","clickable","unresolved","appendIcon","COMMON_CONFIG","onClick","replaceUrlParameters","openBlock","createElementBlock","unref","createBlock","VChip","withCtx","createTextVNode","toDisplayString","createVNode","VTooltip","t","normalizeClass","withModifiers","loaded","createCommentVNode","VProgressCircular"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.\n * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** Label of the close button when Vuetify defaults make the chip closable. Defaults to \"Remove\". */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as in `defineCached`. A blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose. Each admin maps its own users into the cache.\n// A mapper that omits the name or e-mail falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,IAAMmB,IAAQC,GAyBR,EAAE,SAAMC,EAAQ,GAChBC,IAASC,EAAU,GAEnB,EAAE,WAAQ,WAAQ,kBAAeC,QAAqBL,EAAM,KAAKA,EAAM,YAAYA,EAAM,EAAE,IAAI,KAAA,CAAU,GAIzGM,IAAOC,QAAe;GAC1B,IAAMC,IAAOC,EAAO;GAMpB,OALKD,KACSR,EAAM,UAAUA,EAAM,QAAQQ,CAAI,IAAI,QAEhDA,EAAK,QAAQ,WAAiBA,EAAK,OAAO,WAC1CA,EAAK,QAAcA,EAAK,MAAM,MAAM,GAAG,CAAC,CAAC,KACtC,MAAMR,EAAM,MALD;EAMpB,CAAC,GAEKU,IAAYH,QACV,CAACP,EAAM,gBAAgB,CAACW,EAAW,SAAS,CAAC,EAAEX,EAAM,uBAAuBA,EAAM,UAC1F,GAEMY,IAAaL,QAAe;GAChC,IAAKG,EAAU,OACf,OAAOV,EAAM,sBAAsBa,EAAc,KAAK,KAAK,gBAAgBA,EAAc,KAAK,KAAK;EACrG,CAAC,GAEKC,UAAgB;GACpB,AAAKJ,EAAU,SAAUV,EAAM,OAC3BA,EAAM,sBACR,OAAO,KAAKe,EAAqBf,EAAM,qBAAqB,EAAE,IAAIA,EAAM,GAAG,CAAC,GAAG,QAAQ,IAGrFA,EAAM,aAAWG,EAAO,KAAK;IAAE,MAAMH,EAAM;IAAW,QAAQ,EAAE,IAAIA,EAAM,GAAG;GAAE,CAAC;EACtF;E,kBAIEnB,EAAA,GAAAC,EAyCM,OAzCNe,GAyCM,CAxCSI,EAAA,KAEAlB,EAAA4B,CAAA,KADb9B,EAAA,GAAAG,EAcQC,GAAA;;GAZN,OAAM;GACN,MAAK;GACJ,eAAagB,EAAA;GACd,WAAQ;;GACT,SAAAf,QACE,CADFC,EAAA,OACEC,EAAGa,EAAA,EAAE,IAAG,KACT,CAAA,GAAAZ,EAKWC,GAAA;IAJT,WAAU;IACV,UAAS;;IAET,SAAAJ,QAAgD,CAA7CC,EAAAC,EAAAL,EAAA2C,CAAA,CAAC,CAAA,uCAAA,CAAA,GAAA,CAAA,C;;;;E,2BAGR7C,EAAA,GAAAG,EAuBQC,GAAA;;GArBN,OAAKM,EAAA,CAAC,QACEmB,EAAA,QAAS,KAAA,eAAA,CAAA;GACjB,MAAK;GACJ,eAAaE,EAAA;GACb,eAAaX,EAAA;GACb,SAAKT,EAAOsB,GAAO,CAAA,MAAA,CAAA;;GAEpB,SAAA5B,QAKE;IAJMH,EAAA8C,CAAA,KADRhD,EAAA,GAAAG,EAKES,GAAA;;KAHC,MAAMV,EAAA0B,CAAA;KACP,mBAAgB;KACf,MAAM;;IACPtB,EAAA,MACFC,EAAGkB,EAAA,KAAI,IAAG,KACV,CAAA;IACSvB,EAAA8C,CAAA,I,aADThD,EAAA,GAAAG,EAMEW,GAAA;;KAJC,MAAM;KACN,OAAO;KACR,eAAA;KACA,OAAM;;;;;;;;E,OArCVd,EAAA,GAAAC,EAAyB,QAAAgB,GAAR,GAAC,E"}
|
|
@@ -4,16 +4,16 @@ import { CachedItem } from './defineCached';
|
|
|
4
4
|
import { UserAndTimeTrackingUsers } from '../../../shared/types/UserAndTimeTracking';
|
|
5
5
|
export interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {
|
|
6
6
|
/**
|
|
7
|
-
* The admin's user cache composable, e.g. its `useCachedUsers`.
|
|
8
|
-
*
|
|
7
|
+
* The admin's user cache composable, e.g. its `useCachedUsers`.
|
|
8
|
+
* Called once inside the component's setup, so the cache resolves in component scope.
|
|
9
9
|
*/
|
|
10
10
|
useCachedUsers: () => UserAndTimeTrackingUsers<U>;
|
|
11
11
|
/**
|
|
12
|
-
* Named route of a user's detail
|
|
13
|
-
* on each render, so the link can follow the current user's permission for that route.
|
|
12
|
+
* Named route of a user's detail, e.g. `'/(common)/users/[id]'`. Without it the chip is not a link.
|
|
13
|
+
* A function is read on each render, so the link can follow the current user's permission for that route.
|
|
14
14
|
*/
|
|
15
15
|
userRouteName?: string | (() => string | undefined);
|
|
16
|
-
/**
|
|
16
|
+
/** URL of a user's detail in another admin, with `:id` replaced. Opens in a new tab. */
|
|
17
17
|
userExternalUrlTemplate?: string;
|
|
18
18
|
/** The chip's label, for users that carry a better one than `person.fullName`. */
|
|
19
19
|
userTitleFn?: (user: CachedItem<U>) => string;
|
|
@@ -21,11 +21,11 @@ export interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinima
|
|
|
21
21
|
name?: string;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Builds an admin's created / modified rows from its user cache and routes
|
|
25
|
-
* `XTrackingFields.vue`
|
|
26
|
-
* `
|
|
24
|
+
* Builds an admin's created / modified rows from its user cache and routes.
|
|
25
|
+
* Each admin's `XTrackingFields.vue` becomes one factory call over
|
|
26
|
+
* `AUserAndTimeTrackingFields`. `hide-*` props and the `user` slot fall through.
|
|
27
27
|
*
|
|
28
|
-
* Use in an SFC's plain `<script lang="ts"
|
|
28
|
+
* Use in an SFC's plain `<script lang="ts">`, not `setup`:
|
|
29
29
|
* ```ts
|
|
30
30
|
* export default createUserAndTimeTrackingFields({
|
|
31
31
|
* useCachedUsers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUserAndTimeTrackingFields.js","names":["AUserAndTimeTrackingFields","AUserAndTimeTrackingFields_default","createUserAndTimeTrackingFields","defineComponent","options","users","h","props","isFunction","attrs","slots"],"sources":["../../../../src/domains/cached/composables/createUserAndTimeTrackingFields.ts"],"sourcesContent":["import { type Component, defineComponent, h, type PropType } from 'vue'\nimport { isFunction } from '@/shared/utils/common'\nimport AUserAndTimeTrackingFields from '@/domains/ui/components/AUserAndTimeTrackingFields.vue'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\n\nexport interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {\n /**\n * The admin's user cache composable, e.g. its `useCachedUsers
|
|
1
|
+
{"version":3,"file":"createUserAndTimeTrackingFields.js","names":["AUserAndTimeTrackingFields","AUserAndTimeTrackingFields_default","createUserAndTimeTrackingFields","defineComponent","options","users","h","props","isFunction","attrs","slots"],"sources":["../../../../src/domains/cached/composables/createUserAndTimeTrackingFields.ts"],"sourcesContent":["import { type Component, defineComponent, h, type PropType } from 'vue'\nimport { isFunction } from '@/shared/utils/common'\nimport AUserAndTimeTrackingFields from '@/domains/ui/components/AUserAndTimeTrackingFields.vue'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport type { UserAndTimeTrackingData, UserAndTimeTrackingUsers } from '@/shared/types/UserAndTimeTracking'\n\nexport interface CreateUserAndTimeTrackingFieldsOptions<U extends AnzuUserMinimal = AnzuUserMinimal> {\n /**\n * The admin's user cache composable, e.g. its `useCachedUsers`.\n * Called once inside the component's setup, so the cache resolves in component scope.\n */\n useCachedUsers: () => UserAndTimeTrackingUsers<U>\n /**\n * Named route of a user's detail, e.g. `'/(common)/users/[id]'`. Without it the chip is not a link.\n * A function is read on each render, so the link can follow the current user's permission for that route.\n */\n userRouteName?: string | (() => string | undefined)\n /** URL of a user's detail in another admin, with `:id` replaced. Opens in a new tab. */\n userExternalUrlTemplate?: string\n /** The chip's label, for users that carry a better one than `person.fullName`. */\n userTitleFn?: (user: CachedItem<U>) => string\n /** Component name for devtools / warnings. */\n name?: string\n}\n\n/**\n * Builds an admin's created / modified rows from its user cache and routes.\n * Each admin's `XTrackingFields.vue` becomes one factory call over\n * `AUserAndTimeTrackingFields`. `hide-*` props and the `user` slot fall through.\n *\n * Use in an SFC's plain `<script lang=\"ts\">`, not `setup`:\n * ```ts\n * export default createUserAndTimeTrackingFields({\n * useCachedUsers,\n * userRouteName: '/(common)/users/[id]',\n * })\n * ```\n */\nexport function createUserAndTimeTrackingFields<U extends AnzuUserMinimal = AnzuUserMinimal>(\n options: CreateUserAndTimeTrackingFieldsOptions<U>\n): Component {\n return defineComponent({\n name: options.name ?? 'UserAndTimeTrackingFields',\n inheritAttrs: false,\n props: {\n data: { type: Object as PropType<UserAndTimeTrackingData>, required: true },\n },\n setup(props, { attrs, slots }) {\n const users = options.useCachedUsers()\n return () =>\n h(\n AUserAndTimeTrackingFields,\n {\n data: props.data,\n users,\n userRouteName: isFunction(options.userRouteName) ? options.userRouteName() : options.userRouteName,\n userExternalUrlTemplate: options.userExternalUrlTemplate,\n userTitleFn: options.userTitleFn,\n ...attrs,\n },\n slots\n )\n },\n })\n}\n"],"mappings":";;;;AAuCA,SAAgBE,EACd,GACW;CACX,OAAOC,EAAgB;EACrB,MAAMC,EAAQ,QAAQ;EACtB,cAAc;EACd,OAAO,EACL,MAAM;GAAE,MAAM;GAA6C,UAAU;EAAK,EAC5E;EACA,MAAM,GAAO,EAAE,UAAO,YAAS;GAC7B,IAAMC,IAAQD,EAAQ,eAAe;GACrC,aACEE,EACEN,GACA;IACE,MAAMO,EAAM;IACZ;IACA,eAAeC,EAAWJ,EAAQ,aAAa,IAAIA,EAAQ,cAAc,IAAIA,EAAQ;IACrF,yBAAyBA,EAAQ;IACjC,aAAaA,EAAQ;IACrB,GAAGK;GACL,GACAC,CACF;EACJ;CACF,CAAC;AACH"}
|
|
@@ -2,14 +2,14 @@ import { Ref } from 'vue';
|
|
|
2
2
|
import { DocId, IntegerId } from '../../../shared/types/common';
|
|
3
3
|
/**
|
|
4
4
|
* Why a fetch settled without resolving an item:
|
|
5
|
-
* - `notFound
|
|
6
|
-
* - `forbidden
|
|
7
|
-
* - `error
|
|
8
|
-
*
|
|
5
|
+
* - `notFound`: the server answered and the item was not among the results.
|
|
6
|
+
* - `forbidden`: the user may not read it (403). Asking again in this session cannot change that.
|
|
7
|
+
* - `error`: anything else. Network, timeout, 5xx, a 401 before session renewal,
|
|
8
|
+
* or a 404 of the whole request (a route or proxy answering, not a missing item).
|
|
9
9
|
*/
|
|
10
10
|
export type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error';
|
|
11
11
|
/**
|
|
12
|
-
* `_unresolved`: the fetch settled without resolving the item
|
|
12
|
+
* `_unresolved`: the fetch settled without resolving the item. `_unresolvedReason` says why.
|
|
13
13
|
* Whether a later `add()` asks again depends on the reason (see `defineCached`).
|
|
14
14
|
*/
|
|
15
15
|
export type CachedItem<T extends object> = T & {
|
|
@@ -19,15 +19,17 @@ export type CachedItem<T extends object> = T & {
|
|
|
19
19
|
};
|
|
20
20
|
export interface DefineCachedOptions {
|
|
21
21
|
/**
|
|
22
|
-
* Ask again
|
|
23
|
-
* can be created after the first lookup.
|
|
24
|
-
*
|
|
22
|
+
* Ask again on the next `add()` for an id the server did not return. Defaults
|
|
23
|
+
* to `true`, because an entity can be created after the first lookup.
|
|
24
|
+
* A user cache passes `false`. Otherwise an id missing from the table (a
|
|
25
|
+
* system user of another backend) is requested on every page that shows it.
|
|
25
26
|
*/
|
|
26
27
|
retryNotFound?: boolean;
|
|
27
28
|
/**
|
|
28
|
-
* How many ids one
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* How many ids one `fetchCallback` call gets. Each call is
|
|
30
|
+
* committed on its own. Defaults to `FETCH_BY_IDS_BATCH_SIZE`.
|
|
31
|
+
* A backend with a lower per-request limit sets it here. Splitting inside
|
|
32
|
+
* the callback would make one failing part discard the parts already loaded.
|
|
31
33
|
*/
|
|
32
34
|
batchSize?: number;
|
|
33
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineCached.js","names":["isForbidden","isAnzuApiForbiddenError","error","apiErrorStatus","unresolvedReason","isQuiet","isInCauseChain","cause","AnzuApiCancelledError","SessionExpiredError","AuthUnavailableError","defineCached","options","batchSize","cache","ref","toFetch","pinned","inFlight","useSentry","isCached","item","id","isUndefined","retryNotFound","add","args","toAdd","i","arg","isArray","j","prune","mapIdToMinimal","addManual","data","idProp","mapFullToMinimal","addManualMinimal","incoming","protectedIds","overflow","maxLimit","removed","key","value","updateMap","updateToFetch","ids","markUnresolved","reason","fetchBatch","res","fetchCallback","runBatches","items","failures","start","runQueue","run","apiFetch","logFailure","logError","debouncedFetch","useDebounceFn","pending","own","others","other","count"],"sources":["../../../../src/domains/cached/composables/defineCached.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useSentry } from '@/domains/system/composables/sentry'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport { FETCH_BY_IDS_BATCH_SIZE } from '@/domains/api/composables/useApiFetchByIds'\nimport { isAnzuApiForbiddenError } from '@/shared/error/AnzuApiForbiddenError'\nimport { AnzuApiCancelledError } from '@/shared/error/AnzuApiCancelledError'\nimport { SessionExpiredError } from '@/shared/error/SessionExpiredError'\nimport { AuthUnavailableError } from '@/shared/error/AuthUnavailableError'\nimport { isInCauseChain } from '@/shared/error/isInCauseChain'\nimport { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNAUTHORIZED } from '@/shared/statusCodes'\n\n/**\n * Why a fetch settled without resolving an item:\n * - `notFound` -- the server answered and the item was not among the results,\n * - `forbidden` -- the user may not read it (403); asking again in this session cannot change that,\n * - `error` -- anything else: the network, a timeout, a 5xx, a 401 before the session is renewed, and a\n * 404 of the whole request, which is a route or a proxy answering rather than an item missing.\n */\nexport type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error'\n\n/**\n * `_unresolved`: the fetch settled without resolving the item, `_unresolvedReason` says why.\n * Whether a later `add()` asks again depends on the reason (see `defineCached`).\n */\nexport type CachedItem<T extends object> = T & {\n _loaded: boolean\n _unresolved?: boolean\n _unresolvedReason?: CachedUnresolvedReason\n}\n\nexport interface DefineCachedOptions {\n /**\n * Ask again, on the next `add()`, for an id the server did not return. Defaults to `true`: an entity\n * can be created after the first lookup. A cache of users passes `false` -- an id missing from the\n * table (a system user of another backend) would otherwise be asked for on every page showing it.\n */\n retryNotFound?: boolean\n /**\n * How many ids one call of `fetchCallback` gets, each call committed on its own. Defaults to\n * `FETCH_BY_IDS_BATCH_SIZE`. A backend that takes fewer ids a request needs its own limit here: split\n * inside the callback, a failing part would take the parts already loaded with it.\n */\n batchSize?: number\n}\n\n// A rejected 403 arrives mapped as `AnzuApiForbiddenError`, which carries no status of its own.\nconst isForbidden = (error: unknown) =>\n isAnzuApiForbiddenError(error) || apiErrorStatus(error) === HTTP_STATUS_FORBIDDEN\n\nconst unresolvedReason = (error: unknown): CachedUnresolvedReason => (isForbidden(error) ? 'forbidden' : 'error')\n\n/**\n * Not a failure to write down: the user may not (403), nobody is logged in (401, or a session found\n * gone on the way out), the auth service did not answer, or the request was stopped. The api layer\n * keeps 401, 403 and an expired session out of its log itself, and writes an unavailable auth service\n * down with the request it stopped; for a cache all of them are the session, not the fetch.\n */\nconst isQuiet = (error: unknown) =>\n isForbidden(error) ||\n apiErrorStatus(error) === HTTP_STATUS_UNAUTHORIZED ||\n isInCauseChain(\n error,\n (cause) =>\n cause instanceof AnzuApiCancelledError ||\n cause instanceof SessionExpiredError ||\n cause instanceof AuthUnavailableError\n )\n\nexport type AddToCachedArgs<T extends DocId | IntegerId> =\n | Array<T | null | undefined>\n | Array<Array<T | null | undefined> | T | null | undefined>\n\n/**\n * @template I Identifier type\n * @template T Source type\n * @template M Minimal type\n */\nexport function defineCached<\n I extends DocId | IntegerId,\n T extends Record<DocId | IntegerId, any>,\n M extends Record<DocId | IntegerId, any>,\n>(\n mapFullToMinimal: (source: T) => M,\n mapIdToMinimal: (id: I) => M,\n fetchCallback: (ids: I[]) => Promise<T[]>,\n idProp = 'id',\n maxLimit = 1000,\n options: DefineCachedOptions = {}\n) {\n const { retryNotFound = true } = options\n const batchSize =\n options.batchSize && options.batchSize >= 1 ? Math.floor(options.batchSize) : FETCH_BY_IDS_BATCH_SIZE\n const cache: Ref<Map<I, CachedItem<M>>> = ref(new Map())\n const toFetch = ref(new Set()) as Ref<Set<I>>\n // The ids something shows, each with how many show it (`pin`): the cache drops none of them to stay within its\n // limit, and goes over it while more than that many are shown. Dropped, a name a chip showed turned it into a\n // spinner till something added the id again.\n const pinned = new Map<I, number>()\n // Settles, never rejects: a run that failed still hands over what its earlier batches loaded.\n const inFlight = new Set<Promise<{ items: T[]; failures: unknown[] }>>()\n const { logError } = useSentry()\n\n /**\n * Unresolved items are never retried from the queue itself, only on the next `add()`, and only\n * when asking again can help: a failure (`error`) always, a missing item (`notFound`) unless the\n * cache opted out, a forbidden one never.\n */\n const isCached = (id: I) => {\n const item = cache.value.get(id)\n if (isUndefined(item)) return false\n if (item._unresolved !== true) return true\n if (item._unresolvedReason === 'forbidden') return true\n if (item._unresolvedReason === 'notFound') return !retryNotFound\n return false\n }\n\n // Falsy, not only null/undefined: `get`, `has` and `isLoaded` treat 0 and '' as no id, and a blank\n // factory record (`createdBy: 0`) would otherwise be sent to the server as `filter_in[id]=0`.\n const add = (...args: AddToCachedArgs<I>) => {\n const toAdd = new Set<I>()\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (!arg) continue\n if (isArray(arg)) {\n for (let j = 0; j < arg.length; j++) {\n const item = arg[j]\n if (!item) continue\n if (!isCached(item)) toAdd.add(item)\n }\n continue\n }\n if (!isCached(arg)) toAdd.add(arg)\n }\n if (toAdd.size === 0) return\n prune(toAdd)\n toAdd.forEach((id) => {\n cache.value.set(id, {\n ...mapIdToMinimal(id),\n _loaded: false,\n })\n toFetch.value.add(id)\n })\n }\n\n // Out of the queue as well: an id added and then supplied by hand would still be fetched, and the\n // answer would overwrite what the caller just put in.\n const addManual = (data: T) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...mapFullToMinimal(data),\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n const addManualMinimal = (data: M) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...data,\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n /**\n * Drops only as many oldest terminal entries as the overflow requires; dropping every one\n * of them would send currently rendered chips back to their loading state. A pinned entry is\n * never dropped.\n * Must include `_unresolved`, otherwise repeated failures grow the cache past `maxLimit`.\n */\n const prune = (protectedIds?: Set<I>) => {\n let incoming = 0\n if (protectedIds) {\n // Re-queued unresolved ids are already in the cache and do not grow it.\n for (const id of protectedIds) if (!cache.value.has(id)) incoming += 1\n }\n const overflow = cache.value.size + incoming - maxLimit\n if (overflow <= 0) return\n let removed = 0\n for (const [key, value] of cache.value) {\n if (removed >= overflow) break\n if (protectedIds?.has(key) || pinned.has(key)) continue\n if (value._loaded || value._unresolved) {\n cache.value.delete(key)\n removed += 1\n }\n }\n }\n\n const updateMap = (data: T[]) => {\n prune()\n for (const item of data) {\n cache.value.set(item[idProp] as I, {\n ...mapFullToMinimal(item),\n _loaded: true,\n })\n }\n }\n\n const updateToFetch = (ids: Array<I>) => {\n for (const id of ids) {\n toFetch.value.delete(id)\n }\n }\n\n const markUnresolved = (ids: Array<I>, reason: CachedUnresolvedReason) => {\n for (const id of ids) {\n const item = cache.value.get(id)\n if (isUndefined(item) || item._loaded) continue\n cache.value.set(id, { ...item, _unresolved: true, _unresolvedReason: reason })\n }\n }\n\n const fetchBatch = async (ids: I[]): Promise<T[]> => {\n try {\n // Awaited inside the `try`: a callback that throws before it returns a promise (a dam client\n // that is not configured) has to settle its ids too, or they would spin for good.\n const res = await fetchCallback(ids)\n updateMap(res)\n markUnresolved(ids, 'notFound')\n // Back within the limit once the batch is settled: the ids added and still on their way could not be dropped\n // till then, and a large add left the cache over its limit for good, also when the batch failed.\n prune()\n return res\n } catch (error: unknown) {\n markUnresolved(ids, unresolvedReason(error))\n prune()\n throw error\n }\n }\n\n // In the batches the api helpers would split the request into anyway, one after another, each\n // committed on its own: a failing batch leaves the ones before it loaded instead of taking them along.\n const runBatches = async (ids: I[]) => {\n const items: T[] = []\n const failures: unknown[] = []\n for (let start = 0; start < ids.length; start += batchSize) {\n try {\n items.push(...(await fetchBatch(ids.slice(start, start + batchSize))))\n } catch (error: unknown) {\n failures.push(error)\n }\n }\n return { items, failures }\n }\n\n /** Fetches the queue; settles with what loaded and every batch's failure, never rejects. */\n const runQueue = async () => {\n if (toFetch.value.size === 0) return { items: [] as T[], failures: [] as unknown[] }\n const ids = Array.from(toFetch.value)\n // Drained before the request, not after it. A batch that starts while this one is in flight --\n // a slow answer outlasting the debounce, the `maxWait` timer, an `immediateFetch()` -- would\n // otherwise send the same ids again. Draining at all keeps a failing batch from being resent.\n updateToFetch(ids)\n const run = runBatches(ids)\n inFlight.add(run)\n try {\n return await run\n } finally {\n inFlight.delete(run)\n }\n }\n\n async function apiFetch() {\n const { items, failures } = await runQueue()\n if (failures.length > 0) throw failures[0]\n return items\n }\n\n const logFailure = (error: unknown) => {\n if (isQuiet(error)) return\n logError(error instanceof Error ? error : new Error(String(error)), {\n level: 'warning',\n tags: { cachedFetch: 'failed' },\n })\n }\n\n // Caught inside the debounced callback, not on the promise it returns: the maxWait timer\n // is a second invocation path whose promise never reaches the caller, so a rejection\n // there would escape as an unhandled rejection.\n const debouncedFetch = useDebounceFn(\n async () => {\n try {\n // Every batch's failure, not only the first: a 403 in one would otherwise hide a timeout in\n // the next.\n const { items, failures } = await runQueue()\n failures.forEach(logFailure)\n return items\n } catch (error: unknown) {\n logFailure(error)\n return [] as T[]\n }\n },\n 1500,\n { maxWait: 5000 }\n )\n\n /**\n * Debounced fetch for best performance.\n * For general usage.\n *\n * Called fire-and-forget, so it never rejects. Use `immediateFetch()` to handle errors.\n */\n const fetch = () => {\n return debouncedFetch()\n }\n\n /**\n * Immediate fetch with no debounce and with result in promise.\n * Use for special cases.\n *\n * Waits for the batches already in flight as well and resolves with their items: their ids are out\n * of the queue, and a caller reading the result (to add the relations of what it fetched) would miss\n * them. It rejects only when its own batch fails; an id whose batch in flight failed is not in the\n * result -- check `isUnresolved(id)` for it.\n */\n const immediateFetch = async () => {\n const pending = Array.from(inFlight)\n const own = await apiFetch()\n const others = await Promise.all(pending)\n return [...own, ...others.flatMap((other) => other.items)]\n }\n\n /** Something shows the item of `id`: the cache keeps it till as many `unpin` have come. */\n const pin = (id: I | null | undefined) => {\n if (!id) return\n pinned.set(id, (pinned.get(id) ?? 0) + 1)\n }\n\n /** What showed the item of `id` no longer does. The cache goes back within its limit once none is left. */\n const unpin = (id: I | null | undefined) => {\n if (!id) return\n const count = pinned.get(id)\n if (isUndefined(count)) return\n if (count > 1) {\n pinned.set(id, count - 1)\n return\n }\n pinned.delete(id)\n prune()\n }\n\n const get = (id: I | null | undefined) => {\n if (!id) return undefined\n return cache.value.get(id)\n }\n\n const has = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.has(id)\n }\n\n const clear = () => {\n return cache.value.clear()\n }\n\n const isLoaded = (id: I | null | undefined): boolean => {\n if (!id) return false\n const item = cache.value.get(id)\n if (!item) return false\n return item._loaded\n }\n\n /** Terminal counterpart of `isLoaded`: the fetch settled without resolving the item. */\n const isUnresolved = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.get(id)?._unresolved === true\n }\n\n return {\n cache,\n toFetch,\n fetch,\n immediateFetch,\n add,\n addManual,\n addManualMinimal,\n pin,\n unpin,\n has,\n get,\n clear,\n isLoaded,\n isUnresolved,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"defineCached.js","names":["isForbidden","isAnzuApiForbiddenError","error","apiErrorStatus","unresolvedReason","isQuiet","isInCauseChain","cause","AnzuApiCancelledError","SessionExpiredError","AuthUnavailableError","defineCached","options","batchSize","cache","ref","toFetch","pinned","inFlight","useSentry","isCached","item","id","isUndefined","retryNotFound","add","args","toAdd","i","arg","isArray","j","prune","mapIdToMinimal","addManual","data","idProp","mapFullToMinimal","addManualMinimal","incoming","protectedIds","overflow","maxLimit","removed","key","value","updateMap","updateToFetch","ids","markUnresolved","reason","fetchBatch","res","fetchCallback","runBatches","items","failures","start","runQueue","run","apiFetch","logFailure","logError","debouncedFetch","useDebounceFn","pending","own","others","other","count"],"sources":["../../../../src/domains/cached/composables/defineCached.ts"],"sourcesContent":["import { type Ref, ref } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useSentry } from '@/domains/system/composables/sentry'\nimport { apiErrorStatus } from '@/domains/api/utils/apiErrors'\nimport { FETCH_BY_IDS_BATCH_SIZE } from '@/domains/api/composables/useApiFetchByIds'\nimport { isAnzuApiForbiddenError } from '@/shared/error/AnzuApiForbiddenError'\nimport { AnzuApiCancelledError } from '@/shared/error/AnzuApiCancelledError'\nimport { SessionExpiredError } from '@/shared/error/SessionExpiredError'\nimport { AuthUnavailableError } from '@/shared/error/AuthUnavailableError'\nimport { isInCauseChain } from '@/shared/error/isInCauseChain'\nimport { HTTP_STATUS_FORBIDDEN, HTTP_STATUS_UNAUTHORIZED } from '@/shared/statusCodes'\n\n/**\n * Why a fetch settled without resolving an item:\n * - `notFound`: the server answered and the item was not among the results.\n * - `forbidden`: the user may not read it (403). Asking again in this session cannot change that.\n * - `error`: anything else. Network, timeout, 5xx, a 401 before session renewal,\n * or a 404 of the whole request (a route or proxy answering, not a missing item).\n */\nexport type CachedUnresolvedReason = 'notFound' | 'forbidden' | 'error'\n\n/**\n * `_unresolved`: the fetch settled without resolving the item. `_unresolvedReason` says why.\n * Whether a later `add()` asks again depends on the reason (see `defineCached`).\n */\nexport type CachedItem<T extends object> = T & {\n _loaded: boolean\n _unresolved?: boolean\n _unresolvedReason?: CachedUnresolvedReason\n}\n\nexport interface DefineCachedOptions {\n /**\n * Ask again on the next `add()` for an id the server did not return. Defaults\n * to `true`, because an entity can be created after the first lookup.\n * A user cache passes `false`. Otherwise an id missing from the table (a\n * system user of another backend) is requested on every page that shows it.\n */\n retryNotFound?: boolean\n /**\n * How many ids one `fetchCallback` call gets. Each call is\n * committed on its own. Defaults to `FETCH_BY_IDS_BATCH_SIZE`.\n * A backend with a lower per-request limit sets it here. Splitting inside\n * the callback would make one failing part discard the parts already loaded.\n */\n batchSize?: number\n}\n\n// A rejected 403 arrives mapped as `AnzuApiForbiddenError`, which carries no status of its own.\nconst isForbidden = (error: unknown) =>\n isAnzuApiForbiddenError(error) || apiErrorStatus(error) === HTTP_STATUS_FORBIDDEN\n\nconst unresolvedReason = (error: unknown): CachedUnresolvedReason => (isForbidden(error) ? 'forbidden' : 'error')\n\n/**\n * Errors not worth logging: 403, no logged-in user (401 or a\n * session gone), auth service not answering, or an aborted request.\n * The api layer already handles logging of these. For a cache they concern the session, not the fetch.\n */\nconst isQuiet = (error: unknown) =>\n isForbidden(error) ||\n apiErrorStatus(error) === HTTP_STATUS_UNAUTHORIZED ||\n isInCauseChain(\n error,\n (cause) =>\n cause instanceof AnzuApiCancelledError ||\n cause instanceof SessionExpiredError ||\n cause instanceof AuthUnavailableError\n )\n\nexport type AddToCachedArgs<T extends DocId | IntegerId> =\n | Array<T | null | undefined>\n | Array<Array<T | null | undefined> | T | null | undefined>\n\n/**\n * @template I Identifier type\n * @template T Source type\n * @template M Minimal type\n */\nexport function defineCached<\n I extends DocId | IntegerId,\n T extends Record<DocId | IntegerId, any>,\n M extends Record<DocId | IntegerId, any>,\n>(\n mapFullToMinimal: (source: T) => M,\n mapIdToMinimal: (id: I) => M,\n fetchCallback: (ids: I[]) => Promise<T[]>,\n idProp = 'id',\n maxLimit = 1000,\n options: DefineCachedOptions = {}\n) {\n const { retryNotFound = true } = options\n const batchSize =\n options.batchSize && options.batchSize >= 1 ? Math.floor(options.batchSize) : FETCH_BY_IDS_BATCH_SIZE\n const cache: Ref<Map<I, CachedItem<M>>> = ref(new Map())\n const toFetch = ref(new Set()) as Ref<Set<I>>\n // Ids currently shown, each with its show count (`pin`). The cache\n // never drops them to stay within its limit and may exceed it.\n // Dropping one turned a chip's name back into a spinner until the id was added again.\n const pinned = new Map<I, number>()\n // Settles, never rejects. A failed run still hands over what its earlier batches loaded.\n const inFlight = new Set<Promise<{ items: T[]; failures: unknown[] }>>()\n const { logError } = useSentry()\n\n /**\n * Unresolved items are never retried from the queue, only on the next `add()`, and only when retrying can help.\n * `error` always retries, `notFound` unless the cache opted out, `forbidden` never.\n */\n const isCached = (id: I) => {\n const item = cache.value.get(id)\n if (isUndefined(item)) return false\n if (item._unresolved !== true) return true\n if (item._unresolvedReason === 'forbidden') return true\n if (item._unresolvedReason === 'notFound') return !retryNotFound\n return false\n }\n\n // Falsy, not only null/undefined. `get`, `has` and `isLoaded` treat 0 and '' as no id.\n // Otherwise a blank factory record (`createdBy: 0`) is sent to the server as `filter_in[id]=0`.\n const add = (...args: AddToCachedArgs<I>) => {\n const toAdd = new Set<I>()\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (!arg) continue\n if (isArray(arg)) {\n for (let j = 0; j < arg.length; j++) {\n const item = arg[j]\n if (!item) continue\n if (!isCached(item)) toAdd.add(item)\n }\n continue\n }\n if (!isCached(arg)) toAdd.add(arg)\n }\n if (toAdd.size === 0) return\n prune(toAdd)\n toAdd.forEach((id) => {\n cache.value.set(id, {\n ...mapIdToMinimal(id),\n _loaded: false,\n })\n toFetch.value.add(id)\n })\n }\n\n // Remove it from the queue too. Otherwise a queued id supplied by\n // hand is still fetched, and the answer overwrites the caller's data.\n const addManual = (data: T) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...mapFullToMinimal(data),\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n const addManualMinimal = (data: M) => {\n const id = data[idProp] as I\n if (!id) return\n prune(new Set([id]))\n cache.value.set(id, {\n ...data,\n _loaded: true,\n })\n toFetch.value.delete(id)\n }\n\n /**\n * Drops only as many oldest terminal entries as the overflow\n * requires. Dropping all would send rendered chips back to loading.\n * Pinned entries are never dropped.\n * Must include `_unresolved` entries, otherwise repeated failures grow the cache past `maxLimit`.\n */\n const prune = (protectedIds?: Set<I>) => {\n let incoming = 0\n if (protectedIds) {\n // Re-queued unresolved ids are already in the cache and do not grow it.\n for (const id of protectedIds) if (!cache.value.has(id)) incoming += 1\n }\n const overflow = cache.value.size + incoming - maxLimit\n if (overflow <= 0) return\n let removed = 0\n for (const [key, value] of cache.value) {\n if (removed >= overflow) break\n if (protectedIds?.has(key) || pinned.has(key)) continue\n if (value._loaded || value._unresolved) {\n cache.value.delete(key)\n removed += 1\n }\n }\n }\n\n const updateMap = (data: T[]) => {\n prune()\n for (const item of data) {\n cache.value.set(item[idProp] as I, {\n ...mapFullToMinimal(item),\n _loaded: true,\n })\n }\n }\n\n const updateToFetch = (ids: Array<I>) => {\n for (const id of ids) {\n toFetch.value.delete(id)\n }\n }\n\n const markUnresolved = (ids: Array<I>, reason: CachedUnresolvedReason) => {\n for (const id of ids) {\n const item = cache.value.get(id)\n if (isUndefined(item) || item._loaded) continue\n cache.value.set(id, { ...item, _unresolved: true, _unresolvedReason: reason })\n }\n }\n\n const fetchBatch = async (ids: I[]): Promise<T[]> => {\n try {\n // Awaited inside the `try`. A callback that throws before returning a promise\n // (e.g. an unconfigured dam client) must settle its ids too, or they spin forever.\n const res = await fetchCallback(ids)\n updateMap(res)\n markUnresolved(ids, 'notFound')\n // Prune once the batch settles. Ids in flight cannot be dropped before that.\n // Without this, a large add left the cache over its limit for good, also when the batch failed.\n prune()\n return res\n } catch (error: unknown) {\n markUnresolved(ids, unresolvedReason(error))\n prune()\n throw error\n }\n }\n\n // Fetches in the same batches the api helpers would use, sequentially, each committed on its own.\n // A failing batch then leaves earlier batches loaded.\n const runBatches = async (ids: I[]) => {\n const items: T[] = []\n const failures: unknown[] = []\n for (let start = 0; start < ids.length; start += batchSize) {\n try {\n items.push(...(await fetchBatch(ids.slice(start, start + batchSize))))\n } catch (error: unknown) {\n failures.push(error)\n }\n }\n return { items, failures }\n }\n\n /** Fetches the queue; settles with what loaded and every batch's failure, never rejects. */\n const runQueue = async () => {\n if (toFetch.value.size === 0) return { items: [] as T[], failures: [] as unknown[] }\n const ids = Array.from(toFetch.value)\n // Drained before the request, not after. Otherwise a batch\n // started while this one is in flight resends the same ids.\n // That happens with a slow answer outlasting the debounce, the `maxWait` timer, or `immediateFetch()`.\n // Draining also keeps a failing batch from being resent.\n updateToFetch(ids)\n const run = runBatches(ids)\n inFlight.add(run)\n try {\n return await run\n } finally {\n inFlight.delete(run)\n }\n }\n\n async function apiFetch() {\n const { items, failures } = await runQueue()\n if (failures.length > 0) throw failures[0]\n return items\n }\n\n const logFailure = (error: unknown) => {\n if (isQuiet(error)) return\n logError(error instanceof Error ? error : new Error(String(error)), {\n level: 'warning',\n tags: { cachedFetch: 'failed' },\n })\n }\n\n // Caught inside the debounced callback, not on its returned promise.\n // The `maxWait` timer is a second invocation path whose promise\n // never reaches the caller, so a rejection there would be unhandled.\n const debouncedFetch = useDebounceFn(\n async () => {\n try {\n // Log every batch's failure, not only the first. A 403 in one would otherwise hide a timeout in the next.\n const { items, failures } = await runQueue()\n failures.forEach(logFailure)\n return items\n } catch (error: unknown) {\n logFailure(error)\n return [] as T[]\n }\n },\n 1500,\n { maxWait: 5000 }\n )\n\n /**\n * Debounced fetch for general use.\n * Called fire-and-forget, so it never rejects. Use `immediateFetch()` to handle errors.\n */\n const fetch = () => {\n return debouncedFetch()\n }\n\n /**\n * Immediate fetch without debounce, returning the result.\n * Also waits for batches already in flight and includes their items, since\n * their ids are out of the queue and callers adding relations would miss them.\n * Rejects only when its own batch fails. An id whose in-flight batch\n * failed is missing from the result; check `isUnresolved(id)`.\n */\n const immediateFetch = async () => {\n const pending = Array.from(inFlight)\n const own = await apiFetch()\n const others = await Promise.all(pending)\n return [...own, ...others.flatMap((other) => other.items)]\n }\n\n /** Marks the item of `id` as shown. The cache keeps it until a matching number of `unpin` calls. */\n const pin = (id: I | null | undefined) => {\n if (!id) return\n pinned.set(id, (pinned.get(id) ?? 0) + 1)\n }\n\n /** Marks the item of `id` as no longer shown. The cache returns within its limit once no pins are left. */\n const unpin = (id: I | null | undefined) => {\n if (!id) return\n const count = pinned.get(id)\n if (isUndefined(count)) return\n if (count > 1) {\n pinned.set(id, count - 1)\n return\n }\n pinned.delete(id)\n prune()\n }\n\n const get = (id: I | null | undefined) => {\n if (!id) return undefined\n return cache.value.get(id)\n }\n\n const has = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.has(id)\n }\n\n const clear = () => {\n return cache.value.clear()\n }\n\n const isLoaded = (id: I | null | undefined): boolean => {\n if (!id) return false\n const item = cache.value.get(id)\n if (!item) return false\n return item._loaded\n }\n\n /** Terminal counterpart of `isLoaded`: the fetch settled without resolving the item. */\n const isUnresolved = (id: I | null | undefined): boolean => {\n if (!id) return false\n return cache.value.get(id)?._unresolved === true\n }\n\n return {\n cache,\n toFetch,\n fetch,\n immediateFetch,\n add,\n addManual,\n addManualMinimal,\n pin,\n unpin,\n has,\n get,\n clear,\n isLoaded,\n isUnresolved,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import { ComputedRef } from 'vue';
|
|
2
2
|
import { DocId, IntegerId } from '../../../shared/types/common';
|
|
3
|
-
/** How a component
|
|
3
|
+
/** How a component showing a cached item keeps it pinned and requests it (`useCachedItem`). */
|
|
4
4
|
export interface CachedItemPinning<I extends DocId | IntegerId> {
|
|
5
|
-
/**
|
|
5
|
+
/** Id of the shown item. None while the component shows none, e.g. when it has its own title. */
|
|
6
6
|
id: () => I | null | undefined;
|
|
7
|
-
/** `pin` and `unpin` of the cache (`defineCached`). */
|
|
8
7
|
pin: (id: I) => void;
|
|
9
8
|
unpin: (id: I) => void;
|
|
10
|
-
/** Adds the id to the cache and
|
|
9
|
+
/** Adds the id to the cache and fetches it, for an id its page never added. */
|
|
11
10
|
askFor: (id: I) => void;
|
|
12
11
|
}
|
|
13
12
|
/**
|
|
14
|
-
* `pinning`: the item
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* is shown.
|
|
13
|
+
* `pinning`: the shown item stays pinned in its cache while the
|
|
14
|
+
* component shows it, across id changes, and is released on unmount.
|
|
15
|
+
* The cache (1 000 items) never drops pinned items. Without this a chip spun after its item was dropped.
|
|
16
|
+
* An id the cache does not have is requested once when shown.
|
|
18
17
|
*/
|
|
19
18
|
export declare function useCachedItem<T extends {
|
|
20
19
|
_loaded?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCachedItem.js","names":["useCachedItem","pinning","shown","watch","before","id","getter","onScopeDispose","cached","computed","value"],"sources":["../../../../src/domains/cached/composables/useCachedItem.ts"],"sourcesContent":["import { type ComputedRef, computed, onScopeDispose, watch } from 'vue'\nimport type { DocId, IntegerId } from '@/shared/types/common'\n\n/** How a component
|
|
1
|
+
{"version":3,"file":"useCachedItem.js","names":["useCachedItem","pinning","shown","watch","before","id","getter","onScopeDispose","cached","computed","value"],"sources":["../../../../src/domains/cached/composables/useCachedItem.ts"],"sourcesContent":["import { type ComputedRef, computed, onScopeDispose, watch } from 'vue'\nimport type { DocId, IntegerId } from '@/shared/types/common'\n\n/** How a component showing a cached item keeps it pinned and requests it (`useCachedItem`). */\nexport interface CachedItemPinning<I extends DocId | IntegerId> {\n /** Id of the shown item. None while the component shows none, e.g. when it has its own title. */\n id: () => I | null | undefined\n pin: (id: I) => void\n unpin: (id: I) => void\n /** Adds the id to the cache and fetches it, for an id its page never added. */\n askFor: (id: I) => void\n}\n\n/**\n * `pinning`: the shown item stays pinned in its cache while the\n * component shows it, across id changes, and is released on unmount.\n * The cache (1 000 items) never drops pinned items. Without this a chip spun after its item was dropped.\n * An id the cache does not have is requested once when shown.\n */\nexport function useCachedItem<\n T extends { _loaded?: boolean; _unresolved?: boolean },\n I extends DocId | IntegerId = DocId | IntegerId,\n>(\n getter: () => T | undefined,\n pinning?: CachedItemPinning<I>\n): { cached: ComputedRef<T | undefined>; loaded: ComputedRef<boolean>; unresolved: ComputedRef<boolean> } {\n if (pinning) {\n let shown: I | null = null\n watch(\n pinning.id,\n (id) => {\n // Pin the new id first. Unpinning the old one first could let the cache drop the new one.\n const before = shown\n shown = id || null\n if (shown) pinning.pin(shown)\n if (before) pinning.unpin(before)\n if (shown && getter() === undefined) pinning.askFor(shown)\n },\n { immediate: true }\n )\n onScopeDispose(() => {\n if (shown) pinning.unpin(shown)\n shown = null\n })\n }\n const cached = computed<T | undefined>(() => {\n const value = getter()\n if (!value) return undefined\n // `_unresolved` settles the item: return the placeholder so consumers stop showing a spinner.\n return value._loaded !== false || value._unresolved === true ? value : undefined\n })\n const loaded = computed(() => cached.value !== undefined)\n // Separate from `loaded`, because an unresolved item is only a placeholder.\n // A consumer reading its fields would draw an empty chip.\n const unresolved = computed(() => cached.value?._unresolved === true)\n\n return { cached, loaded, unresolved }\n}\n"],"mappings":";;AAmBA,SAAgBA,EAId,GACA,GACwG;CACxG,IAAIC,GAAS;EACX,IAAIC,IAAkB;EAatB,AAZAC,EACEF,EAAQ,KACP,MAAO;GAEN,IAAMG,IAASF;GAIf,AAHA,IAAQG,KAAM,MACVH,KAAOD,EAAQ,IAAIC,CAAK,GACxBE,KAAQH,EAAQ,MAAMG,CAAM,GAC5BF,KAASI,EAAO,MAAM,KAAA,KAAWL,EAAQ,OAAOC,CAAK;EAC3D,GACA,EAAE,WAAW,GAAK,CACpB,GACAK,QAAqB;GAEnB,AADIL,KAAOD,EAAQ,MAAMC,CAAK,GAC9B,IAAQ;EACV,CAAC;CACH;CACA,IAAMM,IAASC,QAA8B;EAC3C,IAAMC,IAAQJ,EAAO;EACrB,IAAKI,GAEL,OAAOA,EAAM,YAAY,MAASA,EAAM,gBAAgB,KAAOA,IAAQ,KAAA;CACzE,CAAC;CAMD,OAAO;EAAE;EAAQ,QALFD,QAAeD,EAAO,UAAU,KAAA,CAK9B;EAAQ,YAFNC,QAAeD,EAAO,OAAO,gBAAgB,EAEvC;CAAW;AACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACollabLockedByUser.js","names":["_sfc_main","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","ACollabLockedByUser_default"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it
|
|
1
|
+
{"version":3,"file":"ACollabLockedByUser.js","names":["_sfc_main","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","ACollabLockedByUser_default"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it.\n // A user resolved later (after an `_unresolved` placeholder) arrives as\n // a new loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_createBlock","_component_VBadge","_withCtx","_createVNode","_component_VIcon","AAnzuUserAvatar","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","props","__props","cached","shallowRef","loaded","cachedUsers","unref","useI18n","item","computed","isNumber","tooltip","prefix","t","watch","newValue","openBlock","createElementBlock","isNull","isUndefined","Fragment","createBlock","VBadge","withCtx","createVNode","VIcon","VProgressCircular"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it
|
|
1
|
+
{"version":3,"file":"ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_createBlock","_component_VBadge","_withCtx","_createVNode","_component_VIcon","AAnzuUserAvatar","_component_VProgressCircular","AAnzuUserAvatar_default","_hoisted_1","_hoisted_2","ACollabLockedByUser_vue_vue_type_script_setup_true_lang_default","props","__props","cached","shallowRef","loaded","cachedUsers","unref","useI18n","item","computed","isNumber","tooltip","prefix","t","watch","newValue","openBlock","createElementBlock","isNull","isUndefined","Fragment","createBlock","VBadge","withCtx","createVNode","VIcon","VProgressCircular"],"sources":["../../../../src/domains/collab/components/ACollabLockedByUser.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, type Ref, shallowRef, unref, watch } from 'vue'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { isNull, isNumber, isUndefined } from '@/shared/utils/common'\nimport type { CollabCachedUsersMap } from '@/domains/collab/composables/collabHelpers'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport { useI18n } from 'vue-i18n'\n\nconst props = withDefaults(\n defineProps<{\n id: null | undefined | IntegerId\n users: CollabCachedUsersMap | Ref<CollabCachedUsersMap>\n isModerator?: boolean\n }>(),\n {\n isModerator: false,\n }\n)\n\nconst cached = shallowRef<undefined | AnzuUserMinimal>(undefined)\nconst loaded = shallowRef<boolean>(false)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst cachedUsers = unref(props.users)\nconst { t } = useI18n()\n\nconst item = computed(() => {\n if (isNumber(props.id) && props.id > 0) {\n return cachedUsers.get(props.id)\n }\n return undefined\n})\n\nconst tooltip = computed(() => {\n let prefix = ''\n if (props.isModerator) {\n prefix = t('common.collab.moderator') + ': '\n }\n if (item.value) {\n return item.value.person.fullName.length\n ? prefix + item.value.person.fullName\n : prefix + item.value.email.split('@')[0]\n }\n return undefined\n})\n\nwatch(\n item,\n (newValue) => {\n // Same user still loaded: keep it.\n // A user resolved later (after an `_unresolved` placeholder) arrives as\n // a new loaded object under the same id and replaces the placeholder.\n if (loaded.value && cached.value?.id === newValue?.id && !newValue?._loaded) return\n loaded.value = false\n cached.value = undefined\n if (isUndefined(newValue) || (!newValue._loaded && newValue._unresolved !== true)) return\n cached.value = newValue\n loaded.value = true\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"isNull(id) || isUndefined(id)\" />\n <template v-else-if=\"loaded\">\n <VBadge\n v-if=\"isModerator\"\n location=\"top right\"\n color=\"white\"\n :width=\"12\"\n :min-width=\"12\"\n :height=\"14\"\n :offset-x=\"-5\"\n :offset-y=\"-5\"\n >\n <template #badge>\n <VIcon\n color=\"grey-darken-2\"\n :size=\"14\"\n icon=\"mdi-crown\"\n />\n </template>\n <AAnzuUserAvatar\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </VBadge>\n <AAnzuUserAvatar\n v-else\n :user=\"cached ?? undefined\"\n :size=\"20\"\n :tooltip=\"tooltip\"\n />\n </template>\n <VProgressCircular\n v-else\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-auto mr-auto\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EASA,IAAMe,IAAQC,GAWRC,IAASC,EAAwC,KAAA,CAAS,GAC1DC,IAASD,EAAoB,EAAK,GAGlCE,IAAcC,EAAMN,EAAM,KAAK,GAC/B,EAAE,SAAMO,EAAQ,GAEhBC,IAAOC,QAAe;GAC1B,IAAIC,EAASV,EAAM,EAAE,KAAKA,EAAM,KAAK,GACnC,OAAOK,EAAY,IAAIL,EAAM,EAAE;EAGnC,CAAC,GAEKW,IAAUF,QAAe;GAC7B,IAAIG,IAAS;GAIb,IAHIZ,EAAM,gBACR,IAASa,EAAE,yBAAyB,IAAI,OAEtCL,EAAK,OACP,OAAOA,EAAK,MAAM,OAAO,SAAS,SAC9BI,IAASJ,EAAK,MAAM,OAAO,WAC3BI,IAASJ,EAAK,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC;EAG7C,CAAC;E,OAEDM,EACEN,IACC,MAAa;GAIZ,CAAI,GAAO,SAASN,EAAO,OAAO,OAAOa,GAAU,MAAOA,GAAU,aACpE,EAAO,QAAQ,IACf,EAAO,QAAQ,KAAA,GACX,IAAYA,CAAQ,KAAM,CAACA,EAAS,WAAWA,EAAS,gBAAgB,QAC5E,EAAO,QAAQA,GACf,EAAO,QAAQ;EACjB,GACA,EAAE,WAAW,GAAK,CACpB,I,UAIE9B,EAAA,GAAAC,EAwCM,OAxCNW,GAwCM,CAvCQV,EAAA+B,CAAA,CAAM,CAACjB,EAAA,EAAE,KAAKd,EAAAgC,CAAA,CAAW,CAAClB,EAAA,EAAE,KAAxChB,EAAA,GAAAC,EAA6C,QAAAY,CAAA,KACxBM,EAAA,SAArBnB,EAAA,GAAAC,EA8BWE,GAAA,EAAA,KAAA,EAAA,GAAA,CA5BDa,EAAA,eADRhB,EAAA,GAAAI,EAsBSC,GAAA;;GApBP,UAAS;GACT,OAAM;GACL,OAAO;GACP,aAAW;GACX,QAAQ;GACR,YAAU;GACV,YAAU;;GAEA,OAAKC,QAKZ,CAJFC,EAIEC,GAAA;IAHA,OAAM;IACL,MAAM;IACP,MAAK;;GAGT,SAAAF,QAIE,CAJFC,EAIEE,GAAA;IAHC,MAAMQ,EAAA,SAAU,KAAA;IAChB,MAAM;IACN,SAASS,EAAA;;;E,OAGd1B,EAAA,GAAAI,EAKEK,GAAA;;GAHC,MAAMQ,EAAA,SAAU,KAAA;GAChB,MAAM;GACN,SAASS,EAAA;E,4CAGd1B,EAAA,GAAAI,EAMEM,GAAA;;GAJC,MAAM;GACN,OAAO;GACR,eAAA;GACA,OAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collabAnyDataChange.js","names":["useCollabAnyDataChange","useCommonAdminCollabOptions","useCollabCurrentUserId","useCollabStateInternal","changeEventBus","useCollabRoomDataChangeEventBus","fieldLockStatusEventBus","useCollabFieldLockStatusEventBus","anyChangeCallback","ref","unsubscribeCollabAnyDataChangeListener","anyChangeEventBusListener","event","room","isUndefined","payload","tryOnBeforeUnmount","disableAutoUnsubscribe","isDefined","callback","collabOptions","collabSocket","roomInfo","collabRoomInfoState","CollabStatus","field","data","object","unref","objectToUpdate","cloneDeep","options","statusEvent","error","setFieldLockUnanswered","isCollabFailedChangeRoomLockCallback","response","createFieldLockStatusPayload","CollabFieldLockType","CollabFieldLockStatus","isCollabSuccessChangeRoomLockCallback","collabFieldLocksState","locks","lock","collabFieldDataBufferState","fieldLockMaybeHeld","currentUserId"],"sources":["../../../../src/domains/collab/composables/collabAnyDataChange.ts"],"sourcesContent":["import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/domains/collab/types/Collab'\nimport { type MaybeRef, ref, unref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n CollabFieldLockType,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/domains/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport { useCollabStateInternal } from '@/domains/collab/composables/collabState'\nimport { useCollabCurrentUserId } from '@/domains/collab/composables/collabCurrentUserId'\nimport { cloneDeep, isDefined, isUndefined } from '@/shared/utils/common'\nimport { objectSetValueByPath } from '@/shared/utils/object'\n\nexport function useCollabAnyDataChange(room: CollabRoom, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { currentUserId } = useCollabCurrentUserId()\n const {\n collabSocket,\n collabFieldLocksState,\n collabFieldDataBufferState,\n collabRoomInfoState,\n setFieldLockUnanswered,\n fieldLockMaybeHeld,\n } = useCollabStateInternal()\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n\n const anyChangeCallback = ref<undefined | ((field: CollabFieldName, payload: CollabFieldDataEnvelope) => void)>()\n const unsubscribeCollabAnyDataChangeListener = ref<undefined | Fn>()\n\n const anyChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (event.room !== room || isUndefined(payload) || isUndefined(anyChangeCallback.value)) {\n return\n }\n anyChangeCallback.value(event.field, payload)\n }\n\n const addCollabAnyDataChangeListener = (\n callback: (field: CollabFieldName, data: CollabFieldDataEnvelope) => void\n ) => {\n anyChangeCallback.value = callback\n unsubscribeCollabAnyDataChangeListener.value = changeEventBus.on(anyChangeEventBusListener)\n }\n\n const changeCollabAnyData = (field: CollabFieldName, data: CollabFieldData, callback: Fn | undefined = undefined) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n if (!isUndefined(callback)) callback()\n })\n }\n\n const objectSetDataByField = <T extends object>(\n field: CollabFieldName,\n data: CollabFieldDataEnvelope,\n objectToUpdate: MaybeRef<T>\n ) => {\n const object = unref(objectToUpdate)\n switch (data.type) {\n case 'json':\n {\n objectSetValueByPath(object, field, cloneDeep(data.value))\n }\n break\n default: {\n objectSetValueByPath(object, field, data.value)\n }\n }\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabAnyDataChangeListener.value)) {\n unsubscribeCollabAnyDataChangeListener.value()\n }\n })\n\n const acquireCollabAnyLock = (field: CollabFieldName, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error) setFieldLockUnanswered(room, field, true)\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(response.locks ? Object.entries(response.locks) : [])\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabAnyLock = (\n field: CollabFieldName,\n data: CollabFieldData,\n options: Partial<CollabFieldLockOptions> = {}\n ) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n // As `useCollabField` does: a lock held while the other editor left is released on the server too.\n if (!collabSocket.value.connected || !fieldLockMaybeHeld(room, field, currentUserId.value)) return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n setFieldLockUnanswered(room, field, false)\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n if (response.locks) {\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n return {\n addCollabAnyDataChangeListener,\n unsubscribeCollabAnyDataChangeListener,\n changeCollabAnyData,\n objectSetDataByField,\n acquireCollabAnyLock,\n releaseCollabAnyLock,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"collabAnyDataChange.js","names":["useCollabAnyDataChange","useCommonAdminCollabOptions","useCollabCurrentUserId","useCollabStateInternal","changeEventBus","useCollabRoomDataChangeEventBus","fieldLockStatusEventBus","useCollabFieldLockStatusEventBus","anyChangeCallback","ref","unsubscribeCollabAnyDataChangeListener","anyChangeEventBusListener","event","room","isUndefined","payload","tryOnBeforeUnmount","disableAutoUnsubscribe","isDefined","callback","collabOptions","collabSocket","roomInfo","collabRoomInfoState","CollabStatus","field","data","object","unref","objectToUpdate","cloneDeep","options","statusEvent","error","setFieldLockUnanswered","isCollabFailedChangeRoomLockCallback","response","createFieldLockStatusPayload","CollabFieldLockType","CollabFieldLockStatus","isCollabSuccessChangeRoomLockCallback","collabFieldLocksState","locks","lock","collabFieldDataBufferState","fieldLockMaybeHeld","currentUserId"],"sources":["../../../../src/domains/collab/composables/collabAnyDataChange.ts"],"sourcesContent":["import {\n type CollabChangeRoomLockCallbackTypes,\n type CollabFieldData,\n type CollabFieldDataEnvelope,\n type CollabFieldLockOptions,\n type CollabFieldName,\n type CollabRoom,\n CollabStatus,\n isCollabFailedChangeRoomLockCallback,\n isCollabSuccessChangeRoomLockCallback,\n} from '@/domains/collab/types/Collab'\nimport { type MaybeRef, ref, unref } from 'vue'\nimport {\n CollabFieldLockStatus,\n type CollabFieldLockStatusEvent,\n CollabFieldLockType,\n type CollabRoomDataChangedEvent,\n createFieldLockStatusPayload,\n useCollabFieldLockStatusEventBus,\n useCollabRoomDataChangeEventBus,\n} from '@/domains/collab/composables/collabEventBus'\nimport { type Fn, tryOnBeforeUnmount } from '@vueuse/core'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport { useCollabStateInternal } from '@/domains/collab/composables/collabState'\nimport { useCollabCurrentUserId } from '@/domains/collab/composables/collabCurrentUserId'\nimport { cloneDeep, isDefined, isUndefined } from '@/shared/utils/common'\nimport { objectSetValueByPath } from '@/shared/utils/object'\n\nexport function useCollabAnyDataChange(room: CollabRoom, disableAutoUnsubscribe = false) {\n const { collabOptions } = useCommonAdminCollabOptions()\n const { currentUserId } = useCollabCurrentUserId()\n const {\n collabSocket,\n collabFieldLocksState,\n collabFieldDataBufferState,\n collabRoomInfoState,\n setFieldLockUnanswered,\n fieldLockMaybeHeld,\n } = useCollabStateInternal()\n const changeEventBus = useCollabRoomDataChangeEventBus()\n const fieldLockStatusEventBus = useCollabFieldLockStatusEventBus()\n\n const anyChangeCallback = ref<undefined | ((field: CollabFieldName, payload: CollabFieldDataEnvelope) => void)>()\n const unsubscribeCollabAnyDataChangeListener = ref<undefined | Fn>()\n\n const anyChangeEventBusListener = (event: CollabRoomDataChangedEvent, payload?: CollabFieldDataEnvelope) => {\n if (event.room !== room || isUndefined(payload) || isUndefined(anyChangeCallback.value)) {\n return\n }\n anyChangeCallback.value(event.field, payload)\n }\n\n const addCollabAnyDataChangeListener = (\n callback: (field: CollabFieldName, data: CollabFieldDataEnvelope) => void\n ) => {\n anyChangeCallback.value = callback\n unsubscribeCollabAnyDataChangeListener.value = changeEventBus.on(anyChangeEventBusListener)\n }\n\n const changeCollabAnyData = (field: CollabFieldName, data: CollabFieldData, callback: Fn | undefined = undefined) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value.emit('changeFieldData', room, field, data, () => {\n if (!isUndefined(callback)) callback()\n })\n }\n\n const objectSetDataByField = <T extends object>(\n field: CollabFieldName,\n data: CollabFieldDataEnvelope,\n objectToUpdate: MaybeRef<T>\n ) => {\n const object = unref(objectToUpdate)\n switch (data.type) {\n case 'json':\n {\n objectSetValueByPath(object, field, cloneDeep(data.value))\n }\n break\n default: {\n objectSetValueByPath(object, field, data.value)\n }\n }\n }\n\n tryOnBeforeUnmount(() => {\n if (disableAutoUnsubscribe) return\n if (isDefined(unsubscribeCollabAnyDataChangeListener.value)) {\n unsubscribeCollabAnyDataChangeListener.value()\n }\n })\n\n const acquireCollabAnyLock = (field: CollabFieldName, options: Partial<CollabFieldLockOptions> = {}) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) return\n collabSocket.value\n ?.timeout(1000)\n .emit('acquireFieldLock', room, field, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error) setFieldLockUnanswered(room, field, true)\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n const locks = new Map(response.locks ? Object.entries(response.locks) : [])\n for (const [field, lock] of locks.entries()) {\n collabFieldLocksState.get(room)?.set(field, lock)\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Acquire, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n const releaseCollabAnyLock = (\n field: CollabFieldName,\n data: CollabFieldData,\n options: Partial<CollabFieldLockOptions> = {}\n ) => {\n if (!collabOptions.value.enabled || isUndefined(collabSocket.value)) return\n const roomInfo = collabRoomInfoState.get(room)\n if (roomInfo && roomInfo.status === CollabStatus.Inactive) {\n if (!collabFieldDataBufferState.has(room)) {\n collabFieldDataBufferState.set(room, new Map())\n }\n collabFieldDataBufferState.get(room)?.set(field, data)\n // As in `useCollabField`: a lock held while the other editor left must be released on the server too.\n if (!collabSocket.value.connected || !fieldLockMaybeHeld(room, field, currentUserId.value)) return\n }\n collabSocket.value\n ?.timeout(1000)\n .emit('releaseFieldLock', room, field, data, options, (error, response: CollabChangeRoomLockCallbackTypes) => {\n const statusEvent: CollabFieldLockStatusEvent = { field, room }\n if (error || isCollabFailedChangeRoomLockCallback(response)) {\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Failure)\n )\n }\n if (isCollabSuccessChangeRoomLockCallback(response)) {\n setFieldLockUnanswered(room, field, false)\n if (!collabFieldLocksState.has(room)) {\n collabFieldLocksState.set(room, new Map())\n }\n if (response.locks) {\n for (const field of Object.keys(response.locks)) {\n collabFieldLocksState.get(room)?.delete(field)\n }\n }\n\n return void fieldLockStatusEventBus.emit(\n statusEvent,\n createFieldLockStatusPayload(CollabFieldLockType.Release, CollabFieldLockStatus.Success)\n )\n }\n })\n }\n\n return {\n addCollabAnyDataChangeListener,\n unsubscribeCollabAnyDataChangeListener,\n changeCollabAnyData,\n objectSetDataByField,\n acquireCollabAnyLock,\n releaseCollabAnyLock,\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,9 +2,11 @@ import { CollabFieldData, CollabFieldDataEnvelope, CollabFieldLockOptions, Colla
|
|
|
2
2
|
import { CollabFieldLockStatusPayload } from './collabEventBus';
|
|
3
3
|
import { Fn } from '@vueuse/core';
|
|
4
4
|
/**
|
|
5
|
-
* `reacquireWhenActive`: a lock the component
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* `reacquireWhenActive`: a lock the component requested and has
|
|
6
|
+
* not released is requested again whenever the room turns active.
|
|
7
|
+
* This covers a reconnect, where the server released it, and
|
|
8
|
+
* another editor joining while this one was alone and held none.
|
|
9
|
+
* For a field that holds the lock while focused.
|
|
8
10
|
*/
|
|
9
11
|
export declare function useCollabField(room: CollabRoom, field: CollabFieldName, disableAutoUnsubscribe?: boolean, reacquireWhenActive?: boolean): {
|
|
10
12
|
addCollabFieldDataChangeListener: (callback: (data: CollabFieldDataEnvelope) => void) => void;
|