@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,9 +1,8 @@
|
|
|
1
1
|
import { Ref } from 'vue';
|
|
2
2
|
import { PermissionGroup } from '../types/PermissionGroup';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* own stricter profile.
|
|
4
|
+
* Not derived from the backend: `PermissionGroupDto` only requires a title.
|
|
5
|
+
* The lengths are a stricter front-end profile shared by all admins.
|
|
7
6
|
*/
|
|
8
7
|
export declare function usePermissionGroupValidation(permissionGroup: Ref<PermissionGroup>): {
|
|
9
8
|
v$: Ref<import('@vuelidate/core').Validation<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionGroupValidations.js","names":["useVuelidate","usePermissionGroupValidation","useValidate","rules","minLength","maxLength"],"sources":["../../../../../src/domains/permission/group/composables/permissionGroupValidations.ts"],"sourcesContent":["import useVuelidate from '@vuelidate/core'\nimport type { Ref } from 'vue'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport type { PermissionGroup } from '@/domains/permission/group/types/PermissionGroup'\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"permissionGroupValidations.js","names":["useVuelidate","usePermissionGroupValidation","useValidate","rules","minLength","maxLength"],"sources":["../../../../../src/domains/permission/group/composables/permissionGroupValidations.ts"],"sourcesContent":["import useVuelidate from '@vuelidate/core'\nimport type { Ref } from 'vue'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport type { PermissionGroup } from '@/domains/permission/group/types/PermissionGroup'\n\n/**\n * Not derived from the backend: `PermissionGroupDto` only requires a title.\n * The lengths are a stricter front-end profile shared by all admins.\n */\nexport function usePermissionGroupValidation(permissionGroup: Ref<PermissionGroup>) {\n const { maxLength, minLength, required } = useValidate()\n\n const rules = {\n permissionGroup: {\n title: {\n required,\n minLength: minLength(3),\n maxLength: maxLength(255),\n },\n description: {\n maxLength: maxLength(2000),\n },\n },\n }\n\n const v$ = useVuelidate(rules, { permissionGroup })\n\n return {\n v$,\n }\n}\n"],"mappings":";;;AASA,SAAgBC,EAA6B,GAAuC;CAClF,IAAM,EAAE,cAAW,cAAW,gBAAaC,EAAY,GAEjDC,IAAQ,EACZ,iBAAiB;EACf,OAAO;GACL;GACA,WAAWC,EAAU,CAAC;GACtB,WAAWC,EAAU,GAAG;EAC1B;EACA,aAAa,EACX,WAAWA,EAAU,GAAI,EAC3B;CACF,EACF;CAIA,OAAO,EACL,IAHSL,EAAaG,GAAO,EAAE,mBAAgB,CAG/C,EACF;AACF"}
|
|
@@ -16,9 +16,8 @@ declare const permissionGroupListFields: ({
|
|
|
16
16
|
})[];
|
|
17
17
|
type ListFields = typeof permissionGroupListFields;
|
|
18
18
|
/**
|
|
19
|
-
* Local-storage key for the list filter. Named
|
|
20
|
-
* per-admin views
|
|
21
|
-
* both versions are on screen they must not share remembered filters (rule 8.0).
|
|
19
|
+
* Local-storage key for the list filter. Named so it does not collide with the replaced
|
|
20
|
+
* per-admin views' `tableFilter_common_permissionGroup` key while both are in use.
|
|
22
21
|
*/
|
|
23
22
|
export declare const permissionGroupFilterStorageKey: (system: string) => string;
|
|
24
23
|
export declare function usePermissionGroupListFilter(system: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionGroupFilter.js","names":["permissionGroupListFields","listStores","permissionGroupFilterStorageKey","system","usePermissionGroupListFilter","store","createFilterStore","createFilter","PERMISSION_GROUP_ENTITY","usePermissionGroupInnerFilter","innerFields"],"sources":["../../../../../src/domains/permission/group/filter/permissionGroupFilter.ts"],"sourcesContent":["import {\n createFilter,\n createFilterStore,\n type FilterConfig,\n type FilterData,\n type MakeFilterOption,\n} from '@/domains/filters/composables/filterFactory'\nimport { PERMISSION_GROUP_ENTITY } from '@/domains/permission/group/api/permissionGroupApi'\n\nconst permissionGroupListFields = [\n { name: 'id' as const, default: null, type: 'integer' },\n { name: 'title' as const, variant: 'startsWith', default: null, type: 'string', render: { skip: true } },\n] satisfies readonly MakeFilterOption[]\n\ntype ListFields = typeof permissionGroupListFields\n\n/**\n * One filter store per system
|
|
1
|
+
{"version":3,"file":"permissionGroupFilter.js","names":["permissionGroupListFields","listStores","permissionGroupFilterStorageKey","system","usePermissionGroupListFilter","store","createFilterStore","createFilter","PERMISSION_GROUP_ENTITY","usePermissionGroupInnerFilter","innerFields"],"sources":["../../../../../src/domains/permission/group/filter/permissionGroupFilter.ts"],"sourcesContent":["import {\n createFilter,\n createFilterStore,\n type FilterConfig,\n type FilterData,\n type MakeFilterOption,\n} from '@/domains/filters/composables/filterFactory'\nimport { PERMISSION_GROUP_ENTITY } from '@/domains/permission/group/api/permissionGroupApi'\n\nconst permissionGroupListFields = [\n { name: 'id' as const, default: null, type: 'integer' },\n { name: 'title' as const, variant: 'startsWith', default: null, type: 'string', render: { skip: true } },\n] satisfies readonly MakeFilterOption[]\n\ntype ListFields = typeof permissionGroupListFields\n\n/**\n * One filter store per system. admin-inhouse has four backends, and a shared\n * store would carry a title typed under `weather` into the `brick` list.\n */\nconst listStores = new Map<string, FilterData<ListFields>>()\n\n/**\n * Local-storage key for the list filter. Named so it does not collide with the replaced\n * per-admin views' `tableFilter_common_permissionGroup` key while both are in use.\n */\nexport const permissionGroupFilterStorageKey = (system: string) => `commonPermissionGroup_${system}`\n\nexport function usePermissionGroupListFilter(system: string): {\n filterConfig: FilterConfig<ListFields>\n filterData: FilterData<ListFields>\n} {\n let store = listStores.get(system)\n if (!store) {\n store = createFilterStore(permissionGroupListFields)\n listStores.set(system, store)\n }\n\n // `system: 'common'` is the translation namespace, not the backend.\n // Labels live in `common.permissionGroup.filter.*` for every backend.\n // The backend identity keys the store above.\n const { filterConfig, filterData } = createFilter(permissionGroupListFields, store, {\n system: 'common',\n subject: PERMISSION_GROUP_ENTITY,\n })\n\n return { filterConfig, filterData }\n}\n\nexport function usePermissionGroupInnerFilter() {\n // `title` is the autocomplete's `filter-by-field`. Built per call and never\n // registered: two autocompletes on a page must not type into each other.\n const innerFields = [\n { name: 'title' as const, variant: 'startsWith', default: null, type: 'string' },\n ] satisfies readonly MakeFilterOption[]\n\n const { filterConfig, filterData } = createFilter(innerFields, createFilterStore(innerFields), {\n system: 'common',\n subject: PERMISSION_GROUP_ENTITY,\n })\n\n return { filterConfig, filterData }\n}\n\n/** Test seam; the list stores are module state. */\nexport const resetPermissionGroupListFilters = () => {\n listStores.clear()\n}\n"],"mappings":";;;AASA,IAAMA,IAA4B,CAChC;CAAE,MAAM;CAAe,SAAS;CAAM,MAAM;AAAU,GACtD;CAAE,MAAM;CAAkB,SAAS;CAAc,SAAS;CAAM,MAAM;CAAU,QAAQ,EAAE,MAAM,GAAK;AAAE,CACzG,GAQMC,oBAAa,IAAI,IAAoC,GAM9CC,KAAmC,MAAmB,yBAAyBC;AAE5F,SAAgBC,EAA6B,GAG3C;CACA,IAAIC,IAAQJ,EAAW,IAAIE,CAAM;CACjC,AAAKE,MACH,IAAQC,EAAkBN,CAAyB,GACnDC,EAAW,IAAIE,GAAQE,CAAK;CAM9B,IAAM,EAAE,iBAAc,kBAAeE,EAAaP,GAA2BK,GAAO;EAClF,QAAQ;EACR,SAASG;CACX,CAAC;CAED,OAAO;EAAE;EAAc;CAAW;AACpC;AAEA,SAAgBC,IAAgC;CAG9C,IAAMC,IAAc,CAClB;EAAE,MAAM;EAAkB,SAAS;EAAc,SAAS;EAAM,MAAM;CAAS,CACjF,GAEM,EAAE,iBAAc,kBAAeH,EAAaG,GAAaJ,EAAkBI,CAAW,GAAG;EAC7F,QAAQ;EACR,SAASF;CACX,CAAC;CAED,OAAO;EAAE;EAAc;CAAW;AACpC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { PermissionGroup } from '../types/PermissionGroup';
|
|
2
2
|
/**
|
|
3
|
-
* A single open group, not a map keyed by system.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* of permission groups at all. Only one group is ever open, so a per-system map would be state
|
|
7
|
-
* nothing reads -- unlike the config store next door, which really is asked about several systems
|
|
8
|
-
* at once by the cross-system user pages.
|
|
3
|
+
* A single open group, not a map keyed by system. One system is one route
|
|
4
|
+
* and one view, and there is no cross-system permission group view.
|
|
5
|
+
* Unlike the config store, which cross-system user pages query for several systems at once.
|
|
9
6
|
*/
|
|
10
7
|
export declare const usePermissionGroupOneStore: import('pinia').SetupStoreDefinition<"commonAdminPermissionGroupOneStore", {
|
|
11
8
|
permissionGroup: import('vue').Ref<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionGroupStore.js","names":["usePermissionGroupOneStore","defineStore","usePermissionGroupFactory","permissionGroup","ref","createPermissionGroup","loadingPermissionGroup","setPermissionGroup","newPermissionGroup","setLoadingPermissionGroup","loading","reset"],"sources":["../../../../../src/domains/permission/group/store/permissionGroupStore.ts"],"sourcesContent":["import { acceptHMRUpdate, defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { usePermissionGroupFactory } from '@/domains/permission/group/factory/PermissionGroupFactory'\nimport type { PermissionGroup } from '@/domains/permission/group/types/PermissionGroup'\n\n/**\n * A single open group, not a map keyed by system
|
|
1
|
+
{"version":3,"file":"permissionGroupStore.js","names":["usePermissionGroupOneStore","defineStore","usePermissionGroupFactory","permissionGroup","ref","createPermissionGroup","loadingPermissionGroup","setPermissionGroup","newPermissionGroup","setLoadingPermissionGroup","loading","reset"],"sources":["../../../../../src/domains/permission/group/store/permissionGroupStore.ts"],"sourcesContent":["import { acceptHMRUpdate, defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { usePermissionGroupFactory } from '@/domains/permission/group/factory/PermissionGroupFactory'\nimport type { PermissionGroup } from '@/domains/permission/group/types/PermissionGroup'\n\n/**\n * A single open group, not a map keyed by system. One system is one route\n * and one view, and there is no cross-system permission group view.\n * Unlike the config store, which cross-system user pages query for several systems at once.\n */\nexport const usePermissionGroupOneStore = defineStore('commonAdminPermissionGroupOneStore', () => {\n const { createPermissionGroup } = usePermissionGroupFactory()\n\n const permissionGroup = ref<PermissionGroup>(createPermissionGroup())\n const loadingPermissionGroup = ref(false)\n\n function setPermissionGroup(newPermissionGroup: PermissionGroup) {\n permissionGroup.value = newPermissionGroup\n }\n\n function setLoadingPermissionGroup(loading: boolean) {\n loadingPermissionGroup.value = loading\n }\n\n function reset() {\n permissionGroup.value = createPermissionGroup()\n loadingPermissionGroup.value = false\n }\n\n return {\n permissionGroup,\n loadingPermissionGroup,\n setPermissionGroup,\n setLoadingPermissionGroup,\n reset,\n }\n})\n\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(usePermissionGroupOneStore, import.meta.hot))\n}\n"],"mappings":";;;;AAUA,IAAaA,IAA6BC,EAAY,4CAA4C;CAChG,IAAM,EAAE,6BAA0BC,EAA0B,GAEtDC,IAAkBC,EAAqBC,EAAsB,CAAC,GAC9DC,IAAyBF,EAAI,EAAK;CAExC,SAASG,EAAmB,GAAqC;EAC/D,EAAgB,QAAQC;CAC1B;CAEA,SAASC,EAA0B,GAAkB;EACnD,EAAuB,QAAQC;CACjC;CAEA,SAASC,IAAQ;EAEf,AADA,EAAgB,QAAQN,EAAsB,GAC9C,EAAuB,QAAQ;CACjC;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterRemoteAutocomplete.js","names":["_sfc_main","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocomplete_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} 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 name: string\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 prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\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 filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\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 onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\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 loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\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\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\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') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\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 }\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 await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// The clear of the field empties the filter in one go, with the model Vuetify has emptied, so the watcher of the\n// filter asks for the list once, for an empty search, and takes only its newest answer. The clear asked again itself,\n// with the search typed before, and wrote that answer whenever it came; a filter of several values was asked a\n// third time, for its default set only after that answer.\n// A filter of one value cleared onto the default it held does not change, and its watcher does nothing: the field\n// and the chips would stay empty while the filter keeps that value. Its item is put back, as the watcher puts one.\n// A clear that ends on a value (a default of the filter) asks for the list for an empty search here, through the\n// counter: the watcher asks for it only for an empty value, and the list stayed as the search before left it.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\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 },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.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\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// The close of a chip, where an admin makes the chips closable (`closable-chips`): its value goes out of the filter,\n// as when it is unticked in the list, and a filter of one value is cleared as by the clear of the field (the chip\n// slot draws its value as a chip too). The chip only hid itself, and the value went on filtering.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\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 </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AFilterRemoteAutocomplete.js","names":["_sfc_main","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocomplete_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} 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 name: string\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 prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\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 filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\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 onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\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 loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\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\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\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') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\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 }\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 await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// Clearing empties the filter in one step, so the filter watcher\n// fetches once for an empty search and keeps only the newest answer.\n// A single-value filter cleared onto its own default does not\n// change, so its watcher does nothing. Its item is restored here.\n// A clear that ends on a default value fetches the empty search here\n// through the counter, because the watcher only fetches for an empty value.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\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 },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.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\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Closing a chip (`closable-chips`) removes its value from the filter, like unticking it in the list.\n// A single-value filter is cleared like the field's clear, since the chip slot draws its value as a chip too.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\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 </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_unref","_hoisted_1","SEARCH_DEBOUNCE_MS","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","filterConfigCurrent","computed","selected","ref","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","item","requestsRunning","loading","byIdsCounter","resetToEmptyState","isArray","value","updateFilterSelected","updateSelected","findItem","obj","id","loadListItems","requestId","idsArray","ids","res","selectedNewValue","useAlerts","apiSearch","query","pagination","requestCounter","error","tryAutoFetch","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","useFilterClearHelpers","watchedValue","clearField","clearOne","onClickClear","isEmpty","newValue","oldValue","checkFirstLoad","placeholderComputed","noDataText","onSelectedUpdate","final","onChipCloseClick","closedItem","watch","newValueFilterData","oldValueFilterData","isBoolean","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","unref"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} 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 name: string\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 prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\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 filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\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 onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\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 loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\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\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\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') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\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 }\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 await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// The clear of the field empties the filter in one go, with the model Vuetify has emptied, so the watcher of the\n// filter asks for the list once, for an empty search, and takes only its newest answer. The clear asked again itself,\n// with the search typed before, and wrote that answer whenever it came; a filter of several values was asked a\n// third time, for its default set only after that answer.\n// A filter of one value cleared onto the default it held does not change, and its watcher does nothing: the field\n// and the chips would stay empty while the filter keeps that value. Its item is put back, as the watcher puts one.\n// A clear that ends on a value (a default of the filter) asks for the list for an empty search here, through the\n// counter: the watcher asks for it only for an empty value, and the list stayed as the search before left it.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\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 },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.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\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// The close of a chip, where an admin makes the chips closable (`closable-chips`): its value goes out of the filter,\n// as when it is unticked in the list, and a filter of one value is cleared as by the clear of the field (the chip\n// slot draws its value as a chip too). The chip only hid itself, and the value went on filtering.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\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 </VAutocomplete>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_unref","_hoisted_1","SEARCH_DEBOUNCE_MS","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","filterConfigCurrent","computed","selected","ref","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","item","requestsRunning","loading","byIdsCounter","resetToEmptyState","isArray","value","updateFilterSelected","updateSelected","findItem","obj","id","loadListItems","requestId","idsArray","ids","res","selectedNewValue","useAlerts","apiSearch","query","pagination","requestCounter","error","tryAutoFetch","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","useFilterClearHelpers","watchedValue","clearField","clearOne","onClickClear","isEmpty","newValue","oldValue","checkFirstLoad","placeholderComputed","noDataText","onSelectedUpdate","final","onChipCloseClick","closedItem","watch","newValueFilterData","oldValueFilterData","isBoolean","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","unref"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} 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 name: string\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 prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\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 filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\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 onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\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 loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\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\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\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') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\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 }\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 await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// Clearing empties the filter in one step, so the filter watcher\n// fetches once for an empty search and keeps only the newest answer.\n// A single-value filter cleared onto its own default does not\n// change, so its watcher does nothing. Its item is restored here.\n// A clear that ends on a default value fetches the empty search here\n// through the counter, because the watcher only fetches for an empty value.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\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 },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.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\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Closing a chip (`closable-chips`) removes its value from the filter, like unticking it in the list.\n// A single-value filter is cleared like the field's clear, since the chip slot draws its value as a chip too.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\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 </VAutocomplete>\n</template>\n"],"mappings":"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"}
|
package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.js","names":["_sfc_main","AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocompleteWithMinimal_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, onBeforeUnmount, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isBoolean, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { isOneOf } from '@/shared/utils/enum'\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 FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter config. ` +\n `Name is '${props.name}' and available options are ${Object.keys(filterData).join(', ')}.`\n )\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\n// The setup above throws unless the field is configured.\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\nconst fetchedItems = ref<any[]>([])\nconst selectedItemsCache = ref<any[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n selectedItemsCache.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n fetchedItems.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\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 loading = computed(() => requestsRunning.value > 0)\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[props.filterByField] = query\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nonBeforeUnmount(clearAutoFetchTimer)\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n requestsRunning.value++\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// The clear empties the filter in one go, with the model Vuetify has emptied, and asks for the list once, for an\n// empty search, through the counter of the searches. It asked with the search typed before, outside the counter,\n// wrote that answer whenever it came, and emptied the filter only after it. The list is there now: the auto-fetch\n// of an empty filter is not needed. A filter of one value cleared onto the default it held does not change for its\n// watcher: its value is shown again here.\nconst onClickClear = () => {\n clearField()\n clearAutoFetchTimer()\n autoFetched.value = true\n const value = filterData[props.name]\n if (!isEmptyValue(value) && value === watchedValue) showValue(value as string | number | Array<string | number>)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nconst isEmptyValue = (value: unknown) => isNull(value) || isUndefined(value) || (isArray(value) && value.length === 0)\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\n/** Puts a value of the filter into the field and the chips: from the items it has, or read by their ids. */\nconst showValue = async (newValue: string | number | Array<string | number>) => {\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n return\n }\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))[0]\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n watchedValue = newValue\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isEmptyValue(newValue)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n // One pending auto-fetch at a time: a second empty value would otherwise orphan the first timer.\n clearAutoFetchTimer()\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n await showValue(newValue as string | number | Array<string | number>)\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query.length < props.searchMinChars) return\n if (query !== (oldValue ?? '')) {\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.js","names":["_sfc_main","AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocompleteWithMinimal_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, onBeforeUnmount, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isBoolean, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { isOneOf } from '@/shared/utils/enum'\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 FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter config. ` +\n `Name is '${props.name}' and available options are ${Object.keys(filterData).join(', ')}.`\n )\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\n// The setup above throws unless the field is configured.\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\nconst fetchedItems = ref<any[]>([])\nconst selectedItemsCache = ref<any[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n selectedItemsCache.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n fetchedItems.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\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 loading = computed(() => requestsRunning.value > 0)\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[props.filterByField] = query\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nonBeforeUnmount(clearAutoFetchTimer)\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n requestsRunning.value++\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Clearing empties the filter in one step and fetches the list once for an empty search through the search counter.\n// So the auto-fetch for an empty filter is not needed. A single-value filter cleared\n// onto its default does not change for its watcher, so its value is shown again here.\nconst onClickClear = () => {\n clearField()\n clearAutoFetchTimer()\n autoFetched.value = true\n const value = filterData[props.name]\n if (!isEmptyValue(value) && value === watchedValue) showValue(value as string | number | Array<string | number>)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nconst isEmptyValue = (value: unknown) => isNull(value) || isUndefined(value) || (isArray(value) && value.length === 0)\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\n/** Puts a value of the filter into the field and the chips: from the items it has, or read by their ids. */\nconst showValue = async (newValue: string | number | Array<string | number>) => {\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n return\n }\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))[0]\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n watchedValue = newValue\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isEmptyValue(newValue)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n // One pending auto-fetch at a time: a second empty value would otherwise orphan the first timer.\n clearAutoFetchTimer()\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n await showValue(newValue as string | number | Array<string | number>)\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query.length < props.searchMinChars) return\n if (query !== (oldValue ?? '')) {\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_renderSlot","_createVNode","_component_VListItem","_mergeProps","_component_VChip","AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","selected","ref","search","isFocused","autoFetchTimer","apiRequestCounter","useI18n","filterConfigCurrent","computed","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","allItems","final","finalRaw","value","cloneDeep","key","requestsRunning","loading","useAlerts","apiSearch","query","res","pagination","requestCounter","findLocalDataByValues","found","values","item","tryToLoadFromLocalData","count","foundItems","isArray","newValue","autoFetched","clearAutoFetchTimer","autoFetch","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onSelectedUpdate","onClickClear","clearField","isEmptyValue","watchedValue","showValue","placeholderComputed","useFilterClearHelpers","clearOne","updateFilterSelected","watch","oldValue","isBoolean","isOneOf","watchDebounced","openBlock","createBlock","VAutocomplete","_cache","$event","withCtx","itemProps","itemItem","renderSlot","_ctx","createVNode","VListItem","mergeProps","chipProps","chipItem","VChip"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, onBeforeUnmount, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isBoolean, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { isOneOf } from '@/shared/utils/enum'\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 FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter config. ` +\n `Name is '${props.name}' and available options are ${Object.keys(filterData).join(', ')}.`\n )\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\n// The setup above throws unless the field is configured.\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\nconst fetchedItems = ref<any[]>([])\nconst selectedItemsCache = ref<any[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n selectedItemsCache.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n fetchedItems.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\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 loading = computed(() => requestsRunning.value > 0)\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[props.filterByField] = query\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nonBeforeUnmount(clearAutoFetchTimer)\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n requestsRunning.value++\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// The clear empties the filter in one go, with the model Vuetify has emptied, and asks for the list once, for an\n// empty search, through the counter of the searches. It asked with the search typed before, outside the counter,\n// wrote that answer whenever it came, and emptied the filter only after it. The list is there now: the auto-fetch\n// of an empty filter is not needed. A filter of one value cleared onto the default it held does not change for its\n// watcher: its value is shown again here.\nconst onClickClear = () => {\n clearField()\n clearAutoFetchTimer()\n autoFetched.value = true\n const value = filterData[props.name]\n if (!isEmptyValue(value) && value === watchedValue) showValue(value as string | number | Array<string | number>)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nconst isEmptyValue = (value: unknown) => isNull(value) || isUndefined(value) || (isArray(value) && value.length === 0)\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\n/** Puts a value of the filter into the field and the chips: from the items it has, or read by their ids. */\nconst showValue = async (newValue: string | number | Array<string | number>) => {\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n return\n }\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))[0]\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n watchedValue = newValue\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isEmptyValue(newValue)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n // One pending auto-fetch at a time: a second empty value would otherwise orphan the first timer.\n clearAutoFetchTimer()\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n await showValue(newValue as string | number | Array<string | number>)\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query.length < props.searchMinChars) return\n if (query !== (oldValue ?? '')) {\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_renderSlot","_createVNode","_component_VListItem","_mergeProps","_component_VChip","AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","selected","ref","search","isFocused","autoFetchTimer","apiRequestCounter","useI18n","filterConfigCurrent","computed","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","allItems","final","finalRaw","value","cloneDeep","key","requestsRunning","loading","useAlerts","apiSearch","query","res","pagination","requestCounter","findLocalDataByValues","found","values","item","tryToLoadFromLocalData","count","foundItems","isArray","newValue","autoFetched","clearAutoFetchTimer","autoFetch","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onSelectedUpdate","onClickClear","clearField","isEmptyValue","watchedValue","showValue","placeholderComputed","useFilterClearHelpers","clearOne","updateFilterSelected","watch","oldValue","isBoolean","isOneOf","watchDebounced","openBlock","createBlock","VAutocomplete","_cache","$event","withCtx","itemProps","itemItem","renderSlot","_ctx","createVNode","VListItem","mergeProps","chipProps","chipItem","VChip"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, onBeforeUnmount, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isBoolean, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { isOneOf } from '@/shared/utils/enum'\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 FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter config. ` +\n `Name is '${props.name}' and available options are ${Object.keys(filterData).join(', ')}.`\n )\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\n// The setup above throws unless the field is configured.\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\nconst fetchedItems = ref<any[]>([])\nconst selectedItemsCache = ref<any[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n selectedItemsCache.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n fetchedItems.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\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 loading = computed(() => requestsRunning.value > 0)\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[props.filterByField] = query\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nonBeforeUnmount(clearAutoFetchTimer)\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n requestsRunning.value++\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.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 (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Clearing empties the filter in one step and fetches the list once for an empty search through the search counter.\n// So the auto-fetch for an empty filter is not needed. A single-value filter cleared\n// onto its default does not change for its watcher, so its value is shown again here.\nconst onClickClear = () => {\n clearField()\n clearAutoFetchTimer()\n autoFetched.value = true\n const value = filterData[props.name]\n if (!isEmptyValue(value) && value === watchedValue) showValue(value as string | number | Array<string | number>)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nconst isEmptyValue = (value: unknown) => isNull(value) || isUndefined(value) || (isArray(value) && value.length === 0)\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\n/** Puts a value of the filter into the field and the chips: from the items it has, or read by their ids. */\nconst showValue = async (newValue: string | number | Array<string | number>) => {\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n return\n }\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))[0]\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n watchedValue = newValue\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isEmptyValue(newValue)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n // One pending auto-fetch at a time: a second empty value would otherwise orphan the first timer.\n clearAutoFetchTimer()\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n await showValue(newValue as string | number | Array<string | number>)\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query.length < props.searchMinChars) return\n if (query !== (oldValue ?? '')) {\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,IAAMW,IAAQC,GAsBRC,KAAOH,GAIPI,KAAqBC,EAAOC,EAA2B,GACvDC,IAAiBF,EAAOG,EAAiB,GACzCC,IAAeJ,EAAOK,EAAe,GACrCC,IAAaN,EAAOO,EAAa,GACjCC,IAAoBR,EAAOS,EAAoB,GAC/CC,IAAkBV,EAAOW,EAAkB,GAE3CC,IAAgBC,GAAmB,CAAC,EAAE,KAAK;EAEjD,IACEC,EAAYf,EAAkB,KAC9Be,EAAYZ,CAAc,KAC1BY,EAAYR,CAAU,KACtBQ,EAAYV,CAAY,KACxBU,EAAYN,CAAiB,KAC7BM,EAAYJ,CAAe,GAE3B,MAAU,MAAM,IAAIE,EAAc,mCAAmC;EAGvE,IAEEE,EAAYV,EAAa,OAAOR,EAAM,KAAK,KAE3CkB,EAAYR,EAAWV,EAAM,KAAK,GAElC,MAAU,MACR,IAAIgB,EAAc,sCACJhB,EAAM,KAAK,8BAA8B,OAAO,KAAKU,CAAU,CAAC,CAAC,KAAK,IAAI,EAAE,EAC5F;EAGF,IAEEQ,EAAYN,EAAkB,OAAOZ,EAAM,cAAc,KAEzDkB,EAAYJ,EAAgBd,EAAM,cAAc,GAEhD,MAAU,MACR,IAAIgB,EAAc,qDACKhB,EAAM,cAAc,8BAA8B,OAAO,KAAKc,CAAe,CAAC,CAAC,KAAK,IAAI,EAAE,EACnH;EAGF,IAAMK,IAAWC,EAAS,CAAC,CAAC,GACtBC,IAASD,EAAI,EAAE,GACfE,IAAYF,EAAI,EAAK,GACrBG,IAAiEH,EAAI,KAAA,CAAS,GAE9EI,IAAoBJ,EAAI,CAAC,GAEzB,EAAE,SAAMK,EAAQ,GAGhBC,IAAsBC,QAAenB,EAAa,OAAOR,EAAM,KAAM,GAErE4B,UAAe;GACnB,EAAU,QAAQ;EACpB,GAEMC,IAAQF,QACLD,EAAoB,MAAM,SAASI,EAAEJ,EAAoB,MAAM,MAAM,IAAI,KAAA,CACjF,GAGK,EAAE,kBAAeK,GAErBC,EAAOhC,EAAM,YAAY,IAAI,OAAOA,EAAM,aAAa,KACvDA,EAAM,cAAc,KACtB,GACMiC,IAAeb,EAAW,CAAC,CAAC,GAC5Bc,IAAqBd,EAAW,CAAC,CAAC,GAElCe,IAAWR,QAAuD;GACtE,IAAMS,oBAAQ,IAAI,IAAI,GAChBC,oBAAwC,IAAI,IAAI;GAmBtD,OAlBAH,EAAmB,MAAM,SAAS,MAAU;IAC1C,AAAII,EAAM,OACRF,EAAM,IAAIE,EAAM,IAAItC,EAAM,YAAYsC,EAAM,IAAItC,EAAM,UAAU,GAChEqC,EAAS,IAAIC,EAAM,IAAItC,EAAM,YAAYuC,EAAUD,EAAM,GAAG,CAAC,MAE7DF,EAAM,IAAIE,EAAMtC,EAAM,YAAYsC,EAAMtC,EAAM,UAAU,GACxDqC,EAAS,IAAIC,EAAMtC,EAAM,YAAYuC,EAAUD,CAAK,CAAC;GAEzD,CAAC,GACDL,EAAa,MAAM,SAAS,MAAU;IACpC,AAAIK,EAAM,OACRF,EAAM,IAAIE,EAAM,IAAItC,EAAM,YAAYsC,EAAM,IAAItC,EAAM,UAAU,GAChEqC,EAAS,IAAIC,EAAM,IAAItC,EAAM,YAAYuC,EAAUD,EAAM,GAAG,CAAC,MAE7DF,EAAM,IAAIE,EAAMtC,EAAM,YAAYsC,EAAMtC,EAAM,UAAU,GACxDqC,EAAS,IAAIC,EAAMtC,EAAM,YAAYuC,EAAUD,CAAK,CAAC;GAEzD,CAAC,GACM,MAAM,KAAKF,IAAQ,CAACI,GAAKF,QACvB;IAAE,OAAOE;IAAK,OAAOF;IAAO,KAAKD,EAAS,IAAIG,CAAG;GAAE,EAC3D;EACH,CAAC,GAIKC,IAAkBrB,EAAI,CAAC,GACvBsB,KAAUf,QAAec,EAAgB,QAAQ,CAAC,GAElD,EAAE,yBAAsBE,EAAU,GAElCC,IAAY,OAAO,GAAe,MAA2B;GAEjE,AADA,EAAgB,SAChB,EAAgB5C,EAAM,iBAAiB6C;GACvC,IAAI;IACF,IAAMC,IAAM,MAAM9C,EAAM,kBAAkB+C,GAAYjC,GAAiBF,CAAiB;IACxF,AAAIoC,MAAmBxB,EAAkB,UAAO,EAAa,QAAQsB;GACvE,SAAS,GAAG;IACV,EAAkB,CAAC;GACrB,UAAU;IACR,EAAgB;GAClB;EACF,GAEMG,KAAyB,MAAqC;GAClE,IAAMC,IAAQf,EAAS,MAAM,QAAQ,MAA6CgB,EAAO,SAASC,EAAK,KAAK,CAAC;GAC7G,OAAQ,CAAC,CAAC,CAA0C,OAAOF,CAAK;EAClE,GAEMG,KAAyB,OAAO,MAAuD;GAC3F,IAAIC,IAAQ,GACRC,IAAmD,CAAC;GAQxD,OAPIC,EAAQC,CAAQ,KAClB,IAAQA,EAAS,QACjB,IAAaR,EAAsBQ,CAAQ,KAE3C,IAAaR,EAAsB,CAACQ,CAAQ,CAAC,GAE/C,EAAmB,QAAQF,GACpBA,EAAW,WAAWD;EAC/B,GAEMI,IAActC,EAAI,EAAK,GAEvBuC,UAA4B;GAEhC,AADA,aAAapC,EAAe,KAAK,GACjC,EAAe,QAAQ,KAAA;EACzB;EAEA,GAAgBoC,CAAmB;EAEnC,IAAMC,IAAY,YAAY;GAE5B,IADAD,EAAoB,GAChBD,EAAY,UAAU,IAC1B;IACA,AADA,EAAY,QAAQ,IACpB,EAAgB;IAChB,IAAI;KACF,IAAMZ,IAAM,MAAM9C,EAAM,kBAAkB+C,GAAYjC,GAAiBF,CAAiB;KACxF,AAAIY,EAAkB,UAAU,MAAG,EAAa,QAAQsB;IAC1D,SAAS,GAAG;KACV,EAAkB,CAAC;IACrB,UAAU;KACR,EAAgB;IAClB;GAToB;EAUtB,GAEMe,WAAgB;GAEpB,AADA,EAAU,QAAQ,IACd7D,EAAM,aAAa,OACvB2D,EAAoB,GACpBC,EAAU;EACZ,GAEME,WAAqB;GACzB,AAAI9D,EAAM,aAAa,WAAWA,EAAM,aAAa,OACrD2D,EAAoB,GACpBC,EAAU;EACZ,GAEMG,KAA0BpC,QAAe;GAC7C,IAAI,CAACD,EAAoB,MAAM,YAAYQ,EAAmB,MAAM,IAClE,OAAOA,EAAmB,MAAM,EAAE,CAAC;EAGvC,CAAC,GAGK8B,MAAkB,MAAyB;GAC/C,IAAMC,IAAOpB,KAAS;GACtB,CAAKnB,EAAoB,MAAM,YAAaJ,EAAU,SAAS2C,EAAK,WAAW,MAC3EF,GAAwB,UAAUE,MACtC,EAAO,QAAQA;EACjB,GAEMC,KAAoB,MAAkB;GAC1C,EAAa,UAAU;GACvB,IAAI9B,IAAsD;GAO1D,AANIoB,EAAQC,CAAQ,IAClB,IAAQA,EAAS,KAAK,MAAcL,EAAK,KAAK,IACpCpB,EAAOyB,CAAQ,MACzB,IAAQA,EAAS,QAEnB,EAAWzD,EAAM,QAAQoC,GACzBlC,GAAK,QAAQ;EACf,GAKMiE,WAAqB;GAGzB,AAFAC,GAAW,GACXT,EAAoB,GACpB,EAAY,QAAQ;GACpB,IAAMrB,IAAQ5B,EAAWV,EAAM;GAG/B,AAFI,CAACqE,EAAa/B,CAAK,KAAKA,MAAUgC,KAAcC,EAAUjC,CAAiD,GAC/G,EAAkB,SAClBM,EAAU,IAAIpB,EAAkB,KAAK;EACvC,GAEMgD,KAAsB7C,QACrBT,EAAYlB,EAAM,WAAW,IAC9B0B,EAAoB,MAAM,YAAY,eAAqBI,EAAE,2CAA2C,IACxGJ,EAAoB,MAAM,YAAY,OAAaI,EAAE,mCAAmC,IACxFJ,EAAoB,MAAM,YAAY,WAAiBI,EAAE,yCAAyC,IAC/F,KAJqC9B,EAAM,WAKnD,GAEK,EAAE,iBAAayE,GAAsB,GAErCL,WAAmB;GAEvB,AADAM,GAAS1E,EAAM,MAAMU,GAAYF,CAAY,GAC7CF,EAAe,MAAM,OAAON,EAAM,IAAI;EACxC,GAEM2E,KACJ,MACG;GAEH,AADArE,EAAe,MAAM,OAAON,EAAM,IAAI,GACjCwD,EAAQC,CAAQ,KAAKA,EAAS,WAAW,KAAMzB,EAAOyB,CAAQ,IACjEnD,EAAe,MAAM,OAAON,EAAM,IAAI,IAGpCwD,EAAQC,CAAQ,IAClBnD,EAAe,MAAM,IACnBN,EAAM,MACNyD,EAAS,KAAK,OAAU;IAAE,OAAOL,EAAK;IAAO,OAAOA,EAAK;GAAM,EAAE,CACnE,IAGF9C,EAAe,MAAM,IAAIN,EAAM,MAAM,CAAC;IAAE,OAAOyD,EAAS;IAAO,OAAOA,EAAS;GAAM,CAAC,CAAC;EACzF,GAEMY,KAAgB,MAAmBrC,EAAOM,CAAK,KAAKpB,EAAYoB,CAAK,KAAMkB,EAAQlB,CAAK,KAAKA,EAAM,WAAW,GAGhHgC,GAGEC,IAAY,OAAO,MAAuD;GAE9E,IAAI,MADgBlB,GAAuBI,CAAQ,GAMjD,AAJA,EAAS,QAAQvB,EAAmB,MAAM,KAAK,OAAU;IACvD,OAAOkB,EAAK;IACZ,OAAOA,EAAK;GACd,EAAE,GACFuB,EAAqBxD,EAAS,KAAK;QAGrC,IAAIqC,EAAQC,CAAQ,GAAG;IACrB,EAAgB;IAChB,IAAI;KAMF,AALA,EAAmB,QAAQ,MAAMzD,EAAM,uBAAuByD,CAAoC,GAClG,EAAS,QAAQvB,EAAmB,MAAM,KAAK,OAAU;MACvD,OAAOkB,EAAK;MACZ,OAAOA,EAAK;KACd,EAAE,GACFuB,EAAqBxD,EAAS,KAAK;IACrC,SAAS,GAAG;KACV,EAAkB,CAAC;IACrB,UAAU;KACR,EAAgB;IAClB;GAEF,OACA;MAAgB;IAChB,IAAI;KAMF,AALA,EAAmB,QAAQ,MAAMnB,EAAM,uBAAuB,CAACyD,CAA6B,CAAC,GAC7F,EAAS,QAAQvB,EAAmB,MAAM,KAAK,OAAU;MACvD,OAAOkB,EAAK;MACZ,OAAOA,EAAK;KACd,EAAE,CAAC,CAAC,IACJuB,EAAqBxD,EAAS,KAAK;IACrC,SAAS,GAAG;KACV,EAAkB,CAAC;IACrB,UAAU;KACR,EAAgB;IAClB;GAZgB;EAalB;E,OAEAyD,SACQlE,EAAWV,EAAM,OACvB,OAAO,GAAU,MAAa;GAE5B,IADA,IAAeyD,GACX,QAAaoB,KAAYC,EAAUrB,CAAQ,IAC/C;QAAIY,EAAaZ,CAAQ,GAAG;KAQ1B,IAPA,EAAmB,QAAQ,CAAC,GACxB/B,EAAoB,MAAM,WAC5B,EAAS,QAAQ,CAAC,IAElB,EAAS,QAAQ,MAEnBiD,EAAqBxD,EAAS,KAAK,GAC/BuC,EAAY,UAAU,MAAQqB,GAAQ/E,EAAM,UAAU;MAAC;MAAS;MAAS;KAAK,CAAC,GAAG;KAGtF,AADA2D,EAAoB,GACpB,EAAe,QAAQ,iBAAiB;MACtC,EAAU;KACZ,GAAG,GAAI;IAET,OACA,MAAMY,EAAUd,CAAoD;GADpE;EAEF,GACA,EAAE,WAAW,GAAK,CACpB,GAEAuB,EACE3D,IACC,GAAyB,MAA4B;GACpD,IAAMwB,IAAQY,KAAY;GAC1B,AAAIZ,EAAM,SAAS7C,EAAM,kBACrB6C,OAAWgC,KAAY,QACzB,EAAkB,SAClBjC,EAAUC,GAAOrB,EAAkB,KAAK;EAE5C,GACA,EAAE,UAAU,IAAI,CAClB,I,UAIEnC,EAAA,GAAAC,EAgDgBC,GAAA;GA/CL,YAAA4B,EAAA;G,wBAAA,AAAAiE,EAAA,QAAA,MAAA,EAAQ,QAAAC,GAaInB,C;GAZpB,OAAO/B,EAAA;GACR,aAAA;GACC,aAAaqC,GAAA;GACb,UAAU9C,EAAA,MAAoB;GAC9B,WAAS,CAAGA,EAAA,MAAoB;GAChC,OAAOG,EAAA;GACP,OAAOH,EAAA,MAAoB;GAC3B,SAASgB,GAAA;GACV,gBAAA;GACA,iBAAA;GACA,cAAa;GACZ,mBAAesB;GAET;GACC;GACP,cAAYF;GACZ,iBAAaK;;GAGH,MAAI3E,GAWN,EAAA,OAXiB+F,GAAS,cAAgBC,QAAQ,CACzD/F,EAUOiG,EAAA,QAAA,QAAA;IARJ,MAAMF;IACN,OAAOD;GAHV,SAUO,CALL7F,EAIEC,GAJFC,EACU2F,GAAS;IAChB,OAAOC,EAAS,IAAI;IACpB,UAAUA,EAAS,IAAI;;GAKnB,MAAIhG,GAWN,EAAA,OAXiBsG,GAAS,cAAgBC,QAAQ,CACzDtG,EAUOiG,EAAA,QAAA,QAAA;IARJ,OAAOI;IACP,MAAMC;GAHT,SAUO,CALLrG,EAIEG,GAJFD,EACUkG,GAAS;IACjB,eAAY;IACX,MAAMC,EAAS"}
|