@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +27 -27
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- package/src/vite/sourcemaps.mjs +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFormRemoteAutocomplete.js","names":["_sfc_main","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocomplete_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// The requests of the component on their way (items by their ids, a search, a prefetch): its spinner is on while\n// any of them runs, and goes off with the last. Each turned it off as it ended: a read by ids hid the spinner of a\n// search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Over before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// The clear of the field empties the search with `null` first: an empty search. A field without focus at that\n// moment read its length and threw.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// The clear empties the value at once and asks for the list once, for an empty search, through the counter of the\n// searches. It asked with the search typed before, outside the counter, wrote that answer whenever it came, and\n// emptied the value only after it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AFormRemoteAutocomplete.js","names":["_sfc_main","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocomplete_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Decremented before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// Empties the value at once and fetches the list once for an empty search\n// through the search counter, so a stale answer cannot overwrite it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_renderSlot","ACollabLockedByUser","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","SEARCH_DEBOUNCE_MS","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"selected\"","\"selectedModifiers\"","__expose","__emit","props","__props","emit","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","modelValue","useModel","isArray","newValue","cloneDeep","modelValueSelected","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","onBlur","errorMessageComputed","computed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","requestsRunning","loadingLocal","loadingComputed","resetToEmptyState","value","updateSelected","findItem","obj","id","byIdsCounter","loadListItems","requestId","idsArray","ids","res","selectedNewValue","tryLoadModelValue","idsToFetch","tryLoadValue","fetchedData","showErrorsDefault","prefetch","tryAutoFetch","useAlerts","apiSearch","query","pagination","requestCounter","error","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onClickClear","onChipCloseClick","closedItem","watchDebounced","oldValue","onAutocompleteModelUpdate","cloned","noDataText","isEmpty","openBlock","createBlock","VAutocomplete","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// The requests of the component on their way (items by their ids, a search, a prefetch): its spinner is on while\n// any of them runs, and goes off with the last. Each turned it off as it ended: a read by ids hid the spinner of a\n// search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Over before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// The clear of the field empties the search with `null` first: an empty search. A field without focus at that\n// moment read its length and threw.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// The clear empties the value at once and asks for the list once, for an empty search, through the counter of the\n// searches. It asked with the search typed before, outside the counter, wrote that answer whenever it came, and\n// emptied the value only after it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_renderSlot","ACollabLockedByUser","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","SEARCH_DEBOUNCE_MS","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"selected\"","\"selectedModifiers\"","__expose","__emit","props","__props","emit","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","modelValue","useModel","isArray","newValue","cloneDeep","modelValueSelected","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","onBlur","errorMessageComputed","computed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","requestsRunning","loadingLocal","loadingComputed","resetToEmptyState","value","updateSelected","findItem","obj","id","byIdsCounter","loadListItems","requestId","idsArray","ids","res","selectedNewValue","tryLoadModelValue","idsToFetch","tryLoadValue","fetchedData","showErrorsDefault","prefetch","tryAutoFetch","useAlerts","apiSearch","query","pagination","requestCounter","error","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onClickClear","onChipCloseClick","closedItem","watchDebounced","oldValue","onAutocompleteModelUpdate","cloned","noDataText","isEmpty","openBlock","createBlock","VAutocomplete","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Decremented before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// Empties the value at once and fetches the list once for an empty search\n// through the search counter, so a stale answer cannot overwrite it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
|
package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts
CHANGED
|
@@ -35,10 +35,12 @@ type __VLS_ModelProps = {
|
|
|
35
35
|
'fetchedItemsMinimal': Map<IntegerId | DocId, any>;
|
|
36
36
|
};
|
|
37
37
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
38
|
-
declare
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
declare const __VLS_template: () => {
|
|
39
|
+
__VLS_Slots: {
|
|
40
|
+
'append-item'?: (props: {}) => any;
|
|
41
|
+
};
|
|
41
42
|
};
|
|
43
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
42
44
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
43
45
|
"update:search": (value: string) => any;
|
|
44
46
|
"update:loadingLocal": (value: boolean) => any;
|
|
@@ -24,9 +24,9 @@ export interface RemoteAutocompleteScope<P> {
|
|
|
24
24
|
/** The field is disabled while the scope is unset, when this says the scope is required. */
|
|
25
25
|
requiredWhen?: (props: P) => boolean;
|
|
26
26
|
/**
|
|
27
|
-
* The form autocomplete clears its model (`[]` when `multiple`, else
|
|
28
|
-
*
|
|
29
|
-
* sibling filter's change.
|
|
27
|
+
* The form autocomplete clears its model (`[]` when `multiple`, else
|
|
28
|
+
* `null`) when the scope changes from a set value. Default `true`.
|
|
29
|
+
* A filter never does: its value outlives a sibling filter's change.
|
|
30
30
|
*/
|
|
31
31
|
reset?: boolean;
|
|
32
32
|
}
|
|
@@ -38,13 +38,13 @@ export interface CreateRemoteAutocompleteOptions<T extends IntegerId | DocId, PO
|
|
|
38
38
|
* so they are reactive and booleans are cast.
|
|
39
39
|
*/
|
|
40
40
|
props?: PO;
|
|
41
|
-
/** Called in the component's setup,
|
|
41
|
+
/** Called in the component's setup, with the component's props when it has `props`. */
|
|
42
42
|
useSelectActions: (props: ExtractPropTypes<PO>) => RemoteSelectActions<T>;
|
|
43
43
|
/** Called in the component's setup; provided as the inner filter of the autocomplete. */
|
|
44
44
|
useInnerFilter: () => RemoteInnerFilter;
|
|
45
45
|
/**
|
|
46
|
-
* Inner filter fields that follow the props
|
|
47
|
-
*
|
|
46
|
+
* Inner filter fields that follow the props. Written in setup, before the first fetch, and on every change.
|
|
47
|
+
* Every key is written each time: return `null` for an unset one.
|
|
48
48
|
*/
|
|
49
49
|
filterFromProps?: (props: ExtractPropTypes<PO>) => Record<string, unknown>;
|
|
50
50
|
scope?: RemoteAutocompleteScope<ExtractPropTypes<PO>>;
|
|
@@ -97,13 +97,11 @@ export type RemoteAutocompleteComponent<M, P = unknown> = DefineSetupFnComponent
|
|
|
97
97
|
}>;
|
|
98
98
|
export type FilterRemoteAutocompleteComponent<P = unknown> = DefineSetupFnComponent<FilterRemoteAutocompleteProps & P>;
|
|
99
99
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* caller's props, listeners and slots all reach `AFormRemoteAutocomplete`, and win over `defaults`.
|
|
106
|
-
*
|
|
100
|
+
* A remote autocomplete for one entity: its select actions, inner filter, search field and default props.
|
|
101
|
+
* The caller's props, listeners and slots reach `AFormRemoteAutocomplete` and win over `defaults`.
|
|
102
|
+
* `M` is the model type: one id, several, or `null`. A caller binding
|
|
103
|
+
* a possibly `undefined` value needs `T | T[] | null | undefined`.
|
|
104
|
+
* @example
|
|
107
105
|
* In an SFC's plain `<script lang="ts">`:
|
|
108
106
|
* ```ts
|
|
109
107
|
* export default createRemoteAutocomplete({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRemoteAutocomplete.js","names":["AFormRemoteAutocomplete","AFilterRemoteAutocomplete","AFilterRemoteAutocomplete_default","AFormRemoteAutocomplete_default","defined","attrs","value","base","options","props","filterFromProps","watch","filterData","fields","provide","FilterInnerConfigKey","filterConfig","FilterInnerDataKey","scopeKey","scope","scoped","createRemoteAutocomplete","defineComponent","before","now","emit","h","bound","slots","createFilterRemoteAutocomplete"],"sources":["../../../../src/domains/remoteAutocomplete/composables/createRemoteAutocomplete.ts"],"sourcesContent":["import {\n type Component,\n type ComponentObjectPropsOptions,\n defineComponent,\n type DefineSetupFnComponent,\n type ExtractPropTypes,\n type ExtractPublicPropTypes,\n h,\n type PropType,\n provide,\n type Ref,\n watch,\n} from 'vue'\nimport AFormRemoteAutocomplete from '@/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue'\nimport AFilterRemoteAutocomplete from '@/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport type { CollabComponentConfig } from '@/domains/collab/types/Collab'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport interface RemoteSelectActions<T extends IntegerId | DocId> {\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n}\n\nexport interface RemoteInnerFilter {\n filterConfig: FilterConfig\n filterData: FilterData\n}\n\n/**\n * What the list of a scoped autocomplete depends on (a site group, an ext system): the autocomplete keeps\n * its fetched list across a model reset and prefetches once, so a changed scope has to remount it.\n */\nexport interface RemoteAutocompleteScope<P> {\n /** The scope, `undefined` while unset. Also the key of the inner autocomplete: a change remounts it. */\n of: (props: P) => unknown\n /** The field is disabled while the scope is unset, when this says the scope is required. */\n requiredWhen?: (props: P) => boolean\n /**\n * The form autocomplete clears its model (`[]` when `multiple`, else `null`) when the scope changes from\n * a set value, as the scoped wrappers did (default `true`). A filter never does: its value outlives a\n * sibling filter's change.\n */\n reset?: boolean\n}\n\nexport interface CreateRemoteAutocompleteOptions<\n T extends IntegerId | DocId,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n> {\n /** The component's name, for devtools and warnings. */\n name: string\n /**\n * The component's own props, read by the options below and not passed to the autocomplete. Declared,\n * so they are reactive and booleans are cast.\n */\n props?: PO\n /** Called in the component's setup, as the wrappers did; with the component's props when it has `props`. */\n useSelectActions: (props: ExtractPropTypes<PO>) => RemoteSelectActions<T>\n /** Called in the component's setup; provided as the inner filter of the autocomplete. */\n useInnerFilter: () => RemoteInnerFilter\n /**\n * Inner filter fields that follow the props, written in setup -- before the autocomplete's first fetch\n * -- and again on every change. Every key is written each time: return `null` for an unset one.\n */\n filterFromProps?: (props: ExtractPropTypes<PO>) => Record<string, unknown>\n scope?: RemoteAutocompleteScope<ExtractPropTypes<PO>>\n filterByField: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n /** Props of the autocomplete this one sets unless its caller does, e.g. `{ clearable: true }`. */\n defaults?: Record<string, unknown>\n /** A model value of `0` reaches the autocomplete as `null`: nothing selected. */\n zeroIsEmpty?: boolean\n}\n\n/** What a caller can set on a form remote autocomplete; anything else falls through to it as well. */\nexport interface RemoteAutocompleteProps<M> {\n modelValue: M\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n}\n\n/** What a caller can set on a filter remote autocomplete; anything else falls through to it as well. */\nexport interface FilterRemoteAutocompleteProps {\n name: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n}\n\n// Only `update:modelValue` is the component's own; the autocomplete's other events reach it as listeners in the\n// attributes, and these types say so.\nexport type RemoteAutocompleteComponent<M, P = unknown> = DefineSetupFnComponent<\n RemoteAutocompleteProps<M> & P,\n {\n 'update:modelValue': (value: M) => true\n blur: (value: M) => true\n focus: (value: M) => true\n searchChange: (text: string) => true\n searchChangeDebounced: (text: string) => true\n }\n>\n\nexport type FilterRemoteAutocompleteComponent<P = unknown> = DefineSetupFnComponent<FilterRemoteAutocompleteProps & P>\n\n// A value the caller leaves `undefined` falls back to the default, as a prop default of the wrappers\n// this replaces did, instead of overriding it.\nconst defined = (attrs: Record<string, unknown>) =>\n Object.fromEntries(Object.entries(attrs).filter(([, value]) => value !== undefined))\n\nconst base = <T extends IntegerId | DocId, PO extends ComponentObjectPropsOptions>(\n options: CreateRemoteAutocompleteOptions<T, PO>,\n props: ExtractPropTypes<PO>\n) => {\n const { fetchItems, fetchItemsByIds } = options.props\n ? options.useSelectActions(props)\n : (options.useSelectActions as () => RemoteSelectActions<T>)()\n const { filterConfig, filterData } = options.useInnerFilter()\n const { filterFromProps } = options\n if (filterFromProps) {\n watch(\n () => filterFromProps(props),\n (fields) => Object.assign(filterData, fields),\n { immediate: true }\n )\n }\n provide(FilterInnerConfigKey, filterConfig)\n provide(FilterInnerDataKey, filterData)\n const { scope } = options\n const scopeKey = () => {\n const value = scope?.of(props)\n return value === undefined ? undefined : JSON.stringify(value)\n }\n const scoped = () => {\n if (!scope) return {}\n // Past the caller's attrs: an unset required scope disables the field whatever the caller says. Left\n // out otherwise, so the caller's `disabled`, or its absence (the collab lock), goes through.\n return { key: scopeKey(), ...(scope.requiredWhen?.(props) && scopeKey() === undefined ? { disabled: true } : {}) }\n }\n return {\n bound: {\n ...options.defaults,\n fetchItems,\n fetchItemsByIds,\n filterByField: options.filterByField,\n ...(options.filterSortBy === undefined ? {} : { filterSortBy: options.filterSortBy }),\n ...(options.prefetch === undefined ? {} : { prefetch: options.prefetch }),\n },\n scopeKey,\n scoped,\n }\n}\n\n/**\n * `M` is the model's type: by default one id, several, or `null`; a caller that binds a value which\n * may be `undefined` needs `T | T[] | null | undefined`.\n *\n * A remote autocomplete of one entity, which an admin wrote as a component of its own for each: the\n * entity's select actions and inner filter, the field it searches by, and the props it sets. The\n * caller's props, listeners and slots all reach `AFormRemoteAutocomplete`, and win over `defaults`.\n *\n * In an SFC's plain `<script lang=\"ts\">`:\n * ```ts\n * export default createRemoteAutocomplete({\n * name: 'DeskRemoteAutocomplete',\n * useSelectActions: useDeskSelectActions,\n * useInnerFilter: useDeskInnerFilter,\n * filterByField: 'name',\n * prefetch: 'hover',\n * defaults: { clearable: true },\n * })\n * ```\n */\nexport function createRemoteAutocomplete<\n T extends IntegerId | DocId = IntegerId,\n M extends T | T[] | null | undefined = T | T[] | null,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n>(options: CreateRemoteAutocompleteOptions<T, PO>): RemoteAutocompleteComponent<M, ExtractPublicPropTypes<PO>> {\n return defineComponent({\n name: options.name,\n inheritAttrs: false,\n props: {\n ...options.props,\n modelValue: { type: null as unknown as PropType<M>, required: true },\n },\n emits: ['update:modelValue'],\n setup(props, { attrs, slots, emit }) {\n const { bound, scopeKey, scoped } = base(options, props as ExtractPropTypes<PO>)\n if (options.scope && options.scope.reset !== false) {\n watch(scopeKey, (now, before) => {\n if (before === undefined || now === before) return\n // `multiple` is the caller's attribute, a bare one arriving as ''.\n emit('update:modelValue', (attrs.multiple === '' || attrs.multiple === true ? [] : null) as M)\n })\n }\n return () =>\n h(\n AFormRemoteAutocomplete as Component,\n {\n ...bound,\n ...defined(attrs),\n ...scoped(),\n modelValue: options.zeroIsEmpty && props.modelValue === 0 ? null : props.modelValue,\n 'onUpdate:modelValue': (value: M) => emit('update:modelValue', value),\n },\n slots\n )\n },\n }) as unknown as RemoteAutocompleteComponent<M, ExtractPublicPropTypes<PO>>\n}\n\n/** `createRemoteAutocomplete` for a filter: the caller's `name` picks the filter field. */\nexport function createFilterRemoteAutocomplete<\n T extends IntegerId | DocId = IntegerId,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n>(options: CreateRemoteAutocompleteOptions<T, PO>): FilterRemoteAutocompleteComponent<ExtractPublicPropTypes<PO>> {\n return defineComponent({\n name: options.name,\n inheritAttrs: false,\n props: { ...options.props },\n setup(props, { attrs, slots }) {\n const { bound, scoped } = base(options, props as ExtractPropTypes<PO>)\n return () => h(AFilterRemoteAutocomplete as Component, { ...bound, ...defined(attrs), ...scoped() }, slots)\n },\n }) as unknown as FilterRemoteAutocompleteComponent<ExtractPublicPropTypes<PO>>\n}\n"],"mappings":";;;;;AAwIA,IAAMI,KAAW,MACf,OAAO,YAAY,OAAO,QAAQC,CAAK,CAAC,CAAC,QAAQ,GAAGC,OAAWA,MAAU,KAAA,CAAS,CAAC,GAE/EC,KACJ,GACA,MACG;CACH,IAAM,EAAE,eAAY,uBAAoBC,EAAQ,QAC5CA,EAAQ,iBAAiBC,CAAK,IAC7BD,EAAQ,iBAAkD,GACzD,EAAE,iBAAc,kBAAeA,EAAQ,eAAe,GACtD,EAAE,uBAAoBA;CAS5B,AARIE,KACFC,QACQD,EAAgBD,CAAK,IAC1B,MAAW,OAAO,OAAOG,GAAYC,CAAM,GAC5C,EAAE,WAAW,GAAK,CACpB,GAEFC,EAAQC,GAAsBC,CAAY,GAC1CF,EAAQG,GAAoBL,CAAU;CACtC,IAAM,EAAE,aAAUJ,GACZU,UAAiB;EACrB,IAAMZ,IAAQa,GAAO,GAAGV,CAAK;EAC7B,OAAOH,MAAU,KAAA,IAAY,KAAA,IAAY,KAAK,UAAUA,CAAK;CAC/D,GACMc,UACCD,IAGE;EAAE,KAAKD,EAAS;EAAG,GAAIC,EAAM,eAAeV,CAAK,KAAKS,EAAS,MAAM,KAAA,IAAY,EAAE,UAAU,GAAK,IAAI,CAAC;CAAG,IAH9F,CAAC;CAKtB,OAAO;EACL,OAAO;GACL,GAAGV,EAAQ;GACX;GACA;GACA,eAAeA,EAAQ;GACvB,GAAIA,EAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAcA,EAAQ,aAAa;GACnF,GAAIA,EAAQ,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAUA,EAAQ,SAAS;EACzE;EACA;EACA;CACF;AACF;AAsBA,SAAgBa,EAId,GAA6G;CAC7G,OAAOC,EAAgB;EACrB,MAAMd,EAAQ;EACd,cAAc;EACd,OAAO;GACL,GAAGA,EAAQ;GACX,YAAY;IAAE,MAAM;IAAgC,UAAU;GAAK;EACrE;EACA,OAAO,CAAC,mBAAmB;EAC3B,MAAM,GAAO,EAAE,UAAO,UAAO,WAAQ;GACnC,IAAM,EAAE,UAAO,aAAU,cAAWD,EAAKC,GAASC,CAA6B;GAQ/E,OAPID,EAAQ,SAASA,EAAQ,MAAM,UAAU,MAC3CG,EAAMO,IAAW,GAAK,MAAW;IAC/B,AAAIK,MAAW,KAAA,KAAaC,MAAQD,KAEpCE,EAAK,qBAAsBpB,EAAM,aAAa,MAAMA,EAAM,aAAa,KAAO,CAAC,IAAI,IAAU;GAC/F,CAAC,SAGDqB,EACE1B,GACA;IACE,GAAG2B;IACH,GAAGvB,EAAQC,CAAK;IAChB,GAAGe,EAAO;IACV,YAAYZ,EAAQ,eAAeC,EAAM,eAAe,IAAI,OAAOA,EAAM;IACzE,wBAAwB,MAAagB,EAAK,qBAAqBnB,CAAK;GACtE,GACAsB,CACF;EACJ;CACF,CAAC;AACH;AAGA,SAAgBC,EAGd,GAAgH;CAChH,OAAOP,EAAgB;EACrB,MAAMd,EAAQ;EACd,cAAc;EACd,OAAO,EAAE,GAAGA,EAAQ,MAAM;EAC1B,MAAM,GAAO,EAAE,UAAO,YAAS;GAC7B,IAAM,EAAE,UAAO,cAAWD,EAAKC,GAASC,CAA6B;GACrE,aAAaiB,EAAEzB,GAAwC;IAAE,GAAG0B;IAAO,GAAGvB,EAAQC,CAAK;IAAG,GAAGe,EAAO;GAAE,GAAGQ,CAAK;EAC5G;CACF,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"createRemoteAutocomplete.js","names":["AFormRemoteAutocomplete","AFilterRemoteAutocomplete","AFilterRemoteAutocomplete_default","AFormRemoteAutocomplete_default","defined","attrs","value","base","options","props","filterFromProps","watch","filterData","fields","provide","FilterInnerConfigKey","filterConfig","FilterInnerDataKey","scopeKey","scope","scoped","createRemoteAutocomplete","defineComponent","before","now","emit","h","bound","slots","createFilterRemoteAutocomplete"],"sources":["../../../../src/domains/remoteAutocomplete/composables/createRemoteAutocomplete.ts"],"sourcesContent":["import {\n type Component,\n type ComponentObjectPropsOptions,\n defineComponent,\n type DefineSetupFnComponent,\n type ExtractPropTypes,\n type ExtractPublicPropTypes,\n h,\n type PropType,\n provide,\n type Ref,\n watch,\n} from 'vue'\nimport AFormRemoteAutocomplete from '@/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue'\nimport AFilterRemoteAutocomplete from '@/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport type { CollabComponentConfig } from '@/domains/collab/types/Collab'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport interface RemoteSelectActions<T extends IntegerId | DocId> {\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n}\n\nexport interface RemoteInnerFilter {\n filterConfig: FilterConfig\n filterData: FilterData\n}\n\n/**\n * What the list of a scoped autocomplete depends on (a site group, an ext system): the autocomplete keeps\n * its fetched list across a model reset and prefetches once, so a changed scope has to remount it.\n */\nexport interface RemoteAutocompleteScope<P> {\n /** The scope, `undefined` while unset. Also the key of the inner autocomplete: a change remounts it. */\n of: (props: P) => unknown\n /** The field is disabled while the scope is unset, when this says the scope is required. */\n requiredWhen?: (props: P) => boolean\n /**\n * The form autocomplete clears its model (`[]` when `multiple`, else\n * `null`) when the scope changes from a set value. Default `true`.\n * A filter never does: its value outlives a sibling filter's change.\n */\n reset?: boolean\n}\n\nexport interface CreateRemoteAutocompleteOptions<\n T extends IntegerId | DocId,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n> {\n /** The component's name, for devtools and warnings. */\n name: string\n /**\n * The component's own props, read by the options below and not passed to the autocomplete. Declared,\n * so they are reactive and booleans are cast.\n */\n props?: PO\n /** Called in the component's setup, with the component's props when it has `props`. */\n useSelectActions: (props: ExtractPropTypes<PO>) => RemoteSelectActions<T>\n /** Called in the component's setup; provided as the inner filter of the autocomplete. */\n useInnerFilter: () => RemoteInnerFilter\n /**\n * Inner filter fields that follow the props. Written in setup, before the first fetch, and on every change.\n * Every key is written each time: return `null` for an unset one.\n */\n filterFromProps?: (props: ExtractPropTypes<PO>) => Record<string, unknown>\n scope?: RemoteAutocompleteScope<ExtractPropTypes<PO>>\n filterByField: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n /** Props of the autocomplete this one sets unless its caller does, e.g. `{ clearable: true }`. */\n defaults?: Record<string, unknown>\n /** A model value of `0` reaches the autocomplete as `null`: nothing selected. */\n zeroIsEmpty?: boolean\n}\n\n/** What a caller can set on a form remote autocomplete; anything else falls through to it as well. */\nexport interface RemoteAutocompleteProps<M> {\n modelValue: M\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n}\n\n/** What a caller can set on a filter remote autocomplete; anything else falls through to it as well. */\nexport interface FilterRemoteAutocompleteProps {\n name: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n}\n\n// Only `update:modelValue` is the component's own; the autocomplete's other events reach it as listeners in the\n// attributes, and these types say so.\nexport type RemoteAutocompleteComponent<M, P = unknown> = DefineSetupFnComponent<\n RemoteAutocompleteProps<M> & P,\n {\n 'update:modelValue': (value: M) => true\n blur: (value: M) => true\n focus: (value: M) => true\n searchChange: (text: string) => true\n searchChangeDebounced: (text: string) => true\n }\n>\n\nexport type FilterRemoteAutocompleteComponent<P = unknown> = DefineSetupFnComponent<FilterRemoteAutocompleteProps & P>\n\n// A value the caller leaves `undefined` falls back to the default instead of overriding it.\nconst defined = (attrs: Record<string, unknown>) =>\n Object.fromEntries(Object.entries(attrs).filter(([, value]) => value !== undefined))\n\nconst base = <T extends IntegerId | DocId, PO extends ComponentObjectPropsOptions>(\n options: CreateRemoteAutocompleteOptions<T, PO>,\n props: ExtractPropTypes<PO>\n) => {\n const { fetchItems, fetchItemsByIds } = options.props\n ? options.useSelectActions(props)\n : (options.useSelectActions as () => RemoteSelectActions<T>)()\n const { filterConfig, filterData } = options.useInnerFilter()\n const { filterFromProps } = options\n if (filterFromProps) {\n watch(\n () => filterFromProps(props),\n (fields) => Object.assign(filterData, fields),\n { immediate: true }\n )\n }\n provide(FilterInnerConfigKey, filterConfig)\n provide(FilterInnerDataKey, filterData)\n const { scope } = options\n const scopeKey = () => {\n const value = scope?.of(props)\n return value === undefined ? undefined : JSON.stringify(value)\n }\n const scoped = () => {\n if (!scope) return {}\n // Applied after the caller's attrs: an unset required scope always disables the field.\n // Otherwise left out, so the caller's `disabled`, or its absence (the collab lock), goes through.\n return { key: scopeKey(), ...(scope.requiredWhen?.(props) && scopeKey() === undefined ? { disabled: true } : {}) }\n }\n return {\n bound: {\n ...options.defaults,\n fetchItems,\n fetchItemsByIds,\n filterByField: options.filterByField,\n ...(options.filterSortBy === undefined ? {} : { filterSortBy: options.filterSortBy }),\n ...(options.prefetch === undefined ? {} : { prefetch: options.prefetch }),\n },\n scopeKey,\n scoped,\n }\n}\n\n/**\n * A remote autocomplete for one entity: its select actions, inner filter, search field and default props.\n * The caller's props, listeners and slots reach `AFormRemoteAutocomplete` and win over `defaults`.\n * `M` is the model type: one id, several, or `null`. A caller binding\n * a possibly `undefined` value needs `T | T[] | null | undefined`.\n * @example\n * In an SFC's plain `<script lang=\"ts\">`:\n * ```ts\n * export default createRemoteAutocomplete({\n * name: 'DeskRemoteAutocomplete',\n * useSelectActions: useDeskSelectActions,\n * useInnerFilter: useDeskInnerFilter,\n * filterByField: 'name',\n * prefetch: 'hover',\n * defaults: { clearable: true },\n * })\n * ```\n */\nexport function createRemoteAutocomplete<\n T extends IntegerId | DocId = IntegerId,\n M extends T | T[] | null | undefined = T | T[] | null,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n>(options: CreateRemoteAutocompleteOptions<T, PO>): RemoteAutocompleteComponent<M, ExtractPublicPropTypes<PO>> {\n return defineComponent({\n name: options.name,\n inheritAttrs: false,\n props: {\n ...options.props,\n modelValue: { type: null as unknown as PropType<M>, required: true },\n },\n emits: ['update:modelValue'],\n setup(props, { attrs, slots, emit }) {\n const { bound, scopeKey, scoped } = base(options, props as ExtractPropTypes<PO>)\n if (options.scope && options.scope.reset !== false) {\n watch(scopeKey, (now, before) => {\n if (before === undefined || now === before) return\n // `multiple` is the caller's attribute, a bare one arriving as ''.\n emit('update:modelValue', (attrs.multiple === '' || attrs.multiple === true ? [] : null) as M)\n })\n }\n return () =>\n h(\n AFormRemoteAutocomplete as Component,\n {\n ...bound,\n ...defined(attrs),\n ...scoped(),\n modelValue: options.zeroIsEmpty && props.modelValue === 0 ? null : props.modelValue,\n 'onUpdate:modelValue': (value: M) => emit('update:modelValue', value),\n },\n slots\n )\n },\n }) as unknown as RemoteAutocompleteComponent<M, ExtractPublicPropTypes<PO>>\n}\n\n/** `createRemoteAutocomplete` for a filter: the caller's `name` picks the filter field. */\nexport function createFilterRemoteAutocomplete<\n T extends IntegerId | DocId = IntegerId,\n PO extends ComponentObjectPropsOptions = Record<never, never>,\n>(options: CreateRemoteAutocompleteOptions<T, PO>): FilterRemoteAutocompleteComponent<ExtractPublicPropTypes<PO>> {\n return defineComponent({\n name: options.name,\n inheritAttrs: false,\n props: { ...options.props },\n setup(props, { attrs, slots }) {\n const { bound, scoped } = base(options, props as ExtractPropTypes<PO>)\n return () => h(AFilterRemoteAutocomplete as Component, { ...bound, ...defined(attrs), ...scoped() }, slots)\n },\n }) as unknown as FilterRemoteAutocompleteComponent<ExtractPublicPropTypes<PO>>\n}\n"],"mappings":";;;;;AAuIA,IAAMI,KAAW,MACf,OAAO,YAAY,OAAO,QAAQC,CAAK,CAAC,CAAC,QAAQ,GAAGC,OAAWA,MAAU,KAAA,CAAS,CAAC,GAE/EC,KACJ,GACA,MACG;CACH,IAAM,EAAE,eAAY,uBAAoBC,EAAQ,QAC5CA,EAAQ,iBAAiBC,CAAK,IAC7BD,EAAQ,iBAAkD,GACzD,EAAE,iBAAc,kBAAeA,EAAQ,eAAe,GACtD,EAAE,uBAAoBA;CAS5B,AARIE,KACFC,QACQD,EAAgBD,CAAK,IAC1B,MAAW,OAAO,OAAOG,GAAYC,CAAM,GAC5C,EAAE,WAAW,GAAK,CACpB,GAEFC,EAAQC,GAAsBC,CAAY,GAC1CF,EAAQG,GAAoBL,CAAU;CACtC,IAAM,EAAE,aAAUJ,GACZU,UAAiB;EACrB,IAAMZ,IAAQa,GAAO,GAAGV,CAAK;EAC7B,OAAOH,MAAU,KAAA,IAAY,KAAA,IAAY,KAAK,UAAUA,CAAK;CAC/D,GACMc,UACCD,IAGE;EAAE,KAAKD,EAAS;EAAG,GAAIC,EAAM,eAAeV,CAAK,KAAKS,EAAS,MAAM,KAAA,IAAY,EAAE,UAAU,GAAK,IAAI,CAAC;CAAG,IAH9F,CAAC;CAKtB,OAAO;EACL,OAAO;GACL,GAAGV,EAAQ;GACX;GACA;GACA,eAAeA,EAAQ;GACvB,GAAIA,EAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAcA,EAAQ,aAAa;GACnF,GAAIA,EAAQ,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAUA,EAAQ,SAAS;EACzE;EACA;EACA;CACF;AACF;AAoBA,SAAgBa,EAId,GAA6G;CAC7G,OAAOC,EAAgB;EACrB,MAAMd,EAAQ;EACd,cAAc;EACd,OAAO;GACL,GAAGA,EAAQ;GACX,YAAY;IAAE,MAAM;IAAgC,UAAU;GAAK;EACrE;EACA,OAAO,CAAC,mBAAmB;EAC3B,MAAM,GAAO,EAAE,UAAO,UAAO,WAAQ;GACnC,IAAM,EAAE,UAAO,aAAU,cAAWD,EAAKC,GAASC,CAA6B;GAQ/E,OAPID,EAAQ,SAASA,EAAQ,MAAM,UAAU,MAC3CG,EAAMO,IAAW,GAAK,MAAW;IAC/B,AAAIK,MAAW,KAAA,KAAaC,MAAQD,KAEpCE,EAAK,qBAAsBpB,EAAM,aAAa,MAAMA,EAAM,aAAa,KAAO,CAAC,IAAI,IAAU;GAC/F,CAAC,SAGDqB,EACE1B,GACA;IACE,GAAG2B;IACH,GAAGvB,EAAQC,CAAK;IAChB,GAAGe,EAAO;IACV,YAAYZ,EAAQ,eAAeC,EAAM,eAAe,IAAI,OAAOA,EAAM;IACzE,wBAAwB,MAAagB,EAAK,qBAAqBnB,CAAK;GACtE,GACAsB,CACF;EACJ;CACF,CAAC;AACH;AAGA,SAAgBC,EAGd,GAAgH;CAChH,OAAOP,EAAgB;EACrB,MAAMd,EAAQ;EACd,cAAc;EACd,OAAO,EAAE,GAAGA,EAAQ,MAAM;EAC1B,MAAM,GAAO,EAAE,UAAO,YAAS;GAC7B,IAAM,EAAE,UAAO,cAAWD,EAAKC,GAASC,CAA6B;GACrE,aAAaiB,EAAEzB,GAAwC;IAAE,GAAG0B;IAAO,GAAGvB,EAAQC,CAAK;IAAG,GAAGe,EAAO;GAAE,GAAGQ,CAAK;EAC5G;CACF,CAAC;AACH"}
|
|
@@ -13,18 +13,20 @@ type __VLS_ModelProps = {
|
|
|
13
13
|
'datatableHiddenColumns'?: string[] | undefined;
|
|
14
14
|
};
|
|
15
15
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
16
|
-
declare
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
} & {
|
|
22
|
-
|
|
23
|
-
} & {
|
|
24
|
-
|
|
25
|
-
} & {
|
|
26
|
-
|
|
16
|
+
declare const __VLS_template: () => {
|
|
17
|
+
__VLS_Slots: {
|
|
18
|
+
[x: string]: ((props: {
|
|
19
|
+
itemConfig: import('../../filters/composables/filterFactory').FilterField;
|
|
20
|
+
}) => any) | undefined;
|
|
21
|
+
} & {
|
|
22
|
+
bookmarks?: (props: {}) => any;
|
|
23
|
+
} & {
|
|
24
|
+
detail?: (props: {}) => any;
|
|
25
|
+
} & {
|
|
26
|
+
buttons?: (props: {}) => any;
|
|
27
|
+
};
|
|
27
28
|
};
|
|
29
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
28
30
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
|
|
29
31
|
submit: () => void;
|
|
30
32
|
reset: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ASubjectSelect.js","names":["_sfc_main","ASubjectSelect_vue_vue_type_script_setup_true_lang_default","ASubjectSelect_default"],"sources":["../../../../src/domains/subjectSelect/components/ASubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport ADatatablePagination from '@/domains/filters/datatable/components/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'open'): void\n (e: 'pageChange'): void\n (e: 'confirm', data: Array<TItem>): void\n (e: 'fetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('open')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'confirm',\n props.selectedItems.map((item) => toRaw(item))\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('fetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('pageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\n// `>=`, not
|
|
1
|
+
{"version":3,"file":"ASubjectSelect.js","names":["_sfc_main","ASubjectSelect_vue_vue_type_script_setup_true_lang_default","ASubjectSelect_default"],"sources":["../../../../src/domains/subjectSelect/components/ASubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport ADatatablePagination from '@/domains/filters/datatable/components/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'open'): void\n (e: 'pageChange'): void\n (e: 'confirm', data: Array<TItem>): void\n (e: 'fetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('open')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'confirm',\n props.selectedItems.map((item) => toRaw(item))\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('fetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('pageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\n// `>=`, not `===`. An empty list has `lastPage` 0 while `page` is at least 1, so they never meet.\n// The same holds before the first request.\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) && paginationComputed.value.page >= lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\nonMounted(() => {\n if (props.autoOpen) {\n onOpen()\n }\n})\n\ndefineExpose({\n open: onOpen,\n closeSidebarOnMobile,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar border-b\"\n @cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n :aria-label=\"t('common.subjectSelect.filter.toggle')\"\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar border-e\">\n <div class=\"subject-select-filter\">\n <slot name=\"filter\" />\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions border-t\">\n <div v-if=\"minCount === maxCount\">\n {{\n t('common.subjectSelect.texts.pickExactCount', {\n count: minCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: minCount,\n maxCount: maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ASubjectSelect.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_resolveComponent","_openBlock","_createElementBlock","_Fragment","_renderSlot","_createVNode","_component_VDialog","_mergeProps","_withCtx","_createBlock","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VToolbar","_createElementVNode","_component_VBtn","_component_VIcon","_component_VTooltip","_normalizeClass","_withDirectives","_vShow","_directive_intersect","ADatatablePagination","_component_VSpacer","_withModifiers","_createCommentVNode","ADialogToolbar_default","ADatatablePagination_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","ASubjectSelect_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","dialogLocal","ref","dialog","computed","isUndefined","newValue","paginationComputed","toRaw","useDisplay","sidebarLeft","mdAndDown","closeSidebarOnMobile","SubjectSelectCloseSidebarKey","useI18n","selectedItemsCount","disabledSubmit","onOpen","toggleSidebar","onClose","onConfirm","item","fetchNextPage","onPageChange","lastPage","hasNextPage","isNull","autoloadOnIntersect","isIntersecting","onMounted","_component_ABtnSecondary","resolveComponent","_component_ABtnPrimary","openBlock","createElementBlock","Fragment","renderSlot","_ctx","withModifiers","createVNode","VDialog","mergeProps","_cache","$event","withCtx","createBlock","VCard","createTextVNode","toDisplayString","unref","t","VToolbar","createElementVNode","VBtn","VIcon","VTooltip","normalizeClass","withDirectives","vShow","Intersect","VSpacer","createCommentVNode"],"sources":["../../../../src/domains/subjectSelect/components/ASubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport ADatatablePagination from '@/domains/filters/datatable/components/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'open'): void\n (e: 'pageChange'): void\n (e: 'confirm', data: Array<TItem>): void\n (e: 'fetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('open')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'confirm',\n props.selectedItems.map((item) => toRaw(item))\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('fetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('pageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\n// `>=`, not `===`: an empty list has `totalCount: 0`, so `lastPage` is 0 while `page` is never below\n// 1, and the two can never meet. The page would then count as \"not the last one\" on a list with\n// nothing in it -- and the same holds before any request has been made, because that initial state is\n// the same numbers.\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) && paginationComputed.value.page >= lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\nonMounted(() => {\n if (props.autoOpen) {\n onOpen()\n }\n})\n\ndefineExpose({\n open: onOpen,\n closeSidebarOnMobile,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar border-b\"\n @cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n :aria-label=\"t('common.subjectSelect.filter.toggle')\"\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar border-e\">\n <div class=\"subject-select-filter\">\n <slot name=\"filter\" />\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions border-t\">\n <div v-if=\"minCount === maxCount\">\n {{\n t('common.subjectSelect.texts.pickExactCount', {\n count: minCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: minCount,\n maxCount: maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ASubjectSelect.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_resolveComponent","_openBlock","_createElementBlock","_Fragment","_renderSlot","_createVNode","_component_VDialog","_mergeProps","_withCtx","_createBlock","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VToolbar","_createElementVNode","_component_VBtn","_component_VIcon","_component_VTooltip","_normalizeClass","_withDirectives","_vShow","_directive_intersect","ADatatablePagination","_component_VSpacer","_withModifiers","_createCommentVNode","ADialogToolbar_default","ADatatablePagination_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","ASubjectSelect_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","dialogLocal","ref","dialog","computed","isUndefined","newValue","paginationComputed","toRaw","useDisplay","sidebarLeft","mdAndDown","closeSidebarOnMobile","SubjectSelectCloseSidebarKey","useI18n","selectedItemsCount","disabledSubmit","onOpen","toggleSidebar","onClose","onConfirm","item","fetchNextPage","onPageChange","lastPage","hasNextPage","isNull","autoloadOnIntersect","isIntersecting","onMounted","_component_ABtnSecondary","resolveComponent","_component_ABtnPrimary","openBlock","createElementBlock","Fragment","renderSlot","_ctx","withModifiers","createVNode","VDialog","mergeProps","_cache","$event","withCtx","createBlock","VCard","createTextVNode","toDisplayString","unref","t","VToolbar","createElementVNode","VBtn","VIcon","VTooltip","normalizeClass","withDirectives","vShow","Intersect","VSpacer","createCommentVNode"],"sources":["../../../../src/domains/subjectSelect/components/ASubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport ADatatablePagination from '@/domains/filters/datatable/components/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'open'): void\n (e: 'pageChange'): void\n (e: 'confirm', data: Array<TItem>): void\n (e: 'fetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('open')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'confirm',\n props.selectedItems.map((item) => toRaw(item))\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('fetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('pageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\n// `>=`, not `===`. An empty list has `lastPage` 0 while `page` is at least 1, so they never meet.\n// The same holds before the first request.\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) && paginationComputed.value.page >= lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\nonMounted(() => {\n if (props.autoOpen) {\n onOpen()\n }\n})\n\ndefineExpose({\n open: onOpen,\n closeSidebarOnMobile,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar border-b\"\n @cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n :aria-label=\"t('common.subjectSelect.filter.toggle')\"\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar border-e\">\n <div class=\"subject-select-filter\">\n <slot name=\"filter\" />\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions border-t\">\n <div v-if=\"minCount === maxCount\">\n {{\n t('common.subjectSelect.texts.pickExactCount', {\n count: minCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: minCount,\n maxCount: maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":"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"}
|