@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +39 -29
- package/src/e2e/conventions.d.mts +4 -0
- package/src/e2e/conventions.mjs +15 -0
- package/src/e2e/index.d.mts +8 -0
- package/src/e2e/index.mjs +1 -0
- package/src/e2e/routeWalk.d.mts +43 -0
- package/src/e2e/routeWalk.mjs +606 -0
- package/src/e2e/types.d.mts +161 -0
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- package/src/vite/sourcemaps.mjs +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserManageButton.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VTooltip","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_createVNode","_component_VBtn","_createTextVNode","_toDisplayString","_unref","AUserManageButton_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","isExternal","computed","missingUrl","href","to","label","t","openBlock","createBlock","VTooltip","withCtx","tooltipProps","createElementVNode","normalizeProps","guardReactiveProps","createVNode","VBtn","createTextVNode","toDisplayString","unref"],"sources":["../../../../src/domains/anzuUser/components/AUserManageButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { UserSystemManageTarget } from '@/domains/anzuUser/composables/userSystemDescriptor'\n\nconst props = withDefaults(\n defineProps<{\n target: UserSystemManageTarget\n
|
|
1
|
+
{"version":3,"file":"AUserManageButton.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VTooltip","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_createVNode","_component_VBtn","_createTextVNode","_toDisplayString","_unref","AUserManageButton_vue_vue_type_script_setup_true_lang_default","props","__props","useI18n","isExternal","computed","missingUrl","href","to","label","t","openBlock","createBlock","VTooltip","withCtx","tooltipProps","createElementVNode","normalizeProps","guardReactiveProps","createVNode","VBtn","createTextVNode","toDisplayString","unref"],"sources":["../../../../src/domains/anzuUser/components/AUserManageButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { UserSystemManageTarget } from '@/domains/anzuUser/composables/userSystemDescriptor'\n\nconst props = withDefaults(\n defineProps<{\n target: UserSystemManageTarget\n systemLabel: string\n /** \"Edit\" instead of \"Manage in X\" -- used where the operator is already in that admin. */\n internalLabel?: string | undefined\n }>(),\n {\n internalLabel: undefined,\n }\n)\n\nconst { t } = useI18n()\n\nconst isExternal = computed(() => props.target.kind === 'external')\n\n/** A missing url means the template is configured but absent. Show the reason instead of a silently disabled button. */\nconst missingUrl = computed(() => props.target.kind === 'external' && props.target.href === null)\n\nconst href = computed(() => (props.target.kind === 'external' ? (props.target.href ?? undefined) : undefined))\nconst to = computed(() => (props.target.kind === 'internal' ? props.target.to : undefined))\n\nconst label = computed(() =>\n isExternal.value\n ? t('common.userSystem.button.manageIn', { system: props.systemLabel })\n : (props.internalLabel ?? t('common.userSystem.button.edit'))\n)\n</script>\n\n<template>\n <VTooltip\n :disabled=\"!missingUrl\"\n location=\"top\"\n >\n <template #activator=\"{ props: tooltipProps }\">\n <!--\n An anchor, not a click handler, so middle-click, open in new tab and screen reader announcements work.\n This is also why the tab bar never navigates: `VTab` renders `role=\"tab\"` and cannot carry a link.\n -->\n <span v-bind=\"tooltipProps\">\n <VBtn\n :to=\"to\"\n :href=\"href\"\n :target=\"isExternal ? '_blank' : undefined\"\n :rel=\"isExternal ? 'noopener' : undefined\"\n :append-icon=\"isExternal ? 'mdi-open-in-new' : undefined\"\n :variant=\"isExternal ? 'outlined' : 'flat'\"\n :color=\"isExternal ? undefined : 'primary'\"\n :disabled=\"missingUrl\"\n size=\"small\"\n data-cy=\"user-system-manage\"\n >\n {{ label }}\n </VBtn>\n </span>\n </template>\n {{ t('common.userSystem.manageMissingUrl') }}\n </VTooltip>\n</template>\n"],"mappings":";;;;;;;;;;;;;EAKA,IAAMa,IAAQC,GAYR,EAAE,SAAMC,EAAQ,GAEhBC,IAAaC,QAAeJ,EAAM,OAAO,SAAS,UAAU,GAG5DK,IAAaD,QAAeJ,EAAM,OAAO,SAAS,cAAcA,EAAM,OAAO,SAAS,IAAI,GAE1FM,IAAOF,QAAgBJ,EAAM,OAAO,SAAS,aAAcA,EAAM,OAAO,QAAQ,KAAA,IAAa,KAAA,CAAU,GACvGO,IAAKH,QAAgBJ,EAAM,OAAO,SAAS,aAAaA,EAAM,OAAO,KAAK,KAAA,CAAU,GAEpFQ,IAAQJ,QACZD,EAAW,QACPM,EAAE,qCAAqC,EAAE,QAAQT,EAAM,YAAY,CAAC,IACnEA,EAAM,iBAAiBS,EAAE,+BAA+B,CAC/D;E,kBAIEtB,EAAA,GAAAC,EA2BWC,GAAA;GA1BR,UAAQ,CAAGgB,EAAA;GACZ,UAAS;;GAEE,WAASf,GAoBX,EAAA,OApBsBwB,QAAY,CAKzCvB,EAeO,QAAAC,EAAAC,EAfOqB,CAAY,CAAA,GAAA,CACxBpB,EAaOC,GAAA;IAZJ,IAAIY,EAAA;IACJ,MAAMD,EAAA;IACN,QAAQH,EAAA,QAAU,WAAc,KAAA;IAChC,KAAKA,EAAA,QAAU,aAAgB,KAAA;IAC/B,eAAaA,EAAA,QAAU,oBAAuB,KAAA;IAC9C,SAASA,EAAA,QAAU,aAAA;IACnB,OAAOA,EAAA,QAAa,KAAA,IAAS;IAC7B,UAAUE,EAAA;IACX,MAAK;IACL,WAAQ;;IAER,SAAAf,QAAW,CAARM,EAAAC,EAAAW,EAAA,KAAK,GAAA,CAAA,C;;;;;;;;;;;;GAGH,SAAAlB,QACX,CADWM,EAAA,MACXC,EAAGC,EAAAW,CAAA,CAAC,CAAA,oCAAA,CAAA,GAAA,CAAA,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserMetadataForm.js","names":["_sfc_main","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","AUserMetadataForm_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`). The cross-system repair form passes\n * `true` outright: it writes to nine places at once, and a loose form could put an empty name\n * into cms -- a record cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is typed in at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this makes three states, which one `readonly` could not express: not drawn,\n * editable, or shown read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do today. Deliberately not passed by the\n * cross-system repair form: it is always strict, so it would invent a colour on open and mark\n * it as a change in every system at once.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * A dirty flag, not a checkbox: the two derived fields stay ordinary inputs that recompute while\n * nobody has touched them, and stop the moment somebody does.\n *\n * The flags are seeded from the data rather than starting clean. A stored value that differs from\n * what the names would produce was set on purpose -- the cms fixtures carry `Anzu` + `User 1` with\n * a full name of `Anzu User1` -- and renaming the person must not silently overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record itself is replaced, not only when its id changes.\n *\n * The id is not enough: the metadata repair dialog swaps between two systems' records *for the\n * same person*, so the id never moves. Without this the flags would still describe the record\n * before the swap, and a deliberate full name in the newly chosen source would be overwritten by\n * one derived from its names -- silently discarding the very value the operator picked as the\n * source of truth.\n *\n * Declared before the derive watcher below so it runs first: the flags are up to date before\n * anything decides whether to recompute.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names themselves rather than on an array, whose identity is new on every read --\n// that alone would make this fire on any object replacement, including one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states, not two. Not drawn where the backend resolves the id itself; a plain\n field while creating; read-only once the record exists, because it is the primary key\n every other system looks this person up by.\n -->\n <!--\n `.number` is not decoration and it is not inert on a component: Vue applies model\n modifiers inside `emit`, so without it the field hands back the string \"42\" against a\n declared `IntegerIdNullable`, and that string is what the create body carries. Every\n admin that draws this field binds it the same way.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` only fires on a real edit: assigning from the watcher above goes\n through the model, not through the field, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AUserMetadataForm.js","names":["_sfc_main","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","AUserMetadataForm_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`).\n * The cross-system repair form always passes `true`. It writes to many systems, and a loose\n * form could put an empty name into cms, which cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do.\n * Deliberately not passed by the cross-system repair form. It is strict, so\n * it would invent a colour on open and mark it as a change in every system.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * Dirty flags: the derived fields recompute until someone edits them, then stop.\n * Flags are seeded from the data. A stored value that differs from the derived one was set on purpose\n * (cms fixtures have `Anzu` + `User 1` with full name `Anzu User1`), and renaming must not overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record is replaced, not only when its id changes.\n * The metadata repair dialog swaps between two systems' records for the same person, so the\n * id stays the same. Stale flags would overwrite the chosen source's deliberate full name.\n * Declared before the derive watcher so the flags are updated first.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names as a string, not an array. A new array on every read\n// would fire on any object replacement, even one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states: not drawn where the backend resolves the id; editable while creating; read-only\n once the record exists, because every other system looks the person up by this key.\n -->\n <!--\n `.number` is required. Vue applies model modifiers inside `emit`, so without it the field\n returns the string \"42\" for an `IntegerIdNullable`, and the create body carries that string.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` fires only on a real edit. The watcher assigns\n through the model, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":""}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { BaseUser } from '../../../shared/types/AnzuUser';
|
|
2
2
|
type __VLS_Props = {
|
|
3
3
|
/**
|
|
4
|
-
* The system's validation profile (`requiredMetadata`).
|
|
5
|
-
* `true
|
|
6
|
-
*
|
|
4
|
+
* The system's validation profile (`requiredMetadata`).
|
|
5
|
+
* The cross-system repair form always passes `true`. It writes to many systems, and a loose
|
|
6
|
+
* form could put an empty name into cms, which cms's own form would then refuse to save.
|
|
7
7
|
*/
|
|
8
8
|
required?: boolean;
|
|
9
9
|
/**
|
|
10
|
-
* Whether the id is
|
|
11
|
-
* With `isEdit` this
|
|
12
|
-
* editable, or shown read-only.
|
|
10
|
+
* Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.
|
|
11
|
+
* With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.
|
|
13
12
|
*/
|
|
14
13
|
idInput?: boolean;
|
|
15
14
|
isEdit?: boolean;
|
|
16
15
|
readonly?: boolean;
|
|
17
16
|
/**
|
|
18
|
-
* Random colour on an empty value, as all four admins do
|
|
19
|
-
* cross-system repair form
|
|
20
|
-
* it as a change in every system
|
|
17
|
+
* Random colour on an empty value, as all four admins do.
|
|
18
|
+
* Deliberately not passed by the cross-system repair form. It is strict, so
|
|
19
|
+
* it would invent a colour on open and mark it as a change in every system.
|
|
21
20
|
*/
|
|
22
21
|
randomColor?: boolean;
|
|
23
22
|
/** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserMetadataForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ASystemEntityScope","_withCtx","_createVNode","_component_VRow","_component_VCol","_component_VAlert","_createTextVNode","_toDisplayString","_createCommentVNode","AFormTextField","_unref","ARow","ACopyText","AAvatarColorPicker","_createElementBlock","ARow_default","AFormTextField_default","ASystemEntityScope_default","ACopyText_default","AAvatarColorPicker_default","_hoisted_1","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","ANZU_USER_ENTITY","\"user\"","\"userModifiers\"","props","__props","user","useModel","useI18n","useUserMetadataValidation","derivedFullName","firstName","lastName","derivedAvatarText","fullNameTouched","ref","avatarTextTouched","seedTouchedFlags","onMounted","watch","next","previous","openBlock","createBlock","withCtx","createVNode","VRow","VCol","VAlert","createTextVNode","toDisplayString","createCommentVNode","_cache","$event","unref","v$","t","createElementBlock"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`). The cross-system repair form passes\n * `true` outright: it writes to nine places at once, and a loose form could put an empty name\n * into cms -- a record cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is typed in at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this makes three states, which one `readonly` could not express: not drawn,\n * editable, or shown read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do today. Deliberately not passed by the\n * cross-system repair form: it is always strict, so it would invent a colour on open and mark\n * it as a change in every system at once.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * A dirty flag, not a checkbox: the two derived fields stay ordinary inputs that recompute while\n * nobody has touched them, and stop the moment somebody does.\n *\n * The flags are seeded from the data rather than starting clean. A stored value that differs from\n * what the names would produce was set on purpose -- the cms fixtures carry `Anzu` + `User 1` with\n * a full name of `Anzu User1` -- and renaming the person must not silently overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record itself is replaced, not only when its id changes.\n *\n * The id is not enough: the metadata repair dialog swaps between two systems' records *for the\n * same person*, so the id never moves. Without this the flags would still describe the record\n * before the swap, and a deliberate full name in the newly chosen source would be overwritten by\n * one derived from its names -- silently discarding the very value the operator picked as the\n * source of truth.\n *\n * Declared before the derive watcher below so it runs first: the flags are up to date before\n * anything decides whether to recompute.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names themselves rather than on an array, whose identity is new on every read --\n// that alone would make this fire on any object replacement, including one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states, not two. Not drawn where the backend resolves the id itself; a plain\n field while creating; read-only once the record exists, because it is the primary key\n every other system looks this person up by.\n -->\n <!--\n `.number` is not decoration and it is not inert on a component: Vue applies model\n modifiers inside `emit`, so without it the field hands back the string \"42\" against a\n declared `IntegerIdNullable`, and that string is what the create body carries. Every\n admin that draws this field binds it the same way.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` only fires on a real edit: assigning from the watcher above goes\n through the model, not through the field, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AUserMetadataForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ASystemEntityScope","_withCtx","_createVNode","_component_VRow","_component_VCol","_component_VAlert","_createTextVNode","_toDisplayString","_createCommentVNode","AFormTextField","_unref","ARow","ACopyText","AAvatarColorPicker","_createElementBlock","ARow_default","AFormTextField_default","ASystemEntityScope_default","ACopyText_default","AAvatarColorPicker_default","_hoisted_1","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","ANZU_USER_ENTITY","\"user\"","\"userModifiers\"","props","__props","user","useModel","useI18n","useUserMetadataValidation","derivedFullName","firstName","lastName","derivedAvatarText","fullNameTouched","ref","avatarTextTouched","seedTouchedFlags","onMounted","watch","next","previous","openBlock","createBlock","withCtx","createVNode","VRow","VCol","VAlert","createTextVNode","toDisplayString","createCommentVNode","_cache","$event","unref","v$","t","createElementBlock"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`).\n * The cross-system repair form always passes `true`. It writes to many systems, and a loose\n * form could put an empty name into cms, which cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do.\n * Deliberately not passed by the cross-system repair form. It is strict, so\n * it would invent a colour on open and mark it as a change in every system.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * Dirty flags: the derived fields recompute until someone edits them, then stop.\n * Flags are seeded from the data. A stored value that differs from the derived one was set on purpose\n * (cms fixtures have `Anzu` + `User 1` with full name `Anzu User1`), and renaming must not overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record is replaced, not only when its id changes.\n * The metadata repair dialog swaps between two systems' records for the same person, so the\n * id stays the same. Stale flags would overwrite the chosen source's deliberate full name.\n * Declared before the derive watcher so the flags are updated first.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names as a string, not an array. A new array on every read\n// would fire on any object replacement, even one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states: not drawn where the backend resolves the id; editable while creating; read-only\n once the record exists, because every other system looks the person up by this key.\n -->\n <!--\n `.number` is required. Vue applies model modifiers inside `emit`, so without it the field\n returns the string \"42\" for an `IntegerIdNullable`, and the create body carries that string.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` fires only on a real edit. The watcher assigns\n through the model, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserMetadataRepairDialog.js","names":["_sfc_main","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","AUserMetadataRepairDialog_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector. Without it the strict rules only showed asterisks: nothing asked them\n// before writing, and a source with an empty name or colour -- blog's `person` is empty for most\n// accounts, cms never required a colour -- was written as blank into every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Which systems the write goes to. Ticked by default, and untickable one by one -- the same shape\n * as the enable/disable dialog, because an operator who knows one system's value is deliberately\n * different needs a way to leave it out that is not \"abort the whole repair\".\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, exactly as the enable/disable one does.\n *\n * Closing on confirm is what made a failed repair invisible: the outcomes went into the shared log\n * with nothing rendering them, so a 422 on one system looked the same as a repair that worked.\n */\nconst showingLog = ref(false)\n\n/**\n * The pre-fill comes from the first system in the configured order that has a record -- never from\n * whichever answered first, since the fan-out is parallel and that would differ every run.\n *\n * And the source is not hidden: it is named here and can be changed, so the order in the config is\n * a default rather than a rule nobody can see.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only the systems whose stored value differs and that may be written. Nothing else is offered, let alone written to. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\n/** What confirm would actually write to: the differing systems that are still ticked. */\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Everything that differs, ticked, whenever the set changes -- on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** The same value again, to the systems it did not reach. 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids behind one e-mail. Writing under either of them would put this person's metadata\n on somebody else's account, and no admin can delete an AnzuUser afterwards.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target systems' own profiles say: this writes to up to nine\n places at once, and a loose form could put an empty name into cms -- a record cms's own\n form would then refuse to save.\n\n `randomColor` is deliberately not passed. The form is strict, so it would invent a colour\n the moment the dialog opens and mark it as a change in every system at once.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AUserMetadataRepairDialog.js","names":["_sfc_main","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","AUserMetadataRepairDialog_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector, so the strict rules are checked before writing. Without it an empty\n// name or colour from the source (common in blog and cms) was written blank to every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Target systems. Ticked by default and untickable one by one, like the enable/disable\n * dialog, so an operator can skip a system whose value is intentionally different.\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, like the enable/disable one.\n * Closing on confirm hid failures: a 422 on one system looked like a successful repair.\n */\nconst showingLog = ref(false)\n\n/**\n * Pre-fill from the first system in configured order that has a record, not\n * the first to answer. The fan-out is parallel, so that would differ per run.\n * The source is shown and can be changed.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only systems whose value differs and that may be written. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Re-tick everything that differs whenever the set changes: on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** Retries the same value on systems it did not reach, 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids share one e-mail. Writing under either could put this person's\n metadata on someone else's account, and no admin can delete an AnzuUser.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target profiles say. It writes to many systems, and a loose\n form could put an empty name into cms, which cms's form would then refuse to save.\n `randomColor` is deliberately not passed: the strict form would\n invent a colour on open and mark it as a change everywhere.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_resolveComponent","_openBlock","_createBlock","_component_VDialog","_withCtx","_createVNode","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VAlert","_createCommentVNode","_component_VSelect","AUserMetadataForm","_createElementVNode","_createElementBlock","_Fragment","_renderList","_component_VCheckbox","AUserSystemStatusChip","_component_VCardActions","_withModifiers","_component_VSpacer","ADialogToolbar_default","AUserMetadataForm_default","AUserSystemStatusChip_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","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","useI18n","store","useUserCrossSystemStore","v$","records","computed","map","descriptor","user","sourceSystem","ref","target","selected","showingLog","watch","value","order","pickPrefillSource","source","isUndefined","cloneDeep","system","sourceOptions","mayUpdate","item","descriptorMayWrite","allDiffering","systemsNeedingWrite","differing","differingWithoutRight","affected","systems","changes","current","USER_METADATA_FIELDS","readMetadataField","field","currentLog","entry","BulkAction","failed","BulkOutcome","noteFor","labelFor","confirm","retryFailed","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createBlock","VDialog","_cache","$event","withCtx","createVNode","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VAlert","createCommentVNode","VSelect","createElementVNode","createElementBlock","Fragment","renderList","VCheckbox","change","VCardActions","withModifiers","VSpacer"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector. Without it the strict rules only showed asterisks: nothing asked them\n// before writing, and a source with an empty name or colour -- blog's `person` is empty for most\n// accounts, cms never required a colour -- was written as blank into every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Which systems the write goes to. Ticked by default, and untickable one by one -- the same shape\n * as the enable/disable dialog, because an operator who knows one system's value is deliberately\n * different needs a way to leave it out that is not \"abort the whole repair\".\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, exactly as the enable/disable one does.\n *\n * Closing on confirm is what made a failed repair invisible: the outcomes went into the shared log\n * with nothing rendering them, so a 422 on one system looked the same as a repair that worked.\n */\nconst showingLog = ref(false)\n\n/**\n * The pre-fill comes from the first system in the configured order that has a record -- never from\n * whichever answered first, since the fan-out is parallel and that would differ every run.\n *\n * And the source is not hidden: it is named here and can be changed, so the order in the config is\n * a default rather than a rule nobody can see.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only the systems whose stored value differs and that may be written. Nothing else is offered, let alone written to. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\n/** What confirm would actually write to: the differing systems that are still ticked. */\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Everything that differs, ticked, whenever the set changes -- on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** The same value again, to the systems it did not reach. 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids behind one e-mail. Writing under either of them would put this person's metadata\n on somebody else's account, and no admin can delete an AnzuUser afterwards.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target systems' own profiles say: this writes to up to nine\n places at once, and a loose form could put an empty name into cms -- a record cms's own\n form would then refuse to save.\n\n `randomColor` is deliberately not passed. The form is strict, so it would invent a colour\n the moment the dialog opens and mark it as a change in every system at once.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,IAAM8C,IAAQC,GAIRC,IAAOH,GAIPI,IAAOjD,GAAoB+C,GAAC,MAA0B,GAEtD,EAAE,SAAMI,GAAQ,GAChBC,IAAQC,GAAwB,GAKhCC,KAAKzB,GAAa,GAElB0B,IAAUC,QAAe;GAC7B,IAAMC,oBAAM,IAAI,IAAsB;GACtC,KAAK,IAAMC,KAAcZ,EAAM,aAAa;IAC1C,IAAMa,IAAOP,EAAM,QAAQ,IAAIM,EAAW,MAAM,CAAC,EAAE;IACnD,AAAIC,KAAMF,EAAI,IAAIC,EAAW,QAAQC,CAAI;GAC3C;GACA,OAAOF;EACT,CAAC,GAEKG,IAAeC,EAAmB,IAAI,GACtCC,IAASD,EAAqB,IAAI,GAMlCE,IAAWF,EAAc,CAAC,CAAC,GAO3BG,IAAaH,EAAI,EAAK;EAwB5B,AAfAI,EACEhB,IACC,MAAU;GACT,IAAI,CAACiB,GAAO;GACZ,EAAW,QAAQ;GACnB,IAAMC,IAAQrB,EAAM,YAAY,KAAK,MAAeY,EAAW,MAAM;GACrE,EAAa,QAAQU,GAAkBD,GAAOZ,EAAQ,KAAK;GAC3D,IAAMc,IAAST,EAAa,UAAU,OAAO,KAAA,IAAYL,EAAQ,MAAM,IAAIK,EAAa,KAAK;GAC7F,EAAO,QAAQU,EAAYD,CAAM,IAC7B,OACAE,EAAU;IAAE,IAAIF,EAAO;IAAI,OAAOA,EAAO;IAAO,QAAQA,EAAO;IAAQ,QAAQA,EAAO;GAAO,CAAC;EACpG,GACA,EAAE,WAAW,GAAK,CACpB,GAEAJ,EAAML,IAAe,MAAW;GAC9B,IAAIY,MAAW,MAAM;GACrB,IAAMH,IAASd,EAAQ,MAAM,IAAIiB,CAAM;GACvC,AAAIF,EAAYD,CAAM,MACtB,EAAO,QAAQE,EAAU;IAAE,IAAIF,EAAO;IAAI,OAAOA,EAAO;IAAO,QAAQA,EAAO;IAAQ,QAAQA,EAAO;GAAO,CAAC;EAC/G,CAAC;EAED,IAAMI,KAAgBjB,QACpBV,EAAM,YACH,QAAQ,MAAeS,EAAQ,MAAM,IAAIG,EAAW,MAAM,CAAC,CAAA,CAC3D,KAAK,OAAgB;GAAE,OAAOA,EAAW;GAAQ,OAAOA,EAAW,SAASA,EAAW;EAAO,EAAE,CACrG,GAEMgB,KAAa,MAAmB;GACpC,IAAMhB,IAAaZ,EAAM,YAAY,MAAM,MAAS6B,EAAK,WAAWH,CAAM;GAC1E,OAAOF,EAAYZ,CAAU,KAAKkB,EAAmBlB,GAAY,QAAQ;EAC3E,GAEMmB,IAAerB,QAAgBM,EAAO,UAAU,OAAO,CAAC,IAAIgB,EAAoBhB,EAAO,OAAOP,EAAQ,KAAK,CAAE,GAG7GwB,IAAYvB,QAAeqB,EAAa,MAAM,OAAOH,CAAS,CAAC,GAG/DM,KAAwBxB,QAAeqB,EAAa,MAAM,QAAQ,MAAW,CAACH,EAAUF,CAAM,CAAC,CAAC,GAGhGS,IAAWzB,QAAeuB,EAAU,MAAM,QAAQ,MAAWhB,EAAS,MAAM,SAASS,CAAM,CAAC,CAAC;EAGnG,EACEO,IACC,MAAY;GACX,EAAS,QAAQ,CAAC,GAAGG,CAAO;EAC9B,GACA,EAAE,WAAW,GAAK,CACpB;EAEA,IAAMC,KAAU3B,QACVM,EAAO,UAAU,OAAa,CAAC,IAC5BiB,EAAU,MAAM,SAAS,MAAW;GACzC,IAAMK,IAAU7B,EAAQ,MAAM,IAAIiB,CAAM;GAExC,OADIF,EAAYc,CAAO,IAAU,CAAC,IAC3BC,GAAqB,QACzB,MAAUC,EAAkBF,GAASG,CAAK,MAAMD,EAAkBxB,EAAO,OAAmByB,CAAK,CACpG,CAAC,CAAC,KAAK,OAAW;IAChB;IACA;IACA,MAAMD,EAAkBF,GAASG,CAAK;IACtC,IAAID,EAAkBxB,EAAO,OAAmByB,CAAK;GACvD,EAAE;EACJ,CAAC,CACF,GAEKC,IAAahC,QACjBJ,EAAM,QAAQ,QAAQ,MAAUqC,EAAM,WAAWC,EAAW,YAAYD,EAAM,cAAcrC,EAAM,UAAU,CAC9G,GAEMuC,IAASnC,QACbgC,EAAW,MAAM,QAAQ,MAAUC,EAAM,YAAYG,EAAY,QAAQH,EAAM,YAAYG,EAAY,OAAO,CAChH,GAEMC,KAAW,MAAmB/C,EAAM,YAAY,MAAM,MAAS6B,EAAK,WAAWH,CAAM,CAAC,EAAE,cAExFsB,KAAY,MAAmBhD,EAAM,YAAY,MAAM,MAAS6B,EAAK,WAAWH,CAAM,CAAC,EAAE,SAASA,GAElGuB,KAAU,YAAY;GAC1B,AAAIjC,EAAO,UAAU,QAAQV,EAAM,qBAAqB,QAAQ6B,EAAS,MAAM,WAAW,KAEpF,MAAM3B,GAAG,MAAM,UAAU,MAC/B,EAAW,QAAQ,IACnBN,EAAK,WAAW;IAAE,QAAQc,EAAO;IAAO,SAASmB,EAAS;GAAM,CAAC;EACnE,GAGMe,WAAoB;GACxB,AAAIlC,EAAO,UAAU,QACrBd,EAAK,WAAW;IAAE,QAAQc,EAAO;IAAO,SAAS6B,EAAO,MAAM,KAAK,MAAUF,EAAM,MAAM;GAAE,CAAC;EAC9F;;;GAIE,OAAAvF,EAAA,GAAAC,EA+IUC,IAAA;IA9IC,YAAA6C,EAAA;IAAA,uBAAA,AAAAsD,EAAA,QAAA,MAAA,EAAI,QAAAC;IACZ,aAAW;IACZ,WAAQ;;IAER,SAAAnG,QAyIQ,CAzIRC,EAyIQC,IAAA,MAAA;KAxIN,SAAAF,QAEiB;MAFjBC,EAEiBE,GAAA,EAFA,UAAM,AAAA+F,EAAA,QAAA,MAAE,EAAA,QAAI,G;OAC3B,SAAAlG,QAAyC,CAAtCI,EAAAC,EAAAC,EAAAoG,CAAA,CAAC,CAAA,gCAAA,CAAA,GAAA,CAAA,C;;;MAEWjD,EAAA,SAAM,CAAKE,EAAA,SAA5B9D,EAAA,GAAAC,EAwFYS,GAAA,EAAA,KAAA,EAAA,GAAA;OAnFV,SAAAP,QASS;QARDM,EAAAyC,CAAA,CAAK,CAAC,oBADdlD,EAAA,GAAAC,EASSU,IAAA;;SAPP,MAAK;SACL,SAAQ;SACR,SAAQ;SACR,OAAM;SACN,WAAQ;;SAER,SAAAR,QAAoD,CAAjDI,EAAAC,EAAAC,EAAAoG,CAAA,CAAC,CAAA,2CAAA,CAAA,GAAA,CAAA,C;;;QAENzG,EAMES,IAAA;SALS,YAAA6C,EAAA;SAAA,uBAAA,AAAA2C,EAAA,QAAA,MAAA,EAAY,QAAAC;SACpB,OAAO/B,GAAA;SACP,OAAO9D,EAAAoG,CAAA,CAAC,CAAA,iCAAA;SACT,SAAQ;SACR,WAAQ;;;;;;QAUVzG,EAKEU,GAAA;SAJQ,MAAM8C,EAAA;SAAA,iBAAA,AAAAyC,EAAA,QAAA,MAAA,EAAM,QAAAC;SACpB,UAAA;SACC,YAAU;SACX,WAAA;;QAEFvF,EAAoF,OAApFa,IAAoFpB,EAA9CC,EAAAoG,CAAA,CAAC,CAAA,kCAAA,CAAA,GAAA,CAAA;SACvC7G,EAAA,EAAA,GAAAgB,EAmCMC,GAAA,MAAAC,EAlCa2D,EAAA,QAAV,OADT7E,EAAA,GAAAgB,EAmCM,OAAA;SAjCH,KAAKsD;SACN,OAAM;Q,IAENlE,EAOEe,GAAA;SANS,YAAA0C,EAAA;SAAA,uBAAA,AAAAwC,EAAA,QAAA,MAAA,EAAQ,QAAAC;SAChB,OAAOhC;SACP,UAAQ,CAAA,CAAI7D,EAAAyC,CAAA,CAAK,CAAC;SAClB,WAAO,iBAAmBoB;SAC3B,SAAQ;SACR,gBAAA;;;;;;Q,IAEFvD,EAqBM,OAAA,MAAA;SApBJA,EAMM,OANNc,IAMM,CALJd,EAA8D,QAA9De,IAA8DtB,EAA1BoF,EAAStB,CAAM,CAAA,GAAA,CAAA,GAE3C7D,EAAAyC,CAAA,CAAK,CAAC,QAAQ,IAAIoB,CAAM,KADhCtE,EAAA,GAAAC,EAGEmB,IAAA;;UADC,MAAMX,EAAAyC,CAAA,CAAK,CAAC,QAAQ,IAAIoB,CAAM,CAAA,CAAG;;SAI9BqB,EAAQrB,CAAM,KADtBtE,EAAA,GAAAgB,EAKM,OALNe,IAKMvB,EADDmF,EAAQrB,CAAM,CAAA,GAAA,CAAA,K;UAEnBtE,EAAA,EAAA,GAAAgB,EAMMC,GAAA,MAAAC,EALa+D,GAAA,MAAQ,QAAQ,MAASR,EAAK,WAAWH,CAAM,IAAzD,OADTtE,EAAA,GAAAgB,EAMM,OAAA;UAJH,KAAKuG,EAAO;UACb,OAAM;;UAEHhH,EAAAC,EAAA+G,EAAO,KAAK,IAAG,MAAE,CAAA;UAAAxG,EAA+B,KAAA,MAAAP,EAAzB+G,EAAO,QAAI,GAAA,GAAA,CAAA;UAAchH,EAAA,QAAGC,EAAG+G,EAAO,MAAE,GAAA,GAAA,CAAA;;;SAIxEvH,EAAA,EAAA,GAAAgB,EAcMC,GAAA,MAAAC,EAba4D,GAAA,QAAV,OADT9E,EAAA,GAAAgB,EAcM,OAAA;SAZH,KAAKsD;SACN,OAAM;SACL,WAAO,0BAA4BA;;SAEpClE,EAKEe,GAAA;UAJC,eAAa;UACd,UAAA;UACA,SAAQ;UACR,gBAAA;;SAEFJ,EAA8D,QAA9DkB,GAA8DzB,EAA1BoF,EAAStB,CAAM,CAAA,GAAA,CAAA;SACnDvD,EAAyG,QAAzGmB,GAAyG1B,EAAnDC,EAAAoG,CAAA,CAAC,CAAA,sCAAA,CAAA,GAAA,CAAA;;;;M,MAGrC/C,EAAA,SAAtB9D,EAAA,GAAAC,EAsBYS,GAAA,EAAA,KAAA,EAAA,GAAA;OArBV,SAAAP,QAA8E,CAA9EY,EAA8E,OAA9EoB,GAA8E3B,EAAxCC,EAAAoG,CAAA,CAAC,CAAA,4BAAA,CAAA,GAAA,CAAA,GAEvC9F,EAkBM,OAlBNqB,GAkBM,EAdJpC,EAAA,EAAA,GAAAgB,EAaMC,GAAA,MAAAC,EAZYoE,EAAA,QAAT,OADTtF,EAAA,GAAAgB,EAaM,OAAA;QAXH,KAAKuE,EAAM;QACZ,OAAM;;QAENxE,EAAkE,OAAlEsB,GAAkE7B,EAA/BoF,EAASL,EAAM,MAAM,CAAA,GAAA,CAAA;QACxDxE,EAA6F,OAA7FuB,GAA6F9B,EAA7DC,EAAAoG,CAAA,CAAC,CAAA,kCAAmCtB,EAAM,SAAO,CAAA,GAAA,CAAA;QAEzEA,EAAM,UADdvF,EAAA,GAAAgB,EAKM,OALNuB,IAKM/B,EADD+E,EAAM,MAAM,GAAA,CAAA,K;;;;MAKvBnF,EAoBeiB,IAAA,MAAA;OAnBb,SAAAlB,QAEe;QAFfC,EAEe2F,GAAA,EAFA,SAAK,AAAAM,EAAA,OAAA/E,GAAA,MAAO,EAAA,QAAI,IAAA,CAAA,MAAA,CAAA,E;SAC7B,SAAAnB,QAAgF,CAA7EI,EAAAC,EAAAsD,EAAA,QAAarD,EAAAoG,CAAA,CAAC,CAAA,8BAAA,IAAmCpG,EAAAoG,CAAA,CAAC,CAAA,sBAAA,CAAA,GAAA,CAAA,C;;;QAEvDzG,EAAWmB,EAAA;QAEHuC,EAAA,SAAc2B,EAAA,MAAO,SAAM,KAAA,CAAShF,EAAAyC,CAAA,CAAK,CAAC,eADlDlD,EAAA,GAAAC,EAMe8F,GAAA;;SAJb,WAAQ;SACP,SAAKzE,EAAOwE,IAAW,CAAA,MAAA,CAAA;;SAExB,SAAA3F,QAA6C,CAA1CI,EAAAC,EAAAC,EAAAoG,CAAA,CAAC,CAAA,oCAAA,CAAA,GAAA,CAAA,C;;;QAGG/C,EAAA,Q,aADT9D,EAAA,GAAAC,EAOcgG,GAAA;;SALX,UAAUlB,EAAA,MAAS,WAAM,KAAA,CAAA,CAAYtE,EAAAyC,CAAA,CAAK,CAAC;SAC5C,WAAQ;SACP,SAAK5B,EAAOuE,IAAO,CAAA,MAAA,CAAA;;SAEpB,SAAA1F,QAA+F,CAA5FI,EAAAC,EAAAC,EAAAoG,CAAA,CAAC,CAAA,2CAAA,EAAA,OAAqD9B,EAAA,MAAS,OAAM,GAAIA,EAAA,MAAS,MAAM,CAAA,GAAA,CAAA,C"}
|
|
1
|
+
{"version":3,"file":"AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_resolveComponent","_openBlock","_createBlock","_component_VDialog","_withCtx","_createVNode","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VAlert","_createCommentVNode","_component_VSelect","AUserMetadataForm","_createElementVNode","_createElementBlock","_Fragment","_renderList","_component_VCheckbox","AUserSystemStatusChip","_component_VCardActions","_withModifiers","_component_VSpacer","ADialogToolbar_default","AUserMetadataForm_default","AUserSystemStatusChip_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","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","useI18n","store","useUserCrossSystemStore","v$","records","computed","map","descriptor","user","sourceSystem","ref","target","selected","showingLog","watch","value","order","pickPrefillSource","source","isUndefined","cloneDeep","system","sourceOptions","mayUpdate","item","descriptorMayWrite","allDiffering","systemsNeedingWrite","differing","differingWithoutRight","affected","systems","changes","current","USER_METADATA_FIELDS","readMetadataField","field","currentLog","entry","BulkAction","failed","BulkOutcome","noteFor","labelFor","confirm","retryFailed","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createBlock","VDialog","_cache","$event","withCtx","createVNode","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VAlert","createCommentVNode","VSelect","createElementVNode","createElementBlock","Fragment","renderList","VCheckbox","change","VCardActions","withModifiers","VSpacer"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector, so the strict rules are checked before writing. Without it an empty\n// name or colour from the source (common in blog and cms) was written blank to every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Target systems. Ticked by default and untickable one by one, like the enable/disable\n * dialog, so an operator can skip a system whose value is intentionally different.\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, like the enable/disable one.\n * Closing on confirm hid failures: a 422 on one system looked like a successful repair.\n */\nconst showingLog = ref(false)\n\n/**\n * Pre-fill from the first system in configured order that has a record, not\n * the first to answer. The fan-out is parallel, so that would differ per run.\n * The source is shown and can be changed.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only systems whose value differs and that may be written. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Re-tick everything that differs whenever the set changes: on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** Retries the same value on systems it did not reach, 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids share one e-mail. Writing under either could put this person's\n metadata on someone else's account, and no admin can delete an AnzuUser.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target profiles say. It writes to many systems, and a loose\n form could put an empty name into cms, which cms's form would then refuse to save.\n `randomColor` is deliberately not passed: the strict form would\n invent a colour on open and mark it as a change everywhere.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserOtherSystemsTable.js","names":["_sfc_main","AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","AUserOtherSystemsTable_default"],"sources":["../../../../src/domains/anzuUser/components/AUserOtherSystemsTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport type { AnyUserSystemDescriptor } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n userId: IntegerId\n readonly?: boolean\n /** Whether an account created from here would be switched on
|
|
1
|
+
{"version":3,"file":"AUserOtherSystemsTable.js","names":["_sfc_main","AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","AUserOtherSystemsTable_default"],"sources":["../../../../src/domains/anzuUser/components/AUserOtherSystemsTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport type { AnyUserSystemDescriptor } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n userId: IntegerId\n readonly?: boolean\n /** Whether an account created from here would be switched on. The dialog states it. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creatingSystem?: string | null\n}>()\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\n/**\n * A read-only list of panels, not `AUserSystemOverview`. The overview adds search, bulk\n * actions and inconsistency detection, and building on it would make task 2 depend on task 3.\n */\nconst panels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\nconst refreshSystem = (system: string) => {\n const index = props.descriptors.findIndex((descriptor) => descriptor.system === system)\n panels.value[index]?.refresh()\n}\n\ndefineExpose({\n refresh: () => panels.value.forEach((panel) => panel?.refresh()),\n refreshSystem,\n})\n</script>\n\n<template>\n <VCard variant=\"flat\">\n <VCardText class=\"d-flex flex-column ga-4\">\n <AUserSystemPanel\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n ref=\"panels\"\n :descriptor=\"descriptor\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"source\"\n :creating=\"creatingSystem === descriptor.system\"\n @create=\"(target, user) => emit('create', target, user)\"\n />\n </VCardText>\n </VCard>\n</template>\n"],"mappings":""}
|
|
@@ -5,11 +5,10 @@ type __VLS_Props = {
|
|
|
5
5
|
descriptors: AnyUserSystemDescriptor[];
|
|
6
6
|
userId: IntegerId;
|
|
7
7
|
readonly?: boolean;
|
|
8
|
-
/** Whether an account created from here would be switched on
|
|
8
|
+
/** Whether an account created from here would be switched on. The dialog states it. */
|
|
9
9
|
createEnabled?: boolean;
|
|
10
10
|
/** What the owning system holds, to prefill the create form. */
|
|
11
11
|
source?: BaseUser | null;
|
|
12
|
-
/** The system a create is currently running for. */
|
|
13
12
|
creatingSystem?: string | null;
|
|
14
13
|
};
|
|
15
14
|
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VCard","_withCtx","_createVNode","_component_VCardText","_createElementBlock","_Fragment","_renderList","AUserSystemPanel","AUserSystemPanel_default","AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","panels","ref","panel","index","descriptor","system","openBlock","createBlock","VCard","withCtx","createVNode","VCardText","createElementBlock","Fragment","renderList","_cache","target","user"],"sources":["../../../../src/domains/anzuUser/components/AUserOtherSystemsTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport type { AnyUserSystemDescriptor } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n userId: IntegerId\n readonly?: boolean\n /** Whether an account created from here would be switched on
|
|
1
|
+
{"version":3,"file":"AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VCard","_withCtx","_createVNode","_component_VCardText","_createElementBlock","_Fragment","_renderList","AUserSystemPanel","AUserSystemPanel_default","AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","panels","ref","panel","index","descriptor","system","openBlock","createBlock","VCard","withCtx","createVNode","VCardText","createElementBlock","Fragment","renderList","_cache","target","user"],"sources":["../../../../src/domains/anzuUser/components/AUserOtherSystemsTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport type { AnyUserSystemDescriptor } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n userId: IntegerId\n readonly?: boolean\n /** Whether an account created from here would be switched on. The dialog states it. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creatingSystem?: string | null\n}>()\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\n/**\n * A read-only list of panels, not `AUserSystemOverview`. The overview adds search, bulk\n * actions and inconsistency detection, and building on it would make task 2 depend on task 3.\n */\nconst panels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\nconst refreshSystem = (system: string) => {\n const index = props.descriptors.findIndex((descriptor) => descriptor.system === system)\n panels.value[index]?.refresh()\n}\n\ndefineExpose({\n refresh: () => panels.value.forEach((panel) => panel?.refresh()),\n refreshSystem,\n})\n</script>\n\n<template>\n <VCard variant=\"flat\">\n <VCardText class=\"d-flex flex-column ga-4\">\n <AUserSystemPanel\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n ref=\"panels\"\n :descriptor=\"descriptor\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"source\"\n :creating=\"creatingSystem === descriptor.system\"\n @create=\"(target, user) => emit('create', target, user)\"\n />\n </VCardText>\n </VCard>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAOA,IAAMc,IAAQC,GAWRC,IAAOH,GAQPI,IAASC,EAA6C,CAAC,CAAC;E,OAO9DN,EAAa;GACX,eAAeK,EAAO,MAAM,SAAS,MAAUE,GAAO,QAAQ,CAAC;GAC/D,gBAPqB,MAAmB;IACxC,IAAMC,IAAQN,EAAM,YAAY,WAAW,MAAeO,EAAW,WAAWC,CAAM;IACtF,EAAO,MAAMF,EAAM,EAAE,QAAQ;GAC/B;EAKA,CAAC,I,UAICpB,EAAA,GAAAC,EAeQC,GAAA,EAfD,SAAQ,OAAM,GAAA;GACnB,SAAAC,QAaY,CAbZC,EAaYC,GAAA,EAbD,OAAM,0BAAyB,GAAA;IAEtC,SAAAF,QAAiC,EADnCH,EAAA,EAAA,GAAAM,EAWEC,GAAA,MAAAC,EAVqBO,EAAA,cAAd,OADTf,EAAA,GAAAC,EAWEQ,GAAA;KATC,KAAKY,EAAW;;KACb,SAAA;KAAJ,KAAIJ;KACS;KACZ,WAASF,EAAA;KACT,UAAUA,EAAA;KACV,kBAAgBA,EAAA;KAChB,QAAQA,EAAA;KACR,UAAUA,EAAA,mBAAmBM,EAAW;KACxC,UAAM,AAAAW,EAAA,QAAG,GAAQ,MAAShB,EAAI,UAAWiB,GAAQC,CAAI"}
|