@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
- package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.js +282 -282
- package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
- package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
- package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
- package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
- package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
- package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
- package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
- package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
- package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
- package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
- package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
- package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
- package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
- package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
- package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
- package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
- package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
- package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
- package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
- package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
- package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
- package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
- package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
- package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
- package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
- package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
- package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
- package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
- package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
- package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
- package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
- package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
- package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
- package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
- package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
- package/dist/domains/api/composables/defineApiClient.js.map +1 -1
- package/dist/domains/api/composables/request.d.ts +18 -48
- package/dist/domains/api/composables/request.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
- package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
- package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
- package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
- package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
- package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
- package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
- package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
- package/dist/domains/api/composables/useApiRequest.js.map +1 -1
- package/dist/domains/api/utils/apiErrors.d.ts +28 -55
- package/dist/domains/api/utils/apiErrors.js.map +1 -1
- package/dist/domains/api/utils/listBody.d.ts +22 -43
- package/dist/domains/api/utils/listBody.js.map +1 -1
- package/dist/domains/auth/components/Acl.js.map +1 -1
- package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
- package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
- package/dist/domains/auth/composables/defineAuth.js.map +1 -1
- package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
- package/dist/domains/auth/composables/refreshSession.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
- package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/cached/composables/defineCached.d.ts +13 -11
- package/dist/domains/cached/composables/defineCached.js.map +1 -1
- package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
- package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
- package/dist/domains/collab/composables/collabField.d.ts +5 -3
- package/dist/domains/collab/composables/collabField.js.map +1 -1
- package/dist/domains/collab/composables/collabInit.js +58 -54
- package/dist/domains/collab/composables/collabInit.js.map +1 -1
- package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
- package/dist/domains/collab/composables/collabRecovery.js +99 -0
- package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
- package/dist/domains/collab/composables/collabRoom.js +106 -106
- package/dist/domains/collab/composables/collabRoom.js.map +1 -1
- package/dist/domains/collab/composables/collabState.d.ts +11 -4
- package/dist/domains/collab/composables/collabState.js +34 -25
- package/dist/domains/collab/composables/collabState.js.map +1 -1
- package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
- package/dist/domains/collab/types/Collab.d.ts +31 -5
- package/dist/domains/collab/types/Collab.js +23 -11
- package/dist/domains/collab/types/Collab.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
- package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
- package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
- package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
- package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
- package/dist/domains/dam/api/damAssetApi.js.map +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
- package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
- package/dist/domains/dam/api/damConstants.js.map +1 -1
- package/dist/domains/dam/api/damEndPoints.js.map +1 -1
- package/dist/domains/dam/api/damImageApi.js.map +1 -1
- package/dist/domains/dam/api/uploadApi.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
- package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
- package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
- package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
- package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
- package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
- package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
- package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
- package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
- package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
- package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
- package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
- package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
- package/dist/domains/dam/author/api/authorApi.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
- package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
- package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
- package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
- package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
- package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
- package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
- package/dist/domains/dam/composables/damConfigName.js.map +1 -1
- package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
- package/dist/domains/dam/composables/damNotifications.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
- package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
- package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
- package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
- package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
- package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
- package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
- package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
- package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
- package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
- package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
- package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
- package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
- package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
- package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
- package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
- package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
- package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
- package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
- package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
- package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
- package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
- package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
- package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
- package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
- package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
- package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
- package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
- package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
- package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
- package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
- package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
- package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
- package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
- package/dist/domains/dam/types/Asset.d.ts +1 -1
- package/dist/domains/dam/types/Asset.js.map +1 -1
- package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
- package/dist/domains/dam/types/UploadQueue.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
- package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
- package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
- package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
- package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
- package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
- package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
- package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
- package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
- package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
- package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
- package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
- package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
- package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
- package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
- package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
- package/dist/domains/dam/user/api/userApi.d.ts +2 -2
- package/dist/domains/dam/user/api/userApi.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
- package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
- package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
- package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
- package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
- package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
- package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
- package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
- package/dist/domains/filters/composables/filterFactory.js +38 -31
- package/dist/domains/filters/composables/filterFactory.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
- package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
- package/dist/domains/job/api/jobApi.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
- package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
- package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
- package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
- package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
- package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
- package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
- package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
- package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
- package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
- package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
- package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
- package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
- package/dist/domains/log/api/logApi.d.ts +2 -3
- package/dist/domains/log/api/logApi.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.js.map +1 -1
- package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.js.map +1 -1
- package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
- package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/composables/logActions.d.ts +4 -5
- package/dist/domains/log/composables/logActions.js.map +1 -1
- package/dist/domains/log/composables/logType.d.ts +6 -7
- package/dist/domains/log/composables/logType.js.map +1 -1
- package/dist/domains/log/filter/logFilter.d.ts +8 -11
- package/dist/domains/log/filter/logFilter.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
- package/dist/domains/permission/composables/permissionActions.js.map +1 -1
- package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
- package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
- package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
- package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
- package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
- package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
- package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
- package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
- package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
- package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
- package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
- package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
- package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
- package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
- package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
- package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
- package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
- package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
- package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/composables/alerts.js.map +1 -1
- package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
- package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
- package/dist/domains/system/composables/languageSettings.js.map +1 -1
- package/dist/domains/system/composables/loginStatus.js.map +1 -1
- package/dist/domains/system/composables/navigationError.d.ts +6 -8
- package/dist/domains/system/composables/navigationError.js.map +1 -1
- package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
- package/dist/domains/system/composables/pageNavigation.js.map +1 -1
- package/dist/domains/system/composables/recordActions.d.ts +14 -22
- package/dist/domains/system/composables/recordActions.js.map +1 -1
- package/dist/domains/system/composables/recordPage.d.ts +23 -38
- package/dist/domains/system/composables/recordPage.js.map +1 -1
- package/dist/domains/system/composables/routeHistory.d.ts +4 -5
- package/dist/domains/system/composables/routeHistory.js.map +1 -1
- package/dist/domains/system/composables/sentry.js.map +1 -1
- package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
- package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
- package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
- package/dist/domains/system/store/datatablePageStore.js +10 -3
- package/dist/domains/system/store/datatablePageStore.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
- package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
- package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
- package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
- package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
- package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
- package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
- package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
- package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
- package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
- package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
- package/dist/domains/ui/view/components/ALoginView.js +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
- package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
- package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
- package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
- package/dist/plugins/commonVuetifyConfig.js.map +1 -1
- package/dist/plugins/i18n.d.ts +4 -5
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/pluginOptions.d.ts +4 -2
- package/dist/plugins/pluginOptions.js.map +1 -1
- package/dist/plugins/webfontloader.js.map +1 -1
- package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
- package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
- package/dist/shared/error/AnzuError.d.ts +3 -5
- package/dist/shared/error/AnzuError.js.map +1 -1
- package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
- package/dist/shared/error/AuthUnavailableError.js.map +1 -1
- package/dist/shared/error/isInCauseChain.d.ts +2 -2
- package/dist/shared/error/isInCauseChain.js.map +1 -1
- package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
- package/dist/shared/types/Validation.d.ts +4 -5
- package/dist/shared/types/common.d.ts +1 -3
- package/dist/shared/types/globalComponents.d.ts +5 -6
- package/dist/shared/utils/common.js.map +1 -1
- package/dist/shared/utils/datetime.d.ts +0 -1
- package/dist/shared/utils/datetime.js.map +1 -1
- package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
- package/dist/shared/utils/datetimePickerValue.js.map +1 -1
- package/dist/shared/utils/development.d.ts +3 -3
- package/dist/shared/utils/development.js.map +1 -1
- package/dist/shared/utils/envConfig.d.ts +4 -4
- package/dist/shared/utils/envConfig.js.map +1 -1
- package/dist/shared/utils/json.d.ts +1 -1
- package/dist/shared/utils/json.js.map +1 -1
- package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
- package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
- package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
- package/dist/testing/appShell.d.ts +11 -11
- package/dist/testing/appShell.js.map +1 -1
- package/dist/testing/closeButtons.d.ts +9 -11
- package/dist/testing/closeButtons.js.map +1 -1
- package/dist/testing/declaredDependencies.d.ts +7 -7
- package/dist/testing/declaredDependencies.js.map +1 -1
- package/dist/testing/generatedRoutes.d.ts +6 -11
- package/dist/testing/generatedRoutes.js.map +1 -1
- package/dist/testing/routeHistory.d.ts +5 -12
- package/dist/testing/routeHistory.js.map +1 -1
- package/dist/testing/sortableLists.d.ts +16 -21
- package/dist/testing/sortableLists.js.map +1 -1
- package/dist/testing/typedRouter.d.ts +0 -1
- package/dist/testing/typedRouter.js.map +1 -1
- package/package.json +27 -27
- package/src/eslint/adminConfig.mjs +19 -27
- package/src/eslint/globalComponentNames.mjs +3 -4
- package/src/eslint/oxlint.mjs +7 -20
- package/src/eslint/plugin.d.mts +2 -4
- package/src/eslint/plugin.mjs +18 -34
- package/src/eslint/validRouteName.mjs +6 -7
- package/src/vite/devWatch.mjs +30 -43
- package/src/vite/index.d.mts +5 -5
- package/src/vite/sentry.mjs +7 -12
- package/src/vite/sourcemaps.mjs +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ADatatableOrdering.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_unref","_createVNode","_component_VBtn","_withCtx","_createTextVNode","_component_VMenu","_component_VList","_Fragment","_renderList","_createBlock","_component_VListItem","_component_VListItemTitle","_normalizeClass","_hoisted_1","_hoisted_2","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__emit","props","__props","emit","modelValue","useModel","pagination","inject","DatatablePaginationKey","isUndefined","useI18n","defaultItemsCreatedAt","SortOrder","defaultItemsId","defaultItemsMostRelevant","SORT_BY_SCORE","activeTitle","computed","found","options","item","t","onItemClick","paginationUpdateDefault","watch","newValue","oldValue","option","openBlock","createElementBlock","createElementVNode","toDisplayString","unref","createVNode","VBtn","withCtx","createTextVNode","VMenu","VList","Fragment","renderList","createBlock","VListItem","VListItemTitle","normalizeClass"],"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.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_unref","_createVNode","_component_VBtn","_withCtx","_createTextVNode","_component_VMenu","_component_VList","_Fragment","_renderList","_createBlock","_component_VListItem","_component_VListItemTitle","_normalizeClass","_hoisted_1","_hoisted_2","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__emit","props","__props","emit","modelValue","useModel","pagination","inject","DatatablePaginationKey","isUndefined","useI18n","defaultItemsCreatedAt","SortOrder","defaultItemsId","defaultItemsMostRelevant","SORT_BY_SCORE","activeTitle","computed","found","options","item","t","onItemClick","paginationUpdateDefault","watch","newValue","oldValue","option","current","openBlock","createElementBlock","createElementVNode","toDisplayString","unref","createVNode","VBtn","withCtx","createTextVNode","VMenu","VList","Fragment","renderList","createBlock","VListItem","VListItemTitle","normalizeClass"],"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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ADatatablePagination.js","names":["_sfc_main","ADatatablePagination_vue_vue_type_script_setup_true_lang_default","ADatatablePagination_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\n// `useFilterHelpers` provides the key, so tables sharing a system/subject stay apart
|
|
1
|
+
{"version":3,"file":"ADatatablePagination.js","names":["_sfc_main","ADatatablePagination_vue_vue_type_script_setup_true_lang_default","ADatatablePagination_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\n// `useFilterHelpers` provides the key, so tables sharing a system/subject stay apart.\n// Both are optional. A datatable providing pagination without them uses the shared bucket.\nconst providedPageKey = inject(DatatablePageStoreKey, undefined)\nconst filterConfig = inject(FilterConfigKey, undefined)\nconst pageStoreKey = computed(\n () => providedPageKey ?? datatablePageKey(filterConfig?.general.system, filterConfig?.general.subject)\n)\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\n// `>=`, not `===`. An empty list has `lastPage` 0 while `page` is at least 1, so they never meet.\n// The same holds before the first request.\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page >= lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page >= lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\n// One watcher for both. A restore after Close sets the page and the rows per page together, and a separate\n// rows watcher put that page back to 1. Rows per page changed alone (the toggle) still start on page 1.\nwatch(\n [() => pagination.value.page, () => pagination.value.rowsPerPage],\n ([page, rowsPerPage], [oldPage, oldRowsPerPage]) => {\n if (rowsPerPage !== oldRowsPerPage && page === oldPage && page !== 1) {\n // Runs this watcher again for the page, which stores it and emits once.\n pagination.value.page = 1\n return\n }\n setStoredPage(pageStoreKey.value, page, rowsPerPage)\n emit('change')\n }\n)\n\n// Leading edge only. The throttle guards against click spam.\n// VueUse 15 defaults `trailing` to true, which replays the last click and can step\n// past `lastPage`, because the queued callback does not recheck the disabled state.\nconst onClickFirst = useThrottleFn(\n () => {\n pagination.value.page = 1\n },\n 300,\n false\n)\n\nconst onClickLast = useThrottleFn(\n () => {\n pagination.value.page = lastPage.value\n },\n 300,\n false\n)\n\nconst onClickPrev = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page - 1\n },\n 300,\n false\n)\n\nconst onClickNext = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page + 1\n },\n 300,\n false\n)\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }}\n {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.first')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.previous')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.next')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.last')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n"],"mappings":""}
|
|
@@ -28,10 +28,8 @@ var O = { class: "anzu-data-footer" }, k = {
|
|
|
28
28
|
let F = P, I = g(a);
|
|
29
29
|
if (t(I)) throw Error("Incorrect provide/inject config.");
|
|
30
30
|
let { t: L } = w(), { setStoredPage: R } = r(), z = g(i, void 0), B = g(o, void 0), V = c(() => z ?? n(B?.general.system, B?.general.subject)), H = c(() => Math.ceil(I.value.totalCount / I.value.rowsPerPage)), U = c(() => I.value.page * I.value.rowsPerPage - I.value.rowsPerPage + 1), W = c(() => I.value.page * I.value.rowsPerPage - I.value.rowsPerPage + I.value.currentViewCount), G = c(() => I.value.page === 1), K = c(() => !e(I.value.hasNextPage) || I.value.page >= H.value), q = c(() => e(I.value.hasNextPage) && I.value.page >= H.value || I.value.hasNextPage === !1), J = c(() => e(I.value.hasNextPage) ? I.value.totalCount : I.value.hasNextPage ? W.value + 1 + "+" : W.value);
|
|
31
|
-
x(() => I.value.rowsPerPage, (e, t) => {
|
|
32
|
-
|
|
33
|
-
}), x(() => I.value.page, (e, t) => {
|
|
34
|
-
e !== t && (R(V.value, e), F("change"));
|
|
31
|
+
x([() => I.value.page, () => I.value.rowsPerPage], ([e, t], [n, r]) => {
|
|
32
|
+
t !== r && e === n && e !== 1 ? I.value.page = 1 : (R(V.value, e, t), F("change"));
|
|
35
33
|
});
|
|
36
34
|
let Y = T(() => {
|
|
37
35
|
I.value.page = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ADatatablePagination.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createTextVNode","_toDisplayString","_unref","_createVNode","_component_VBtnToggle","_withCtx","_Fragment","_renderList","_createBlock","_component_VBtn","_createCommentVNode","_createElementVNode","_withModifiers","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","ADatatablePagination_vue_vue_type_script_setup_true_lang_default","__emit","emit","pagination","inject","DatatablePaginationKey","isUndefined","useI18n","useDatatablePageStore","providedPageKey","DatatablePageStoreKey","filterConfig","FilterConfigKey","pageStoreKey","computed","datatablePageKey","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","isNull","disabledNext","computedTotalCountText","watch","newValue","oldValue","setStoredPage","onClickFirst","useThrottleFn","onClickLast","onClickPrev","onClickNext","openBlock","createElementBlock","__props","createCommentVNode","createTextVNode","toDisplayString","unref","t","createVNode","VBtnToggle","_cache","$event","withCtx","Fragment","renderList","createBlock","VBtn","item","createElementVNode","withModifiers"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\n// `useFilterHelpers` provides the key, so tables sharing a system/subject stay apart. Both\n// fallbacks are optional on purpose: a datatable may provide pagination without either, and it\n// then keeps the shared bucket it had before the store was keyed.\nconst providedPageKey = inject(DatatablePageStoreKey, undefined)\nconst filterConfig = inject(FilterConfigKey, undefined)\nconst pageStoreKey = computed(\n () => providedPageKey ?? datatablePageKey(filterConfig?.general.system, filterConfig?.general.subject)\n)\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\n// `>=`, not `===`: an empty list has `totalCount: 0`, so `lastPage` is 0 while `page` is never below\n// 1, and the two can never meet. The page would then count as \"not the last one\" on a list with\n// nothing in it -- and the same holds before any request has been made, because that initial state is\n// the same numbers.\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page >= lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page >= lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\nwatch(\n () => pagination.value.rowsPerPage,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n pagination.value.page = 1\n emit('change')\n }\n }\n)\n\nwatch(\n () => pagination.value.page,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n setStoredPage(pageStoreKey.value, newValue)\n emit('change')\n }\n }\n)\n\n// Leading edge only: the throttle is a click-spam guard, not a rate limiter. VueUse 15 flipped\n// `trailing` to true by default, which replays the last click once the window closes -- stepping\n// prev/next a second time, and past `lastPage`, because the queued callback never re-reads the\n// disabled state.\nconst onClickFirst = useThrottleFn(\n () => {\n pagination.value.page = 1\n },\n 300,\n false\n)\n\nconst onClickLast = useThrottleFn(\n () => {\n pagination.value.page = lastPage.value\n },\n 300,\n false\n)\n\nconst onClickPrev = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page - 1\n },\n 300,\n false\n)\n\nconst onClickNext = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page + 1\n },\n 300,\n false\n)\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }}\n {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.first')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.previous')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.next')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.last')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBA,IAAMuB,IAAOD,GAIPE,IAAaC,EAAOC,CAAsB;EAEhD,IAAIC,EAAYH,CAAU,GACxB,MAAU,MAAM,kCAAkC;EAGpD,IAAM,EAAE,SAAMI,EAAQ,GAChB,EAAE,qBAAkBC,EAAsB,GAK1CC,IAAkBL,EAAOM,GAAuB,KAAA,CAAS,GACzDC,IAAeP,EAAOQ,GAAiB,KAAA,CAAS,GAChDC,IAAeC,QACbL,KAAmBM,EAAiBJ,GAAc,QAAQ,QAAQA,GAAc,QAAQ,OAAO,CACvG,GAEMK,IAAWF,QACR,KAAK,KAAKX,EAAW,MAAM,aAAaA,EAAW,MAAM,WAAW,CAC5E,GAEKc,IAAgBH,QACbX,EAAW,MAAM,OAAOA,EAAW,MAAM,cAAcA,EAAW,MAAM,cAAc,CAC9F,GAEKe,IAAcJ,QAEhBX,EAAW,MAAM,OAAOA,EAAW,MAAM,cACzCA,EAAW,MAAM,cACjBA,EAAW,MAAM,gBAEpB,GAEKgB,IAAuBL,QACpBX,EAAW,MAAM,SAAS,CAClC,GAMKiB,IAAeN,QACZ,CAACO,EAAOlB,EAAW,MAAM,WAAW,KAAKA,EAAW,MAAM,QAAQa,EAAS,KACnF,GAEKM,IAAeR,QAEhBO,EAAOlB,EAAW,MAAM,WAAW,KAAKA,EAAW,MAAM,QAAQa,EAAS,SAC3Eb,EAAW,MAAM,gBAAgB,EAEpC,GAEKoB,IAAyBT,QACxBO,EAAOlB,EAAW,MAAM,WAAW,IAGjCA,EAAW,MAAM,aAFfA,EAAW,MAAM,cAAce,EAAY,QAAQ,IAAI,MAAMA,EAAY,KAGnF;EAYD,AAVAM,QACQrB,EAAW,MAAM,cACtB,GAAU,MAAa;GACtB,AAAIsB,MAAaC,MACf,EAAW,MAAM,OAAO,GACxBxB,EAAK,QAAQ;EAEjB,CACF,GAEAsB,QACQrB,EAAW,MAAM,OACtB,GAAU,MAAa;GACtB,AAAIsB,MAAaC,MACfC,EAAcd,EAAa,OAAOY,CAAQ,GAC1CvB,EAAK,QAAQ;EAEjB,CACF;EAMA,IAAM0B,IAAeC,QACb;GACJ,EAAW,MAAM,OAAO;EAC1B,GACA,KACA,EACF,GAEMC,IAAcD,QACZ;GACJ,EAAW,MAAM,OAAOb,EAAS;EACnC,GACA,KACA,EACF,GAEMe,IAAcF,QACZ;GACJ,EAAW,MAAM,OAAO1B,EAAW,MAAM,OAAO;EAClD,GACA,KACA,EACF,GAEM6B,IAAcH,QACZ;GACJ,EAAW,MAAM,OAAO1B,EAAW,MAAM,OAAO;EAClD,GACA,KACA,EACF;E,kBAIExB,EAAA,GAAAC,EAqEM,OArENc,GAqEM;GAnEKyC,EAAA,qB,aADTxD,EAAA,GAAAC,EAwBM,OAxBNe,GAwBM,CApBDd,EAAAC,EAAAC,EAAAyD,CAAA,CAAC,CAAA,sCAAA,CAAA,IAA2C,MAC/C,CAAA,GAAAxD,EAkBaC,GAAA;IAjBF,YAAAF,EAAAoB,CAAA,CAAU,CAAC;IAAX,uBAAA,AAAAwC,EAAA,QAAA,MAAA,EAAAxC,CAAA,CAAU,CAAC,cAAWyC;IAC/B,OAAM;IACN,SAAQ;IACR,WAAA;IACA,WAAQ;;IAGN,SAAA1D,QAAmC,EADrCP,EAAA,EAAA,GAAAC,EAUOO,GAAA,MAAAC,EATU+C,EAAA,sBAAR,OADTxD,EAAA,GAAAU,EAUOC,GAAA;KARJ,KAAK4D;KACL,OAAOA,MAASnE,EAAAoB,CAAA,CAAU,CAAC,cAAW,cAAA;KACtC,OAAO+C;KACR,SAAQ;KACR,MAAK;KACL,SAAQ;;KAER,SAAAhE,QAAU,CAAPL,EAAAC,EAAAoE,CAAI,GAAA,CAAA,C;;;;;GAIb1D,EAGM,OAHNI,GAGMd,EAFDmC,EAAA,KAAa,IAAG,QAAGnC,EAAGoC,EAAA,KAAW,IAAG,MAACpC,EAAGC,EAAAyD,CAAA,CAAC,CAAA,8BAAA,CAAA,IAAmC,MAC/E1D,EAAGyC,EAAA,KAAsB,GAAA,CAAA;GAE3B/B,EAiBM,OAjBNK,GAiBM,CAhBJb,EAOEM,GAAA;IANC,UAAU6B,EAAA;IACX,MAAK;IACJ,cAAYpC,EAAAyD,CAAA,CAAC,CAAA,qCAAA;IACd,MAAK;IACL,SAAQ;IACP,SAAK/C,EAAOV,EAAA6C,CAAA,GAAY,CAAA,MAAA,CAAA;;;;;G,IAE3B5C,EAOEM,GAAA;IANC,UAAU6B,EAAA;IACX,MAAK;IACJ,cAAYpC,EAAAyD,CAAA,CAAC,CAAA,wCAAA;IACd,MAAK;IACL,SAAQ;IACP,SAAK/C,EAAOV,EAAAgD,CAAA,GAAW,CAAA,MAAA,CAAA;;;;;;GAG5BvC,EAEM,OAFNM,GAEM,CADJN,EAAkC,QAAA,MAAAV,EAAzBC,EAAAoB,CAAA,CAAU,CAAC,IAAI,GAAA,CAAA,C;GAE1BX,EAiBM,OAjBNO,GAiBM,CAhBJf,EAOEM,GAAA;IANC,UAAUgC,EAAA;IACX,MAAK;IACJ,cAAYvC,EAAAyD,CAAA,CAAC,CAAA,oCAAA;IACd,MAAK;IACL,SAAQ;IACP,SAAK/C,EAAOV,EAAAiD,CAAA,GAAW,CAAA,MAAA,CAAA;;;;;G,IAE1BhD,EAOEM,GAAA;IANC,UAAU8B,EAAA;IACX,MAAK;IACJ,cAAYrC,EAAAyD,CAAA,CAAC,CAAA,oCAAA;IACd,MAAK;IACL,SAAQ;IACP,SAAK/C,EAAOV,EAAA+C,CAAA,GAAW,CAAA,MAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"ADatatablePagination.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createTextVNode","_toDisplayString","_unref","_createVNode","_component_VBtnToggle","_withCtx","_Fragment","_renderList","_createBlock","_component_VBtn","_createCommentVNode","_createElementVNode","_withModifiers","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","ADatatablePagination_vue_vue_type_script_setup_true_lang_default","__emit","emit","pagination","inject","DatatablePaginationKey","isUndefined","useI18n","useDatatablePageStore","providedPageKey","DatatablePageStoreKey","filterConfig","FilterConfigKey","pageStoreKey","computed","datatablePageKey","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","isNull","disabledNext","computedTotalCountText","page","rowsPerPage","oldPage","oldRowsPerPage","setStoredPage","onClickFirst","useThrottleFn","onClickLast","onClickPrev","onClickNext","openBlock","createElementBlock","__props","createCommentVNode","createTextVNode","toDisplayString","unref","t","createVNode","VBtnToggle","_cache","$event","withCtx","Fragment","renderList","createBlock","VBtn","item","createElementVNode","withModifiers"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\n// `useFilterHelpers` provides the key, so tables sharing a system/subject stay apart.\n// Both are optional. A datatable providing pagination without them uses the shared bucket.\nconst providedPageKey = inject(DatatablePageStoreKey, undefined)\nconst filterConfig = inject(FilterConfigKey, undefined)\nconst pageStoreKey = computed(\n () => providedPageKey ?? datatablePageKey(filterConfig?.general.system, filterConfig?.general.subject)\n)\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\n// `>=`, not `===`. An empty list has `lastPage` 0 while `page` is at least 1, so they never meet.\n// The same holds before the first request.\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page >= lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page >= lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\n// One watcher for both. A restore after Close sets the page and the rows per page together, and a separate\n// rows watcher put that page back to 1. Rows per page changed alone (the toggle) still start on page 1.\nwatch(\n [() => pagination.value.page, () => pagination.value.rowsPerPage],\n ([page, rowsPerPage], [oldPage, oldRowsPerPage]) => {\n if (rowsPerPage !== oldRowsPerPage && page === oldPage && page !== 1) {\n // Runs this watcher again for the page, which stores it and emits once.\n pagination.value.page = 1\n return\n }\n setStoredPage(pageStoreKey.value, page, rowsPerPage)\n emit('change')\n }\n)\n\n// Leading edge only. The throttle guards against click spam.\n// VueUse 15 defaults `trailing` to true, which replays the last click and can step\n// past `lastPage`, because the queued callback does not recheck the disabled state.\nconst onClickFirst = useThrottleFn(\n () => {\n pagination.value.page = 1\n },\n 300,\n false\n)\n\nconst onClickLast = useThrottleFn(\n () => {\n pagination.value.page = lastPage.value\n },\n 300,\n false\n)\n\nconst onClickPrev = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page - 1\n },\n 300,\n false\n)\n\nconst onClickNext = useThrottleFn(\n () => {\n pagination.value.page = pagination.value.page + 1\n },\n 300,\n false\n)\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }}\n {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.first')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.previous')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.next')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n :aria-label=\"t('$vuetify.pagination.ariaLabel.last')\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterInjectionKeys.js","names":["FilterDataKey","FilterConfigKey","FilterInnerDataKey","FilterInnerConfigKey","FilterSubmitResetCounterKey","FilterSelectedKey","DatatablePaginationKey","SubjectSelectCloseSidebarKey","DatatablePageStoreKey"],"sources":["../../../../src/domains/filters/utils/filterInjectionKeys.ts"],"sourcesContent":["import type { InjectionKey, Ref } from 'vue'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nexport const FilterDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterDataKey')\nexport const FilterConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterConfigKey')\n\nexport const FilterInnerDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterInnerDataKey')\nexport const FilterInnerConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterInnerConfigKey')\n\nexport const FilterSubmitResetCounterKey: InjectionKey<Ref<number>> = Symbol.for('anzu:FilterSubmitResetCounterKey')\nexport const FilterSelectedKey: InjectionKey<Ref<Map<string, ValueObjectOption<string | number>[]>>> =\n Symbol.for('anzu:FilterSelectedKey')\n\nexport const DatatablePaginationKey: InjectionKey<Ref<Pagination>> = Symbol.for('anzu:DatatablePaginationKey')\n\nexport const SubjectSelectCloseSidebarKey: InjectionKey<() => void> = Symbol.for('anzu:SubjectSelectCloseSidebarKey')\n\n//
|
|
1
|
+
{"version":3,"file":"filterInjectionKeys.js","names":["FilterDataKey","FilterConfigKey","FilterInnerDataKey","FilterInnerConfigKey","FilterSubmitResetCounterKey","FilterSelectedKey","DatatablePaginationKey","SubjectSelectCloseSidebarKey","DatatablePageStoreKey"],"sources":["../../../../src/domains/filters/utils/filterInjectionKeys.ts"],"sourcesContent":["import type { InjectionKey, Ref } from 'vue'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nexport const FilterDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterDataKey')\nexport const FilterConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterConfigKey')\n\nexport const FilterInnerDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterInnerDataKey')\nexport const FilterInnerConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterInnerConfigKey')\n\nexport const FilterSubmitResetCounterKey: InjectionKey<Ref<number>> = Symbol.for('anzu:FilterSubmitResetCounterKey')\nexport const FilterSelectedKey: InjectionKey<Ref<Map<string, ValueObjectOption<string | number>[]>>> =\n Symbol.for('anzu:FilterSelectedKey')\n\nexport const DatatablePaginationKey: InjectionKey<Ref<Pagination>> = Symbol.for('anzu:DatatablePaginationKey')\n\nexport const SubjectSelectCloseSidebarKey: InjectionKey<() => void> = Symbol.for('anzu:SubjectSelectCloseSidebarKey')\n\n// Key for a datatable's remembered page. `useFilterHelpers` provides it so\n// `ADatatablePagination` writes under the key `loadStoredFilters` reads.\n// Several tables can share one system/subject (cms has seven for\n// `cms/article`). They differ by overriding `storeFiltersLocalStorage`.\nexport const DatatablePageStoreKey: InjectionKey<string> = Symbol.for('anzu:DatatablePageStoreKey')\n"],"mappings":";AAKA,IAAaA,IAA0C,OAAO,IAAI,oBAAoB,GACzEC,IAA8C,OAAO,IAAI,sBAAsB,GAE/EC,IAA+C,OAAO,IAAI,yBAAyB,GACnFC,IAAmD,OAAO,IAAI,2BAA2B,GAEzFC,IAAyD,OAAO,IAAI,kCAAkC,GACtGC,IACX,OAAO,IAAI,wBAAwB,GAExBC,IAAwD,OAAO,IAAI,6BAA6B,GAEhGC,IAAyD,OAAO,IAAI,mCAAmC,GAMvGC,IAA8C,OAAO,IAAI,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFormDatetimePicker.js","names":["_sfc_main","AFormDatetimePicker_vue_vue_type_script_setup_true_lang_default","AFormDatetimePicker_default"],"sources":["../../../../src/domains/form/components/AFormDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\nimport type { DatetimePickerType } from '@/shared/utils/datetimePickerValue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n type?: DatetimePickerType\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst isOpened = ref(false)\nconst isFocused = ref(false)\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n // The picker emits close before its watchers flush the picked value into the model.\n nextTick(() => {\n releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event
|
|
1
|
+
{"version":3,"file":"AFormDatetimePicker.js","names":["_sfc_main","AFormDatetimePicker_vue_vue_type_script_setup_true_lang_default","AFormDatetimePicker_default"],"sources":["../../../../src/domains/form/components/AFormDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\nimport type { DatetimePickerType } from '@/shared/utils/datetimePickerValue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n type?: DatetimePickerType\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst isOpened = ref(false)\nconst isFocused = ref(false)\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n // The picker emits close before its watchers flush the picked value into the model.\n nextTick(() => {\n releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event.\n // Releasing the lock now would send the previous value, and clearing `isFocused` would skip the change.\n nextTick(() => {\n isFocused.value = false\n emit('blur', isUndefined(props.modelValue) ? null : props.modelValue)\n if (isOpened.value === false) releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item) => unref(item.$message)).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if ((props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && (isFocused.value || isOpened.value)) {\n changeFieldData.value(newValue)\n }\n})\n</script>\n\n<template>\n <ADatetimePicker\n v-model=\"modelValueComputed\"\n :type=\"type\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :required=\"requiredComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :label=\"labelComputed\"\n :clearable=\"clearable\"\n v-bind=\"$attrs\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @open=\"onOpen\"\n @close=\"onClose\"\n >\n <template #append-inner>\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </ADatetimePicker>\n</template>\n"],"mappings":""}
|
|
@@ -15,12 +15,14 @@ type __VLS_Props = {
|
|
|
15
15
|
disabled?: boolean;
|
|
16
16
|
readonly?: boolean;
|
|
17
17
|
};
|
|
18
|
-
declare
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
declare const __VLS_template: () => {
|
|
19
|
+
__VLS_Slots: {
|
|
20
|
+
locked?: (props: {
|
|
21
|
+
userId: IntegerIdNullable;
|
|
22
|
+
}) => any;
|
|
23
|
+
};
|
|
23
24
|
};
|
|
25
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
24
26
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
25
27
|
"update:modelValue": (data: DatetimeUTCNullable | undefined) => any;
|
|
26
28
|
blur: (data: string | number | null | undefined) => any;
|
package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","ADatetimePicker","_mergeProps","_withCtx","_renderSlot","ACollabLockedByUser","_createCommentVNode","ACollabLockedByUser_default","ADatetimePicker_default","AFormDatetimePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","modelValueComputed","computed","newValue","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","isOpened","isFocused","onOpen","onClose","nextTick","useI18n","system","inject","SystemScopeKey","subject","SubjectScopeKey","onBlur","isUndefined","onFocus","errorMessageComputed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","oldValue","openBlock","createBlock","mergeProps","_cache","$event","_ctx","withCtx","renderSlot","createCommentVNode"],"sources":["../../../../src/domains/form/components/AFormDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\nimport type { DatetimePickerType } from '@/shared/utils/datetimePickerValue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n type?: DatetimePickerType\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst isOpened = ref(false)\nconst isFocused = ref(false)\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n // The picker emits close before its watchers flush the picked value into the model.\n nextTick(() => {\n releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event
|
|
1
|
+
{"version":3,"file":"AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","ADatetimePicker","_mergeProps","_withCtx","_renderSlot","ACollabLockedByUser","_createCommentVNode","ACollabLockedByUser_default","ADatetimePicker_default","AFormDatetimePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","modelValueComputed","computed","newValue","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","isOpened","isFocused","onOpen","onClose","nextTick","useI18n","system","inject","SystemScopeKey","subject","SubjectScopeKey","onBlur","isUndefined","onFocus","errorMessageComputed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","oldValue","openBlock","createBlock","mergeProps","_cache","$event","_ctx","withCtx","renderSlot","createCommentVNode"],"sources":["../../../../src/domains/form/components/AFormDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\nimport type { DatetimePickerType } from '@/shared/utils/datetimePickerValue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n type?: DatetimePickerType\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n }>(),\n {\n type: 'datetime',\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null | undefined): void\n (e: 'blur', data: string | number | null | undefined): void\n (e: 'focus', data: string | number | null | undefined): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst isOpened = ref(false)\nconst isFocused = ref(false)\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n // The picker emits close before its watchers flush the picked value into the model.\n nextTick(() => {\n releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event.\n // Releasing the lock now would send the previous value, and clearing `isFocused` would skip the change.\n nextTick(() => {\n isFocused.value = false\n emit('blur', isUndefined(props.modelValue) ? null : props.modelValue)\n if (isOpened.value === false) releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item) => unref(item.$message)).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if ((props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && (isFocused.value || isOpened.value)) {\n changeFieldData.value(newValue)\n }\n})\n</script>\n\n<template>\n <ADatetimePicker\n v-model=\"modelValueComputed\"\n :type=\"type\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :required=\"requiredComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :label=\"labelComputed\"\n :clearable=\"clearable\"\n v-bind=\"$attrs\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @open=\"onOpen\"\n @close=\"onClose\"\n >\n <template #append-inner>\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n </ADatetimePicker>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFormFlagDatetimePicker.js","names":["_sfc_main","AFormFlagDatetimePicker_vue_vue_type_script_setup_true_lang_default","AFormFlagDatetimePicker_default"],"sources":["../../../../src/domains/form/components/AFormFlagDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isFunction, isNull, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport { dateTimeNow } from '@/shared/utils/datetime'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n label?: string\n errorMessage?: string\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n defaultActivationValue?: DatetimeUTCNullable | 'now' | (() => DatetimeUTCNullable)\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n defaultActivationValue: 'now',\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null): void\n (e: 'blur', data: string | number | null): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst checkboxModel = ref(false)\nconst isFocused = ref(false)\nconst isOpened = ref(false)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event
|
|
1
|
+
{"version":3,"file":"AFormFlagDatetimePicker.js","names":["_sfc_main","AFormFlagDatetimePicker_vue_vue_type_script_setup_true_lang_default","AFormFlagDatetimePicker_default"],"sources":["../../../../src/domains/form/components/AFormFlagDatetimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, nextTick, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { isDefined, isFunction, isNull, isUndefined } from '@/shared/utils/common'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { DatetimeUTCNullable, IntegerIdNullable } from '@/shared/types/common'\nimport { dateTimeNow } from '@/shared/utils/datetime'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport ADatetimePicker from '@/domains/ui/datetime/components/ADatetimePicker.vue'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: DatetimeUTCNullable | undefined\n label?: string\n errorMessage?: string\n v?: AFormFieldValidation | null\n dataCy?: string\n clearable?: boolean\n defaultActivationValue?: DatetimeUTCNullable | 'now' | (() => DatetimeUTCNullable)\n collab?: CollabComponentConfig\n disabled?: boolean\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n v: null,\n dataCy: undefined,\n clearable: false,\n defaultActivationValue: 'now',\n collab: undefined,\n disabled: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DatetimeUTCNullable | undefined): void\n (e: 'click:append', data: string | number | null): void\n (e: 'blur', data: string | number | null): void\n}>()\n\nconst modelValueComputed = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DatetimeUTCNullable | undefined) {\n emit('update:modelValue', newValue)\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst checkboxModel = ref(false)\nconst isFocused = ref(false)\nconst isOpened = ref(false)\n\nconst onBlur = () => {\n props.v?.$touch()\n // The picker commits a typed value in a watcher that runs after this event.\n // Releasing the lock now would send the previous value, and clearing `isFocused` would skip the change.\n nextTick(() => {\n isFocused.value = false\n emit('blur', isUndefined(props.modelValue) ? null : props.modelValue)\n if (isOpened.value === false) releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst onFocus = () => {\n isFocused.value = true\n acquireFieldLock.value()\n}\n\nconst onOpen = () => {\n isOpened.value = true\n acquireFieldLock.value()\n}\n\nconst onClose = () => {\n isOpened.value = false\n // The picker emits close before its watchers flush the picked value into the model.\n nextTick(() => {\n releaseFieldLock.value(props.modelValue)\n })\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return [props.v.$errors.map((item) => unref(item.$message)).join(' ')]\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nwatch(\n modelValueComputed,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isNull(newValue) || isUndefined(newValue)) {\n checkboxModel.value = false\n return\n }\n checkboxModel.value = true\n },\n { immediate: true }\n)\n\n/**\n * @param oldValue state before click\n */\nconst onCheckboxClick = (oldValue: boolean) => {\n acquireFieldLock.value()\n setTimeout(() => {\n if (isFocused.value === false) releaseFieldLock.value(props.modelValue)\n }, 500)\n if (oldValue) {\n modelValueComputed.value = null\n return\n }\n if (props.defaultActivationValue === 'now') {\n modelValueComputed.value = dateTimeNow()\n return\n }\n if (isFunction(props.defaultActivationValue)) {\n modelValueComputed.value = props.defaultActivationValue()\n return\n }\n modelValueComputed.value = props.defaultActivationValue\n}\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nwatch(modelValueComputed, (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && (isFocused.value || isOpened.value)) {\n changeFieldData.value(newValue)\n }\n})\n</script>\n\n<template>\n <div class=\"d-flex justify-space-between\">\n <VCheckboxBtn\n v-model=\"checkboxModel\"\n :label=\"labelComputed\"\n :disabled=\"disabledComputed\"\n @click.stop=\"onCheckboxClick(checkboxModel)\"\n />\n <div style=\"opacity: 0.5\">\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </div>\n </div>\n <VExpandTransition>\n <div v-show=\"checkboxModel\">\n <ADatetimePicker\n v-model=\"modelValueComputed\"\n :data-cy=\"dataCy\"\n :error-messages=\"errorMessageComputed\"\n :clearable=\"clearable\"\n :disabled=\"disabledComputed\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @open=\"onOpen\"\n @close=\"onClose\"\n >\n <template #append-inner />\n </ADatetimePicker>\n </div>\n </VExpandTransition>\n</template>\n"],"mappings":""}
|