@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +39 -29
- package/src/e2e/conventions.d.mts +4 -0
- package/src/e2e/conventions.mjs +15 -0
- package/src/e2e/index.d.mts +8 -0
- package/src/e2e/index.mjs +1 -0
- package/src/e2e/routeWalk.d.mts +43 -0
- package/src/e2e/routeWalk.mjs +606 -0
- package/src/e2e/types.d.mts +161 -0
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- package/src/vite/sourcemaps.mjs +4 -8
package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterWrapper.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_component_VRow","_createVNode","_component_VCol","_renderSlot","_createCommentVNode","_unref","_createElementVNode","FilterBookmarks","AFilterAdvancedButton","FiltersSelected","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","_createElementBlock","_resolveDynamicComponent","_withDirectives","_normalizeClass","_Fragment","_renderList","FilterDetailItem","_vShow","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","AFilterAdvancedButton_default","FiltersSelected_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AFilterWrapper_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","\"showDetail\"","\"showDetailModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","showDetail","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","toggleFilterDetail","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","VRow","createVNode","VCol","renderSlot","_ctx","createCommentVNode","unref","isDefined","createElementVNode","_cache","$event","createElementBlock","resolveDynamicComponent","withDirectives","normalizeClass","Fragment","renderList","datatableSlotName","vShow"],"sources":["../../../../src/domains/filters/components/AFilterWrapper.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/domains/filters/components/AFilterAdvancedButton.vue'\nimport AFilterSubmitButton from '@/domains/filters/components/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/domains/filters/components/AFilterResetButton.vue'\nimport { computed, inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport FiltersSelected from '@/domains/filters/components/FiltersSelected.vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isBoolean, isDefined, isUndefined } from '@/shared/utils/common'\nimport { type FilterStoreIdentifier, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { datatableSlotName } from '@/domains/filters/datatable/utils/datatable'\nimport FilterDetailItem from '@/domains/filters/components/FilterDetailItem.vue'\nimport AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { type AxiosInstance } from 'axios'\n\nconst props = withDefaults(\n defineProps<{\n enableTop?: boolean\n hideButtons?: boolean\n formName?: string\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n alwaysVisible?: boolean\n hideMore?: boolean\n }>(),\n {\n enableTop: false,\n hideButtons: false,\n formName: 'search',\n userId: undefined,\n client: undefined,\n store: true,\n alwaysVisible: false,\n hideMore: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'reset'): void\n (e: 'bookmarkLoadAfter'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\nconst showDetail = defineModel<boolean>('showDetail', { default: false, required: false })\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\nconst identifier = ref<Partial<FilterStoreIdentifier>>({\n system: filterConfig.general.system,\n subject: filterConfig.general.subject,\n})\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isBoolean(props.store)) {\n identifier.value.system = props.store.system\n identifier.value.subject = props.store.subject\n} else if (false === props.store) {\n identifier.value.system = undefined\n identifier.value.subject = undefined\n}\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n })\n}\n\nconst toggleFilterDetail = () => {\n showDetail.value = !showDetail.value\n}\n\nconst touched = computed(() => {\n return filterConfig.touched\n})\n\n// Names of `filterConfig.fields` itself, so the template's lookups by them always hit.\nconst renderedFieldNames = computed(() => {\n return Object.entries(filterConfig.fields)\n .filter(([, field]) => !field.render.skip)\n .map(([fieldName]) => fieldName)\n})\n\nif (props.alwaysVisible) {\n showDetail.value = true\n}\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <VRow\n v-if=\"enableTop\"\n density=\"compact\"\n >\n <VCol>\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <slot name=\"bookmarks\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :user-id=\"userId\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </slot>\n </VCol>\n </VRow>\n <VRow\n v-if=\"!alwaysVisible\"\n density=\"compact\"\n >\n <VCol\n v-if=\"!hideMore\"\n cols=\"auto\"\n >\n <AFilterAdvancedButton\n :button-active=\"showDetail\"\n @advanced-filter=\"toggleFilterDetail\"\n />\n </VCol>\n <VCol>\n <div class=\"a-filter__container\">\n <div class=\"a-filter__search\">\n <slot name=\"search\" />\n </div>\n <FiltersSelected />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"text-right\"\n cols=\"auto\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n :client=\"client\"\n :user=\"userId\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </VCol>\n </VRow>\n <div v-if=\"!hideMore\">\n <component :is=\"alwaysVisible ? 'div' : 'VSlideYTransition'\">\n <div\n v-show=\"showDetail\"\n :class=\"{ 'mt-6 pa-4 border': !alwaysVisible }\"\n >\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"fieldName in renderedFieldNames\"\n :key=\"fieldName\"\n :cols=\"filterConfig.fields[fieldName]!.render.xs || 12\"\n :sm=\"filterConfig.fields[fieldName]!.render.sm || 6\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 4\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 3\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 2\"\n >\n <slot\n :name=\"datatableSlotName(fieldName)\"\n :item-config=\"filterConfig.fields[fieldName]!\"\n >\n <FilterDetailItem :name=\"fieldName\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n </component>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n\n &__search {\n display: inline-flex;\n vertical-align: middle;\n min-width: 100%;\n height: 34px;\n\n @include media-breakpoint-up(sm) {\n min-width: 50%;\n margin-right: 8px;\n }\n\n @include media-breakpoint-up(md) {\n min-width: 40%;\n }\n\n @include media-breakpoint-up(lg) {\n min-width: 30%;\n }\n }\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AFilterWrapper.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_component_VRow","_createVNode","_component_VCol","_renderSlot","_createCommentVNode","_unref","_createElementVNode","FilterBookmarks","AFilterAdvancedButton","FiltersSelected","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","_createElementBlock","_resolveDynamicComponent","_withDirectives","_normalizeClass","_Fragment","_renderList","FilterDetailItem","_vShow","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","AFilterAdvancedButton_default","FiltersSelected_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AFilterWrapper_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","\"showDetail\"","\"showDetailModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","showDetail","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","toggleFilterDetail","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","VRow","createVNode","VCol","renderSlot","_ctx","createCommentVNode","unref","isDefined","createElementVNode","_cache","$event","createElementBlock","resolveDynamicComponent","VSlideYTransition","withDirectives","normalizeClass","Fragment","renderList","datatableSlotName","vShow"],"sources":["../../../../src/domains/filters/components/AFilterWrapper.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/domains/filters/components/AFilterAdvancedButton.vue'\nimport AFilterSubmitButton from '@/domains/filters/components/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/domains/filters/components/AFilterResetButton.vue'\nimport { computed, inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport FiltersSelected from '@/domains/filters/components/FiltersSelected.vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isBoolean, isDefined, isUndefined } from '@/shared/utils/common'\nimport { type FilterStoreIdentifier, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { datatableSlotName } from '@/domains/filters/datatable/utils/datatable'\nimport FilterDetailItem from '@/domains/filters/components/FilterDetailItem.vue'\nimport AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { type AxiosInstance } from 'axios'\nimport { VSlideYTransition } from 'vuetify/components/transitions'\n\nconst props = withDefaults(\n defineProps<{\n enableTop?: boolean\n hideButtons?: boolean\n formName?: string\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n alwaysVisible?: boolean\n hideMore?: boolean\n }>(),\n {\n enableTop: false,\n hideButtons: false,\n formName: 'search',\n userId: undefined,\n client: undefined,\n store: true,\n alwaysVisible: false,\n hideMore: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'reset'): void\n (e: 'bookmarkLoadAfter'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\nconst showDetail = defineModel<boolean>('showDetail', { default: false, required: false })\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\nconst identifier = ref<Partial<FilterStoreIdentifier>>({\n system: filterConfig.general.system,\n subject: filterConfig.general.subject,\n})\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isBoolean(props.store)) {\n identifier.value.system = props.store.system\n identifier.value.subject = props.store.subject\n} else if (false === props.store) {\n identifier.value.system = undefined\n identifier.value.subject = undefined\n}\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n })\n}\n\nconst toggleFilterDetail = () => {\n showDetail.value = !showDetail.value\n}\n\nconst touched = computed(() => {\n return filterConfig.touched\n})\n\n// Names of `filterConfig.fields` itself, so the template's lookups by them always hit.\nconst renderedFieldNames = computed(() => {\n return Object.entries(filterConfig.fields)\n .filter(([, field]) => !field.render.skip)\n .map(([fieldName]) => fieldName)\n})\n\nif (props.alwaysVisible) {\n showDetail.value = true\n}\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <VRow\n v-if=\"enableTop\"\n density=\"compact\"\n >\n <VCol>\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <slot name=\"bookmarks\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :user-id=\"userId\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </slot>\n </VCol>\n </VRow>\n <VRow\n v-if=\"!alwaysVisible\"\n density=\"compact\"\n >\n <VCol\n v-if=\"!hideMore\"\n cols=\"auto\"\n >\n <AFilterAdvancedButton\n :button-active=\"showDetail\"\n @advanced-filter=\"toggleFilterDetail\"\n />\n </VCol>\n <VCol>\n <div class=\"a-filter__container\">\n <div class=\"a-filter__search\">\n <slot name=\"search\" />\n </div>\n <FiltersSelected />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"text-right\"\n cols=\"auto\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n :client=\"client\"\n :user=\"userId\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </VCol>\n </VRow>\n <div v-if=\"!hideMore\">\n <component :is=\"alwaysVisible ? 'div' : VSlideYTransition\">\n <div\n v-show=\"showDetail\"\n :class=\"{ 'mt-6 pa-4 border': !alwaysVisible }\"\n >\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"fieldName in renderedFieldNames\"\n :key=\"fieldName\"\n :cols=\"filterConfig.fields[fieldName]!.render.xs || 12\"\n :sm=\"filterConfig.fields[fieldName]!.render.sm || 6\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 4\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 3\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 2\"\n >\n <slot\n :name=\"datatableSlotName(fieldName)\"\n :item-config=\"filterConfig.fields[fieldName]!\"\n >\n <FilterDetailItem :name=\"fieldName\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n </component>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n\n &__search {\n display: inline-flex;\n vertical-align: middle;\n min-width: 100%;\n height: 34px;\n\n @include media-breakpoint-up(sm) {\n min-width: 50%;\n margin-right: 8px;\n }\n\n @include media-breakpoint-up(md) {\n min-width: 40%;\n }\n\n @include media-breakpoint-up(lg) {\n min-width: 30%;\n }\n }\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
2
|
formName?: string;
|
|
3
3
|
};
|
|
4
|
-
declare
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
declare const __VLS_template: () => {
|
|
5
|
+
__VLS_Slots: {
|
|
6
|
+
default?: (props: {}) => any;
|
|
7
|
+
};
|
|
7
8
|
};
|
|
9
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
8
10
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
9
11
|
resetFilter: () => void;
|
|
10
12
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FiltersSelected.js","names":["_sfc_main","FiltersSelected_vue_vue_type_script_setup_true_lang_default","FiltersSelected_default"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing
|
|
1
|
+
{"version":3,"file":"FiltersSelected.js","names":["_sfc_main","FiltersSelected_vue_vue_type_script_setup_true_lang_default","FiltersSelected_default"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing restores the default. On a field already at its non-null default, the close\n * button would drop the chip, write the same value, and the chip would come back.\n * Arrays differ: closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both.\n // Only `until` may differ, because the custom dialog opens prefilled. The button still has work then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":""}
|
package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FiltersSelected.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createBlock","_component_VChip","_withModifiers","_withCtx","_createVNode","_component_VIcon","_createTextVNode","_hoisted_1","FiltersSelected_vue_vue_type_script_setup_true_lang_default","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","filterSelected","FilterSelectedKey","isUndefined","useI18n","getTitleFromConfig","titleT","name","t","selectedArray","computed","fieldOrder","key","valueArray","a","b","useFilterClearHelpers","canClear","isClearable","config","related","value","isArray","clickClose","clearOneFilterSelected","optionValue","openBlock","createElementBlock","Fragment","renderList","item","createElementVNode","toDisplayString","option","createBlock","VChip","withModifiers","withCtx","createVNode","VIcon","createTextVNode"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing
|
|
1
|
+
{"version":3,"file":"FiltersSelected.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createBlock","_component_VChip","_withModifiers","_withCtx","_createVNode","_component_VIcon","_createTextVNode","_hoisted_1","FiltersSelected_vue_vue_type_script_setup_true_lang_default","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","filterSelected","FilterSelectedKey","isUndefined","useI18n","getTitleFromConfig","titleT","name","t","selectedArray","computed","fieldOrder","key","valueArray","a","b","useFilterClearHelpers","canClear","isClearable","config","related","value","isArray","clickClose","clearOneFilterSelected","optionValue","openBlock","createElementBlock","Fragment","renderList","item","createElementVNode","toDisplayString","option","createBlock","VChip","withModifiers","withCtx","createVNode","VIcon","createTextVNode"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing restores the default. On a field already at its non-null default, the close\n * button would drop the chip, write the same value, and the chip would come back.\n * Arrays differ: closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both.\n // Only `until` may differ, because the custom dialog opens prefilled. The button still has work then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;EAOA,IAAMe,IAAeC,EAAOC,CAAe,GACrCC,IAAaF,EAAOG,CAAa,GACjCC,IAAiBJ,EAAOK,CAAiB;EAE/C,IAAIC,EAAYP,CAAY,KAAKO,EAAYJ,CAAU,KAAKI,EAAYF,CAAc,GACpF,MAAU,MAAM,kCAAkC;EAGpD,IAAM,EAAE,SAAMG,EAAQ,GAEhBC,KAAsB,MAAiB;GAC3C,IAAMC,IAASV,EAAa,SAASW,EAAK,EAAE;GAE5C,OADID,IAAeE,EAAEF,CAAM,IACpBC;EACT,GAEME,IAAgBC,QAAe;GACnC,IAAMC,IAAa,OAAO,KAAKf,EAAa,MAAM;GAClD,OAAO,MAAM,KAAKK,EAAe,KAAK,CAAA,CACnC,QAAQ,CAACW,OAAShB,EAAa,SAASgB,EAAI,EAAE,QAAQ,aAAa,EAAK,CAAA,CACxE,KAAK,CAACA,GAAKC,QAAiB;IAC3B,MAAMD;IACN,OAAOP,EAAmBO,CAAG;IAC7B,SAASC;GACX,EAAE,CAAA,CACD,MAAM,GAAG,MAAMF,EAAW,QAAQG,EAAE,IAAI,IAAIH,EAAW,QAAQI,EAAE,IAAI,CAAC;EAC3E,CAAC,GAEK,EAAE,2BAAwB,mBAAgBC,EAAsB,GAOhEC,KAAY,MAAiB;GACjC,IAAI,CAACC,EAAYX,GAAMX,CAAY,GAAG,OAAO;GAE7C,IAAMuB,IAASvB,EAAa,OAAOW;GAGnC,IAAIY,EAAO,SAAS,kBAAkBA,EAAO,SAAS;IAEpD,IAAMC,IAAUxB,EAAa,OAAOuB,EAAO;IAC3C,IAAIpB,EAAWoB,EAAO,aAAaC,EAAQ,SAAS,OAAO;GAC7D;GACA,IAAMC,IAAQtB,EAAWQ;GAEzB,OADIe,EAAQD,CAAK,IAAU,KACpBA,MAAUF,EAAO;EAC1B,GAEMI,KAAc,GAAc,MAAiC;GAEjE,AADAC,EAAuBjB,GAAMkB,GAAa1B,GAAYH,GAAcK,CAAc,GAClF,EAAa,UAAU;EACzB;E,kBAIEpB,EAAA,EAAA,GAAAC,EAmCMC,GAAA,MAAAC,EAlCWyB,EAAA,QAAR,OADT5B,EAAA,GAAAC,EAmCM,OAAA;GAjCH,KAAKgD,EAAK;GACX,OAAM;E,IAEN7C,EAA8E,OAA9ES,GAA8ER,EAApB4C,EAAK,KAAK,IAAG,KAAC,CAAA,IACxEjD,EAAA,EAAA,GAAAC,EA4BMC,GAAA,MAAAC,EA3Ba8C,EAAK,UAAf,OADTjD,EAAA,GAAAC,EA4BM,OAAA;GA1BH,KAAKmD,EAAO;GACb,OAAM;E,IAGEhB,EAASa,EAAK,IAAI,KAD1BjD,EAAA,GAAAM,EAeQC,GAAA;;GAbN,UAAA;GACA,eAAY;GACZ,MAAK;GACL,OAAM;GACL,iBAAWC,GAAA,MAAOkC,EAAWO,EAAK,MAAMG,EAAO,KAAK,GAAA,CAAA,MAAA,CAAA;;GAE1C,OAAK3C,QAIZ,CAHFC,EAGEC,GAAA;IAFA,MAAK;IACL,MAAK;;GAEE,SAAAF,QACX,CADWG,EAAA,MACXP,EAAG+C,EAAO,KAAK,GAAA,CAAA,C;;E,gCAEjBpD,EAAA,GAAAM,EAMQC,GAAA;;GAJN,MAAK;GACL,OAAM;;GAEN,SAAAE,QAAkB,CAAfG,EAAAP,EAAA+C,EAAO,KAAK,GAAA,CAAA,C"}
|
|
@@ -8,13 +8,10 @@ export type FilterStoreIdentifier = {
|
|
|
8
8
|
subject: string;
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
|
-
* Hash for a filter link,
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* not survive that trip; check with `isRouterSafeHash` and fall back to assigning
|
|
16
|
-
* `window.location.hash` after navigating. Returns an empty string when nothing differs from
|
|
17
|
-
* the defaults.
|
|
11
|
+
* Hash for a filter link, leaving out values equal to their default. Returns an empty string when nothing differs.
|
|
12
|
+
* Use with `router.push({ name, hash })`. The hash needs the leading `#`, or vue-router appends it to the path.
|
|
13
|
+
* A hash containing `%` (diacritics, `&`, `=`) does not survive the push. Check
|
|
14
|
+
* `isRouterSafeHash` and fall back to setting `window.location.hash` after navigating.
|
|
18
15
|
*/
|
|
19
16
|
export declare function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(filterConfig: FilterConfig<F>, filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>, sortBy?: DatatableSortBy): string;
|
|
20
17
|
/** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */
|
|
@@ -34,6 +31,7 @@ export declare function useFilterClearHelpers<F extends readonly MakeFilterOptio
|
|
|
34
31
|
export interface FilterHelpersMoreOptions {
|
|
35
32
|
storeFiltersLocalStorage: string | boolean;
|
|
36
33
|
populateUrlParams: boolean;
|
|
34
|
+
pageStoreKey?: string;
|
|
37
35
|
}
|
|
38
36
|
export declare function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(filterData: FilterData<F>, filterConfig: FilterConfig<F>, moreOptions?: Partial<FilterHelpersMoreOptions>): {
|
|
39
37
|
loadStoredFilters: (pagination: Ref<Pagination>, callback?: AnyFn) => boolean;
|
|
@@ -46,28 +44,20 @@ export declare function useFilterHelpers<F extends readonly MakeFilterOption<str
|
|
|
46
44
|
} | null;
|
|
47
45
|
};
|
|
48
46
|
/**
|
|
49
|
-
* Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`)
|
|
50
|
-
* bar and `ADatatablePagination` below
|
|
51
|
-
* `fetchList(pagination, filterData, filterConfig)`
|
|
52
|
-
*
|
|
53
|
-
* and sort go through `useFilterHelpers` (with `filterHelpersOptions`)
|
|
54
|
-
* remembered page are restored before the first load.
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* than the list's three arguments, or a parent renders the filter bar (the parent provides then).
|
|
59
|
-
*
|
|
60
|
-
* ```ts
|
|
47
|
+
* Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`)
|
|
48
|
+
* to the filter bar and `ADatatablePagination` below, and wires the list to them.
|
|
49
|
+
* `getList` is a debounced `fetchList(pagination, filterData, filterConfig)` that resolves when
|
|
50
|
+
* the load finishes. A call superseded within the debounce resolves at once without loading.
|
|
51
|
+
* Submit, reset and sort go through `useFilterHelpers` (with `filterHelpersOptions`).
|
|
52
|
+
* On mount the stored filter and remembered page are restored before the first load.
|
|
53
|
+
* Use only for a datatable that is the parent of its filter bar. Wire it by hand when the first load skips the stored
|
|
54
|
+
* filter, `getList` adds logic, sort is custom, `fetchList` takes other arguments, or a parent renders the filter bar.
|
|
55
|
+
* @example
|
|
61
56
|
* const { filterData, filterConfig } = useFaqListFilter()
|
|
62
57
|
* const { fetchList, listItems } = useFaqListActions()
|
|
63
58
|
* const { pagination } = usePagination(SORT_BY_ID)
|
|
64
|
-
* const { getList, sortByChange, submitFilterAction, resetFilterAction
|
|
65
|
-
*
|
|
66
|
-
* filterConfig,
|
|
67
|
-
* pagination,
|
|
68
|
-
* fetchList
|
|
69
|
-
* )
|
|
70
|
-
* ```
|
|
59
|
+
* const { getList, sortByChange, submitFilterAction, resetFilterAction
|
|
60
|
+
* } = useDatatableList(filterData, filterConfig, pagination, fetchList)
|
|
71
61
|
*/
|
|
72
62
|
export declare function useDatatableList<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[], R = unknown>(filterData: FilterData<F>, filterConfig: FilterConfig<F>, pagination: Ref<Pagination>, fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R, filterHelpersOptions?: Partial<FilterHelpersMoreOptions>): {
|
|
73
63
|
getList: import('@vueuse/shared').UseDebounceFnReturn<() => R>;
|
|
@@ -140,16 +140,21 @@ function z(e, t, o = {}) {
|
|
|
140
140
|
...o
|
|
141
141
|
}, g;
|
|
142
142
|
c(h.storeFiltersLocalStorage) ? g = h.storeFiltersLocalStorage : n(h.storeFiltersLocalStorage) && !0 === h.storeFiltersLocalStorage && c(t.general.system) && c(t.general.subject) && (g = "tableFilter_" + t.general.system + "_" + t.general.subject);
|
|
143
|
-
let _ = c(h.storeFiltersLocalStorage) ? h.storeFiltersLocalStorage : f(t.general.system, t.general.subject);
|
|
143
|
+
let _ = h.pageStoreKey ?? (c(h.storeFiltersLocalStorage) ? h.storeFiltersLocalStorage : f(t.general.system, t.general.subject));
|
|
144
144
|
y() && x(m, _);
|
|
145
|
-
let {
|
|
145
|
+
let { consumeStoredPage: b, getStoredRowsPerPage: S, getStoredView: C, setStoredPage: w } = p(), D = (e) => A(F(), e), O = (e) => w(_, e.value.page, e.value.rowsPerPage, D(e.value.sortBy)), j = h.populateUrlParams || !l(g), M = (e) => {
|
|
146
|
+
let t = b(_);
|
|
147
|
+
if (t === null || j) return t;
|
|
148
|
+
let n = C(_);
|
|
149
|
+
return n === null || n === D(e) ? t : null;
|
|
150
|
+
}, N = (e, t) => t === null ? e.value.rowsPerPage : S(_) ?? e.value.rowsPerPage, { clearAll: P } = L(), F = () => {
|
|
146
151
|
let n = {};
|
|
147
152
|
for (let i in e) try {
|
|
148
153
|
let o = i, s = e[o];
|
|
149
154
|
l(s) || a(s) || r(s) || k(s, t.fields[o].default) || (n[i] = s);
|
|
150
155
|
} catch {}
|
|
151
156
|
return n;
|
|
152
|
-
},
|
|
157
|
+
}, I = (e, t, n) => A(e, n ? t.value.sortBy : void 0), z = (e) => {
|
|
153
158
|
if (!e) return null;
|
|
154
159
|
e.startsWith("#") && (e = e.substring(1));
|
|
155
160
|
let n = e.indexOf(E);
|
|
@@ -175,37 +180,38 @@ function z(e, t, o = {}) {
|
|
|
175
180
|
filters: o,
|
|
176
181
|
sortBy: s
|
|
177
182
|
};
|
|
178
|
-
},
|
|
183
|
+
}, B = (e) => {
|
|
179
184
|
let t = window.location.pathname + window.location.search + e, n = window.history.state, r = s(n) && c(n.current) ? {
|
|
180
185
|
...n,
|
|
181
186
|
current: (n.current.split("#")[0] ?? "") + e
|
|
182
187
|
} : n;
|
|
183
188
|
window.history.replaceState(r, "", t);
|
|
184
|
-
},
|
|
185
|
-
h.populateUrlParams !== !1 &&
|
|
186
|
-
},
|
|
187
|
-
h.populateUrlParams !== !1 &&
|
|
188
|
-
},
|
|
189
|
+
}, V = (e) => {
|
|
190
|
+
h.populateUrlParams !== !1 && B("#" + e);
|
|
191
|
+
}, H = () => {
|
|
192
|
+
h.populateUrlParams !== !1 && B("");
|
|
193
|
+
}, U = () => h.populateUrlParams === !1 ? null : z(window.location.hash), W = (e) => {
|
|
189
194
|
g && localStorage && localStorage.setItem(g, e);
|
|
190
|
-
},
|
|
195
|
+
}, G = () => {
|
|
191
196
|
if (!g || !localStorage) return null;
|
|
192
197
|
let e = localStorage.getItem(g);
|
|
193
|
-
return !e || !c(e) ? null :
|
|
198
|
+
return !e || !c(e) ? null : z(e);
|
|
194
199
|
};
|
|
195
200
|
return {
|
|
196
201
|
loadStoredFilters: (n, r) => {
|
|
197
|
-
let
|
|
198
|
-
if (a(
|
|
199
|
-
let e =
|
|
202
|
+
let o = "hash", s = U();
|
|
203
|
+
if (a(s) && (o = "localStorage", s = G()), a(s) || i(s.filters) && a(s.sortBy)) {
|
|
204
|
+
let e = M(n.value.sortBy);
|
|
200
205
|
return e !== null && (n.value = {
|
|
201
206
|
...n.value,
|
|
202
|
-
page: e
|
|
203
|
-
|
|
207
|
+
page: e,
|
|
208
|
+
rowsPerPage: N(n, e)
|
|
209
|
+
}), O(n), r && r(), !1;
|
|
204
210
|
}
|
|
205
|
-
let
|
|
206
|
-
|
|
211
|
+
let f = o === "hash" && !i(s.filters);
|
|
212
|
+
f && P(e, t);
|
|
207
213
|
for (let t in e) {
|
|
208
|
-
let n = t, r =
|
|
214
|
+
let n = t, r = s.filters[n];
|
|
209
215
|
if (!l(r)) {
|
|
210
216
|
if (c(r)) {
|
|
211
217
|
let e = d(r);
|
|
@@ -218,32 +224,33 @@ function z(e, t, o = {}) {
|
|
|
218
224
|
e[n] = r;
|
|
219
225
|
}
|
|
220
226
|
}
|
|
221
|
-
if (
|
|
227
|
+
if (o === "localStorage" && g && localStorage) {
|
|
222
228
|
let e = localStorage.getItem(g);
|
|
223
|
-
e &&
|
|
229
|
+
e && V(e);
|
|
224
230
|
}
|
|
225
|
-
let
|
|
231
|
+
let p = s.sortBy ?? n.value.sortBy, m = M(p);
|
|
226
232
|
return n.value = {
|
|
227
233
|
...n.value,
|
|
228
|
-
sortBy:
|
|
229
|
-
page:
|
|
230
|
-
|
|
234
|
+
sortBy: p,
|
|
235
|
+
page: m ?? (o === "hash" ? 1 : n.value.page),
|
|
236
|
+
rowsPerPage: N(n, m)
|
|
237
|
+
}, O(n), f && W(I(F(), n, !0)), r && r(), !0;
|
|
231
238
|
},
|
|
232
239
|
resetFilter: (e, n) => {
|
|
233
240
|
e.value = {
|
|
234
241
|
...e.value,
|
|
235
242
|
page: 1
|
|
236
|
-
}, g && localStorage && localStorage.removeItem(g),
|
|
243
|
+
}, O(e), g && localStorage && localStorage.removeItem(g), H(), t.touched = !1, n && n();
|
|
237
244
|
},
|
|
238
245
|
submitFilter: (e, n) => {
|
|
239
|
-
let r =
|
|
240
|
-
|
|
246
|
+
let r = F(), i = I(r, e, !0);
|
|
247
|
+
V(i), W(i), e.value = {
|
|
241
248
|
...e.value,
|
|
242
249
|
page: 1
|
|
243
|
-
}, t.touched = !1, n && n();
|
|
250
|
+
}, O(e), t.touched = !1, n && n();
|
|
244
251
|
},
|
|
245
|
-
serializeFilters:
|
|
246
|
-
deserializeFilters:
|
|
252
|
+
serializeFilters: I,
|
|
253
|
+
deserializeFilters: z
|
|
247
254
|
};
|
|
248
255
|
}
|
|
249
256
|
function B(e, t, n, r, i = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterFactory.js","names":["SORT_URL_PARAM","END_FILTER_MARKER","RELAXED_IN_HASH","relaxHashEncoding","value","match","isSameFilterValue","isArray","a","b","item","index","encodeFilterHash","params","key","data","isUndefined","isNull","isEmptyArray","isObject","isEmptyObject","isString","sortBy","buildFilterHash","filters","field","filterConfig","hash","isRouterSafeHash","defaultRenderOptions","createFilterStore","reactive","filterFields","acc","cloneDeep","createFilter","config","filter","defaultValue","resolveValue","options","defaultGlobalOptions","store","fallback","useFilterClearHelpers","clearOne","name","clearAll","filterName","filterData","clearOneFilterSelected","isClearable","selectedFound","filterSelected","foundIndex","optionValue","newArray","toRaw","isNumber","isBoolean","clearAllFilterSelected","FilterHelpersMoreOptionsDefault","useFilterHelpers","moreOptions","storeKey","pageStoreKey","datatablePageKey","getCurrentInstance","provide","DatatablePageStoreKey","getFilterDataForStoring","serializeFilters","includeSort","pagination","deserializeFilters","markerIndex","result","sortParam","order","SortOrder","fieldConfig","items","replaceHash","url","state","patched","updateLocationHash","serialized","resetLocationHash","parseLocationHash","storeFilterLocalStorage","loadFilterLocalStorage","stored","useDatatablePageStore","source","storedFromHash","restoredPage","consumeStoredPage","callback","hashDescribesThisView","tryConvertNumber","stringToNumber","tryConvertBoolean","stringToBooleanExact","useDatatableList","FilterConfigKey","FilterDataKey","DatatablePaginationKey","filterHelpersOptions","getList","useDebounceFn","fetchList","submitFilterAction","submitFilter","onMounted","loadStoredFilters","resetFilter"],"sources":["../../../../src/domains/filters/composables/filterFactory.ts"],"sourcesContent":["import { getCurrentInstance, onMounted, provide, reactive, type Ref, toRaw } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n FilterDataKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport {\n cloneDeep,\n isArray,\n isBoolean,\n isEmptyArray,\n isEmptyObject,\n isNull,\n isNumber,\n isObject,\n isString,\n isUndefined,\n} from '@/shared/utils/common'\nimport type { AnyFn } from '@vueuse/core'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { type DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { stringToBooleanExact, stringToNumber } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport type FilterStoreIdentifier = { system: string; subject: string }\n\nconst SORT_URL_PARAM = '_sort'\nconst END_FILTER_MARKER = '~'\n\n// `URLSearchParams` percent-encodes characters a URL fragment accepts verbatim, and vue-router\n// then runs `encodeURI` over the hash, which escapes the `%` a second time — `_sort=id%2Cdesc`\n// arrives as `id%252Cdesc` and the sort is silently lost. Handing these back keeps a built hash\n// stable through `router.push({ hash })`. `~` stays encoded because the end marker relies on it\n// never occurring inside a value; `&`, `=` carry the structure, `+` reads back as a space.\nconst RELAXED_IN_HASH: Record<string, string> = {\n '%2C': ',',\n '%3A': ':',\n '%2F': '/',\n '%40': '@',\n '%24': '$',\n '%21': '!',\n '%27': \"'\",\n '%28': '(',\n '%29': ')',\n '%3B': ';',\n '%3F': '?',\n}\nconst relaxHashEncoding = (value: string) =>\n value.replace(/%(2C|3A|2F|40|24|21|27|28|29|3B|3F)/g, (match) => RELAXED_IN_HASH[match]!)\n\n// `structuredClone` gives every array default a fresh identity, so `!==` is always true for them\n// and an array default would be written into the url on every submit.\nconst isSameFilterValue = (a: AllowedFilterValues, b: AllowedFilterValues): boolean => {\n if (isArray(a) && isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index])\n }\n return a === b\n}\n\nconst encodeFilterHash = (data: Record<string, AllowedFilterValues>, sortBy?: DatatableSortBy): string => {\n const params = new URLSearchParams()\n for (const key in data) {\n const value = data[key]\n if (isUndefined(value) || isNull(value)) continue\n if (isArray(value) && isEmptyArray(value)) continue\n if (isObject(value) && isEmptyObject(value)) continue\n if (isString(value) && value.length === 0) continue\n params.set(key, isArray(value) ? value.join(',') : String(value))\n }\n if (sortBy) {\n params.set(SORT_URL_PARAM, `${sortBy.key},${sortBy.order}`)\n }\n if (params.size === 0) return ''\n return relaxHashEncoding(params.toString()) + END_FILTER_MARKER\n}\n\n/**\n * Hash for a filter link, with values equal to their default left out.\n *\n * Pair it with `router.push({ name, hash })`, which needs the leading `#` — without it vue-router\n * glues the value onto the path instead. A hash still containing `%` (diacritics, `&`, `=`) does\n * not survive that trip; check with `isRouterSafeHash` and fall back to assigning\n * `window.location.hash` after navigating. Returns an empty string when nothing differs from\n * the defaults.\n */\nexport function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(\n filterConfig: FilterConfig<F>,\n filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>,\n sortBy?: DatatableSortBy\n): string {\n const data: Record<string, AllowedFilterValues> = {}\n for (const [key, value] of Object.entries(filters) as [string, AllowedFilterValues][]) {\n const field = filterConfig.fields[key as keyof FilterConfig<F>['fields']]\n if (isUndefined(field) || isSameFilterValue(value, field.default)) continue\n data[key] = value\n }\n const hash = encodeFilterHash(data, sortBy)\n return hash.length === 0 ? hash : '#' + hash\n}\n\n/** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */\nexport const isRouterSafeHash = (hash: string): boolean => !hash.includes('%')\n\nconst defaultRenderOptions: FilerRenderOptions = {\n skip: false,\n selected: true,\n xs: undefined,\n sm: undefined,\n md: undefined,\n lg: undefined,\n xl: undefined,\n}\n\nexport function createFilterStore<F extends readonly MakeFilterOption<string>[]>(filterFields: F): FilterData<F> {\n return reactive(\n filterFields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: cloneDeep(field.default),\n }\n }, {} as FilterData<F>)\n ) as FilterData<F>\n}\n\nexport function createFilter<F extends readonly MakeFilterOption<string>[]>(\n filterFields: F,\n store: FilterData<F>,\n options?: Partial<GeneralFilterOptions>\n): {\n filterConfig: FilterConfig<F>\n filterData: FilterData<F>\n} {\n const config = filterFields.reduce(\n (acc, filter) => {\n const key = filter.name as keyof FilterData<F>\n const defaultValue = cloneDeep(filter.default)\n\n return {\n ...acc,\n [key]: {\n name: key as string,\n variant: resolveValue(filter.variant, 'eq'),\n type: resolveValue(filter.type, 'custom'),\n titleT:\n filter.titleT ??\n (options?.system && options?.subject && filter.name\n ? `${options.system}.${options.subject}.filter.${filter.name}`\n : undefined),\n apiName: resolveValue(filter.apiName, filter.name),\n clearable: resolveValue(filter.clearable, true),\n mandatory: resolveValue(filter.mandatory, false),\n multiple: isArray(defaultValue),\n advanced: resolveValue(filter.advanced, false),\n related: resolveValue(filter.related, undefined),\n exclude: resolveValue(filter.exclude, false),\n default: defaultValue,\n render: { ...defaultRenderOptions, ...resolveValue(filter.render, {}) },\n },\n }\n },\n {} as FilterConfig<F>['fields']\n )\n\n // A time interval names the field that holds its upper bound. The query builder and the selected chips\n // read that field's config without a check, so a name that is not configured fails here, by name,\n // instead of as a TypeError on the first query.\n for (const field of Object.values(config) as FilterField[]) {\n if (field.related && !(field.related in config)) {\n throw new Error(`createFilter: \"${field.name}\" names related field \"${field.related}\", which is not configured`)\n }\n }\n\n const defaultGlobalOptions: GeneralFilterOptions = {\n elastic: false,\n system: undefined,\n subject: undefined,\n simpleFilters: false,\n ...options,\n }\n\n if (defaultGlobalOptions.elastic) {\n defaultGlobalOptions.simpleFilters = true\n }\n\n const filterConfig = reactive({\n general: defaultGlobalOptions,\n touched: false,\n fields: config,\n }) as FilterConfig<F>\n\n return {\n filterConfig,\n filterData: store as FilterData<F>,\n }\n}\n\nfunction resolveValue<T>(value: T | undefined, fallback: T): T {\n return isUndefined(value) ? fallback : value\n}\n\nexport function useFilterClearHelpers<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n>() {\n const clearOne = (name: keyof FilterData<F>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n if (!filterConfig.fields[name]?.clearable) return\n filterData[name] = cloneDeep(filterConfig.fields[name].default)\n }\n\n const clearAll = (filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n for (const filterName in filterConfig.fields) {\n clearOne(filterName as keyof FilterData<F>, filterData, filterConfig)\n }\n }\n const clearOneFilterSelected = (\n name: string,\n optionValue: number | string,\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n if (!isClearable(name, filterConfig)) return\n // update selected\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n const selectedFound = filterSelected.value.get(name)\n if (selectedFound && selectedFound.length === 1) {\n filterSelected.value.delete(name)\n } else if (selectedFound) {\n const foundIndex = selectedFound.findIndex((item) => item.value === optionValue)\n if (foundIndex !== -1) selectedFound.splice(foundIndex, 1)\n }\n // update data\n if (config.type === 'timeInterval' && config.related) {\n filterData[name as keyof FilterData<F>] = config.default\n filterData[config.related as keyof FilterData<F>] =\n filterConfig.fields[config.related as keyof FilterConfig<F>['fields']].default\n } else if (\n isArray(filterData[name as keyof FilterData<F>]) &&\n (filterData[name as keyof FilterData<F>] as any[]).length > 0\n ) {\n const foundIndex = (filterData[name as keyof FilterData<F>] as any[]).findIndex(\n (item) => String(item) === String(optionValue)\n )\n if (foundIndex !== -1) {\n const newArray = [...toRaw(filterData[name as keyof FilterData<F>] as any[])]\n newArray.splice(foundIndex, 1)\n filterData[name as keyof FilterData<F>] = newArray as AllowedFilterValues\n }\n } else if (isString(filterData[name as keyof FilterData<F>]) || isNumber(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n } else if (isBoolean(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n }\n }\n\n const clearAllFilterSelected = (\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n for (const key of filterSelected.value.keys()) {\n if (isClearable(key, filterConfig)) {\n filterSelected.value.delete(key)\n }\n }\n }\n\n const isClearable = (name: string, filterConfig: FilterConfig<F>) => {\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n return !(config.mandatory || !config.clearable)\n }\n\n return {\n clearOne,\n clearAll,\n clearOneFilterSelected,\n clearAllFilterSelected,\n isClearable,\n }\n}\n\nexport interface FilterHelpersMoreOptions {\n storeFiltersLocalStorage: string | boolean // false to disable, string to override store key\n populateUrlParams: boolean\n}\n\nconst FilterHelpersMoreOptionsDefault = {\n storeFiltersLocalStorage: true,\n populateUrlParams: true,\n}\n\nexport function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n moreOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n const options = { ...FilterHelpersMoreOptionsDefault, ...moreOptions }\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeFiltersLocalStorage)) {\n storeKey = options.storeFiltersLocalStorage\n } else if (\n isBoolean(options.storeFiltersLocalStorage) &&\n true === options.storeFiltersLocalStorage &&\n isString(filterConfig.general.system) &&\n isString(filterConfig.general.subject)\n ) {\n storeKey = 'tableFilter_' + filterConfig.general.system + '_' + filterConfig.general.subject\n }\n\n // Independent of `storeFiltersLocalStorage` being on: the remembered page is keyed even when\n // filters are not persisted. A string override is what distinguishes tables sharing a subject.\n const pageStoreKey = isString(options.storeFiltersLocalStorage)\n ? options.storeFiltersLocalStorage\n : datatablePageKey(filterConfig.general.system, filterConfig.general.subject)\n // Called from a datatable's setup, so `ADatatablePagination` picks it up. Guarded because a\n // composable may legitimately be called outside setup, and Vue would warn.\n if (getCurrentInstance()) {\n provide(DatatablePageStoreKey, pageStoreKey)\n }\n\n const { clearAll } = useFilterClearHelpers<F>()\n\n const getFilterDataForStoring = (): Record<string, AllowedFilterValues> => {\n const data: Record<string, AllowedFilterValues> = {}\n for (const filterName in filterData) {\n try {\n const key = filterName as keyof FilterData<F>\n const value = filterData[key]\n if (\n !isUndefined(value) &&\n !isNull(value) &&\n !isEmptyArray(value) &&\n !isSameFilterValue(value, filterConfig.fields[key].default)\n ) {\n data[filterName] = value\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return data\n }\n\n const serializeFilters = (\n data: Record<string, AllowedFilterValues>,\n pagination: Ref<Pagination>,\n includeSort: boolean\n ): string => {\n return encodeFilterHash(data, includeSort ? pagination.value.sortBy : undefined)\n }\n\n const deserializeFilters = (\n hash: string\n ): { filters: Record<string, AllowedFilterValues>; sortBy: DatatableSortBy } | null => {\n if (!hash) return null\n if (hash.startsWith('#')) hash = hash.substring(1)\n\n // URLSearchParams percent-encodes `~` in values, so the marker cannot occur inside our own\n // data — a hash without it is foreign or truncated, and null lets localStorage take over.\n const markerIndex = hash.indexOf(END_FILTER_MARKER)\n if (markerIndex === -1) return null\n hash = hash.slice(0, markerIndex)\n\n const params = new URLSearchParams(hash)\n const result: Record<string, AllowedFilterValues> = {}\n let sortBy: DatatableSortBy = null\n\n const sortParam = params.get(SORT_URL_PARAM)\n if (sortParam) {\n const [key, order] = sortParam.split(',')\n if (key && (order === SortOrder.Asc || order === SortOrder.Desc)) {\n sortBy = { key, order }\n }\n params.delete(SORT_URL_PARAM)\n }\n\n for (const [key, value] of params.entries()) {\n const fieldConfig = filterConfig.fields[key as keyof typeof filterConfig.fields]\n if (isUndefined(fieldConfig)) {\n console.error(`Filter config not found for ${key}`)\n continue\n }\n const isMultiple = fieldConfig.multiple ?? false\n\n if (isMultiple) {\n const items = value.split(',')\n\n const allNumeric = items.every((item) => item !== '' && String(Number(item)) === item)\n\n result[key] = allNumeric ? items.map(Number) : items\n } else {\n result[key] = value\n }\n }\n\n // An empty result would still count as \"found\", shadowing localStorage.\n if (isEmptyObject(result) && isNull(sortBy)) return null\n\n return { filters: result, sortBy }\n }\n\n // A submit is not a place to step back to, so it replaces the entry. `replaceState` fires no\n // popstate, so vue-router does not run a navigation (and its guards) per submit; its `current` is\n // patched so the router's next push, which rewrites this entry from it, keeps the hash.\n const replaceHash = (hash: string) => {\n const url = window.location.pathname + window.location.search + hash\n const state = window.history.state\n const patched =\n isObject(state) && isString((state as { current?: unknown }).current)\n ? { ...state, current: ((state as { current: string }).current.split('#')[0] ?? '') + hash }\n : state\n window.history.replaceState(patched, '', url)\n }\n\n const updateLocationHash = (serialized: string) => {\n if (options.populateUrlParams === false) return\n replaceHash('#' + serialized)\n }\n\n const resetLocationHash = () => {\n if (options.populateUrlParams === false) return\n replaceHash('')\n }\n\n const parseLocationHash = () => {\n if (options.populateUrlParams === false) return null\n return deserializeFilters(window.location.hash)\n }\n\n const storeFilterLocalStorage = (serialized: string) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, serialized)\n }\n\n const loadFilterLocalStorage = () => {\n if (!storeKey || !localStorage) return null\n const stored = localStorage.getItem(storeKey)\n if (!stored || !isString(stored)) return null\n return deserializeFilters(stored)\n }\n\n const resetFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n pagination.value = { ...pagination.value, page: 1 }\n if (storeKey && localStorage) {\n localStorage.removeItem(storeKey)\n }\n resetLocationHash()\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const submitFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const data = getFilterDataForStoring()\n const serialized = serializeFilters(data, pagination, true)\n updateLocationHash(serialized)\n storeFilterLocalStorage(serialized)\n pagination.value = { ...pagination.value, page: 1 }\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const loadStoredFilters = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const { consumeStoredPage } = useDatatablePageStore()\n let source: 'hash' | 'localStorage' = 'hash'\n let storedFromHash = parseLocationHash()\n if (isNull(storedFromHash)) {\n source = 'localStorage'\n storedFromHash = loadFilterLocalStorage()\n }\n if (isNull(storedFromHash) || (isEmptyObject(storedFromHash.filters) && isNull(storedFromHash.sortBy))) {\n const restoredPage = consumeStoredPage(pageStoreKey)\n if (restoredPage !== null) {\n pagination.value = { ...pagination.value, page: restoredPage }\n }\n if (callback) callback()\n return false\n }\n\n // A hash naming at least one field is authoritative: it arrives from a link, or from stepping\n // back to an older address, and in both cases it describes the whole view. Without this reset\n // the fields it does not mention keep whatever the module-level filter store still holds from\n // an earlier visit, so the same link lands differently depending on how the user got to it.\n // On a fresh page load the store is already at its defaults and this is a no-op. Local storage\n // keeps merging, because there the absent fields were left out as equal to their default.\n //\n // A hash carrying only `_sort` is excluded on purpose. Unknown keys are dropped before this\n // point, so such a hash also results from a link meant for a different table sharing the page\n // - it must not wipe this one's filter. Only `clearable` fields are reset, as everywhere else.\n const hashDescribesThisView = source === 'hash' && !isEmptyObject(storedFromHash.filters)\n if (hashDescribesThisView) {\n clearAll(filterData, filterConfig)\n }\n\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData<F>\n let value = storedFromHash.filters[key]\n if (isUndefined(value)) continue\n if (isString(value)) {\n const tryConvertNumber = stringToNumber(value)\n if (!isNull(tryConvertNumber) && String(tryConvertNumber) === value) {\n value = tryConvertNumber\n } else {\n const tryConvertBoolean = stringToBooleanExact(value)\n if (!isNull(tryConvertBoolean)) {\n value = tryConvertBoolean\n }\n }\n }\n filterData[key] = value\n }\n if (source === 'localStorage' && storeKey && localStorage) {\n const stored = localStorage.getItem(storeKey)\n if (stored) {\n updateLocationHash(stored)\n }\n }\n // Drained either way: the flag means \"the next list I land on should restore its page\", so\n // leaving it set would hand the remembered page to whichever table comes after this one.\n const restoredPage = consumeStoredPage(pageStoreKey)\n pagination.value = {\n ...pagination.value,\n // A link need not carry the sort. Taking `null` from it would drop `order[...]` from the\n // query, and paging without ORDER BY can repeat or skip rows.\n sortBy: storedFromHash.sortBy ?? pagination.value.sortBy,\n // A hash replaces the view, so a link starts at the first page. A restored page still wins:\n // the flag behind it is only ever set by the close button, which means \"I am coming back to\n // this list\", and that address carries the list's own hash along with it.\n page: restoredPage ?? (source === 'hash' ? 1 : pagination.value.page),\n }\n if (hashDescribesThisView) {\n // Local storage mirrors the last applied state, so a link becomes the view the user returns\n // to. Re-serialized rather than stored verbatim, to drop values equal to their default.\n // A sort-only hash is not a link to this view, so it does not overwrite what is remembered.\n storeFilterLocalStorage(serializeFilters(getFilterDataForStoring(), pagination, true))\n }\n if (callback) callback()\n return true\n }\n\n return {\n loadStoredFilters,\n resetFilter,\n submitFilter,\n serializeFilters,\n deserializeFilters,\n }\n}\n\n/**\n * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`) to the filter\n * bar and `ADatatablePagination` below this component, and wires the list to them: `getList` is\n * `fetchList(pagination, filterData, filterConfig)` debounced and resolves once that has (a refresh button can wait for\n * it; a call that a newer one replaces within the debounce resolves at once, without a load of its own), submit, reset\n * and sort go through `useFilterHelpers` (with `filterHelpersOptions`), and on mount the stored filter and the\n * remembered page are restored before the first load.\n *\n * Only for a datatable that is the parent of its filter bar and does exactly this. Write the wiring out when the first\n * load skips the stored filter, `getList` checks or adds anything, the sort is handled by hand, `fetchList` takes more\n * than the list's three arguments, or a parent renders the filter bar (the parent provides then).\n *\n * ```ts\n * const { filterData, filterConfig } = useFaqListFilter()\n * const { fetchList, listItems } = useFaqListActions()\n * const { pagination } = usePagination(SORT_BY_ID)\n * const { getList, sortByChange, submitFilterAction, resetFilterAction } = useDatatableList(\n * filterData,\n * filterConfig,\n * pagination,\n * fetchList\n * )\n * ```\n */\nexport function useDatatableList<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n R = unknown,\n>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n pagination: Ref<Pagination>,\n fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R,\n filterHelpersOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n provide(FilterConfigKey, filterConfig as FilterConfig)\n provide(FilterDataKey, filterData as FilterData)\n provide(DatatablePaginationKey, pagination)\n const { resetFilter, submitFilter, loadStoredFilters } = useFilterHelpers(\n filterData,\n filterConfig,\n filterHelpersOptions\n )\n const getList = useDebounceFn(() => fetchList(pagination, filterData, filterConfig))\n const submitFilterAction = () => submitFilter(pagination, getList)\n const resetFilterAction = () => resetFilter(pagination, getList)\n onMounted(() => loadStoredFilters(pagination, getList))\n return { getList, sortByChange: submitFilterAction, submitFilterAction, resetFilterAction }\n}\n\nexport type AllowedFilterValues = number | number[] | string | string[] | null | undefined | boolean\n\nexport interface GeneralFilterOptions {\n system?: string\n subject?: string\n elastic?: boolean\n simpleFilters?: boolean\n}\n\nexport interface FilerRenderOptions {\n skip: boolean\n // Whether the field is shown as a selected-filter chip (FiltersSelected). Default true.\n // Optional for backward compatibility (other admins may construct FilerRenderOptions).\n selected?: boolean\n xs: number | undefined\n sm: number | undefined\n md: number | undefined\n lg: number | undefined\n xl: number | undefined\n}\n\nexport type FilterVariant =\n | 'search'\n | 'lt'\n | 'in'\n | 'notIn'\n | 'endsWith'\n | 'startsWith'\n | 'memberOf'\n | 'neq'\n | 'gte'\n | 'gt'\n | 'eq'\n | 'lte'\n | 'custom'\n\nexport type FilterType = 'boolean' | 'datetime' | 'integer' | 'string' | 'custom' | 'timeInterval'\n\nexport interface MakeFilterOption<TName extends string = string> {\n name: TName\n default: AllowedFilterValues\n type?: FilterType\n variant?: FilterVariant\n titleT?: string\n apiName?: string\n clearable?: boolean\n mandatory?: boolean\n advanced?: boolean\n exclude?: boolean\n related?: string | undefined\n render?: Partial<FilerRenderOptions>\n}\n\nexport interface FilterField {\n name: string\n type: FilterType\n variant: FilterVariant\n titleT?: string\n default: AllowedFilterValues\n apiName: string\n clearable: boolean\n mandatory: boolean\n multiple: boolean\n advanced: boolean\n exclude: boolean\n related: string | undefined\n render: FilerRenderOptions\n}\n\nexport type FilterConfig<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n general: GeneralFilterOptions\n touched: boolean\n fields: {\n [P in F[number]['name']]: FilterField\n }\n}\n\nexport type FilterData<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n [P in F[number]['name']]: AllowedFilterValues\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filterFactory.js","names":["SORT_URL_PARAM","END_FILTER_MARKER","RELAXED_IN_HASH","relaxHashEncoding","value","match","isSameFilterValue","isArray","a","b","item","index","encodeFilterHash","params","key","data","isUndefined","isNull","isEmptyArray","isObject","isEmptyObject","isString","sortBy","buildFilterHash","filters","field","filterConfig","hash","isRouterSafeHash","defaultRenderOptions","createFilterStore","reactive","filterFields","acc","cloneDeep","createFilter","config","filter","defaultValue","resolveValue","options","defaultGlobalOptions","store","fallback","useFilterClearHelpers","clearOne","name","clearAll","filterName","filterData","clearOneFilterSelected","isClearable","selectedFound","filterSelected","foundIndex","optionValue","newArray","toRaw","isNumber","isBoolean","clearAllFilterSelected","FilterHelpersMoreOptionsDefault","useFilterHelpers","moreOptions","storeKey","pageStoreKey","datatablePageKey","getCurrentInstance","provide","DatatablePageStoreKey","useDatatablePageStore","viewOf","getFilterDataForStoring","rememberShownPage","setStoredPage","pagination","keepsItsView","consumeRestoredPage","page","consumeStoredPage","view","getStoredView","rowsPerPageFor","restoredPage","getStoredRowsPerPage","serializeFilters","includeSort","deserializeFilters","markerIndex","result","sortParam","order","SortOrder","fieldConfig","items","replaceHash","url","state","patched","updateLocationHash","serialized","resetLocationHash","parseLocationHash","storeFilterLocalStorage","loadFilterLocalStorage","stored","source","storedFromHash","callback","hashDescribesThisView","tryConvertNumber","stringToNumber","tryConvertBoolean","stringToBooleanExact","useDatatableList","FilterConfigKey","FilterDataKey","DatatablePaginationKey","filterHelpersOptions","getList","useDebounceFn","fetchList","submitFilterAction","submitFilter","onMounted","loadStoredFilters","resetFilter"],"sources":["../../../../src/domains/filters/composables/filterFactory.ts"],"sourcesContent":["import { getCurrentInstance, onMounted, provide, reactive, type Ref, toRaw } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n FilterDataKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport {\n cloneDeep,\n isArray,\n isBoolean,\n isEmptyArray,\n isEmptyObject,\n isNull,\n isNumber,\n isObject,\n isString,\n isUndefined,\n} from '@/shared/utils/common'\nimport type { AnyFn } from '@vueuse/core'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { type DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { stringToBooleanExact, stringToNumber } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport type FilterStoreIdentifier = { system: string; subject: string }\n\nconst SORT_URL_PARAM = '_sort'\nconst END_FILTER_MARKER = '~'\n\n// `URLSearchParams` percent-encodes characters a fragment accepts verbatim,\n// and vue-router runs `encodeURI` over the hash, double-escaping `%`.\n// So `_sort=id%2Cdesc` arrives as `id%252Cdesc` and the sort is lost.\n// Decoding these keeps the hash stable through `router.push({ hash })`.\n// `~` stays encoded because the end marker must never occur in a\n// value. `&` and `=` carry the structure. `+` reads back as a space.\nconst RELAXED_IN_HASH: Record<string, string> = {\n '%2C': ',',\n '%3A': ':',\n '%2F': '/',\n '%40': '@',\n '%24': '$',\n '%21': '!',\n '%27': \"'\",\n '%28': '(',\n '%29': ')',\n '%3B': ';',\n '%3F': '?',\n}\nconst relaxHashEncoding = (value: string) =>\n value.replace(/%(2C|3A|2F|40|24|21|27|28|29|3B|3F)/g, (match) => RELAXED_IN_HASH[match]!)\n\n// `structuredClone` gives each array default a new identity, so `!==` is always true.\n// Without a deep compare, an array default would be written into the URL on every submit.\nconst isSameFilterValue = (a: AllowedFilterValues, b: AllowedFilterValues): boolean => {\n if (isArray(a) && isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index])\n }\n return a === b\n}\n\nconst encodeFilterHash = (data: Record<string, AllowedFilterValues>, sortBy?: DatatableSortBy): string => {\n const params = new URLSearchParams()\n for (const key in data) {\n const value = data[key]\n if (isUndefined(value) || isNull(value)) continue\n if (isArray(value) && isEmptyArray(value)) continue\n if (isObject(value) && isEmptyObject(value)) continue\n if (isString(value) && value.length === 0) continue\n params.set(key, isArray(value) ? value.join(',') : String(value))\n }\n if (sortBy) {\n params.set(SORT_URL_PARAM, `${sortBy.key},${sortBy.order}`)\n }\n if (params.size === 0) return ''\n return relaxHashEncoding(params.toString()) + END_FILTER_MARKER\n}\n\n/**\n * Hash for a filter link, leaving out values equal to their default. Returns an empty string when nothing differs.\n * Use with `router.push({ name, hash })`. The hash needs the leading `#`, or vue-router appends it to the path.\n * A hash containing `%` (diacritics, `&`, `=`) does not survive the push. Check\n * `isRouterSafeHash` and fall back to setting `window.location.hash` after navigating.\n */\nexport function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(\n filterConfig: FilterConfig<F>,\n filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>,\n sortBy?: DatatableSortBy\n): string {\n const data: Record<string, AllowedFilterValues> = {}\n for (const [key, value] of Object.entries(filters) as [string, AllowedFilterValues][]) {\n const field = filterConfig.fields[key as keyof FilterConfig<F>['fields']]\n if (isUndefined(field) || isSameFilterValue(value, field.default)) continue\n data[key] = value\n }\n const hash = encodeFilterHash(data, sortBy)\n return hash.length === 0 ? hash : '#' + hash\n}\n\n/** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */\nexport const isRouterSafeHash = (hash: string): boolean => !hash.includes('%')\n\nconst defaultRenderOptions: FilerRenderOptions = {\n skip: false,\n selected: true,\n xs: undefined,\n sm: undefined,\n md: undefined,\n lg: undefined,\n xl: undefined,\n}\n\nexport function createFilterStore<F extends readonly MakeFilterOption<string>[]>(filterFields: F): FilterData<F> {\n return reactive(\n filterFields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: cloneDeep(field.default),\n }\n }, {} as FilterData<F>)\n ) as FilterData<F>\n}\n\nexport function createFilter<F extends readonly MakeFilterOption<string>[]>(\n filterFields: F,\n store: FilterData<F>,\n options?: Partial<GeneralFilterOptions>\n): {\n filterConfig: FilterConfig<F>\n filterData: FilterData<F>\n} {\n const config = filterFields.reduce(\n (acc, filter) => {\n const key = filter.name as keyof FilterData<F>\n const defaultValue = cloneDeep(filter.default)\n\n return {\n ...acc,\n [key]: {\n name: key as string,\n variant: resolveValue(filter.variant, 'eq'),\n type: resolveValue(filter.type, 'custom'),\n titleT:\n filter.titleT ??\n (options?.system && options?.subject && filter.name\n ? `${options.system}.${options.subject}.filter.${filter.name}`\n : undefined),\n apiName: resolveValue(filter.apiName, filter.name),\n clearable: resolveValue(filter.clearable, true),\n mandatory: resolveValue(filter.mandatory, false),\n multiple: isArray(defaultValue),\n advanced: resolveValue(filter.advanced, false),\n related: resolveValue(filter.related, undefined),\n exclude: resolveValue(filter.exclude, false),\n default: defaultValue,\n render: { ...defaultRenderOptions, ...resolveValue(filter.render, {}) },\n },\n }\n },\n {} as FilterConfig<F>['fields']\n )\n\n // A time interval names the field holding its upper bound.\n // The query builder and the chips read that config unchecked.\n // Fail here by name rather than with a TypeError on the first query.\n for (const field of Object.values(config) as FilterField[]) {\n if (field.related && !(field.related in config)) {\n throw new Error(`createFilter: \"${field.name}\" names related field \"${field.related}\", which is not configured`)\n }\n }\n\n const defaultGlobalOptions: GeneralFilterOptions = {\n elastic: false,\n system: undefined,\n subject: undefined,\n simpleFilters: false,\n ...options,\n }\n\n if (defaultGlobalOptions.elastic) {\n defaultGlobalOptions.simpleFilters = true\n }\n\n const filterConfig = reactive({\n general: defaultGlobalOptions,\n touched: false,\n fields: config,\n }) as FilterConfig<F>\n\n return {\n filterConfig,\n filterData: store as FilterData<F>,\n }\n}\n\nfunction resolveValue<T>(value: T | undefined, fallback: T): T {\n return isUndefined(value) ? fallback : value\n}\n\nexport function useFilterClearHelpers<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n>() {\n const clearOne = (name: keyof FilterData<F>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n if (!filterConfig.fields[name]?.clearable) return\n filterData[name] = cloneDeep(filterConfig.fields[name].default)\n }\n\n const clearAll = (filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n for (const filterName in filterConfig.fields) {\n clearOne(filterName as keyof FilterData<F>, filterData, filterConfig)\n }\n }\n const clearOneFilterSelected = (\n name: string,\n optionValue: number | string,\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n if (!isClearable(name, filterConfig)) return\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n const selectedFound = filterSelected.value.get(name)\n if (selectedFound && selectedFound.length === 1) {\n filterSelected.value.delete(name)\n } else if (selectedFound) {\n const foundIndex = selectedFound.findIndex((item) => item.value === optionValue)\n if (foundIndex !== -1) selectedFound.splice(foundIndex, 1)\n }\n if (config.type === 'timeInterval' && config.related) {\n filterData[name as keyof FilterData<F>] = config.default\n filterData[config.related as keyof FilterData<F>] =\n filterConfig.fields[config.related as keyof FilterConfig<F>['fields']].default\n } else if (\n isArray(filterData[name as keyof FilterData<F>]) &&\n (filterData[name as keyof FilterData<F>] as any[]).length > 0\n ) {\n const foundIndex = (filterData[name as keyof FilterData<F>] as any[]).findIndex(\n (item) => String(item) === String(optionValue)\n )\n if (foundIndex !== -1) {\n const newArray = [...toRaw(filterData[name as keyof FilterData<F>] as any[])]\n newArray.splice(foundIndex, 1)\n filterData[name as keyof FilterData<F>] = newArray as AllowedFilterValues\n }\n } else if (isString(filterData[name as keyof FilterData<F>]) || isNumber(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n } else if (isBoolean(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n }\n }\n\n const clearAllFilterSelected = (\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n for (const key of filterSelected.value.keys()) {\n if (isClearable(key, filterConfig)) {\n filterSelected.value.delete(key)\n }\n }\n }\n\n const isClearable = (name: string, filterConfig: FilterConfig<F>) => {\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n return !(config.mandatory || !config.clearable)\n }\n\n return {\n clearOne,\n clearAll,\n clearOneFilterSelected,\n clearAllFilterSelected,\n isClearable,\n }\n}\n\nexport interface FilterHelpersMoreOptions {\n storeFiltersLocalStorage: string | boolean // false to disable, string to override store key\n populateUrlParams: boolean\n // Keys the remembered page without turning on local storage. A select dialog sharing its subject with a list\n // sets its own, so searching or paging in it does not change the page Close returns that list to.\n pageStoreKey?: string\n}\n\nconst FilterHelpersMoreOptionsDefault = {\n storeFiltersLocalStorage: true,\n populateUrlParams: true,\n}\n\nexport function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n moreOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n const options = { ...FilterHelpersMoreOptionsDefault, ...moreOptions }\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeFiltersLocalStorage)) {\n storeKey = options.storeFiltersLocalStorage\n } else if (\n isBoolean(options.storeFiltersLocalStorage) &&\n true === options.storeFiltersLocalStorage &&\n isString(filterConfig.general.system) &&\n isString(filterConfig.general.subject)\n ) {\n storeKey = 'tableFilter_' + filterConfig.general.system + '_' + filterConfig.general.subject\n }\n\n // The page key exists even when filters are not persisted.\n // A string override distinguishes tables sharing a subject.\n const pageStoreKey =\n options.pageStoreKey ??\n (isString(options.storeFiltersLocalStorage)\n ? options.storeFiltersLocalStorage\n : datatablePageKey(filterConfig.general.system, filterConfig.general.subject))\n // Provided so `ADatatablePagination` picks it up. Guarded because\n // the composable may run outside setup, where Vue would warn.\n if (getCurrentInstance()) {\n provide(DatatablePageStoreKey, pageStoreKey)\n }\n const { consumeStoredPage, getStoredRowsPerPage, getStoredView, setStoredPage } = useDatatablePageStore()\n // The filter and sort a page is shown in. Stored on load, submit and reset, which every change of them goes through.\n const viewOf = (sortBy: DatatableSortBy) => encodeFilterHash(getFilterDataForStoring(), sortBy)\n // `ADatatablePagination` stores the page only when its watcher sees a change. A list that opens on page 1,\n // or returns to it within the tick that restored another page, would keep the older page for the next Close.\n const rememberShownPage = (pagination: Ref<Pagination>) =>\n setStoredPage(pageStoreKey, pagination.value.page, pagination.value.rowsPerPage, viewOf(pagination.value.sortBy))\n // The page Close kept. A list that keeps neither filter nor sort (no hash, no local storage) comes back with\n // both reset, and its page 3 would show other rows, so its page comes back only into the view it was shown in.\n // Not checked for other lists: they restore their view themselves, and many adjust the sort or a filter\n // in `getList` after a submit or reset stored the view, which would turn a correct restore into page 1.\n const keepsItsView = options.populateUrlParams || !isUndefined(storeKey)\n const consumeRestoredPage = (sortBy: DatatableSortBy) => {\n const page = consumeStoredPage(pageStoreKey)\n if (page === null || keepsItsView) return page\n const view = getStoredView(pageStoreKey)\n return view === null || view === viewOf(sortBy) ? page : null\n }\n // A restored page comes back at the page size it was shown at. At another size it would show other rows.\n const rowsPerPageFor = (pagination: Ref<Pagination>, restoredPage: number | null) =>\n restoredPage === null\n ? pagination.value.rowsPerPage\n : (getStoredRowsPerPage(pageStoreKey) ?? pagination.value.rowsPerPage)\n\n const { clearAll } = useFilterClearHelpers<F>()\n\n const getFilterDataForStoring = (): Record<string, AllowedFilterValues> => {\n const data: Record<string, AllowedFilterValues> = {}\n for (const filterName in filterData) {\n try {\n const key = filterName as keyof FilterData<F>\n const value = filterData[key]\n if (\n !isUndefined(value) &&\n !isNull(value) &&\n !isEmptyArray(value) &&\n !isSameFilterValue(value, filterConfig.fields[key].default)\n ) {\n data[filterName] = value\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return data\n }\n\n const serializeFilters = (\n data: Record<string, AllowedFilterValues>,\n pagination: Ref<Pagination>,\n includeSort: boolean\n ): string => {\n return encodeFilterHash(data, includeSort ? pagination.value.sortBy : undefined)\n }\n\n const deserializeFilters = (\n hash: string\n ): { filters: Record<string, AllowedFilterValues>; sortBy: DatatableSortBy } | null => {\n if (!hash) return null\n if (hash.startsWith('#')) hash = hash.substring(1)\n\n // `URLSearchParams` encodes `~` in values, so the marker never occurs in our data.\n // A hash without it is foreign or truncated. `null` lets localStorage take over.\n const markerIndex = hash.indexOf(END_FILTER_MARKER)\n if (markerIndex === -1) return null\n hash = hash.slice(0, markerIndex)\n\n const params = new URLSearchParams(hash)\n const result: Record<string, AllowedFilterValues> = {}\n let sortBy: DatatableSortBy = null\n\n const sortParam = params.get(SORT_URL_PARAM)\n if (sortParam) {\n const [key, order] = sortParam.split(',')\n if (key && (order === SortOrder.Asc || order === SortOrder.Desc)) {\n sortBy = { key, order }\n }\n params.delete(SORT_URL_PARAM)\n }\n\n for (const [key, value] of params.entries()) {\n const fieldConfig = filterConfig.fields[key as keyof typeof filterConfig.fields]\n if (isUndefined(fieldConfig)) {\n console.error(`Filter config not found for ${key}`)\n continue\n }\n const isMultiple = fieldConfig.multiple ?? false\n\n if (isMultiple) {\n const items = value.split(',')\n\n const allNumeric = items.every((item) => item !== '' && String(Number(item)) === item)\n\n result[key] = allNumeric ? items.map(Number) : items\n } else {\n result[key] = value\n }\n }\n\n // An empty result would still count as \"found\", shadowing localStorage.\n if (isEmptyObject(result) && isNull(sortBy)) return null\n\n return { filters: result, sortBy }\n }\n\n // A submit replaces the history entry instead of adding one.\n // `replaceState` fires no popstate, so vue-router runs no navigation or guards per submit.\n // Its `current` is patched so the router's next push, which rewrites this entry, keeps the hash.\n const replaceHash = (hash: string) => {\n const url = window.location.pathname + window.location.search + hash\n const state = window.history.state\n const patched =\n isObject(state) && isString((state as { current?: unknown }).current)\n ? { ...state, current: ((state as { current: string }).current.split('#')[0] ?? '') + hash }\n : state\n window.history.replaceState(patched, '', url)\n }\n\n const updateLocationHash = (serialized: string) => {\n if (options.populateUrlParams === false) return\n replaceHash('#' + serialized)\n }\n\n const resetLocationHash = () => {\n if (options.populateUrlParams === false) return\n replaceHash('')\n }\n\n const parseLocationHash = () => {\n if (options.populateUrlParams === false) return null\n return deserializeFilters(window.location.hash)\n }\n\n const storeFilterLocalStorage = (serialized: string) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, serialized)\n }\n\n const loadFilterLocalStorage = () => {\n if (!storeKey || !localStorage) return null\n const stored = localStorage.getItem(storeKey)\n if (!stored || !isString(stored)) return null\n return deserializeFilters(stored)\n }\n\n const resetFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n pagination.value = { ...pagination.value, page: 1 }\n rememberShownPage(pagination)\n if (storeKey && localStorage) {\n localStorage.removeItem(storeKey)\n }\n resetLocationHash()\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const submitFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const data = getFilterDataForStoring()\n const serialized = serializeFilters(data, pagination, true)\n updateLocationHash(serialized)\n storeFilterLocalStorage(serialized)\n pagination.value = { ...pagination.value, page: 1 }\n rememberShownPage(pagination)\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const loadStoredFilters = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n let source: 'hash' | 'localStorage' = 'hash'\n let storedFromHash = parseLocationHash()\n if (isNull(storedFromHash)) {\n source = 'localStorage'\n storedFromHash = loadFilterLocalStorage()\n }\n if (isNull(storedFromHash) || (isEmptyObject(storedFromHash.filters) && isNull(storedFromHash.sortBy))) {\n const restoredPage = consumeRestoredPage(pagination.value.sortBy)\n if (restoredPage !== null) {\n pagination.value = {\n ...pagination.value,\n page: restoredPage,\n rowsPerPage: rowsPerPageFor(pagination, restoredPage),\n }\n }\n rememberShownPage(pagination)\n if (callback) callback()\n return false\n }\n\n // A hash naming at least one field describes the whole view, whether\n // from a link or from going back. Reset the fields it omits.\n // Otherwise they keep values from the module-level store, and the same link lands\n // differently. Local storage still merges, since it omits fields equal to their default.\n // A `_sort`-only hash is excluded. It can come from a link for\n // another table on the same page and must not wipe this filter.\n // Only `clearable` fields are reset.\n const hashDescribesThisView = source === 'hash' && !isEmptyObject(storedFromHash.filters)\n if (hashDescribesThisView) {\n clearAll(filterData, filterConfig)\n }\n\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData<F>\n let value = storedFromHash.filters[key]\n if (isUndefined(value)) continue\n if (isString(value)) {\n const tryConvertNumber = stringToNumber(value)\n if (!isNull(tryConvertNumber) && String(tryConvertNumber) === value) {\n value = tryConvertNumber\n } else {\n const tryConvertBoolean = stringToBooleanExact(value)\n if (!isNull(tryConvertBoolean)) {\n value = tryConvertBoolean\n }\n }\n }\n filterData[key] = value\n }\n if (source === 'localStorage' && storeKey && localStorage) {\n const stored = localStorage.getItem(storeKey)\n if (stored) {\n updateLocationHash(stored)\n }\n }\n // A link may omit the sort. Taking `null` would drop `order[...]` from\n // the query, and paging without ORDER BY can repeat or skip rows.\n const sortBy = storedFromHash.sortBy ?? pagination.value.sortBy\n // Always consumed. The flag means \"the next list should restore\n // its page\". Leaving it set would pass the page to the next table.\n const restoredPage = consumeRestoredPage(sortBy)\n pagination.value = {\n ...pagination.value,\n sortBy,\n // A link starts at the first page. A restored page still wins.\n // Only the close button sets that flag, meaning the user returns\n // to this list, and that address carries the list's own hash.\n page: restoredPage ?? (source === 'hash' ? 1 : pagination.value.page),\n rowsPerPage: rowsPerPageFor(pagination, restoredPage),\n }\n rememberShownPage(pagination)\n if (hashDescribesThisView) {\n // Local storage mirrors the last applied state, so a link becomes the view the user returns to.\n // Re-serialized to drop values equal to their default. A sort-only hash does not overwrite it.\n storeFilterLocalStorage(serializeFilters(getFilterDataForStoring(), pagination, true))\n }\n if (callback) callback()\n return true\n }\n\n return {\n loadStoredFilters,\n resetFilter,\n submitFilter,\n serializeFilters,\n deserializeFilters,\n }\n}\n\n/**\n * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`)\n * to the filter bar and `ADatatablePagination` below, and wires the list to them.\n * `getList` is a debounced `fetchList(pagination, filterData, filterConfig)` that resolves when\n * the load finishes. A call superseded within the debounce resolves at once without loading.\n * Submit, reset and sort go through `useFilterHelpers` (with `filterHelpersOptions`).\n * On mount the stored filter and remembered page are restored before the first load.\n * Use only for a datatable that is the parent of its filter bar. Wire it by hand when the first load skips the stored\n * filter, `getList` adds logic, sort is custom, `fetchList` takes other arguments, or a parent renders the filter bar.\n * @example\n * const { filterData, filterConfig } = useFaqListFilter()\n * const { fetchList, listItems } = useFaqListActions()\n * const { pagination } = usePagination(SORT_BY_ID)\n * const { getList, sortByChange, submitFilterAction, resetFilterAction\n * } = useDatatableList(filterData, filterConfig, pagination, fetchList)\n */\nexport function useDatatableList<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n R = unknown,\n>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n pagination: Ref<Pagination>,\n fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R,\n filterHelpersOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n provide(FilterConfigKey, filterConfig as FilterConfig)\n provide(FilterDataKey, filterData as FilterData)\n provide(DatatablePaginationKey, pagination)\n const { resetFilter, submitFilter, loadStoredFilters } = useFilterHelpers(\n filterData,\n filterConfig,\n filterHelpersOptions\n )\n const getList = useDebounceFn(() => fetchList(pagination, filterData, filterConfig))\n const submitFilterAction = () => submitFilter(pagination, getList)\n const resetFilterAction = () => resetFilter(pagination, getList)\n onMounted(() => loadStoredFilters(pagination, getList))\n return { getList, sortByChange: submitFilterAction, submitFilterAction, resetFilterAction }\n}\n\nexport type AllowedFilterValues = number | number[] | string | string[] | null | undefined | boolean\n\nexport interface GeneralFilterOptions {\n system?: string\n subject?: string\n elastic?: boolean\n simpleFilters?: boolean\n}\n\nexport interface FilerRenderOptions {\n skip: boolean\n // Whether the field shows as a chip in `FiltersSelected`. Default true.\n // Optional because other admins may construct `FilerRenderOptions`.\n selected?: boolean\n xs: number | undefined\n sm: number | undefined\n md: number | undefined\n lg: number | undefined\n xl: number | undefined\n}\n\nexport type FilterVariant =\n | 'search'\n | 'lt'\n | 'in'\n | 'notIn'\n | 'endsWith'\n | 'startsWith'\n | 'memberOf'\n | 'neq'\n | 'gte'\n | 'gt'\n | 'eq'\n | 'lte'\n | 'custom'\n\nexport type FilterType = 'boolean' | 'datetime' | 'integer' | 'string' | 'custom' | 'timeInterval'\n\nexport interface MakeFilterOption<TName extends string = string> {\n name: TName\n default: AllowedFilterValues\n type?: FilterType\n variant?: FilterVariant\n titleT?: string\n apiName?: string\n clearable?: boolean\n mandatory?: boolean\n advanced?: boolean\n exclude?: boolean\n related?: string | undefined\n render?: Partial<FilerRenderOptions>\n}\n\nexport interface FilterField {\n name: string\n type: FilterType\n variant: FilterVariant\n titleT?: string\n default: AllowedFilterValues\n apiName: string\n clearable: boolean\n mandatory: boolean\n multiple: boolean\n advanced: boolean\n exclude: boolean\n related: string | undefined\n render: FilerRenderOptions\n}\n\nexport type FilterConfig<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n general: GeneralFilterOptions\n touched: boolean\n fields: {\n [P in F[number]['name']]: FilterField\n }\n}\n\nexport type FilterData<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n [P in F[number]['name']]: AllowedFilterValues\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ADatatableOrdering.js","names":["_sfc_main","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","ADatatableOrdering_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatableOrdering.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n} from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?: ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void) | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n return\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\n// A getter, not the ref
|
|
1
|
+
{"version":3,"file":"ADatatableOrdering.js","names":["_sfc_main","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","ADatatableOrdering_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatableOrdering.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n} from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?: ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void) | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n return\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n // Already the pagination's sort: the ordering only follows it (a loaded hash, `setSortBy`, an admin setting\n // the v-model with it). Applying it again made the list submit, which put a restored page back to 1.\n const current = pagination.value.sortBy\n if (current?.key === found.sortBy?.key && current?.order === found.sortBy?.order) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\n// A getter, not the ref. Admins set `pagination.value.sortBy` in place, which a shallow watch of the ref misses.\nwatch(\n () => ({ key: pagination.value.sortBy?.key, order: pagination.value.sortBy?.order }),\n (newValue, oldValue) => {\n if (newValue.key === oldValue?.key && newValue.order === oldValue?.order) {\n return\n }\n const found = options.value.find((option) => {\n return newValue.key === option.sortBy?.key && newValue.order === option.sortBy?.order\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-body-small mr-1\">{{ t('common.system.datatable.ordering.title') }}:</div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n class=\"text-medium-emphasis\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -95,7 +95,9 @@ var O = { class: "d-flex align-center justify-center" }, k = { class: "text-body
|
|
|
95
95
|
return b(M, (t, n) => {
|
|
96
96
|
if (t === n) return;
|
|
97
97
|
let r = z.value.find((e) => e.id === t);
|
|
98
|
-
|
|
98
|
+
if (e(r)) return;
|
|
99
|
+
let i = N.value.sortBy;
|
|
100
|
+
(i?.key !== r.sortBy?.key || i?.order !== r.sortBy?.order) && (e(A.paginationUpdateCustomCb) ? V(r) : A.paginationUpdateCustomCb(r, N));
|
|
99
101
|
}), b(() => ({
|
|
100
102
|
key: N.value.sortBy?.key,
|
|
101
103
|
order: N.value.sortBy?.order
|