@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +27 -27
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- package/src/vite/sourcemaps.mjs +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemOverview.js","names":["_sfc_main","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","AUserSystemOverview_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// A collector for the metadata form inside the create dialog. Without one its rules register\n// against whatever ancestor happens to have an instance, and the dialog's confirm could not ask\n// whether the fields it is about to send are valid.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** The bulk actions only write where the person was found; offer them when at least one of those may be written. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When creating an account may be offered after a search that found nobody.\n *\n * By id: only when every relevant probe answered an authoritative 404. A record that could not be\n * read is not a record that does not exist, and no admin can delete an AnzuUser, so a duplicate\n * identity created on a guess cannot be taken back.\n *\n * By e-mail: always, because an address search cannot prove absence at all -- a system holding the\n * same person under a different address answers nothing, which is why the second round exists.\n * What makes it safe is that the dialog asks for the id and runs its own authoritative fan-out on\n * it before writing anything; refusing here would put the flow decision 21 describes out of reach\n * of the search people actually use, since the id is the thing they do not know yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * A failed row action says so.\n *\n * The bulk dialog has its log; a single row had nothing -- a 403 on Vypnúť left a spinner, an\n * unchanged row and silence, and the api helpers only write to the logger. The per-admin pages this\n * replaces put every write through `showErrorsDefault`.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** After every write the touched row is read again -- otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read fresh from the server, never from the search results or a form's store: a switch flipped\n // and not saved would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The same promise the panel makes: the dialog has already said whether this account will be\n // switched on, taken from the search result. If the server no longer agrees, somebody changed\n // it in between, and in blog and forum the difference is a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read rather than patch the record: the chip draws from the probe's axes, and replacing\n // only the user left it showing the old state next to a toggle already showing the new one.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have gone while the source was read; nothing is offered then, so nothing is said.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata from the dialog, which was validated against the target's profile: the source may\n // leave `person` empty -- blog fills it for nobody -- where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\n/* ---- bulk ---- */\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** The one place every bulk write passes through, retries included: a system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // What the search showed is captured before anything is written, so the comparison is against the\n // values the operator was actually looking at rather than against a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\n/* ---- create where nobody was found ---- */\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // The first system that is switched on, not the first one listed: a system disabled in the\n // configuration is not among the options, and preselecting it would POST through a client with\n // no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n *\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check the id and\n * the e-mail separately rather than as a pair -- so a typo creates an account with one person's id\n * and another's e-mail, and every later fan-out then follows the wrong identity.\n *\n * The check has to be authoritative too: if a probe answers 401, 403 or nothing, creating is not\n * allowed, because whether that id belongs to somebody is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here and not only by the form, because everything below depends on the\n // fan-out having run: a term the search refuses probes nothing, and the empty result that leaves\n // behind would otherwise read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent: the operator can click outside it and use the menu while the\n // POST is still out. The search after it takes a fresh generation that `cancel()` cannot stop,\n // and would put the new person back into a store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * The chosen target's own profile, not a blanket strict one.\n *\n * The repair dialog is strict on purpose -- it writes to nine places at once -- but this creates\n * one account in one system, and the plan asks for that system's profile. Strict here would demand\n * an avatar colour for a blog account that does not require one.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about having an account in the chosen system -- for blog and forum, a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store is there so a closed dialog does not take a running bulk action with it -- not to keep\n// a person on screen across navigation. Coming back through the menu showed the last one's rows and\n// live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent,\n and calling it \"no account here\" would invite a Create for an account that exists under\n another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered on a row only when the person exists somewhere -- that is the only way\n their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AUserSystemOverview.js","names":["_sfc_main","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","AUserSystemOverview_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// Collector for the metadata form in the create dialog. Without it the rules register\n// on some ancestor, and the dialog cannot validate the fields before sending.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** Bulk actions only write where the person was found, so offer them when at least one of those systems is writable. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When to offer creating an account after a search that found nobody.\n * By id: only if every relevant probe returned an authoritative 404. An\n * unreadable record may exist, and a duplicate identity cannot be deleted.\n * By e-mail: always. An address search cannot prove absence, and the dialog\n * asks for the id and runs its own authoritative check before writing.\n * Refusing here would block the decision 21 flow for the search people actually use, since they do not know the id yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * Report a failed row action to the user.\n * Without this a 403 on Vypnúť leaves a spinner and an unchanged row, because the api helpers only write to the logger.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** The touched row is read again after every write. Otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read from the server, never from search results or a form's store.\n // An unsaved switch would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The dialog already told the operator whether the account will be switched on, based on the search result.\n // If the server disagrees now, someone changed it. In blog and forum that means a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read instead of patching the record. The chip uses the probe's axes, so\n // replacing only the user leaves the chip stale next to an updated toggle.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata comes from the dialog, which was validated against the target's profile.\n // The source may leave `person` empty (blog never fills it) where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** Every bulk write passes through here, retries included. A system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // Captured before any write, so the comparison uses the values the operator saw, not a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // Pick the first enabled system, not the first listed. A system disabled in the configuration\n // is not an option, and preselecting it would POST through a client with no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check id and e-mail separately. A\n * typo would create an account with one person's id and another's e-mail, and later fan-outs follow the wrong identity.\n * If a probe answers 401, 403 or nothing, creating is blocked, because the id's owner is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here, not only by the form. A term the search refuses probes\n // nothing, and that empty result would read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent, so the operator can navigate away while the POST is pending.\n // The following search takes a fresh generation that `cancel()`\n // cannot stop, and would refill the store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * Uses the chosen target's own profile, not a blanket strict one.\n * The repair dialog is strict because it writes to nine systems. This creates one account\n * in one system, and strict would demand an avatar colour that blog does not require.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about an account in the chosen system. For blog and forum it is a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store exists so a closed dialog does not stop a running bulk action, not to keep a person across navigation.\n// Without this reset, returning through the menu showed the last\n// person's rows and live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent.\n Showing \"no account here\" would invite a Create for an account that exists under another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered only when the person exists somewhere. That is the only way their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemOverview.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_VCard","_withCtx","_component_VCardText","_createElementVNode","_component_VTextField","_unref","_withKeys","_withModifiers","_createTextVNode","_toDisplayString","_createCommentVNode","_createBlock","_component_VAlert","_Fragment","_renderList","AUserSystemStatusChip","_component_VChip","_component_VSpacer","_component_VBtn","AUserManageButton","AUserCreateInSystemButton","AUserBulkActionDialog","AUserMetadataRepairDialog","_component_VDialog","ADialogToolbar","_component_VSelect","AUserMetadataForm","_component_VCardActions","ADialogToolbar_default","AUserMetadataForm_default","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","AUserBulkActionDialog_default","AUserMetadataRepairDialog_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","useAlerts","store","useUserCrossSystemStore","useAnzuUserFactory","writes","useUserCrossSystemWrites","v$","useUserCrossSystemSearch","term","ref","rowBusy","runSearch","value","search","records","computed","map","descriptor","user","differences","findMetadataDifferences","foundAnywhere","anyFoundWritable","item","descriptorMayWrite","searchDone","CrossSystemPhase","searchedByEmail","isEmailTerm","canOfferCreateAnywhere","unresolvedSystems","blockedByConflict","labelFor","manageTargetFor","isUndefined","isNull","extraStateFor","EXTRA_STATE_COLOR","reportOutcome","outcome","BulkOutcome","showError","label","t","detailFor","fields","withRowBusy","system","run","next","toggleOne","id","result","enabled","refreshSystem","createFromSource","sourceSystem","source","sourceEnabled","body","createAnzuUser","metadata","cloneDeep","prefillSource","first","bulkOpen","bulkAction","BulkAction","repairOpen","openBulk","action","writableSystems","systems","runBulk","requested","runRepair","payload","seenBefore","createAnywhereOpen","createAnywhereSystem","createAnywhereUser","createAnywhereChecking","createAnywhereConflict","createAnywhereError","left","openCreateAnywhere","confirmCreateAnywhere","createAnywhereRequiredMetadata","createAnywhereNote","createSystemOptions","onBeforeUnmount","cancel","_component_ABtnPrimary","resolveComponent","_component_ABtnTertiary","openBlock","createElementBlock","createVNode","VCard","withCtx","VCardText","createElementVNode","VTextField","_cache","$event","unref","withKeys","withModifiers","createTextVNode","toDisplayString","createCommentVNode","createBlock","VAlert","Fragment","renderList","VChip","VSpacer","isActionable","VBtn","difference","systemValue","VDialog","VSelect","VCardActions"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// A collector for the metadata form inside the create dialog. Without one its rules register\n// against whatever ancestor happens to have an instance, and the dialog's confirm could not ask\n// whether the fields it is about to send are valid.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** The bulk actions only write where the person was found; offer them when at least one of those may be written. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When creating an account may be offered after a search that found nobody.\n *\n * By id: only when every relevant probe answered an authoritative 404. A record that could not be\n * read is not a record that does not exist, and no admin can delete an AnzuUser, so a duplicate\n * identity created on a guess cannot be taken back.\n *\n * By e-mail: always, because an address search cannot prove absence at all -- a system holding the\n * same person under a different address answers nothing, which is why the second round exists.\n * What makes it safe is that the dialog asks for the id and runs its own authoritative fan-out on\n * it before writing anything; refusing here would put the flow decision 21 describes out of reach\n * of the search people actually use, since the id is the thing they do not know yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * A failed row action says so.\n *\n * The bulk dialog has its log; a single row had nothing -- a 403 on Vypnúť left a spinner, an\n * unchanged row and silence, and the api helpers only write to the logger. The per-admin pages this\n * replaces put every write through `showErrorsDefault`.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** After every write the touched row is read again -- otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read fresh from the server, never from the search results or a form's store: a switch flipped\n // and not saved would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The same promise the panel makes: the dialog has already said whether this account will be\n // switched on, taken from the search result. If the server no longer agrees, somebody changed\n // it in between, and in blog and forum the difference is a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read rather than patch the record: the chip draws from the probe's axes, and replacing\n // only the user left it showing the old state next to a toggle already showing the new one.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have gone while the source was read; nothing is offered then, so nothing is said.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata from the dialog, which was validated against the target's profile: the source may\n // leave `person` empty -- blog fills it for nobody -- where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\n/* ---- bulk ---- */\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** The one place every bulk write passes through, retries included: a system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // What the search showed is captured before anything is written, so the comparison is against the\n // values the operator was actually looking at rather than against a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\n/* ---- create where nobody was found ---- */\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // The first system that is switched on, not the first one listed: a system disabled in the\n // configuration is not among the options, and preselecting it would POST through a client with\n // no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n *\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check the id and\n * the e-mail separately rather than as a pair -- so a typo creates an account with one person's id\n * and another's e-mail, and every later fan-out then follows the wrong identity.\n *\n * The check has to be authoritative too: if a probe answers 401, 403 or nothing, creating is not\n * allowed, because whether that id belongs to somebody is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here and not only by the form, because everything below depends on the\n // fan-out having run: a term the search refuses probes nothing, and the empty result that leaves\n // behind would otherwise read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent: the operator can click outside it and use the menu while the\n // POST is still out. The search after it takes a fresh generation that `cancel()` cannot stop,\n // and would put the new person back into a store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * The chosen target's own profile, not a blanket strict one.\n *\n * The repair dialog is strict on purpose -- it writes to nine places at once -- but this creates\n * one account in one system, and the plan asks for that system's profile. Strict here would demand\n * an avatar colour for a blog account that does not require one.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about having an account in the chosen system -- for blog and forum, a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store is there so a closed dialog does not take a running bulk action with it -- not to keep\n// a person on screen across navigation. Coming back through the menu showed the last one's rows and\n// live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent,\n and calling it \"no account here\" would invite a Create for an account that exists under\n another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered on a row only when the person exists somewhere -- that is the only way\n their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AUserSystemOverview.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_VCard","_withCtx","_component_VCardText","_createElementVNode","_component_VTextField","_unref","_withKeys","_withModifiers","_createTextVNode","_toDisplayString","_createCommentVNode","_createBlock","_component_VAlert","_Fragment","_renderList","AUserSystemStatusChip","_component_VChip","_component_VSpacer","_component_VBtn","AUserManageButton","AUserCreateInSystemButton","AUserBulkActionDialog","AUserMetadataRepairDialog","_component_VDialog","ADialogToolbar","_component_VSelect","AUserMetadataForm","_component_VCardActions","ADialogToolbar_default","AUserMetadataForm_default","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","AUserBulkActionDialog_default","AUserMetadataRepairDialog_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","useAlerts","store","useUserCrossSystemStore","useAnzuUserFactory","writes","useUserCrossSystemWrites","v$","useUserCrossSystemSearch","term","ref","rowBusy","runSearch","value","search","records","computed","map","descriptor","user","differences","findMetadataDifferences","foundAnywhere","anyFoundWritable","item","descriptorMayWrite","searchDone","CrossSystemPhase","searchedByEmail","isEmailTerm","canOfferCreateAnywhere","unresolvedSystems","blockedByConflict","labelFor","manageTargetFor","isUndefined","isNull","extraStateFor","EXTRA_STATE_COLOR","reportOutcome","outcome","BulkOutcome","showError","label","t","detailFor","fields","withRowBusy","system","run","next","toggleOne","id","result","enabled","refreshSystem","createFromSource","sourceSystem","source","sourceEnabled","body","createAnzuUser","metadata","cloneDeep","prefillSource","first","bulkOpen","bulkAction","BulkAction","repairOpen","openBulk","action","writableSystems","systems","runBulk","requested","runRepair","payload","seenBefore","createAnywhereOpen","createAnywhereSystem","createAnywhereUser","createAnywhereChecking","createAnywhereConflict","createAnywhereError","left","openCreateAnywhere","confirmCreateAnywhere","createAnywhereRequiredMetadata","createAnywhereNote","createSystemOptions","onBeforeUnmount","cancel","_component_ABtnPrimary","resolveComponent","_component_ABtnTertiary","openBlock","createElementBlock","createVNode","VCard","withCtx","VCardText","createElementVNode","VTextField","_cache","$event","unref","withKeys","withModifiers","createTextVNode","toDisplayString","createCommentVNode","createBlock","VAlert","Fragment","renderList","VChip","VSpacer","isActionable","VBtn","difference","systemValue","VDialog","VSelect","VCardActions"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// Collector for the metadata form in the create dialog. Without it the rules register\n// on some ancestor, and the dialog cannot validate the fields before sending.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** Bulk actions only write where the person was found, so offer them when at least one of those systems is writable. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When to offer creating an account after a search that found nobody.\n * By id: only if every relevant probe returned an authoritative 404. An\n * unreadable record may exist, and a duplicate identity cannot be deleted.\n * By e-mail: always. An address search cannot prove absence, and the dialog\n * asks for the id and runs its own authoritative check before writing.\n * Refusing here would block the decision 21 flow for the search people actually use, since they do not know the id yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * Report a failed row action to the user.\n * Without this a 403 on Vypnúť leaves a spinner and an unchanged row, because the api helpers only write to the logger.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** The touched row is read again after every write. Otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read from the server, never from search results or a form's store.\n // An unsaved switch would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The dialog already told the operator whether the account will be switched on, based on the search result.\n // If the server disagrees now, someone changed it. In blog and forum that means a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read instead of patching the record. The chip uses the probe's axes, so\n // replacing only the user leaves the chip stale next to an updated toggle.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata comes from the dialog, which was validated against the target's profile.\n // The source may leave `person` empty (blog never fills it) where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** Every bulk write passes through here, retries included. A system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // Captured before any write, so the comparison uses the values the operator saw, not a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // Pick the first enabled system, not the first listed. A system disabled in the configuration\n // is not an option, and preselecting it would POST through a client with no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check id and e-mail separately. A\n * typo would create an account with one person's id and another's e-mail, and later fan-outs follow the wrong identity.\n * If a probe answers 401, 403 or nothing, creating is blocked, because the id's owner is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here, not only by the form. A term the search refuses probes\n // nothing, and that empty result would read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent, so the operator can navigate away while the POST is pending.\n // The following search takes a fresh generation that `cancel()`\n // cannot stop, and would refill the store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * Uses the chosen target's own profile, not a blanket strict one.\n * The repair dialog is strict because it writes to nine systems. This creates one account\n * in one system, and strict would demand an avatar colour that blog does not require.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about an account in the chosen system. For blog and forum it is a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store exists so a closed dialog does not stop a running bulk action, not to keep a person across navigation.\n// Without this reset, returning through the menu showed the last\n// person's rows and live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent.\n Showing \"no account here\" would invite a Create for an account that exists under another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered only when the person exists somewhere. That is the only way their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemPanel.js","names":["_sfc_main","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","AUserSystemPanel_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create
|
|
1
|
+
{"version":3,"file":"AUserSystemPanel.js","names":["_sfc_main","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","AUserSystemPanel_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create, because no read-only screen offers a write action.\n * Manage stays because it only navigates.\n */\n readonly?: boolean\n /** Whether the account about to be created would be switched on. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creating?: boolean\n }>(),\n {\n readonly: false,\n createEnabled: false,\n source: null,\n creating: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\nconst { t } = useI18n()\n\n// Provided once per page rather than passed down through every row.\nconst refreshHook = inject(UserSystemRefreshHookKey, undefined)\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { axes, user, probe, cancel } = useUserSystemProbe({ descriptor: props.descriptor, refreshHook })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst label = computed(() => props.descriptor.label ?? props.descriptor.system)\n\n/**\n * The buttons depend on the probe's answer, not on `<Acl>`, except that the descriptor can deny writing (`canWrite`).\n * On a cross-system surface no current user is loaded for other backends, so `can()` would throw and\n * `<Acl>` would render nothing. The probe is the only signal, so its 401 handling must be right.\n */\nconst showManage = computed(\n () =>\n axes.value.load === UserSystemLoad.Loaded &&\n user.value !== null &&\n !isUndefined(props.descriptor.manage) &&\n descriptorMayWrite(props.descriptor, 'update')\n)\nconst showCreate = computed(\n () => !props.readonly && isAuthoritativelyAbsent(axes.value) && descriptorMayWrite(props.descriptor, 'create')\n)\n\nconst manageTarget = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.manage)) return null\n return props.descriptor.manage(user.value)\n})\n\nconst extraState = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.extraState)) return null\n return props.descriptor.extraState(user.value)\n})\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\nconst canRetry = computed(\n () => axes.value.access === UserSystemAccess.Unavailable || axes.value.access === UserSystemAccess.Unauthenticated\n)\n\nconst run = () => probe(props.userId)\n\nonMounted(run)\n\n// The panel is never re-created because `VWindowItem` hides it\n// with `v-show`. A new id has to reach it through this watcher.\nwatch(() => props.userId, run)\n\nonBeforeUnmount(cancel)\n\ndefineExpose({\n refresh: run,\n})\n</script>\n\n<template>\n <div\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`user-system-panel-${descriptor.system}`\"\n >\n <div class=\"font-weight-medium\">{{ label }}</div>\n <AUserSystemStatusChip :axes=\"axes\" />\n <VChip\n v-if=\"extraState\"\n :color=\"EXTRA_STATE_COLOR[extraState.tone]\"\n label\n size=\"small\"\n >\n {{ extraState.label }}: {{ extraState.value }}\n </VChip>\n <div\n v-if=\"user\"\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ user.person.fullName }} · {{ user.email }}\n </div>\n <div\n v-if=\"descriptor.enabledNote\"\n class=\"text-body-small text-medium-emphasis w-100\"\n >\n {{ descriptor.enabledNote }}\n </div>\n <VSpacer />\n <AUserManageButton\n v-if=\"showManage && manageTarget\"\n :target=\"manageTarget\"\n :system-label=\"label\"\n />\n <AUserCreateInSystemButton\n v-if=\"showCreate\"\n :system-label=\"label\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"createEnabled\"\n :loading=\"creating\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"userId\"\n :source=\"source\"\n @confirm=\"(user) => emit('create', descriptor, user)\"\n />\n <VBtn\n v-if=\"canRetry\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"user-system-retry\"\n @click=\"run\"\n >\n {{ t('common.userSystem.button.retry') }}\n </VBtn>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -5,8 +5,8 @@ type __VLS_Props = {
|
|
|
5
5
|
descriptor: AnyUserSystemDescriptor;
|
|
6
6
|
userId: IntegerId;
|
|
7
7
|
/**
|
|
8
|
-
* On a viewing page there is no Create
|
|
9
|
-
*
|
|
8
|
+
* On a viewing page there is no Create, because no read-only screen offers a write action.
|
|
9
|
+
* Manage stays because it only navigates.
|
|
10
10
|
*/
|
|
11
11
|
readonly?: boolean;
|
|
12
12
|
/** Whether the account about to be created would be switched on. */
|
package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","AUserSystemStatusChip","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_createCommentVNode","_component_VSpacer","AUserManageButton","AUserCreateInSystemButton","_component_VBtn","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","refreshHook","inject","UserSystemRefreshHookKey","useUserSystemProbe","label","computed","showManage","axes","UserSystemLoad","user","isUndefined","descriptorMayWrite","showCreate","isAuthoritativelyAbsent","manageTarget","extraState","EXTRA_STATE_COLOR","canRetry","UserSystemAccess","run","probe","onMounted","watch","onBeforeUnmount","cancel","openBlock","createElementBlock","createElementVNode","toDisplayString","createVNode","unref","createBlock","VChip","withCtx","createTextVNode","createCommentVNode","VSpacer","_cache","VBtn","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create
|
|
1
|
+
{"version":3,"file":"AUserSystemPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","AUserSystemStatusChip","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_createCommentVNode","_component_VSpacer","AUserManageButton","AUserCreateInSystemButton","_component_VBtn","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","refreshHook","inject","UserSystemRefreshHookKey","useUserSystemProbe","label","computed","showManage","axes","UserSystemLoad","user","isUndefined","descriptorMayWrite","showCreate","isAuthoritativelyAbsent","manageTarget","extraState","EXTRA_STATE_COLOR","canRetry","UserSystemAccess","run","probe","onMounted","watch","onBeforeUnmount","cancel","openBlock","createElementBlock","createElementVNode","toDisplayString","createVNode","unref","createBlock","VChip","withCtx","createTextVNode","createCommentVNode","VSpacer","_cache","VBtn","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create, because no read-only screen offers a write action.\n * Manage stays because it only navigates.\n */\n readonly?: boolean\n /** Whether the account about to be created would be switched on. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creating?: boolean\n }>(),\n {\n readonly: false,\n createEnabled: false,\n source: null,\n creating: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\nconst { t } = useI18n()\n\n// Provided once per page rather than passed down through every row.\nconst refreshHook = inject(UserSystemRefreshHookKey, undefined)\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { axes, user, probe, cancel } = useUserSystemProbe({ descriptor: props.descriptor, refreshHook })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst label = computed(() => props.descriptor.label ?? props.descriptor.system)\n\n/**\n * The buttons depend on the probe's answer, not on `<Acl>`, except that the descriptor can deny writing (`canWrite`).\n * On a cross-system surface no current user is loaded for other backends, so `can()` would throw and\n * `<Acl>` would render nothing. The probe is the only signal, so its 401 handling must be right.\n */\nconst showManage = computed(\n () =>\n axes.value.load === UserSystemLoad.Loaded &&\n user.value !== null &&\n !isUndefined(props.descriptor.manage) &&\n descriptorMayWrite(props.descriptor, 'update')\n)\nconst showCreate = computed(\n () => !props.readonly && isAuthoritativelyAbsent(axes.value) && descriptorMayWrite(props.descriptor, 'create')\n)\n\nconst manageTarget = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.manage)) return null\n return props.descriptor.manage(user.value)\n})\n\nconst extraState = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.extraState)) return null\n return props.descriptor.extraState(user.value)\n})\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\nconst canRetry = computed(\n () => axes.value.access === UserSystemAccess.Unavailable || axes.value.access === UserSystemAccess.Unauthenticated\n)\n\nconst run = () => probe(props.userId)\n\nonMounted(run)\n\n// The panel is never re-created because `VWindowItem` hides it\n// with `v-show`. A new id has to reach it through this watcher.\nwatch(() => props.userId, run)\n\nonBeforeUnmount(cancel)\n\ndefineExpose({\n refresh: run,\n})\n</script>\n\n<template>\n <div\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`user-system-panel-${descriptor.system}`\"\n >\n <div class=\"font-weight-medium\">{{ label }}</div>\n <AUserSystemStatusChip :axes=\"axes\" />\n <VChip\n v-if=\"extraState\"\n :color=\"EXTRA_STATE_COLOR[extraState.tone]\"\n label\n size=\"small\"\n >\n {{ extraState.label }}: {{ extraState.value }}\n </VChip>\n <div\n v-if=\"user\"\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ user.person.fullName }} · {{ user.email }}\n </div>\n <div\n v-if=\"descriptor.enabledNote\"\n class=\"text-body-small text-medium-emphasis w-100\"\n >\n {{ descriptor.enabledNote }}\n </div>\n <VSpacer />\n <AUserManageButton\n v-if=\"showManage && manageTarget\"\n :target=\"manageTarget\"\n :system-label=\"label\"\n />\n <AUserCreateInSystemButton\n v-if=\"showCreate\"\n :system-label=\"label\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"createEnabled\"\n :loading=\"creating\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"userId\"\n :source=\"source\"\n @confirm=\"(user) => emit('create', descriptor, user)\"\n />\n <VBtn\n v-if=\"canRetry\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"user-system-retry\"\n @click=\"run\"\n >\n {{ t('common.userSystem.button.retry') }}\n </VBtn>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemStatusChip.js","names":["_sfc_main","AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","AUserSystemStatusChip_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n resolveUserSystemState,\n UserSystemState,\n type UserSystemAxes,\n type UserSystemStateType,\n} from '@/domains/anzuUser/utils/userSystemState'\n\nconst props = defineProps<{\n axes: UserSystemAxes\n}>()\n\nconst { t } = useI18n()\n\nconst state = computed<UserSystemStateType>(() => resolveUserSystemState(props.axes))\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"AUserSystemStatusChip.js","names":["_sfc_main","AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","AUserSystemStatusChip_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n resolveUserSystemState,\n UserSystemState,\n type UserSystemAxes,\n type UserSystemStateType,\n} from '@/domains/anzuUser/utils/userSystemState'\n\nconst props = defineProps<{\n axes: UserSystemAxes\n}>()\n\nconst { t } = useI18n()\n\nconst state = computed<UserSystemStateType>(() => resolveUserSystemState(props.axes))\n\n/**\n * Shared appearance for the \"other systems\" table, cross-system rows, bulk-action rows and the log.\n * A text chip, not a tooltip: tooltips do not work on touch, cannot be scanned\n * down a column, and would make \"no account here\" and \"no access\" look alike.\n */\nconst APPEARANCE: Record<UserSystemStateType, { color: string; icon: string; muted: boolean }> = {\n [UserSystemState.Loading]: { color: 'default', icon: 'mdi-dots-horizontal', muted: true },\n [UserSystemState.Enabled]: { color: 'success', icon: 'mdi-check-circle-outline', muted: false },\n [UserSystemState.Disabled]: { color: 'warning', icon: 'mdi-alert-circle-outline', muted: false },\n [UserSystemState.Absent]: { color: 'default', icon: 'mdi-close-circle-outline', muted: false },\n [UserSystemState.Forbidden]: { color: 'default', icon: 'mdi-cancel', muted: false },\n [UserSystemState.Unavailable]: { color: 'error', icon: 'mdi-alert-outline', muted: false },\n [UserSystemState.ConfigDisabled]: { color: 'default', icon: 'mdi-cancel', muted: true },\n}\n\nconst appearance = computed(() => APPEARANCE[state.value])\n</script>\n\n<template>\n <VChip\n :color=\"appearance.color\"\n close-label=\"common.button.remove\"\n :prepend-icon=\"appearance.icon\"\n :class=\"{ 'text-disabled': appearance.muted }\"\n :data-cy=\"`user-system-state-${state}`\"\n label\n size=\"small\"\n >\n {{ t(`common.userSystem.state.${state}`) }}\n </VChip>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VChip","_normalizeClass","_withCtx","_createTextVNode","_toDisplayString","_unref","AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","state","computed","resolveUserSystemState","APPEARANCE","UserSystemState","appearance","openBlock","createBlock","VChip","normalizeClass","withCtx","createTextVNode","toDisplayString","unref","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n resolveUserSystemState,\n UserSystemState,\n type UserSystemAxes,\n type UserSystemStateType,\n} from '@/domains/anzuUser/utils/userSystemState'\n\nconst props = defineProps<{\n axes: UserSystemAxes\n}>()\n\nconst { t } = useI18n()\n\nconst state = computed<UserSystemStateType>(() => resolveUserSystemState(props.axes))\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VChip","_normalizeClass","_withCtx","_createTextVNode","_toDisplayString","_unref","AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","state","computed","resolveUserSystemState","APPEARANCE","UserSystemState","appearance","openBlock","createBlock","VChip","normalizeClass","withCtx","createTextVNode","toDisplayString","unref","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n resolveUserSystemState,\n UserSystemState,\n type UserSystemAxes,\n type UserSystemStateType,\n} from '@/domains/anzuUser/utils/userSystemState'\n\nconst props = defineProps<{\n axes: UserSystemAxes\n}>()\n\nconst { t } = useI18n()\n\nconst state = computed<UserSystemStateType>(() => resolveUserSystemState(props.axes))\n\n/**\n * Shared appearance for the \"other systems\" table, cross-system rows, bulk-action rows and the log.\n * A text chip, not a tooltip: tooltips do not work on touch, cannot be scanned\n * down a column, and would make \"no account here\" and \"no access\" look alike.\n */\nconst APPEARANCE: Record<UserSystemStateType, { color: string; icon: string; muted: boolean }> = {\n [UserSystemState.Loading]: { color: 'default', icon: 'mdi-dots-horizontal', muted: true },\n [UserSystemState.Enabled]: { color: 'success', icon: 'mdi-check-circle-outline', muted: false },\n [UserSystemState.Disabled]: { color: 'warning', icon: 'mdi-alert-circle-outline', muted: false },\n [UserSystemState.Absent]: { color: 'default', icon: 'mdi-close-circle-outline', muted: false },\n [UserSystemState.Forbidden]: { color: 'default', icon: 'mdi-cancel', muted: false },\n [UserSystemState.Unavailable]: { color: 'error', icon: 'mdi-alert-outline', muted: false },\n [UserSystemState.ConfigDisabled]: { color: 'default', icon: 'mdi-cancel', muted: true },\n}\n\nconst appearance = computed(() => APPEARANCE[state.value])\n</script>\n\n<template>\n <VChip\n :color=\"appearance.color\"\n close-label=\"common.button.remove\"\n :prepend-icon=\"appearance.icon\"\n :class=\"{ 'text-disabled': appearance.muted }\"\n :data-cy=\"`user-system-state-${state}`\"\n label\n size=\"small\"\n >\n {{ t(`common.userSystem.state.${state}`) }}\n </VChip>\n</template>\n"],"mappings":";;;;;;;;;EAUA,IAAMS,IAAQC,GAIR,EAAE,SAAMC,EAAQ,GAEhBC,IAAQC,QAAoCC,EAAuBL,EAAM,IAAI,CAAC,GAO9EM,IAA2F;IAC9FC,EAAgB,UAAU;IAAE,OAAO;IAAW,MAAM;IAAuB,OAAO;GAAK;IACvFA,EAAgB,UAAU;IAAE,OAAO;IAAW,MAAM;IAA4B,OAAO;GAAM;IAC7FA,EAAgB,WAAW;IAAE,OAAO;IAAW,MAAM;IAA4B,OAAO;GAAM;IAC9FA,EAAgB,SAAS;IAAE,OAAO;IAAW,MAAM;IAA4B,OAAO;GAAM;IAC5FA,EAAgB,YAAY;IAAE,OAAO;IAAW,MAAM;IAAc,OAAO;GAAM;IACjFA,EAAgB,cAAc;IAAE,OAAO;IAAS,MAAM;IAAqB,OAAO;GAAM;IACxFA,EAAgB,iBAAiB;IAAE,OAAO;IAAW,MAAM;IAAc,OAAO;GAAK;EACxF,GAEMC,IAAaJ,QAAeE,EAAWH,EAAM,MAAM;E,kBAIvDZ,EAAA,GAAAC,EAUQC,GAAA;GATL,OAAOe,EAAA,MAAW;GACnB,eAAY;GACX,gBAAcA,EAAA,MAAW;GACzB,OAAKd,EAAA,EAAA,iBAAqBc,EAAA,MAAW,MAAK,CAAA;GAC1C,WAAO,qBAAuBL,EAAA;GAC/B,OAAA;GACA,MAAK;;GAEL,SAAAR,QAA2C,CAAxCC,EAAAC,EAAAC,EAAAmB,CAAA,CAAC,CAAA,2BAA4Bd,EAAA,OAAK,CAAA,GAAA,CAAA,C"}
|