@anzusystems/common-admin 2.0.0-rc.11 → 2.0.0-rc.12
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/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
- 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_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_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/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_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_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_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/AUserMetadataForm.js.map +1 -1
- 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/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_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/AUserTabsShell.js.map +1 -1
- package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.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/cached/components/ACachedChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
- package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/components/ACollabCountdown.js.map +1 -1
- package/dist/domains/collab/components/ACollabCountdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
- package/dist/domains/collab/components/ACollabManagement.js.map +1 -1
- package/dist/domains/collab/components/ACollabManagement.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
- 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/dam/assetDetail/components/AColorBox.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
- 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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogLoader.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailDialogSidebar.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsTeleportTarget.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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/AssetFileFailReasonChip.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileRotate.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetFileRotate.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_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_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/components/AssetMetadataImageAttributes.js.map +1 -1
- package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
- 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_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_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/AssetImagePreview.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectFilter.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListTable.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.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/AssetSelectTilesItem.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/assetSelect/components/FilterPodcastRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/author/components/AuthorCreateButton.js.map +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_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.map +1 -1
- 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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
- package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
- 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/components/DamAssetImageRoiSelectLazy.js.map +1 -1
- package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue_vue_type_script_setup_true_lang.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/AImageWidgetMultipleSimple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
- 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_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_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_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_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.js.map +1 -1
- package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
- 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.map +1 -1
- package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.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/UploadQueueDialogSingleSidebarMetadata.js.map +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_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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.js.map +1 -1
- package/dist/domains/dam/user/components/DamAssetLicenceGroupRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamAssetLicenceRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamExtSystemRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserFilterRemoteAutocomplete.js.map +1 -1
- package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.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/components/FilterBookmarks.js.map +1 -1
- package/dist/domains/filters/bookmarks/components/FilterBookmarks.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterAdvancedButton.js.map +1 -1
- package/dist/domains/filters/components/AFilterBooleanSelect.js.map +1 -1
- package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
- package/dist/domains/filters/components/AFilterEmpty.js.map +1 -1
- package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
- package/dist/domains/filters/components/AFilterResetButton.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.js.map +1 -1
- package/dist/domains/filters/components/AFilterString.vue.d.ts +3 -0
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterSubmitButton.js.map +1 -1
- package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
- 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/AFilterWrapper.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/filters/components/AFilterWrapperSidebar.js.map +1 -1
- package/dist/domains/filters/components/FilterDetailItem.js.map +1 -1
- package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableConfigButton.js.map +1 -1
- package/dist/domains/filters/datatable/components/ADatatableOrdering.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.map +1 -1
- package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
- 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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormRemoteCheckbox.js.map +1 -1
- package/dist/domains/form/components/AFormRemoteCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormRemoteSwitch.js.map +1 -1
- package/dist/domains/form/components/AFormRemoteSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.js.map +1 -1
- package/dist/domains/form/components/AFormSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.js.map +1 -1
- package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.js.map +1 -1
- package/dist/domains/form/components/AFormTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.js.map +1 -1
- package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/form/components/ASystemEntityScope.js.map +1 -1
- package/dist/domains/job/components/AJobBaseCreateForm.js.map +1 -1
- package/dist/domains/job/components/AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/job/components/AJobDetailCommon.js.map +1 -1
- package/dist/domains/job/components/AJobPriorityChip.js.map +1 -1
- package/dist/domains/job/components/AJobStatusChip.js.map +1 -1
- 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_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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeChangeParentDialog.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeChangeParentDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeDeleteDialog.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeDeleteDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeDragHandle.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeEmptyState.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeNestedRow.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeNestedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeStatus.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeStatus.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeUnsavedLabel.js.map +1 -1
- package/dist/domains/listEditor/components/internal/LeUnsavedLabel.vue_vue_type_script_setup_true_lang.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/ALogDetail.js.map +1 -1
- package/dist/domains/log/components/ALogDetailView.js.map +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/ALogLevelChip.js.map +1 -1
- package/dist/domains/log/components/ALogLevelChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/log/components/ALogListView.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/components/APermissionGrantEditor.js.map +1 -1
- package/dist/domains/permission/components/APermissionValueChip.js.map +1 -1
- package/dist/domains/permission/components/APermissionValueChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
- 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/APermissionGroupFilter.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/permission/group/components/APermissionGroupRemoteAutocomplete.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/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.js.map +1 -1
- package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.js.map +1 -1
- package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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/system/appShell/components/AActionbar.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/appShell/components/AActionbarTarget.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutLoader.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
- package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/components/AAdminSwitcher.js.map +1 -1
- package/dist/domains/system/components/AAdminSwitcher.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/components/AAlerts.js.map +1 -1
- package/dist/domains/system/components/ALanguageSelect.js.map +1 -1
- package/dist/domains/system/components/AThemeSelect.js.map +1 -1
- package/dist/domains/system/components/AThemeSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/system/flags/components/FlagCountry.js.map +1 -1
- package/dist/domains/system/flags/components/FlagEn.js.map +1 -1
- package/dist/domains/system/flags/components/FlagSk.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/components/ASystemBarNewVersion.js.map +1 -1
- package/dist/domains/system/systemBar/components/ASystemBarNewVersion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCreateButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionCreateButton.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/action/components/AActionEditButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionSaveButton.js.map +1 -1
- package/dist/domains/ui/buttons/action/components/AActionSaveButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.js.map +1 -1
- package/dist/domains/ui/buttons/components/ABtnSplit.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableDetailButton.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableDetailButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableEditButton.js.map +1 -1
- package/dist/domains/ui/buttons/table/components/ATableEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/AAnzuUserAvatar.js.map +1 -1
- package/dist/domains/ui/components/AAnzuUserAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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/ABooleanSelect.js.map +1 -1
- package/dist/domains/ui/components/ABooleanValue.js.map +1 -1
- package/dist/domains/ui/components/ACard.js.map +1 -1
- package/dist/domains/ui/components/ACardLoader.js.map +1 -1
- package/dist/domains/ui/components/AChipNoLink.js.map +1 -1
- package/dist/domains/ui/components/ACopyText.js.map +1 -1
- package/dist/domains/ui/components/ACopyText.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
- package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ACurrentUserDropdown.js.map +1 -1
- package/dist/domains/ui/components/ACurrentUserDropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/components/ADialogToolbar.js.map +1 -1
- package/dist/domains/ui/components/AIconGroup.js.map +1 -1
- package/dist/domains/ui/components/AProgress.js.map +1 -1
- package/dist/domains/ui/components/ARow.js.map +1 -1
- package/dist/domains/ui/components/ARow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetime.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
- package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/datetime/components/TimePicker.js.map +1 -1
- package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
- package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
- 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_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.js.map +1 -1
- package/dist/domains/ui/view/components/AGenericView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
- 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/ANotFoundView.js.map +1 -1
- package/dist/domains/ui/view/components/AUnauthorizedView.js.map +1 -1
- package/dist/domains/ui/view/components/AUnauthorizedView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/domains/unsavedGuard/components/AUnsavedConfirmDialog.js.map +1 -1
- package/dist/locales/cs/common/alert.js.map +1 -1
- package/dist/locales/cs/common/anzuUser.js.map +1 -1
- package/dist/locales/cs/common/assetSelect.js.map +1 -1
- package/dist/locales/cs/common/button.js.map +1 -1
- package/dist/locales/cs/common/collab.js.map +1 -1
- package/dist/locales/cs/common/confirmDialog.js.map +1 -1
- package/dist/locales/cs/common/customForm.js.map +1 -1
- package/dist/locales/cs/common/customFormElement.js.map +1 -1
- package/dist/locales/cs/common/damImage.js.map +1 -1
- package/dist/locales/cs/common/dayOfWeek.js.map +1 -1
- package/dist/locales/cs/common/filter.js.map +1 -1
- package/dist/locales/cs/common/job.js.map +1 -1
- package/dist/locales/cs/common/linkDto.js.map +1 -1
- package/dist/locales/cs/common/listItemDto.js.map +1 -1
- package/dist/locales/cs/common/log.js.map +1 -1
- package/dist/locales/cs/common/model.js.map +1 -1
- package/dist/locales/cs/common/permission.js.map +1 -1
- package/dist/locales/cs/common/permissionEditor.js.map +1 -1
- package/dist/locales/cs/common/permissionGroup.js.map +1 -1
- package/dist/locales/cs/common/routeSettings.js.map +1 -1
- package/dist/locales/cs/common/sortable.js.map +1 -1
- package/dist/locales/cs/common/subjectSelect.js.map +1 -1
- package/dist/locales/cs/common/system.js.map +1 -1
- package/dist/locales/cs/common/time.js.map +1 -1
- package/dist/locales/cs/common/userSystem.js.map +1 -1
- package/dist/locales/cs/error/apiDependencyExists.js.map +1 -1
- package/dist/locales/cs/error/apiForbiddenOperation.js.map +1 -1
- package/dist/locales/cs/error/apiTimedOut.js.map +1 -1
- package/dist/locales/cs/error/apiValidation.js.map +1 -1
- package/dist/locales/cs/error/jsValidation.js.map +1 -1
- package/dist/locales/cs/vuetify.js.map +1 -1
- package/dist/locales/en/common/alert.js.map +1 -1
- package/dist/locales/en/common/anzuUser.js.map +1 -1
- package/dist/locales/en/common/assetSelect.js.map +1 -1
- package/dist/locales/en/common/button.js.map +1 -1
- package/dist/locales/en/common/collab.js.map +1 -1
- package/dist/locales/en/common/confirmDialog.js.map +1 -1
- package/dist/locales/en/common/customForm.js.map +1 -1
- package/dist/locales/en/common/customFormElement.js.map +1 -1
- package/dist/locales/en/common/damImage.js.map +1 -1
- package/dist/locales/en/common/dayOfWeek.js.map +1 -1
- package/dist/locales/en/common/filter.js.map +1 -1
- package/dist/locales/en/common/job.js.map +1 -1
- package/dist/locales/en/common/linkDto.js.map +1 -1
- package/dist/locales/en/common/listItemDto.js.map +1 -1
- package/dist/locales/en/common/log.js.map +1 -1
- package/dist/locales/en/common/model.js.map +1 -1
- package/dist/locales/en/common/permission.js.map +1 -1
- package/dist/locales/en/common/permissionEditor.js.map +1 -1
- package/dist/locales/en/common/permissionGroup.js.map +1 -1
- package/dist/locales/en/common/routeSettings.js.map +1 -1
- package/dist/locales/en/common/sortable.js.map +1 -1
- package/dist/locales/en/common/subjectSelect.js.map +1 -1
- package/dist/locales/en/common/system.js.map +1 -1
- package/dist/locales/en/common/time.js.map +1 -1
- package/dist/locales/en/common/userSystem.js.map +1 -1
- package/dist/locales/en/error/apiDependencyExists.js.map +1 -1
- package/dist/locales/en/error/apiForbiddenOperation.js.map +1 -1
- package/dist/locales/en/error/apiTimedOut.js.map +1 -1
- package/dist/locales/en/error/apiValidation.js.map +1 -1
- package/dist/locales/en/error/jsValidation.js.map +1 -1
- package/dist/locales/en/vuetify.js.map +1 -1
- package/dist/locales/sk/common/alert.js.map +1 -1
- package/dist/locales/sk/common/anzuUser.js.map +1 -1
- package/dist/locales/sk/common/assetSelect.js.map +1 -1
- package/dist/locales/sk/common/button.js.map +1 -1
- package/dist/locales/sk/common/collab.js.map +1 -1
- package/dist/locales/sk/common/confirmDialog.js.map +1 -1
- package/dist/locales/sk/common/customForm.js.map +1 -1
- package/dist/locales/sk/common/customFormElement.js.map +1 -1
- package/dist/locales/sk/common/damImage.js.map +1 -1
- package/dist/locales/sk/common/dayOfWeek.js.map +1 -1
- package/dist/locales/sk/common/filter.js.map +1 -1
- package/dist/locales/sk/common/job.js.map +1 -1
- package/dist/locales/sk/common/linkDto.js.map +1 -1
- package/dist/locales/sk/common/listItemDto.js.map +1 -1
- package/dist/locales/sk/common/log.js.map +1 -1
- package/dist/locales/sk/common/model.js.map +1 -1
- package/dist/locales/sk/common/permission.js.map +1 -1
- package/dist/locales/sk/common/permissionEditor.js.map +1 -1
- package/dist/locales/sk/common/permissionGroup.js.map +1 -1
- package/dist/locales/sk/common/routeSettings.js.map +1 -1
- package/dist/locales/sk/common/sortable.js.map +1 -1
- package/dist/locales/sk/common/subjectSelect.js.map +1 -1
- package/dist/locales/sk/common/system.js.map +1 -1
- package/dist/locales/sk/common/time.js.map +1 -1
- package/dist/locales/sk/common/userSystem.js.map +1 -1
- package/dist/locales/sk/error/apiDependencyExists.js.map +1 -1
- package/dist/locales/sk/error/apiForbiddenOperation.js.map +1 -1
- package/dist/locales/sk/error/apiTimedOut.js.map +1 -1
- package/dist/locales/sk/error/apiValidation.js.map +1 -1
- package/dist/locales/sk/error/jsValidation.js.map +1 -1
- package/dist/locales/sk/vuetify.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadQueueItemEditable.js","names":["_sfc_main","UploadQueueItemEditable_vue_vue_type_script_setup_true_lang_default","UploadQueueItemEditable_default"],"sources":["../../../../../src/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onUnmounted, ref, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetCustomData, DamAssetStatusDefault } from '@/domains/dam/types/Asset'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport type { ValidationScope } from '@/shared/types/Validation'\nimport ATableCopyIdButton from '@/domains/ui/buttons/table/components/ATableCopyIdButton.vue'\nimport { prettyBytes } from '@/shared/utils/file'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetImage from '@/domains/dam/assetDetail/components/AssetImage.vue'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { isNull } from '@/shared/utils/common'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport AActionDeleteButton from '@/domains/ui/buttons/action/components/AActionDeleteButton.vue'\nimport { SHOW_REFRESH_AFTER_SECONDS } from '@/domains/dam/uploadQueue/composables/uploadQueueItemRefresh'\nimport UploadQueueItemErrorOverlay from '@/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.vue'\nimport type { DamFieldsDisabledAs } from '@/domains/dam/uploadQueue/components/uploadQueueBindings'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n queueKey: UploadQueueKey\n extSystem: IntegerId\n customData: AssetCustomData\n keywords: DocId[]\n authors: DocId[]\n item: UploadQueueItem\n refreshDisabled: boolean\n mainFileSingleUse: boolean | null\n mainFileSingleUseEnabled?: boolean\n disableDoneAnimation?: boolean\n /**\n * A failed row that a refresh may still change: its finish request went out and the\n * server gave no final answer, or the original of its duplicate could not be read.\n * The queue knows these rows. A row shown outside a queue has no such state.\n */\n refreshMayHelp?: boolean\n /** Statuses in which \"cancel\" is offered. */\n cancelStatuses?: readonly UploadQueueItemStatusType[]\n /** Shows the line \"The main file is a duplicate.\" under the title. */\n duplicateNotice?: boolean\n /** Keeps the form disabled on a duplicate regardless of its metadata. */\n disableFormOnDuplicate?: boolean\n /** The scope the fields of an editable row report to. A non-editable row reports to none. */\n validationScope?: ValidationScope\n /** How keywords and authors look while the row is not editable. Passed to both inputs as `disabledAs`. */\n disabledFieldsAs?: DamFieldsDisabledAs\n /** A duplicate gets no edit button: neither the `edit` slot nor its default is rendered. */\n hideEditOnDuplicate?: boolean\n /** Whether the row offers refresh, decided by the host. Without it the row decides itself. */\n refreshOffered?: boolean | undefined\n /** The DAM configuration whose rules and forms the row follows. Inherited when not given. */\n configName?: string\n }>(),\n {\n mainFileSingleUseEnabled: true,\n disableDoneAnimation: false,\n refreshMayHelp: false,\n cancelStatuses: () => [\n UploadQueueItemStatus.Loading,\n UploadQueueItemStatus.Waiting,\n UploadQueueItemStatus.Uploading,\n ],\n duplicateNotice: true,\n disableFormOnDuplicate: false,\n validationScope: ADamAssetMetadataValidationScopeSymbol,\n disabledFieldsAs: 'chips',\n hideEditOnDuplicate: false,\n // Declared explicitly, otherwise Vue casts an absent boolean to `false` and the row never offers refresh by itself.\n refreshOffered: undefined,\n configName: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:customData', data: AssetCustomData): void\n (e: 'update:keywords', data: DocId[]): void\n (e: 'update:authors', data: DocId[]): void\n (e: 'update:mainFileSingleUse', data: boolean | null): void\n (e: 'cancelItem', data: { index: number; item: UploadQueueItem; queueKey: UploadQueueKey }): void\n (e: 'removeItem', index: number): void\n (e: 'showDetail', data: DocId): void\n (e: 'refreshItem', data: { index: number; assetId: DocId }): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\ndefineSlots<{\n /** Rendered over the picture, under the error overlay. */\n 'image-overlay'?(props: { item: UploadQueueItem }): unknown\n /** Left of the action line. Default: \"Edit in Media Library\", disabled without metadata, emits `showDetail`. */\n edit?(props: { item: UploadQueueItem }): unknown\n /** Last in the action line. Default: \"Remove from queue\" while offered, emits `removeItem`. */\n remove?(props: { item: UploadQueueItem; index: number; offered: boolean }): unknown\n}>()\n\nconst IMAGE_ASPECT_RATIO = 16 / 9\n\nconst customData = computed({\n get() {\n return props.customData\n },\n set(newValue) {\n emit('update:customData', { ...props.customData, ...newValue })\n },\n})\n\nconst keywords = computed({\n get() {\n return props.keywords\n },\n set(newValue) {\n emit('update:keywords', [...newValue])\n },\n})\n\nconst authors = computed({\n get() {\n return props.authors\n },\n set(newValue) {\n emit('update:authors', [...newValue])\n },\n})\n\nconst mainFileSingleUse = computed({\n get() {\n return props.mainFileSingleUse\n },\n set(newValue) {\n emit('update:mainFileSingleUse', newValue)\n },\n})\n\nconst { t } = useI18n()\n\n// The save skips an item whose metadata cannot be edited, so its row is not validated: the user could not fix it.\n// A field reads its scope only once at setup, hence the key on the form.\nconst metadataValidationScope = computed(() => {\n return props.item.canEditMetadata ? props.validationScope : false\n})\n\nconst processingStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Processing,\n UploadQueueItemStatus.Loading,\n]\nconst processing = computed(() => {\n return processingStatuses.includes(props.item.status)\n})\nconst waiting = computed(() => {\n return props.item.status === UploadQueueItemStatus.Waiting\n})\nconst done = computed(() => {\n return !props.disableDoneAnimation && props.item.status === UploadQueueItemStatus.Uploaded\n})\nconst uploading = computed(() => {\n return props.item.status === UploadQueueItemStatus.Uploading\n})\nconst uploadProgress = computed(() => {\n return props.item.progress.progressPercent\n})\n\nconst imageSrc = computed(() => {\n return props.item.imagePreview ? props.item.imagePreview.url : undefined\n})\nconst assetType = computed(() => {\n return props.item.assetType\n})\nconst status = computed(() => {\n if (!props.item) return DamAssetStatusDefault\n return props.item.assetStatus\n})\n\nconst cancelItem = () => {\n emit('cancelItem', { index: props.index, item: props.item, queueKey: props.queueKey })\n}\n\nconst showCancel = computed(() => {\n return props.cancelStatuses.includes(props.item.status)\n})\n\n// For a row that has not failed: refresh is offered after it has waited for its file or its metadata.\nconst refreshDue = ref(false)\nconst refreshTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n// A failed row offers refresh only while a refresh can still change it.\n// A row whose chunk the server never took, or whose file the server failed, has nothing a refresh could find.\nconst offeredByRow = computed(() => {\n if (props.item.status === UploadQueueItemStatus.Failed) return props.refreshMayHelp && !isNull(props.item.assetId)\n return refreshDue.value\n})\nconst showRefresh = computed(() => {\n return props.refreshOffered ?? offeredByRow.value\n})\n// Remove comes with refresh, and a failed row gets it at once: nothing else takes such a row out of the queue.\nconst showRemove = computed(() => {\n return showRefresh.value || props.item.status === UploadQueueItemStatus.Failed\n})\n\nconst showDetail = async () => {\n if (isNull(props.item.assetId)) return\n emit('showDetail', props.item.assetId)\n}\n\nconst refresh = () => {\n if (props.item.assetId) {\n emit('refreshItem', { index: props.index, assetId: props.item.assetId })\n }\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nwatch(\n () => props.item.status,\n async (newValue) => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = setTimeout(() => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n refreshDue.value = true\n }\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Uploaded) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n // An uploaded row whose metadata has not arrived by then has a\n // disabled form and the save skips it. Refresh loads the metadata.\n refreshTimer.value = setTimeout(() => {\n if (props.item.status !== UploadQueueItemStatus.Uploaded || props.item.canEditMetadata) return\n refreshDue.value = true\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Failed) {\n // The wait is over. For a failed row, the offer follows `refreshMayHelp` immediately.\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.item.canEditMetadata,\n (canEdit) => {\n // The metadata arrived after all, by notification or by refresh.\n if (canEdit && props.item.status === UploadQueueItemStatus.Uploaded) refreshDue.value = false\n }\n)\n\nonUnmounted(() => {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n})\n</script>\n\n<template>\n <VCol\n xxl=\"2\"\n xl=\"3\"\n md=\"4\"\n sm=\"6\"\n cols=\"12\"\n >\n <div class=\"dam-upload-queue__item\">\n <div class=\"dam-upload-queue__item-card\">\n <div class=\"position-relative\">\n <AssetImage\n :asset-type=\"assetType\"\n :asset-status=\"status\"\n :src=\"imageSrc\"\n background-color=\"#ccc\"\n :show-uploading=\"uploading\"\n :show-processing=\"processing\"\n :show-waiting=\"waiting\"\n :show-done=\"done\"\n :uploading-progress=\"uploadProgress\"\n :remaining-time=\"item.progress.remainingTime\"\n use-component\n cover\n :aspect-ratio=\"IMAGE_ASPECT_RATIO\"\n />\n <slot\n name=\"image-overlay\"\n :item=\"item\"\n />\n <UploadQueueItemErrorOverlay\n v-if=\"item.error.hasError\"\n :error=\"item.error\"\n />\n </div>\n <VRow\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <div class=\"w-100 d-flex justify-space-between align-center\">\n <div>\n <template v-if=\"!(hideEditOnDuplicate && item.isDuplicate)\">\n <slot\n name=\"edit\"\n :item=\"item\"\n >\n <VBtn\n size=\"small\"\n variant=\"text\"\n :disabled=\"!item.canEditMetadata\"\n @click.stop=\"showDetail\"\n >\n {{ t('common.damImage.image.button.editAsset') }}\n </VBtn>\n </slot>\n </template>\n </div>\n <div>\n <ATableCopyIdButton\n v-if=\"item.assetId\"\n :id=\"item.assetId\"\n button-t=\"common.damImage.queueItem.copyAssetId\"\n size=\"small\"\n />\n <VBtn\n v-if=\"showRefresh\"\n :aria-label=\"t('common.button.refresh')\"\n icon\n size=\"small\"\n variant=\"text\"\n :disabled=\"refreshDisabled\"\n @click.stop=\"refresh\"\n >\n <VIcon icon=\"mdi-refresh\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.refresh') }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-if=\"showCancel\"\n :aria-label=\"t('common.button.cancel')\"\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"cancelItem\"\n >\n <VIcon icon=\"mdi-close-circle-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.cancel') }}\n </VTooltip>\n </VBtn>\n <slot\n name=\"remove\"\n :item=\"item\"\n :index=\"index\"\n :offered=\"showRemove\"\n >\n <AActionDeleteButton\n v-if=\"showRemove\"\n variant=\"icon\"\n button-class=\"\"\n dialog-message-t=\"common.damImage.queueItem.removeFromQueue\"\n @delete-record=\"emit('removeItem', index)\"\n />\n </slot>\n </div>\n </div>\n </VCol>\n </VRow>\n <VRow\n v-if=\"item.displayTitle\"\n density=\"compact\"\n class=\"my-2 mb-3 mt-0 text-body-small\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.queueItem.displayTitle') }}: {{ item.displayTitle }}\n <span v-if=\"item.file?.size\"> ({{ prettyBytes(item.file.size) }})</span>\n </VCol>\n </VRow>\n <VRow\n v-if=\"duplicateNotice && item.isDuplicate\"\n class=\"text-body-small text-warning\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </VCol>\n </VRow>\n <VForm :disabled=\"!item.canEditMetadata || (disableFormOnDuplicate && item.isDuplicate)\">\n <AssetCustomMetadataForm\n v-if=\"item\"\n :key=\"item.canEditMetadata ? 'validated' : 'skipped'\"\n v-model=\"customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n :validation-scope=\"metadataValidationScope\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"keywords\"\n :queue-id=\"queueKey\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n clearable\n multiple\n :required=\"keywordRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"authors\"\n :queue-id=\"queueKey\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"item.authorConflicts\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :required=\"authorRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VForm>\n </div>\n </div>\n </VCol>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"UploadQueueItemEditable.js","names":["UploadQueueItemEditable_vue_vue_type_script_setup_true_lang_default","UploadQueueItemEditable_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VCol","_withCtx","_createElementVNode","_createVNode","AssetImage","_renderSlot","UploadQueueItemErrorOverlay","_createCommentVNode","_component_VRow","_component_VBtn","_withModifiers","_createTextVNode","_toDisplayString","_unref","ATableCopyIdButton","_component_VIcon","_component_VTooltip","AActionDeleteButton","_createElementBlock","_component_VForm","AssetCustomMetadataForm","ASystemEntityScope","KeywordRemoteAutocompleteWithCached","AuthorRemoteAutocompleteWithCached","_component_VSwitch","ATableCopyIdButton_default","ASystemEntityScope_default","AssetCustomMetadataForm_default","AssetImage_default","AuthorRemoteAutocompleteWithCached_default","KeywordRemoteAutocompleteWithCached_default","AActionDeleteButton_default","UploadQueueItemErrorOverlay_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","IMAGE_ASPECT_RATIO","UploadQueueItemEditable_vue_vue_type_script_setup_true_lang_default","UploadQueueItemStatus","ADamAssetMetadataValidationScopeSymbol","__emit","props","__props","emit","damConfigName","useDamConfigName","customData","computed","newValue","keywords","authors","mainFileSingleUse","useI18n","metadataValidationScope","processingStatuses","processing","waiting","done","uploading","uploadProgress","imageSrc","assetType","status","DamAssetStatusDefault","cancelItem","showCancel","refreshDue","ref","refreshTimer","offeredByRow","isNull","showRefresh","showRemove","showDetail","refresh","useDamKeywordAssetTypeConfig","useDamAuthorAssetTypeConfig","watch","canEdit","onUnmounted","openBlock","createBlock","VCol","withCtx","createElementVNode","createVNode","renderSlot","_ctx","createCommentVNode","VRow","VBtn","withModifiers","createTextVNode","toDisplayString","unref","t","VIcon","VTooltip","_cache","createElementBlock","prettyBytes","VForm","$event","keywordEnabled","keywordRequired","authorEnabled","authorRequired","VSwitch"],"sources":["../../../../../src/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onUnmounted, ref, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetCustomData, DamAssetStatusDefault } from '@/domains/dam/types/Asset'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport type { ValidationScope } from '@/shared/types/Validation'\nimport ATableCopyIdButton from '@/domains/ui/buttons/table/components/ATableCopyIdButton.vue'\nimport { prettyBytes } from '@/shared/utils/file'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetImage from '@/domains/dam/assetDetail/components/AssetImage.vue'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { isNull } from '@/shared/utils/common'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport AActionDeleteButton from '@/domains/ui/buttons/action/components/AActionDeleteButton.vue'\nimport { SHOW_REFRESH_AFTER_SECONDS } from '@/domains/dam/uploadQueue/composables/uploadQueueItemRefresh'\nimport UploadQueueItemErrorOverlay from '@/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.vue'\nimport type { DamFieldsDisabledAs } from '@/domains/dam/uploadQueue/components/uploadQueueBindings'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n queueKey: UploadQueueKey\n extSystem: IntegerId\n customData: AssetCustomData\n keywords: DocId[]\n authors: DocId[]\n item: UploadQueueItem\n refreshDisabled: boolean\n mainFileSingleUse: boolean | null\n mainFileSingleUseEnabled?: boolean\n disableDoneAnimation?: boolean\n /**\n * A failed row that a refresh may still change: its finish request went out and the\n * server gave no final answer, or the original of its duplicate could not be read.\n * The queue knows these rows. A row shown outside a queue has no such state.\n */\n refreshMayHelp?: boolean\n /** Statuses in which \"cancel\" is offered. */\n cancelStatuses?: readonly UploadQueueItemStatusType[]\n /** Shows the line \"The main file is a duplicate.\" under the title. */\n duplicateNotice?: boolean\n /** Keeps the form disabled on a duplicate regardless of its metadata. */\n disableFormOnDuplicate?: boolean\n /** The scope the fields of an editable row report to. A non-editable row reports to none. */\n validationScope?: ValidationScope\n /** How keywords and authors look while the row is not editable. Passed to both inputs as `disabledAs`. */\n disabledFieldsAs?: DamFieldsDisabledAs\n /** A duplicate gets no edit button: neither the `edit` slot nor its default is rendered. */\n hideEditOnDuplicate?: boolean\n /** Whether the row offers refresh, decided by the host. Without it the row decides itself. */\n refreshOffered?: boolean | undefined\n /** The DAM configuration whose rules and forms the row follows. Inherited when not given. */\n configName?: string\n }>(),\n {\n mainFileSingleUseEnabled: true,\n disableDoneAnimation: false,\n refreshMayHelp: false,\n cancelStatuses: () => [\n UploadQueueItemStatus.Loading,\n UploadQueueItemStatus.Waiting,\n UploadQueueItemStatus.Uploading,\n ],\n duplicateNotice: true,\n disableFormOnDuplicate: false,\n validationScope: ADamAssetMetadataValidationScopeSymbol,\n disabledFieldsAs: 'chips',\n hideEditOnDuplicate: false,\n // Declared explicitly, otherwise Vue casts an absent boolean to `false` and the row never offers refresh by itself.\n refreshOffered: undefined,\n configName: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:customData', data: AssetCustomData): void\n (e: 'update:keywords', data: DocId[]): void\n (e: 'update:authors', data: DocId[]): void\n (e: 'update:mainFileSingleUse', data: boolean | null): void\n (e: 'cancelItem', data: { index: number; item: UploadQueueItem; queueKey: UploadQueueKey }): void\n (e: 'removeItem', index: number): void\n (e: 'showDetail', data: DocId): void\n (e: 'refreshItem', data: { index: number; assetId: DocId }): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\ndefineSlots<{\n /** Rendered over the picture, under the error overlay. */\n 'image-overlay'?(props: { item: UploadQueueItem }): unknown\n /** Left of the action line. Default: \"Edit in Media Library\", disabled without metadata, emits `showDetail`. */\n edit?(props: { item: UploadQueueItem }): unknown\n /** Last in the action line. Default: \"Remove from queue\" while offered, emits `removeItem`. */\n remove?(props: { item: UploadQueueItem; index: number; offered: boolean }): unknown\n}>()\n\nconst IMAGE_ASPECT_RATIO = 16 / 9\n\nconst customData = computed({\n get() {\n return props.customData\n },\n set(newValue) {\n emit('update:customData', { ...props.customData, ...newValue })\n },\n})\n\nconst keywords = computed({\n get() {\n return props.keywords\n },\n set(newValue) {\n emit('update:keywords', [...newValue])\n },\n})\n\nconst authors = computed({\n get() {\n return props.authors\n },\n set(newValue) {\n emit('update:authors', [...newValue])\n },\n})\n\nconst mainFileSingleUse = computed({\n get() {\n return props.mainFileSingleUse\n },\n set(newValue) {\n emit('update:mainFileSingleUse', newValue)\n },\n})\n\nconst { t } = useI18n()\n\n// The save skips an item whose metadata cannot be edited, so its row is not validated: the user could not fix it.\n// A field reads its scope only once at setup, hence the key on the form.\nconst metadataValidationScope = computed(() => {\n return props.item.canEditMetadata ? props.validationScope : false\n})\n\nconst processingStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Processing,\n UploadQueueItemStatus.Loading,\n]\nconst processing = computed(() => {\n return processingStatuses.includes(props.item.status)\n})\nconst waiting = computed(() => {\n return props.item.status === UploadQueueItemStatus.Waiting\n})\nconst done = computed(() => {\n return !props.disableDoneAnimation && props.item.status === UploadQueueItemStatus.Uploaded\n})\nconst uploading = computed(() => {\n return props.item.status === UploadQueueItemStatus.Uploading\n})\nconst uploadProgress = computed(() => {\n return props.item.progress.progressPercent\n})\n\nconst imageSrc = computed(() => {\n return props.item.imagePreview ? props.item.imagePreview.url : undefined\n})\nconst assetType = computed(() => {\n return props.item.assetType\n})\nconst status = computed(() => {\n if (!props.item) return DamAssetStatusDefault\n return props.item.assetStatus\n})\n\nconst cancelItem = () => {\n emit('cancelItem', { index: props.index, item: props.item, queueKey: props.queueKey })\n}\n\nconst showCancel = computed(() => {\n return props.cancelStatuses.includes(props.item.status)\n})\n\n// For a row that has not failed: refresh is offered after it has waited for its file or its metadata.\nconst refreshDue = ref(false)\nconst refreshTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n// A failed row offers refresh only while a refresh can still change it.\n// A row whose chunk the server never took, or whose file the server failed, has nothing a refresh could find.\nconst offeredByRow = computed(() => {\n if (props.item.status === UploadQueueItemStatus.Failed) return props.refreshMayHelp && !isNull(props.item.assetId)\n return refreshDue.value\n})\nconst showRefresh = computed(() => {\n return props.refreshOffered ?? offeredByRow.value\n})\n// Remove comes with refresh, and a failed row gets it at once: nothing else takes such a row out of the queue.\nconst showRemove = computed(() => {\n return showRefresh.value || props.item.status === UploadQueueItemStatus.Failed\n})\n\nconst showDetail = async () => {\n if (isNull(props.item.assetId)) return\n emit('showDetail', props.item.assetId)\n}\n\nconst refresh = () => {\n if (props.item.assetId) {\n emit('refreshItem', { index: props.index, assetId: props.item.assetId })\n }\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nwatch(\n () => props.item.status,\n async (newValue) => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = setTimeout(() => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n refreshDue.value = true\n }\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Uploaded) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n // An uploaded row whose metadata has not arrived by then has a\n // disabled form and the save skips it. Refresh loads the metadata.\n refreshTimer.value = setTimeout(() => {\n if (props.item.status !== UploadQueueItemStatus.Uploaded || props.item.canEditMetadata) return\n refreshDue.value = true\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Failed) {\n // The wait is over. For a failed row, the offer follows `refreshMayHelp` immediately.\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.item.canEditMetadata,\n (canEdit) => {\n // The metadata arrived after all, by notification or by refresh.\n if (canEdit && props.item.status === UploadQueueItemStatus.Uploaded) refreshDue.value = false\n }\n)\n\nonUnmounted(() => {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n})\n</script>\n\n<template>\n <VCol\n xxl=\"2\"\n xl=\"3\"\n md=\"4\"\n sm=\"6\"\n cols=\"12\"\n >\n <div class=\"dam-upload-queue__item\">\n <div class=\"dam-upload-queue__item-card\">\n <div class=\"position-relative\">\n <AssetImage\n :asset-type=\"assetType\"\n :asset-status=\"status\"\n :src=\"imageSrc\"\n background-color=\"#ccc\"\n :show-uploading=\"uploading\"\n :show-processing=\"processing\"\n :show-waiting=\"waiting\"\n :show-done=\"done\"\n :uploading-progress=\"uploadProgress\"\n :remaining-time=\"item.progress.remainingTime\"\n use-component\n cover\n :aspect-ratio=\"IMAGE_ASPECT_RATIO\"\n />\n <slot\n name=\"image-overlay\"\n :item=\"item\"\n />\n <UploadQueueItemErrorOverlay\n v-if=\"item.error.hasError\"\n :error=\"item.error\"\n />\n </div>\n <VRow\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <div class=\"w-100 d-flex justify-space-between align-center\">\n <div>\n <template v-if=\"!(hideEditOnDuplicate && item.isDuplicate)\">\n <slot\n name=\"edit\"\n :item=\"item\"\n >\n <VBtn\n size=\"small\"\n variant=\"text\"\n :disabled=\"!item.canEditMetadata\"\n @click.stop=\"showDetail\"\n >\n {{ t('common.damImage.image.button.editAsset') }}\n </VBtn>\n </slot>\n </template>\n </div>\n <div>\n <ATableCopyIdButton\n v-if=\"item.assetId\"\n :id=\"item.assetId\"\n button-t=\"common.damImage.queueItem.copyAssetId\"\n size=\"small\"\n />\n <VBtn\n v-if=\"showRefresh\"\n :aria-label=\"t('common.button.refresh')\"\n icon\n size=\"small\"\n variant=\"text\"\n :disabled=\"refreshDisabled\"\n @click.stop=\"refresh\"\n >\n <VIcon icon=\"mdi-refresh\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.refresh') }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-if=\"showCancel\"\n :aria-label=\"t('common.button.cancel')\"\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"cancelItem\"\n >\n <VIcon icon=\"mdi-close-circle-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.cancel') }}\n </VTooltip>\n </VBtn>\n <slot\n name=\"remove\"\n :item=\"item\"\n :index=\"index\"\n :offered=\"showRemove\"\n >\n <AActionDeleteButton\n v-if=\"showRemove\"\n variant=\"icon\"\n button-class=\"\"\n dialog-message-t=\"common.damImage.queueItem.removeFromQueue\"\n @delete-record=\"emit('removeItem', index)\"\n />\n </slot>\n </div>\n </div>\n </VCol>\n </VRow>\n <VRow\n v-if=\"item.displayTitle\"\n density=\"compact\"\n class=\"my-2 mb-3 mt-0 text-body-small\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.queueItem.displayTitle') }}: {{ item.displayTitle }}\n <span v-if=\"item.file?.size\"> ({{ prettyBytes(item.file.size) }})</span>\n </VCol>\n </VRow>\n <VRow\n v-if=\"duplicateNotice && item.isDuplicate\"\n class=\"text-body-small text-warning\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </VCol>\n </VRow>\n <VForm :disabled=\"!item.canEditMetadata || (disableFormOnDuplicate && item.isDuplicate)\">\n <AssetCustomMetadataForm\n v-if=\"item\"\n :key=\"item.canEditMetadata ? 'validated' : 'skipped'\"\n v-model=\"customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n :validation-scope=\"metadataValidationScope\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"keywords\"\n :queue-id=\"queueKey\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n clearable\n multiple\n :required=\"keywordRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"authors\"\n :queue-id=\"queueKey\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"item.authorConflicts\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :required=\"authorRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VForm>\n </div>\n </div>\n </VCol>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VCol","_withCtx","_createElementVNode","_createVNode","AssetImage","_renderSlot","UploadQueueItemErrorOverlay","_component_VRow","_component_VBtn","_withModifiers","_createTextVNode","_toDisplayString","_unref","ATableCopyIdButton","_component_VIcon","_component_VTooltip","AActionDeleteButton","_createElementBlock","_component_VForm","AssetCustomMetadataForm","ASystemEntityScope","KeywordRemoteAutocompleteWithCached","AuthorRemoteAutocompleteWithCached","_component_VSwitch","ATableCopyIdButton_default","ASystemEntityScope_default","AssetCustomMetadataForm_default","AssetImage_default","AuthorRemoteAutocompleteWithCached_default","KeywordRemoteAutocompleteWithCached_default","AActionDeleteButton_default","UploadQueueItemErrorOverlay_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","IMAGE_ASPECT_RATIO","UploadQueueItemEditable_vue_vue_type_script_setup_true_lang_default","UploadQueueItemStatus","ADamAssetMetadataValidationScopeSymbol","__emit","props","__props","emit","damConfigName","useDamConfigName","customData","computed","newValue","keywords","authors","mainFileSingleUse","useI18n","metadataValidationScope","processingStatuses","processing","waiting","done","uploading","uploadProgress","imageSrc","assetType","status","DamAssetStatusDefault","cancelItem","showCancel","refreshDue","ref","refreshTimer","offeredByRow","isNull","showRefresh","showRemove","showDetail","refresh","useDamKeywordAssetTypeConfig","useDamAuthorAssetTypeConfig","watch","canEdit","onUnmounted","openBlock","createBlock","VCol","withCtx","createElementVNode","createVNode","renderSlot","_ctx","createCommentVNode","VRow","VBtn","withModifiers","createTextVNode","toDisplayString","unref","t","VIcon","VTooltip","_cache","createElementBlock","prettyBytes","VForm","$event","keywordEnabled","keywordRequired","authorEnabled","authorRequired","VSwitch"],"sources":["../../../../../src/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onUnmounted, ref, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { type AssetCustomData, DamAssetStatusDefault } from '@/domains/dam/types/Asset'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n type UploadQueueItem,\n UploadQueueItemStatus,\n type UploadQueueItemStatusType,\n type UploadQueueKey,\n} from '@/domains/dam/types/UploadQueue'\nimport type { ValidationScope } from '@/shared/types/Validation'\nimport ATableCopyIdButton from '@/domains/ui/buttons/table/components/ATableCopyIdButton.vue'\nimport { prettyBytes } from '@/shared/utils/file'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport AssetCustomMetadataForm from '@/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue'\nimport AssetImage from '@/domains/dam/assetDetail/components/AssetImage.vue'\nimport AuthorRemoteAutocompleteWithCached from '@/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue'\nimport { ADamAssetMetadataValidationScopeSymbol } from '@/domains/dam/composables/uploadValidations'\nimport KeywordRemoteAutocompleteWithCached from '@/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue'\nimport { isNull } from '@/shared/utils/common'\nimport { useDamKeywordAssetTypeConfig } from '@/domains/dam/keyword/composables/damKeywordConfig'\nimport { useDamAuthorAssetTypeConfig } from '@/domains/dam/author/composables/damAuthorConfig'\nimport AActionDeleteButton from '@/domains/ui/buttons/action/components/AActionDeleteButton.vue'\nimport { SHOW_REFRESH_AFTER_SECONDS } from '@/domains/dam/uploadQueue/composables/uploadQueueItemRefresh'\nimport UploadQueueItemErrorOverlay from '@/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.vue'\nimport type { DamFieldsDisabledAs } from '@/domains/dam/uploadQueue/components/uploadQueueBindings'\nimport { useDamConfigName } from '@/domains/dam/composables/damConfigName'\n\nconst props = withDefaults(\n defineProps<{\n index: number\n queueKey: UploadQueueKey\n extSystem: IntegerId\n customData: AssetCustomData\n keywords: DocId[]\n authors: DocId[]\n item: UploadQueueItem\n refreshDisabled: boolean\n mainFileSingleUse: boolean | null\n mainFileSingleUseEnabled?: boolean\n disableDoneAnimation?: boolean\n /**\n * A failed row that a refresh may still change: its finish request went out and the\n * server gave no final answer, or the original of its duplicate could not be read.\n * The queue knows these rows. A row shown outside a queue has no such state.\n */\n refreshMayHelp?: boolean\n /** Statuses in which \"cancel\" is offered. */\n cancelStatuses?: readonly UploadQueueItemStatusType[]\n /** Shows the line \"The main file is a duplicate.\" under the title. */\n duplicateNotice?: boolean\n /** Keeps the form disabled on a duplicate regardless of its metadata. */\n disableFormOnDuplicate?: boolean\n /** The scope the fields of an editable row report to. A non-editable row reports to none. */\n validationScope?: ValidationScope\n /** How keywords and authors look while the row is not editable. Passed to both inputs as `disabledAs`. */\n disabledFieldsAs?: DamFieldsDisabledAs\n /** A duplicate gets no edit button: neither the `edit` slot nor its default is rendered. */\n hideEditOnDuplicate?: boolean\n /** Whether the row offers refresh, decided by the host. Without it the row decides itself. */\n refreshOffered?: boolean | undefined\n /** The DAM configuration whose rules and forms the row follows. Inherited when not given. */\n configName?: string\n }>(),\n {\n mainFileSingleUseEnabled: true,\n disableDoneAnimation: false,\n refreshMayHelp: false,\n cancelStatuses: () => [\n UploadQueueItemStatus.Loading,\n UploadQueueItemStatus.Waiting,\n UploadQueueItemStatus.Uploading,\n ],\n duplicateNotice: true,\n disableFormOnDuplicate: false,\n validationScope: ADamAssetMetadataValidationScopeSymbol,\n disabledFieldsAs: 'chips',\n hideEditOnDuplicate: false,\n // Declared explicitly, otherwise Vue casts an absent boolean to `false` and the row never offers refresh by itself.\n refreshOffered: undefined,\n configName: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:customData', data: AssetCustomData): void\n (e: 'update:keywords', data: DocId[]): void\n (e: 'update:authors', data: DocId[]): void\n (e: 'update:mainFileSingleUse', data: boolean | null): void\n (e: 'cancelItem', data: { index: number; item: UploadQueueItem; queueKey: UploadQueueKey }): void\n (e: 'removeItem', index: number): void\n (e: 'showDetail', data: DocId): void\n (e: 'refreshItem', data: { index: number; assetId: DocId }): void\n}>()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst damConfigName = useDamConfigName(props.configName)\n\ndefineSlots<{\n /** Rendered over the picture, under the error overlay. */\n 'image-overlay'?(props: { item: UploadQueueItem }): unknown\n /** Left of the action line. Default: \"Edit in Media Library\", disabled without metadata, emits `showDetail`. */\n edit?(props: { item: UploadQueueItem }): unknown\n /** Last in the action line. Default: \"Remove from queue\" while offered, emits `removeItem`. */\n remove?(props: { item: UploadQueueItem; index: number; offered: boolean }): unknown\n}>()\n\nconst IMAGE_ASPECT_RATIO = 16 / 9\n\nconst customData = computed({\n get() {\n return props.customData\n },\n set(newValue) {\n emit('update:customData', { ...props.customData, ...newValue })\n },\n})\n\nconst keywords = computed({\n get() {\n return props.keywords\n },\n set(newValue) {\n emit('update:keywords', [...newValue])\n },\n})\n\nconst authors = computed({\n get() {\n return props.authors\n },\n set(newValue) {\n emit('update:authors', [...newValue])\n },\n})\n\nconst mainFileSingleUse = computed({\n get() {\n return props.mainFileSingleUse\n },\n set(newValue) {\n emit('update:mainFileSingleUse', newValue)\n },\n})\n\nconst { t } = useI18n()\n\n// The save skips an item whose metadata cannot be edited, so its row is not validated: the user could not fix it.\n// A field reads its scope only once at setup, hence the key on the form.\nconst metadataValidationScope = computed(() => {\n return props.item.canEditMetadata ? props.validationScope : false\n})\n\nconst processingStatuses: readonly UploadQueueItemStatusType[] = [\n UploadQueueItemStatus.Processing,\n UploadQueueItemStatus.Loading,\n]\nconst processing = computed(() => {\n return processingStatuses.includes(props.item.status)\n})\nconst waiting = computed(() => {\n return props.item.status === UploadQueueItemStatus.Waiting\n})\nconst done = computed(() => {\n return !props.disableDoneAnimation && props.item.status === UploadQueueItemStatus.Uploaded\n})\nconst uploading = computed(() => {\n return props.item.status === UploadQueueItemStatus.Uploading\n})\nconst uploadProgress = computed(() => {\n return props.item.progress.progressPercent\n})\n\nconst imageSrc = computed(() => {\n return props.item.imagePreview ? props.item.imagePreview.url : undefined\n})\nconst assetType = computed(() => {\n return props.item.assetType\n})\nconst status = computed(() => {\n if (!props.item) return DamAssetStatusDefault\n return props.item.assetStatus\n})\n\nconst cancelItem = () => {\n emit('cancelItem', { index: props.index, item: props.item, queueKey: props.queueKey })\n}\n\nconst showCancel = computed(() => {\n return props.cancelStatuses.includes(props.item.status)\n})\n\n// For a row that has not failed: refresh is offered after it has waited for its file or its metadata.\nconst refreshDue = ref(false)\nconst refreshTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n// A failed row offers refresh only while a refresh can still change it.\n// A row whose chunk the server never took, or whose file the server failed, has nothing a refresh could find.\nconst offeredByRow = computed(() => {\n if (props.item.status === UploadQueueItemStatus.Failed) return props.refreshMayHelp && !isNull(props.item.assetId)\n return refreshDue.value\n})\nconst showRefresh = computed(() => {\n return props.refreshOffered ?? offeredByRow.value\n})\n// Remove comes with refresh, and a failed row gets it at once: nothing else takes such a row out of the queue.\nconst showRemove = computed(() => {\n return showRefresh.value || props.item.status === UploadQueueItemStatus.Failed\n})\n\nconst showDetail = async () => {\n if (isNull(props.item.assetId)) return\n emit('showDetail', props.item.assetId)\n}\n\nconst refresh = () => {\n if (props.item.assetId) {\n emit('refreshItem', { index: props.index, assetId: props.item.assetId })\n }\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { keywordRequired, keywordEnabled } = useDamKeywordAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { authorRequired, authorEnabled } = useDamAuthorAssetTypeConfig(\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n assetType.value,\n props.extSystem,\n damConfigName\n)\n\nwatch(\n () => props.item.status,\n async (newValue) => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = setTimeout(() => {\n if (newValue === UploadQueueItemStatus.Uploading || newValue === UploadQueueItemStatus.Processing) {\n refreshDue.value = true\n }\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Uploaded) {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n // An uploaded row whose metadata has not arrived by then has a\n // disabled form and the save skips it. Refresh loads the metadata.\n refreshTimer.value = setTimeout(() => {\n if (props.item.status !== UploadQueueItemStatus.Uploaded || props.item.canEditMetadata) return\n refreshDue.value = true\n }, SHOW_REFRESH_AFTER_SECONDS * 1000)\n } else if (newValue === UploadQueueItemStatus.Failed) {\n // The wait is over. For a failed row, the offer follows `refreshMayHelp` immediately.\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n refreshDue.value = false\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.item.canEditMetadata,\n (canEdit) => {\n // The metadata arrived after all, by notification or by refresh.\n if (canEdit && props.item.status === UploadQueueItemStatus.Uploaded) refreshDue.value = false\n }\n)\n\nonUnmounted(() => {\n clearTimeout(refreshTimer.value)\n refreshTimer.value = undefined\n})\n</script>\n\n<template>\n <VCol\n xxl=\"2\"\n xl=\"3\"\n md=\"4\"\n sm=\"6\"\n cols=\"12\"\n >\n <div class=\"dam-upload-queue__item\">\n <div class=\"dam-upload-queue__item-card\">\n <div class=\"position-relative\">\n <AssetImage\n :asset-type=\"assetType\"\n :asset-status=\"status\"\n :src=\"imageSrc\"\n background-color=\"#ccc\"\n :show-uploading=\"uploading\"\n :show-processing=\"processing\"\n :show-waiting=\"waiting\"\n :show-done=\"done\"\n :uploading-progress=\"uploadProgress\"\n :remaining-time=\"item.progress.remainingTime\"\n use-component\n cover\n :aspect-ratio=\"IMAGE_ASPECT_RATIO\"\n />\n <slot\n name=\"image-overlay\"\n :item=\"item\"\n />\n <UploadQueueItemErrorOverlay\n v-if=\"item.error.hasError\"\n :error=\"item.error\"\n />\n </div>\n <VRow\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <div class=\"w-100 d-flex justify-space-between align-center\">\n <div>\n <template v-if=\"!(hideEditOnDuplicate && item.isDuplicate)\">\n <slot\n name=\"edit\"\n :item=\"item\"\n >\n <VBtn\n size=\"small\"\n variant=\"text\"\n :disabled=\"!item.canEditMetadata\"\n @click.stop=\"showDetail\"\n >\n {{ t('common.damImage.image.button.editAsset') }}\n </VBtn>\n </slot>\n </template>\n </div>\n <div>\n <ATableCopyIdButton\n v-if=\"item.assetId\"\n :id=\"item.assetId\"\n button-t=\"common.damImage.queueItem.copyAssetId\"\n size=\"small\"\n />\n <VBtn\n v-if=\"showRefresh\"\n :aria-label=\"t('common.button.refresh')\"\n icon\n size=\"small\"\n variant=\"text\"\n :disabled=\"refreshDisabled\"\n @click.stop=\"refresh\"\n >\n <VIcon icon=\"mdi-refresh\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.refresh') }}\n </VTooltip>\n </VBtn>\n <VBtn\n v-if=\"showCancel\"\n :aria-label=\"t('common.button.cancel')\"\n icon\n size=\"small\"\n variant=\"text\"\n @click.stop=\"cancelItem\"\n >\n <VIcon icon=\"mdi-close-circle-outline\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.button.cancel') }}\n </VTooltip>\n </VBtn>\n <slot\n name=\"remove\"\n :item=\"item\"\n :index=\"index\"\n :offered=\"showRemove\"\n >\n <AActionDeleteButton\n v-if=\"showRemove\"\n variant=\"icon\"\n button-class=\"\"\n dialog-message-t=\"common.damImage.queueItem.removeFromQueue\"\n @delete-record=\"emit('removeItem', index)\"\n />\n </slot>\n </div>\n </div>\n </VCol>\n </VRow>\n <VRow\n v-if=\"item.displayTitle\"\n density=\"compact\"\n class=\"my-2 mb-3 mt-0 text-body-small\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.queueItem.displayTitle') }}: {{ item.displayTitle }}\n <span v-if=\"item.file?.size\"> ({{ prettyBytes(item.file.size) }})</span>\n </VCol>\n </VRow>\n <VRow\n v-if=\"duplicateNotice && item.isDuplicate\"\n class=\"text-body-small text-warning\"\n >\n <VCol class=\"pt-0\">\n {{ t('common.damImage.asset.detail.info.status.duplicate') }}\n </VCol>\n </VRow>\n <VForm :disabled=\"!item.canEditMetadata || (disableFormOnDuplicate && item.isDuplicate)\">\n <AssetCustomMetadataForm\n v-if=\"item\"\n :key=\"item.canEditMetadata ? 'validated' : 'skipped'\"\n v-model=\"customData\"\n :ext-system=\"extSystem\"\n :asset-type=\"assetType\"\n :validation-scope=\"metadataValidationScope\"\n >\n <template #after-pinned>\n <VRow\n v-if=\"keywordEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"keyword\"\n system=\"dam\"\n >\n <KeywordRemoteAutocompleteWithCached\n v-model=\"keywords\"\n :queue-id=\"queueKey\"\n :ext-system=\"extSystem\"\n :label=\"t('common.damImage.asset.model.keywords')\"\n clearable\n multiple\n :required=\"keywordRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"authorEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <ASystemEntityScope\n subject=\"author\"\n system=\"dam\"\n >\n <AuthorRemoteAutocompleteWithCached\n v-model=\"authors\"\n :queue-id=\"queueKey\"\n :label=\"t('common.damImage.asset.model.authors')\"\n :author-conflicts=\"item.authorConflicts\"\n :ext-system=\"extSystem\"\n clearable\n multiple\n :required=\"authorRequired\"\n :validation-scope=\"metadataValidationScope\"\n :disabled=\"!item.canEditMetadata\"\n :disabled-as=\"disabledFieldsAs\"\n />\n </ASystemEntityScope>\n </VCol>\n </VRow>\n <VRow\n v-if=\"mainFileSingleUseEnabled\"\n density=\"compact\"\n class=\"my-2\"\n >\n <VCol>\n <VSwitch\n v-model=\"mainFileSingleUse\"\n :label=\"t('common.damImage.asset.model.mainFileSingleUse')\"\n />\n </VCol>\n </VRow>\n </template>\n </AssetCustomMetadataForm>\n </VForm>\n </div>\n </div>\n </VCol>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadQueueItemErrorOverlay.js","names":["
|
|
1
|
+
{"version":3,"file":"UploadQueueItemErrorOverlay.js","names":["UploadQueueItemErrorOverlay_vue_vue_type_script_setup_true_lang_default","UploadQueueItemErrorOverlay_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamAssetLicenceGroupRemoteAutocomplete.js","names":["
|
|
1
|
+
{"version":3,"file":"DamAssetLicenceGroupRemoteAutocomplete.js","names":["DamAssetLicenceGroupRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","DamAssetLicenceGroupRemoteAutocomplete_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamAssetLicenceRemoteAutocomplete.js","names":["
|
|
1
|
+
{"version":3,"file":"DamAssetLicenceRemoteAutocomplete.js","names":["DamAssetLicenceRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","DamAssetLicenceRemoteAutocomplete_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamDistributionServiceSelect.js","names":["
|
|
1
|
+
{"version":3,"file":"DamDistributionServiceSelect.js","names":["DamDistributionServiceSelect_vue_vue_type_script_setup_true_lang_default","DamDistributionServiceSelect_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamExtSystemRemoteAutocomplete.js","names":["
|
|
1
|
+
{"version":3,"file":"DamExtSystemRemoteAutocomplete.js","names":["DamExtSystemRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","DamExtSystemRemoteAutocomplete_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamExternalProviderAssetSelect.js","names":["
|
|
1
|
+
{"version":3,"file":"DamExternalProviderAssetSelect.js","names":["DamExternalProviderAssetSelect_vue_vue_type_script_setup_true_lang_default","DamExternalProviderAssetSelect_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamUserFilterRemoteAutocomplete.js","names":["
|
|
1
|
+
{"version":3,"file":"DamUserFilterRemoteAutocomplete.js","names":["DamUserFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","DamUserFilterRemoteAutocomplete_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DamUserRemoteAutocomplete.js","names":["
|
|
1
|
+
{"version":3,"file":"DamUserRemoteAutocomplete.js","names":["DamUserRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","DamUserRemoteAutocomplete_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterBookmarkButton.js","names":["
|
|
1
|
+
{"version":3,"file":"AFilterBookmarkButton.js","names":["AFilterBookmarkButton_vue_vue_type_script_setup_true_lang_default","AFilterBookmarkButton_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","
|
|
1
|
+
{"version":3,"file":"AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createVNode","_component_VBtn","_normalizeClass","_unref","_withModifiers","_withCtx","_component_VIcon","_component_VTooltip","_createTextVNode","_toDisplayString","_createBlock","FilterBookmarkDialog","FilterBookmarkDialog_default","AFilterBookmarkButton_vue_vue_type_script_setup_true_lang_default","\"dialog\"","\"dialogModifiers\"","dialog","useModel","__props","onClick","eventClickBlur","event","useI18n","openBlock","createElementBlock","Fragment","createVNode","VBtn","normalizeClass","unref","t","withModifiers","withCtx","VIcon","VTooltip","createTextVNode","toDisplayString","createBlock","_cache","createCommentVNode"],"sources":["../../../../../src/domains/filters/bookmarks/components/AFilterBookmarkButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { eventClickBlur } from '@/shared/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport FilterBookmarkDialog from '@/domains/filters/bookmarks/components/FilterBookmarkDialog.vue'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/shared/types/common'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\n\nwithDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n subject: string\n user: IntegerId\n tooltipT?: string\n buttonClass?: string\n dataCy?: string\n datatableHiddenColumns?: string[] | undefined\n datatableSortBy?: DatatableSortBy\n }>(),\n {\n tooltipT: 'common.button.bookmarkFilter',\n buttonClass: 'ml-2',\n dataCy: 'filter-bookmark',\n datatableHiddenColumns: undefined,\n datatableSortBy: undefined,\n }\n)\n\nconst dialog = defineModel<boolean>('dialog', { default: false, required: false })\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n dialog.value = true\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :aria-label=\"t(tooltipT)\"\n :data-cy=\"dataCy\"\n class=\"text-medium-emphasis px-2\"\n min-width=\"36px\"\n variant=\"flat\"\n @click.stop=\"onClick\"\n >\n <VIcon\n color=\"grey-darken-1\"\n icon=\"mdi-bookmark-outline\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </VBtn>\n <FilterBookmarkDialog\n v-if=\"dialog\"\n :client=\"client\"\n :system=\"system\"\n :user=\"user\"\n :subject=\"subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n @close=\"dialog = false\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,IAAMkB,IAASlB,EAAoBoB,GAAC,QAA6C,GAE3EC,KAAW,MAAiB;GAEhC,AADAC,EAAeC,CAAK,GACpB,EAAO,QAAQ;EACjB,GAEM,EAAE,SAAMC,EAAQ;E,mCAIpBtB,EAmBOC,GAAA;GAlBJ,OAAKC,EAAA,CAAEgB,EAAA,aAGF,2BAA2B,CAAA;GAFhC,cAAYf,EAAA2B,CAAA,CAAC,CAACZ,EAAA,QAAQ;GACtB,WAASA,EAAA;GAEV,aAAU;GACV,SAAQ;GACP,SAAKd,EAAOe,GAAO,CAAA,MAAA,CAAA;;GAEpB,SAAAd,QAGE,CAHFL,EAGEM,GAAA;IAFA,OAAM;IACN,MAAK;G,IAEPN,EAKWO,GAAA;IAJT,WAAU;IACV,UAAS;;IAET,SAAAF,QAAiB,CAAdG,EAAAC,EAAAN,EAAA2B,CAAA,CAAC,CAACZ,EAAA,QAAQ,CAAA,GAAA,CAAA,C;;;;;;;;E,IAITF,EAAA,SADRjB,EAAA,GAAAW,EAQEC,GAAA;;GANC,QAAQO,EAAA;GACR,QAAQA,EAAA;GACR,MAAMA,EAAA;GACN,SAASA,EAAA;GACT,4BAA0BA,EAAA;GAC1B,SAAK,AAAAoB,EAAA,QAAA,MAAE,EAAA,QAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBookmarkDialog.js","names":["_sfc_main","FilterBookmarkDialog_vue_vue_type_script_setup_true_lang_default","FilterBookmarkDialog_default"],"sources":["../../../../../src/domains/filters/bookmarks/components/FilterBookmarkDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { type Component, inject, ref, shallowRef, useTemplateRef, watch } from 'vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormSwitch from '@/domains/form/components/AFormSwitch.vue'\nimport { loadListEditor } from '@/domains/listEditor/utils/listEditorLoader'\nimport type { ExposedListEditorHandle } from '@/domains/listEditor/composables/useListEditorController'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/shared/types/common'\nimport { MAX_BOOKMARK_ITEMS, useFilterBookmarkStore } from '@/domains/filters/bookmarks/store/bookmarksStore'\nimport { useUserAdminConfigApi } from '@/domains/filters/bookmarks/api/userAdminConfigApi'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useUserAdminConfigFactory } from '@/domains/filters/bookmarks/factory/UserAdminConfigFactory'\nimport {\n type UserAdminConfig,\n UserAdminConfigLayoutType,\n UserAdminConfigType,\n} from '@/domains/filters/bookmarks/types/UserAdminConfig'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey, FilterConfigKey, FilterDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { useFilterHelpers } from '@/domains/filters/composables/filterFactory'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport { hasAnzuApiValidationErrorSpecific, isAnzuApiValidationError } from '@/shared/error/AnzuApiValidationError'\nimport { isAnzuApiAxiosError } from '@/shared/error/AnzuApiAxiosError'\nimport { HTTP_STATUS_NOT_FOUND } from '@/shared/statusCodes'\n\nconst props = withDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n subject: string\n user: IntegerId\n datatableHiddenColumns?: string[] | undefined\n }>(),\n {\n datatableHiddenColumns: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination) || isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\n// The dialog is mounted behind the parent's `v-if`, but the guard needs a model to watch.\n// All closing goes through here. `requestClose` lets the guard ask\n// first. `forceClose` is for paths that already are the confirmation.\nconst isOpen = ref(true)\n\n// The editor takes its clean baseline on creation, so it waits for the first fetch.\n// After that it stays mounted. It alone registers this tab's pending work\n// with the guard, and swapping it out would disarm the guard mid-edit.\nconst manageLoaded = ref(false)\nconst loadFailed = ref(false)\n\n// The editor component loads on the first visit to the manage tab (see\n// `loadListEditor`). Its chunk load can fail independently of the bookmark fetch.\nconst listEditor = shallowRef<Component>()\nconst editorLoadFailed = ref(false)\nlet editorLoading = false\n\nconst loadEditor = async () => {\n if (listEditor.value || editorLoading) return\n editorLoading = true\n editorLoadFailed.value = false\n try {\n listEditor.value = await loadListEditor()\n } catch {\n editorLoadFailed.value = true\n } finally {\n editorLoading = false\n }\n}\n\nconst guard = useUnsavedChangesGuard({\n sources: [],\n guardDialogModel: isOpen,\n guardRoute: false,\n guardWindowUnload: false,\n})\n\nwatch(isOpen, (open) => {\n if (!open) emit('close')\n})\n\nconst requestClose = () => {\n // Not while a write is out. The toolbar X and Escape bypass the write-phase disabling.\n // Closing here would ask whether to discard work already sent to the server, and it would be written anyway.\n if (saveButtonLoading.value) return\n isOpen.value = false\n}\n\nconst forceClose = () => {\n guard.acknowledge()\n isOpen.value = false\n}\n\nconst activeTab = ref<'add' | 'manage'>('add')\nconst customName = ref('')\nconst storeDatatableHiddenColumns = ref(false)\nconst storeDatatableOrder = ref(false)\nconst saveButtonLoading = ref(false)\nconst listLoading = ref(false)\nconst errorCount = ref(false)\nconst itemsManage = ref<Array<UserAdminConfig>>([])\n\ninterface RowUpdate {\n update: (next: UserAdminConfig) => void\n}\n\nconst MAX_BOOKMARK_NAME_LENGTH = 100\n\n// The editor handles opening, saving and cancelling a row. Only the rule\n// remains here. It drives the editor's red rail and blocks its save.\nconst validateBookmarkName = (item: UserAdminConfig): boolean =>\n !!item.customName && item.customName.length <= MAX_BOOKMARK_NAME_LENGTH\n\nconst { required, maxLength } = useValidate()\nconst rulesCreate = {\n customName: {\n required,\n maxLength: maxLength(MAX_BOOKMARK_NAME_LENGTH),\n },\n}\nconst vCreate$ = useVuelidate(rulesCreate, { customName }, { $stopPropagation: true })\nconst filterBookmarkStore = useFilterBookmarkStore()\n\nconst {\n createUserAdminConfig,\n useFetchUserAdminConfigList,\n updateUserAdminConfigPositions,\n deleteUserAdminConfig,\n updateUserAdminConfig,\n} =\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n useUserAdminConfigApi(props.client, props.system)\nconst { t } = useI18n()\nconst { showErrorsDefault, showUnknownError, showValidationError, showWarningT } = useAlerts()\nconst { createDefaultUserAdminConfig } = useUserAdminConfigFactory()\n\nconst editor = useTemplateRef<ExposedListEditorHandle<UserAdminConfig>>('editor')\n\n// One save for the whole tab, like other list editors here. A per-row PUT required reloading\n// the list to re-baseline, which lost the pending reorder and other rows' typed text.\n// A DELETE answered with \"not found\" means the row is already gone. A retry after a\n// lost response looks like this. Otherwise every retry would stop on the same row.\nconst isAlreadyGone = (e: unknown) => isAnzuApiAxiosError(e) && e.cause.response?.status === HTTP_STATUS_NOT_FOUND\n\nconst saveManage = async () => {\n // Not while the list is refreshing: the on-screen order is about to be replaced by the incoming answer.\n // The button is also disabled. This check does not depend on the button.\n if (listLoading.value) return\n if (!editor.value?.validateAll()) return\n saveButtonLoading.value = true\n try {\n const changes = editor.value.getChanges()\n // Deletes first, then renames, then the order. The order comes\n // from `itemsManage`, which the deleted rows have already left.\n for (const item of changes.deleted) {\n try {\n await deleteUserAdminConfig(item.id)\n } catch (e) {\n if (!isAlreadyGone(e)) throw e\n }\n // Removed from the cache right away. The filter bar is reading\n // it, and a later failure in this save would skip the refresh.\n filterBookmarkStore.removeOne(bookmarkCacheKey(), item.id)\n // Dropping the pending deletion makes a retry safe after a later call failed.\n // Resent renames are the same idempotent PUT. A resent DELETE on a\n // gone row would fail and stop the batch at the same place every time.\n editor.value.restoreDeleted(item.id)\n }\n for (const item of changes.updated) {\n await updateUserAdminConfig(item.id, cloneDeep(item))\n }\n // An empty list is not a valid order to send.\n if (itemsManage.value.length > 0) {\n await updateUserAdminConfigPositions(itemsManage.value.map((item) => item.id))\n }\n // Once, at the end. This also refreshes the store the filter\n // bar reads names from, and the editor re-baselines against it.\n applyItems(await fetchItems())\n forceClose()\n } catch (e) {\n showErrorsDefault(e)\n // No refetch and no rollback. Written changes already match the\n // server, and unwritten ones stay for the user to fix and resend.\n // A refetch would discard that unsent work without asking. The store is marked stale instead.\n filterBookmarkStore.markStale(bookmarkCacheKey())\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst { serializeFilters } = useFilterHelpers(filterData, filterConfig)\n\nconst systemResource = props.system + '_' + props.subject\nconst bookmarkCacheKey = () => filterBookmarkStore.generateKey(UserAdminConfigLayoutType.Desktop, systemResource)\n\nconst addBookmark = async () => {\n saveButtonLoading.value = true\n errorCount.value = false\n const config = createDefaultUserAdminConfig(props.system)\n config.user = props.user\n config.configType = UserAdminConfigType.FilterBookmark\n config.layoutType = UserAdminConfigLayoutType.Desktop\n config.systemResource = systemResource\n config.customName = customName.value\n config.data = {\n filter: serializeFilters(filterData, pagination, false),\n datatableHiddenColumns:\n storeDatatableHiddenColumns.value && props.datatableHiddenColumns ? props.datatableHiddenColumns : undefined,\n sortBy: storeDatatableOrder.value && pagination.value.sortBy ? pagination.value.sortBy : undefined,\n }\n try {\n const { count, maxPosition } = await filterBookmarkStore.fetchBookmarkStats(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList\n )\n if (count >= MAX_BOOKMARK_ITEMS) {\n errorCount.value = true\n saveButtonLoading.value = false\n return\n }\n // After the highest used position, not the row count. The manage tab renumbers only the\n // rows it sends, so deletions leave gaps and a row count could reuse a taken position.\n config.position = maxPosition + 1\n const res = await createUserAdminConfig(config)\n filterBookmarkStore.addOne(bookmarkCacheKey(), res)\n // Cleared because `requestClose` may not close. If the guard asks and the user stays, a\n // second click would create the bookmark again. Empty, the `required` rule blocks that.\n customName.value = ''\n vCreate$.value.$reset()\n // The write is done, and `requestClose` refuses while one is out. The `finally` sets it again.\n saveButtonLoading.value = false\n // `requestClose`, not `forceClose`: adding a bookmark says nothing\n // about a reorder pending on the other tab, so the guard still asks.\n requestClose()\n } catch (e) {\n if (\n isAnzuApiValidationError(e) &&\n hasAnzuApiValidationErrorSpecific(e, 'error_field_not_unique', 'cms.userAdminConfig.model.systemResource')\n ) {\n showWarningT('common.filter.bookmark.nameUniqueError')\n return\n }\n showErrorsDefault(e)\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst onConfirm = () => {\n if (activeTab.value === 'add') {\n vCreate$.value.$touch()\n if (vCreate$.value.$invalid) {\n showValidationError()\n return\n }\n addBookmark()\n } else if (activeTab.value === 'manage') {\n // Not gated on a non-empty list. Deleting every row empties it while\n // the deletions are still pending, and only this button sends them.\n saveManage()\n }\n}\n\n// Tab switches can start fetches faster than they return. Only the\n// newest may apply, or an older answer could restore an outdated list.\nlet fetchGeneration = 0\nlet fetchesInFlight = 0\n\nconst fetchItems = async (): Promise<UserAdminConfig[] | null> => {\n const generation = ++fetchGeneration\n // A counter, not a flag. An older fetch finishing must not mark the tab\n // settled while a newer one is out, or the editor accepts edits in between.\n fetchesInFlight++\n listLoading.value = true\n loadFailed.value = false\n try {\n const items = await filterBookmarkStore.getBookmarks(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList,\n true\n )\n if (generation !== fetchGeneration) return null\n // `null` means this request failed. The store's `error` flag is\n // shared with other fetches, including this dialog's bookmark count.\n if (items === null) {\n loadFailed.value = true\n showUnknownError()\n return null\n }\n return items\n } catch (e) {\n // An overtaken answer must not set the error state or raise an alert.\n if (generation !== fetchGeneration) return null\n loadFailed.value = true\n showErrorsDefault(e)\n return null\n } finally {\n fetchesInFlight--\n listLoading.value = fetchesInFlight > 0\n }\n}\n\n// Rows are handed to the editor directly, not via `v-model`, which lags a render.\n// A commit before the rows arrived would pin the baseline to the old list,\n// and every fetched difference would look like an unsaved user edit.\n// On first load the editor mounts later and takes its baseline from `itemsManage`.\nconst applyItems = (items: UserAdminConfig[] | null) => {\n if (!items) return\n itemsManage.value = items\n manageLoaded.value = true\n editor.value?.commit(items)\n}\n\nwatch(activeTab, async () => {\n errorCount.value = false\n if (activeTab.value !== 'manage') return\n void loadEditor()\n // Entering the tab refreshes it, for example after adding a bookmark on the other\n // tab. Never over unsaved work: the fetched order would replace the dragged one.\n if (editor.value?.hasUnsaved) return\n const items = await fetchItems()\n // Checked again after the fetch: the user may have started dragging while it ran.\n if (editor.value?.hasUnsaved) return\n applyItems(items)\n})\n</script>\n\n<template>\n <!--\n `persistent` while a write is out: Escape and outside clicks\n change the model directly, bypassing the write-phase disabling.\n -->\n <VDialog\n v-model=\"isOpen\"\n :persistent=\"saveButtonLoading\"\n :width=\"500\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"requestClose\">\n {{ t('common.filter.bookmark.title') }}\n </ADialogToolbar>\n <VCardText class=\"pt-0\">\n <VTabs\n v-model=\"activeTab\"\n fixed-tabs\n >\n <VTab\n value=\"add\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.add') }}\n </VTab>\n <VTab\n value=\"manage\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.manage') }}\n </VTab>\n </VTabs>\n <div\n v-if=\"activeTab === 'add'\"\n class=\"w-100 pt-4\"\n >\n <ARow :title=\"t('common.filter.bookmark.infoSave')\" />\n <ARow\n v-if=\"errorCount\"\n class=\"text-error\"\n :title=\"t('common.filter.bookmark.errorMax')\"\n />\n <ARow>\n <AFormTextField\n v-model=\"customName\"\n :label=\"t('common.filter.bookmark.name')\"\n required\n :disabled=\"saveButtonLoading\"\n :v=\"vCreate$.customName\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableHiddenColumns\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableColumns')\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableOrder\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableOrder')\"\n />\n </ARow>\n </div>\n <!--\n `v-show`, not `v-if`: the guard sees pending work only through the section the editor registers.\n Unmounting on a tab switch would let the dialog close on a dragged order without asking.\n The spinner is the editor's own `loading` for the same reason.\n -->\n <div\n v-show=\"activeTab === 'manage'\"\n class=\"w-100 pt-4\"\n >\n <div\n v-if=\"!manageLoaded && !loadFailed\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Nothing loaded yet: the editor's empty state would wrongly\n claim there are no bookmarks after a failed fetch.\n -->\n <ARow\n v-else-if=\"!manageLoaded\"\n class=\"text-error\"\n :title=\"t('common.alert.unknownError')\"\n />\n <div\n v-else-if=\"editorLoadFailed\"\n class=\"d-flex w-100 align-center justify-space-between\"\n >\n <span class=\"text-error\">{{ t('common.alert.unknownError') }}</span>\n <ABtnTertiary\n data-cy=\"button-retry-editor\"\n @click.stop=\"loadEditor\"\n >\n {{ t('common.button.retry') }}\n </ABtnTertiary>\n </div>\n <div\n v-else-if=\"!listEditor\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Mounted once the first fetch settles, even if empty, so an empty\n list shows the editor's empty state. Never unmounted after that.\n -->\n <component\n :is=\"listEditor\"\n v-else\n ref=\"editor\"\n v-model=\"itemsManage\"\n :position=\"false\"\n :loading=\"listLoading || saveButtonLoading\"\n compact-field=\"customName\"\n :validate=\"validateBookmarkName\"\n :show-add-button=\"false\"\n :unsaved-section-label=\"t('common.filter.bookmark.unsavedSection')\"\n >\n <template #item=\"{ raw, actions }: { raw: UserAdminConfig; actions: RowUpdate }\">\n <AFormTextField\n :model-value=\"raw.customName\"\n hide-details=\"auto\"\n @update:model-value=\"actions.update({ ...raw, customName: String($event ?? '') })\"\n />\n </template>\n </component>\n </div>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <!--\n Inputs are disabled while a write is out. The change set was read when the button\n was pressed, so later typing would be lost on the close after a successful save.\n -->\n <ABtnTertiary\n data-cy=\"button-cancel\"\n :disabled=\"saveButtonLoading\"\n @click.stop=\"requestClose\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <!-- Disabled while the list refreshes: the on-screen order is about to be replaced by the incoming answer. -->\n <ABtnPrimary\n data-cy=\"button-confirm\"\n :disabled=\"activeTab === 'manage' && (listLoading || !listEditor)\"\n :loading=\"saveButtonLoading\"\n @click.stop=\"onConfirm\"\n >\n {{ activeTab === 'add' ? t('common.button.add') : t('common.filter.bookmark.saveBookmarkOrder') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n\n <AUnsavedConfirmDialog\n v-model=\"guard.promptOpen.value\"\n :dirty-labels=\"guard.dirtyLabels.value\"\n @resolve=\"guard.resolvePrompt\"\n />\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"FilterBookmarkDialog.js","names":["FilterBookmarkDialog_vue_vue_type_script_setup_true_lang_default","FilterBookmarkDialog_default"],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_openBlock","_createElementBlock","_Fragment","_createVNode","_component_VDialog","_withCtx","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VTabs","_component_VTab","ARow","_createBlock","_createCommentVNode","AFormTextField","AFormSwitch","_withDirectives","_createElementVNode","_component_VProgressCircular","_withModifiers","_resolveDynamicComponent","_vShow","_component_VCardActions","_component_VSpacer","AUnsavedConfirmDialog","ADialogToolbar_default","AFormTextField_default","ARow_default","AFormSwitch_default","AUnsavedConfirmDialog_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","MAX_BOOKMARK_NAME_LENGTH","FilterBookmarkDialog_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","pagination","DatatablePaginationKey","isUndefined","isOpen","ref","manageLoaded","loadFailed","listEditor","shallowRef","editorLoadFailed","editorLoading","loadEditor","loadListEditor","guard","useUnsavedChangesGuard","open","requestClose","saveButtonLoading","forceClose","activeTab","customName","storeDatatableHiddenColumns","storeDatatableOrder","listLoading","errorCount","itemsManage","validateBookmarkName","item","useValidate","rulesCreate","maxLength","vCreate$","filterBookmarkStore","useFilterBookmarkStore","useUserAdminConfigApi","useI18n","useAlerts","useUserAdminConfigFactory","editor","useTemplateRef","isAlreadyGone","isAnzuApiAxiosError","saveManage","changes","deleteUserAdminConfig","bookmarkCacheKey","updateUserAdminConfig","cloneDeep","updateUserAdminConfigPositions","applyItems","fetchItems","showErrorsDefault","useFilterHelpers","systemResource","UserAdminConfigLayoutType","addBookmark","config","createDefaultUserAdminConfig","UserAdminConfigType","serializeFilters","useFetchUserAdminConfigList","count","maxPosition","res","createUserAdminConfig","isAnzuApiValidationError","hasAnzuApiValidationErrorSpecific","onConfirm","fetchGeneration","fetchesInFlight","generation","items","showUnknownError","e","watch","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createElementBlock","Fragment","createVNode","VDialog","_cache","$event","withCtx","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VTabs","VTab","createBlock","createCommentVNode","withDirectives","createElementVNode","VProgressCircular","withModifiers","resolveDynamicComponent","raw","actions","vShow","VCardActions","VSpacer"],"sources":["../../../../../src/domains/filters/bookmarks/components/FilterBookmarkDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { type Component, inject, ref, shallowRef, useTemplateRef, watch } from 'vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormSwitch from '@/domains/form/components/AFormSwitch.vue'\nimport { loadListEditor } from '@/domains/listEditor/utils/listEditorLoader'\nimport type { ExposedListEditorHandle } from '@/domains/listEditor/composables/useListEditorController'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/shared/types/common'\nimport { MAX_BOOKMARK_ITEMS, useFilterBookmarkStore } from '@/domains/filters/bookmarks/store/bookmarksStore'\nimport { useUserAdminConfigApi } from '@/domains/filters/bookmarks/api/userAdminConfigApi'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useUserAdminConfigFactory } from '@/domains/filters/bookmarks/factory/UserAdminConfigFactory'\nimport {\n type UserAdminConfig,\n UserAdminConfigLayoutType,\n UserAdminConfigType,\n} from '@/domains/filters/bookmarks/types/UserAdminConfig'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey, FilterConfigKey, FilterDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { useFilterHelpers } from '@/domains/filters/composables/filterFactory'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport { hasAnzuApiValidationErrorSpecific, isAnzuApiValidationError } from '@/shared/error/AnzuApiValidationError'\nimport { isAnzuApiAxiosError } from '@/shared/error/AnzuApiAxiosError'\nimport { HTTP_STATUS_NOT_FOUND } from '@/shared/statusCodes'\n\nconst props = withDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n subject: string\n user: IntegerId\n datatableHiddenColumns?: string[] | undefined\n }>(),\n {\n datatableHiddenColumns: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination) || isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\n// The dialog is mounted behind the parent's `v-if`, but the guard needs a model to watch.\n// All closing goes through here. `requestClose` lets the guard ask\n// first. `forceClose` is for paths that already are the confirmation.\nconst isOpen = ref(true)\n\n// The editor takes its clean baseline on creation, so it waits for the first fetch.\n// After that it stays mounted. It alone registers this tab's pending work\n// with the guard, and swapping it out would disarm the guard mid-edit.\nconst manageLoaded = ref(false)\nconst loadFailed = ref(false)\n\n// The editor component loads on the first visit to the manage tab (see\n// `loadListEditor`). Its chunk load can fail independently of the bookmark fetch.\nconst listEditor = shallowRef<Component>()\nconst editorLoadFailed = ref(false)\nlet editorLoading = false\n\nconst loadEditor = async () => {\n if (listEditor.value || editorLoading) return\n editorLoading = true\n editorLoadFailed.value = false\n try {\n listEditor.value = await loadListEditor()\n } catch {\n editorLoadFailed.value = true\n } finally {\n editorLoading = false\n }\n}\n\nconst guard = useUnsavedChangesGuard({\n sources: [],\n guardDialogModel: isOpen,\n guardRoute: false,\n guardWindowUnload: false,\n})\n\nwatch(isOpen, (open) => {\n if (!open) emit('close')\n})\n\nconst requestClose = () => {\n // Not while a write is out. The toolbar X and Escape bypass the write-phase disabling.\n // Closing here would ask whether to discard work already sent to the server, and it would be written anyway.\n if (saveButtonLoading.value) return\n isOpen.value = false\n}\n\nconst forceClose = () => {\n guard.acknowledge()\n isOpen.value = false\n}\n\nconst activeTab = ref<'add' | 'manage'>('add')\nconst customName = ref('')\nconst storeDatatableHiddenColumns = ref(false)\nconst storeDatatableOrder = ref(false)\nconst saveButtonLoading = ref(false)\nconst listLoading = ref(false)\nconst errorCount = ref(false)\nconst itemsManage = ref<Array<UserAdminConfig>>([])\n\ninterface RowUpdate {\n update: (next: UserAdminConfig) => void\n}\n\nconst MAX_BOOKMARK_NAME_LENGTH = 100\n\n// The editor handles opening, saving and cancelling a row. Only the rule\n// remains here. It drives the editor's red rail and blocks its save.\nconst validateBookmarkName = (item: UserAdminConfig): boolean =>\n !!item.customName && item.customName.length <= MAX_BOOKMARK_NAME_LENGTH\n\nconst { required, maxLength } = useValidate()\nconst rulesCreate = {\n customName: {\n required,\n maxLength: maxLength(MAX_BOOKMARK_NAME_LENGTH),\n },\n}\nconst vCreate$ = useVuelidate(rulesCreate, { customName }, { $stopPropagation: true })\nconst filterBookmarkStore = useFilterBookmarkStore()\n\nconst {\n createUserAdminConfig,\n useFetchUserAdminConfigList,\n updateUserAdminConfigPositions,\n deleteUserAdminConfig,\n updateUserAdminConfig,\n} =\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n useUserAdminConfigApi(props.client, props.system)\nconst { t } = useI18n()\nconst { showErrorsDefault, showUnknownError, showValidationError, showWarningT } = useAlerts()\nconst { createDefaultUserAdminConfig } = useUserAdminConfigFactory()\n\nconst editor = useTemplateRef<ExposedListEditorHandle<UserAdminConfig>>('editor')\n\n// One save for the whole tab, like other list editors here. A per-row PUT required reloading\n// the list to re-baseline, which lost the pending reorder and other rows' typed text.\n// A DELETE answered with \"not found\" means the row is already gone. A retry after a\n// lost response looks like this. Otherwise every retry would stop on the same row.\nconst isAlreadyGone = (e: unknown) => isAnzuApiAxiosError(e) && e.cause.response?.status === HTTP_STATUS_NOT_FOUND\n\nconst saveManage = async () => {\n // Not while the list is refreshing: the on-screen order is about to be replaced by the incoming answer.\n // The button is also disabled. This check does not depend on the button.\n if (listLoading.value) return\n if (!editor.value?.validateAll()) return\n saveButtonLoading.value = true\n try {\n const changes = editor.value.getChanges()\n // Deletes first, then renames, then the order. The order comes\n // from `itemsManage`, which the deleted rows have already left.\n for (const item of changes.deleted) {\n try {\n await deleteUserAdminConfig(item.id)\n } catch (e) {\n if (!isAlreadyGone(e)) throw e\n }\n // Removed from the cache right away. The filter bar is reading\n // it, and a later failure in this save would skip the refresh.\n filterBookmarkStore.removeOne(bookmarkCacheKey(), item.id)\n // Dropping the pending deletion makes a retry safe after a later call failed.\n // Resent renames are the same idempotent PUT. A resent DELETE on a\n // gone row would fail and stop the batch at the same place every time.\n editor.value.restoreDeleted(item.id)\n }\n for (const item of changes.updated) {\n await updateUserAdminConfig(item.id, cloneDeep(item))\n }\n // An empty list is not a valid order to send.\n if (itemsManage.value.length > 0) {\n await updateUserAdminConfigPositions(itemsManage.value.map((item) => item.id))\n }\n // Once, at the end. This also refreshes the store the filter\n // bar reads names from, and the editor re-baselines against it.\n applyItems(await fetchItems())\n forceClose()\n } catch (e) {\n showErrorsDefault(e)\n // No refetch and no rollback. Written changes already match the\n // server, and unwritten ones stay for the user to fix and resend.\n // A refetch would discard that unsent work without asking. The store is marked stale instead.\n filterBookmarkStore.markStale(bookmarkCacheKey())\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst { serializeFilters } = useFilterHelpers(filterData, filterConfig)\n\nconst systemResource = props.system + '_' + props.subject\nconst bookmarkCacheKey = () => filterBookmarkStore.generateKey(UserAdminConfigLayoutType.Desktop, systemResource)\n\nconst addBookmark = async () => {\n saveButtonLoading.value = true\n errorCount.value = false\n const config = createDefaultUserAdminConfig(props.system)\n config.user = props.user\n config.configType = UserAdminConfigType.FilterBookmark\n config.layoutType = UserAdminConfigLayoutType.Desktop\n config.systemResource = systemResource\n config.customName = customName.value\n config.data = {\n filter: serializeFilters(filterData, pagination, false),\n datatableHiddenColumns:\n storeDatatableHiddenColumns.value && props.datatableHiddenColumns ? props.datatableHiddenColumns : undefined,\n sortBy: storeDatatableOrder.value && pagination.value.sortBy ? pagination.value.sortBy : undefined,\n }\n try {\n const { count, maxPosition } = await filterBookmarkStore.fetchBookmarkStats(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList\n )\n if (count >= MAX_BOOKMARK_ITEMS) {\n errorCount.value = true\n saveButtonLoading.value = false\n return\n }\n // After the highest used position, not the row count. The manage tab renumbers only the\n // rows it sends, so deletions leave gaps and a row count could reuse a taken position.\n config.position = maxPosition + 1\n const res = await createUserAdminConfig(config)\n filterBookmarkStore.addOne(bookmarkCacheKey(), res)\n // Cleared because `requestClose` may not close. If the guard asks and the user stays, a\n // second click would create the bookmark again. Empty, the `required` rule blocks that.\n customName.value = ''\n vCreate$.value.$reset()\n // The write is done, and `requestClose` refuses while one is out. The `finally` sets it again.\n saveButtonLoading.value = false\n // `requestClose`, not `forceClose`: adding a bookmark says nothing\n // about a reorder pending on the other tab, so the guard still asks.\n requestClose()\n } catch (e) {\n if (\n isAnzuApiValidationError(e) &&\n hasAnzuApiValidationErrorSpecific(e, 'error_field_not_unique', 'cms.userAdminConfig.model.systemResource')\n ) {\n showWarningT('common.filter.bookmark.nameUniqueError')\n return\n }\n showErrorsDefault(e)\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst onConfirm = () => {\n if (activeTab.value === 'add') {\n vCreate$.value.$touch()\n if (vCreate$.value.$invalid) {\n showValidationError()\n return\n }\n addBookmark()\n } else if (activeTab.value === 'manage') {\n // Not gated on a non-empty list. Deleting every row empties it while\n // the deletions are still pending, and only this button sends them.\n saveManage()\n }\n}\n\n// Tab switches can start fetches faster than they return. Only the\n// newest may apply, or an older answer could restore an outdated list.\nlet fetchGeneration = 0\nlet fetchesInFlight = 0\n\nconst fetchItems = async (): Promise<UserAdminConfig[] | null> => {\n const generation = ++fetchGeneration\n // A counter, not a flag. An older fetch finishing must not mark the tab\n // settled while a newer one is out, or the editor accepts edits in between.\n fetchesInFlight++\n listLoading.value = true\n loadFailed.value = false\n try {\n const items = await filterBookmarkStore.getBookmarks(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList,\n true\n )\n if (generation !== fetchGeneration) return null\n // `null` means this request failed. The store's `error` flag is\n // shared with other fetches, including this dialog's bookmark count.\n if (items === null) {\n loadFailed.value = true\n showUnknownError()\n return null\n }\n return items\n } catch (e) {\n // An overtaken answer must not set the error state or raise an alert.\n if (generation !== fetchGeneration) return null\n loadFailed.value = true\n showErrorsDefault(e)\n return null\n } finally {\n fetchesInFlight--\n listLoading.value = fetchesInFlight > 0\n }\n}\n\n// Rows are handed to the editor directly, not via `v-model`, which lags a render.\n// A commit before the rows arrived would pin the baseline to the old list,\n// and every fetched difference would look like an unsaved user edit.\n// On first load the editor mounts later and takes its baseline from `itemsManage`.\nconst applyItems = (items: UserAdminConfig[] | null) => {\n if (!items) return\n itemsManage.value = items\n manageLoaded.value = true\n editor.value?.commit(items)\n}\n\nwatch(activeTab, async () => {\n errorCount.value = false\n if (activeTab.value !== 'manage') return\n void loadEditor()\n // Entering the tab refreshes it, for example after adding a bookmark on the other\n // tab. Never over unsaved work: the fetched order would replace the dragged one.\n if (editor.value?.hasUnsaved) return\n const items = await fetchItems()\n // Checked again after the fetch: the user may have started dragging while it ran.\n if (editor.value?.hasUnsaved) return\n applyItems(items)\n})\n</script>\n\n<template>\n <!--\n `persistent` while a write is out: Escape and outside clicks\n change the model directly, bypassing the write-phase disabling.\n -->\n <VDialog\n v-model=\"isOpen\"\n :persistent=\"saveButtonLoading\"\n :width=\"500\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"requestClose\">\n {{ t('common.filter.bookmark.title') }}\n </ADialogToolbar>\n <VCardText class=\"pt-0\">\n <VTabs\n v-model=\"activeTab\"\n fixed-tabs\n >\n <VTab\n value=\"add\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.add') }}\n </VTab>\n <VTab\n value=\"manage\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.manage') }}\n </VTab>\n </VTabs>\n <div\n v-if=\"activeTab === 'add'\"\n class=\"w-100 pt-4\"\n >\n <ARow :title=\"t('common.filter.bookmark.infoSave')\" />\n <ARow\n v-if=\"errorCount\"\n class=\"text-error\"\n :title=\"t('common.filter.bookmark.errorMax')\"\n />\n <ARow>\n <AFormTextField\n v-model=\"customName\"\n :label=\"t('common.filter.bookmark.name')\"\n required\n :disabled=\"saveButtonLoading\"\n :v=\"vCreate$.customName\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableHiddenColumns\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableColumns')\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableOrder\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableOrder')\"\n />\n </ARow>\n </div>\n <!--\n `v-show`, not `v-if`: the guard sees pending work only through the section the editor registers.\n Unmounting on a tab switch would let the dialog close on a dragged order without asking.\n The spinner is the editor's own `loading` for the same reason.\n -->\n <div\n v-show=\"activeTab === 'manage'\"\n class=\"w-100 pt-4\"\n >\n <div\n v-if=\"!manageLoaded && !loadFailed\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Nothing loaded yet: the editor's empty state would wrongly\n claim there are no bookmarks after a failed fetch.\n -->\n <ARow\n v-else-if=\"!manageLoaded\"\n class=\"text-error\"\n :title=\"t('common.alert.unknownError')\"\n />\n <div\n v-else-if=\"editorLoadFailed\"\n class=\"d-flex w-100 align-center justify-space-between\"\n >\n <span class=\"text-error\">{{ t('common.alert.unknownError') }}</span>\n <ABtnTertiary\n data-cy=\"button-retry-editor\"\n @click.stop=\"loadEditor\"\n >\n {{ t('common.button.retry') }}\n </ABtnTertiary>\n </div>\n <div\n v-else-if=\"!listEditor\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Mounted once the first fetch settles, even if empty, so an empty\n list shows the editor's empty state. Never unmounted after that.\n -->\n <component\n :is=\"listEditor\"\n v-else\n ref=\"editor\"\n v-model=\"itemsManage\"\n :position=\"false\"\n :loading=\"listLoading || saveButtonLoading\"\n compact-field=\"customName\"\n :validate=\"validateBookmarkName\"\n :show-add-button=\"false\"\n :unsaved-section-label=\"t('common.filter.bookmark.unsavedSection')\"\n >\n <template #item=\"{ raw, actions }: { raw: UserAdminConfig; actions: RowUpdate }\">\n <AFormTextField\n :model-value=\"raw.customName\"\n hide-details=\"auto\"\n @update:model-value=\"actions.update({ ...raw, customName: String($event ?? '') })\"\n />\n </template>\n </component>\n </div>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <!--\n Inputs are disabled while a write is out. The change set was read when the button\n was pressed, so later typing would be lost on the close after a successful save.\n -->\n <ABtnTertiary\n data-cy=\"button-cancel\"\n :disabled=\"saveButtonLoading\"\n @click.stop=\"requestClose\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <!-- Disabled while the list refreshes: the on-screen order is about to be replaced by the incoming answer. -->\n <ABtnPrimary\n data-cy=\"button-confirm\"\n :disabled=\"activeTab === 'manage' && (listLoading || !listEditor)\"\n :loading=\"saveButtonLoading\"\n @click.stop=\"onConfirm\"\n >\n {{ activeTab === 'add' ? t('common.button.add') : t('common.filter.bookmark.saveBookmarkOrder') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n\n <AUnsavedConfirmDialog\n v-model=\"guard.promptOpen.value\"\n :dirty-labels=\"guard.dirtyLabels.value\"\n @resolve=\"guard.resolvePrompt\"\n />\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_component_VDialog","_withCtx","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VTabs","_component_VTab","ARow","_createBlock","AFormTextField","AFormSwitch","_withDirectives","_createElementVNode","_component_VProgressCircular","_withModifiers","_resolveDynamicComponent","_vShow","_component_VCardActions","_component_VSpacer","AUnsavedConfirmDialog","ADialogToolbar_default","AFormTextField_default","ARow_default","AFormSwitch_default","AUnsavedConfirmDialog_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","MAX_BOOKMARK_NAME_LENGTH","FilterBookmarkDialog_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","pagination","DatatablePaginationKey","isUndefined","isOpen","ref","manageLoaded","loadFailed","listEditor","shallowRef","editorLoadFailed","editorLoading","loadEditor","loadListEditor","guard","useUnsavedChangesGuard","open","requestClose","saveButtonLoading","forceClose","activeTab","customName","storeDatatableHiddenColumns","storeDatatableOrder","listLoading","errorCount","itemsManage","validateBookmarkName","item","useValidate","rulesCreate","maxLength","vCreate$","filterBookmarkStore","useFilterBookmarkStore","useUserAdminConfigApi","useI18n","useAlerts","useUserAdminConfigFactory","editor","useTemplateRef","isAlreadyGone","isAnzuApiAxiosError","saveManage","changes","deleteUserAdminConfig","bookmarkCacheKey","updateUserAdminConfig","cloneDeep","updateUserAdminConfigPositions","applyItems","fetchItems","showErrorsDefault","useFilterHelpers","systemResource","UserAdminConfigLayoutType","addBookmark","config","createDefaultUserAdminConfig","UserAdminConfigType","serializeFilters","useFetchUserAdminConfigList","count","maxPosition","res","createUserAdminConfig","isAnzuApiValidationError","hasAnzuApiValidationErrorSpecific","onConfirm","fetchGeneration","fetchesInFlight","generation","items","showUnknownError","e","watch","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createElementBlock","Fragment","createVNode","VDialog","_cache","$event","withCtx","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VTabs","VTab","createBlock","createCommentVNode","withDirectives","createElementVNode","VProgressCircular","withModifiers","resolveDynamicComponent","raw","actions","vShow","VCardActions","VSpacer"],"sources":["../../../../../src/domains/filters/bookmarks/components/FilterBookmarkDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { type Component, inject, ref, shallowRef, useTemplateRef, watch } from 'vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormSwitch from '@/domains/form/components/AFormSwitch.vue'\nimport { loadListEditor } from '@/domains/listEditor/utils/listEditorLoader'\nimport type { ExposedListEditorHandle } from '@/domains/listEditor/composables/useListEditorController'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/shared/types/common'\nimport { MAX_BOOKMARK_ITEMS, useFilterBookmarkStore } from '@/domains/filters/bookmarks/store/bookmarksStore'\nimport { useUserAdminConfigApi } from '@/domains/filters/bookmarks/api/userAdminConfigApi'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useUserAdminConfigFactory } from '@/domains/filters/bookmarks/factory/UserAdminConfigFactory'\nimport {\n type UserAdminConfig,\n UserAdminConfigLayoutType,\n UserAdminConfigType,\n} from '@/domains/filters/bookmarks/types/UserAdminConfig'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/shared/validators/vuelidate/useValidate'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey, FilterConfigKey, FilterDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { useFilterHelpers } from '@/domains/filters/composables/filterFactory'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport { hasAnzuApiValidationErrorSpecific, isAnzuApiValidationError } from '@/shared/error/AnzuApiValidationError'\nimport { isAnzuApiAxiosError } from '@/shared/error/AnzuApiAxiosError'\nimport { HTTP_STATUS_NOT_FOUND } from '@/shared/statusCodes'\n\nconst props = withDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n subject: string\n user: IntegerId\n datatableHiddenColumns?: string[] | undefined\n }>(),\n {\n datatableHiddenColumns: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination) || isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\n// The dialog is mounted behind the parent's `v-if`, but the guard needs a model to watch.\n// All closing goes through here. `requestClose` lets the guard ask\n// first. `forceClose` is for paths that already are the confirmation.\nconst isOpen = ref(true)\n\n// The editor takes its clean baseline on creation, so it waits for the first fetch.\n// After that it stays mounted. It alone registers this tab's pending work\n// with the guard, and swapping it out would disarm the guard mid-edit.\nconst manageLoaded = ref(false)\nconst loadFailed = ref(false)\n\n// The editor component loads on the first visit to the manage tab (see\n// `loadListEditor`). Its chunk load can fail independently of the bookmark fetch.\nconst listEditor = shallowRef<Component>()\nconst editorLoadFailed = ref(false)\nlet editorLoading = false\n\nconst loadEditor = async () => {\n if (listEditor.value || editorLoading) return\n editorLoading = true\n editorLoadFailed.value = false\n try {\n listEditor.value = await loadListEditor()\n } catch {\n editorLoadFailed.value = true\n } finally {\n editorLoading = false\n }\n}\n\nconst guard = useUnsavedChangesGuard({\n sources: [],\n guardDialogModel: isOpen,\n guardRoute: false,\n guardWindowUnload: false,\n})\n\nwatch(isOpen, (open) => {\n if (!open) emit('close')\n})\n\nconst requestClose = () => {\n // Not while a write is out. The toolbar X and Escape bypass the write-phase disabling.\n // Closing here would ask whether to discard work already sent to the server, and it would be written anyway.\n if (saveButtonLoading.value) return\n isOpen.value = false\n}\n\nconst forceClose = () => {\n guard.acknowledge()\n isOpen.value = false\n}\n\nconst activeTab = ref<'add' | 'manage'>('add')\nconst customName = ref('')\nconst storeDatatableHiddenColumns = ref(false)\nconst storeDatatableOrder = ref(false)\nconst saveButtonLoading = ref(false)\nconst listLoading = ref(false)\nconst errorCount = ref(false)\nconst itemsManage = ref<Array<UserAdminConfig>>([])\n\ninterface RowUpdate {\n update: (next: UserAdminConfig) => void\n}\n\nconst MAX_BOOKMARK_NAME_LENGTH = 100\n\n// The editor handles opening, saving and cancelling a row. Only the rule\n// remains here. It drives the editor's red rail and blocks its save.\nconst validateBookmarkName = (item: UserAdminConfig): boolean =>\n !!item.customName && item.customName.length <= MAX_BOOKMARK_NAME_LENGTH\n\nconst { required, maxLength } = useValidate()\nconst rulesCreate = {\n customName: {\n required,\n maxLength: maxLength(MAX_BOOKMARK_NAME_LENGTH),\n },\n}\nconst vCreate$ = useVuelidate(rulesCreate, { customName }, { $stopPropagation: true })\nconst filterBookmarkStore = useFilterBookmarkStore()\n\nconst {\n createUserAdminConfig,\n useFetchUserAdminConfigList,\n updateUserAdminConfigPositions,\n deleteUserAdminConfig,\n updateUserAdminConfig,\n} =\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n useUserAdminConfigApi(props.client, props.system)\nconst { t } = useI18n()\nconst { showErrorsDefault, showUnknownError, showValidationError, showWarningT } = useAlerts()\nconst { createDefaultUserAdminConfig } = useUserAdminConfigFactory()\n\nconst editor = useTemplateRef<ExposedListEditorHandle<UserAdminConfig>>('editor')\n\n// One save for the whole tab, like other list editors here. A per-row PUT required reloading\n// the list to re-baseline, which lost the pending reorder and other rows' typed text.\n// A DELETE answered with \"not found\" means the row is already gone. A retry after a\n// lost response looks like this. Otherwise every retry would stop on the same row.\nconst isAlreadyGone = (e: unknown) => isAnzuApiAxiosError(e) && e.cause.response?.status === HTTP_STATUS_NOT_FOUND\n\nconst saveManage = async () => {\n // Not while the list is refreshing: the on-screen order is about to be replaced by the incoming answer.\n // The button is also disabled. This check does not depend on the button.\n if (listLoading.value) return\n if (!editor.value?.validateAll()) return\n saveButtonLoading.value = true\n try {\n const changes = editor.value.getChanges()\n // Deletes first, then renames, then the order. The order comes\n // from `itemsManage`, which the deleted rows have already left.\n for (const item of changes.deleted) {\n try {\n await deleteUserAdminConfig(item.id)\n } catch (e) {\n if (!isAlreadyGone(e)) throw e\n }\n // Removed from the cache right away. The filter bar is reading\n // it, and a later failure in this save would skip the refresh.\n filterBookmarkStore.removeOne(bookmarkCacheKey(), item.id)\n // Dropping the pending deletion makes a retry safe after a later call failed.\n // Resent renames are the same idempotent PUT. A resent DELETE on a\n // gone row would fail and stop the batch at the same place every time.\n editor.value.restoreDeleted(item.id)\n }\n for (const item of changes.updated) {\n await updateUserAdminConfig(item.id, cloneDeep(item))\n }\n // An empty list is not a valid order to send.\n if (itemsManage.value.length > 0) {\n await updateUserAdminConfigPositions(itemsManage.value.map((item) => item.id))\n }\n // Once, at the end. This also refreshes the store the filter\n // bar reads names from, and the editor re-baselines against it.\n applyItems(await fetchItems())\n forceClose()\n } catch (e) {\n showErrorsDefault(e)\n // No refetch and no rollback. Written changes already match the\n // server, and unwritten ones stay for the user to fix and resend.\n // A refetch would discard that unsent work without asking. The store is marked stale instead.\n filterBookmarkStore.markStale(bookmarkCacheKey())\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst { serializeFilters } = useFilterHelpers(filterData, filterConfig)\n\nconst systemResource = props.system + '_' + props.subject\nconst bookmarkCacheKey = () => filterBookmarkStore.generateKey(UserAdminConfigLayoutType.Desktop, systemResource)\n\nconst addBookmark = async () => {\n saveButtonLoading.value = true\n errorCount.value = false\n const config = createDefaultUserAdminConfig(props.system)\n config.user = props.user\n config.configType = UserAdminConfigType.FilterBookmark\n config.layoutType = UserAdminConfigLayoutType.Desktop\n config.systemResource = systemResource\n config.customName = customName.value\n config.data = {\n filter: serializeFilters(filterData, pagination, false),\n datatableHiddenColumns:\n storeDatatableHiddenColumns.value && props.datatableHiddenColumns ? props.datatableHiddenColumns : undefined,\n sortBy: storeDatatableOrder.value && pagination.value.sortBy ? pagination.value.sortBy : undefined,\n }\n try {\n const { count, maxPosition } = await filterBookmarkStore.fetchBookmarkStats(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList\n )\n if (count >= MAX_BOOKMARK_ITEMS) {\n errorCount.value = true\n saveButtonLoading.value = false\n return\n }\n // After the highest used position, not the row count. The manage tab renumbers only the\n // rows it sends, so deletions leave gaps and a row count could reuse a taken position.\n config.position = maxPosition + 1\n const res = await createUserAdminConfig(config)\n filterBookmarkStore.addOne(bookmarkCacheKey(), res)\n // Cleared because `requestClose` may not close. If the guard asks and the user stays, a\n // second click would create the bookmark again. Empty, the `required` rule blocks that.\n customName.value = ''\n vCreate$.value.$reset()\n // The write is done, and `requestClose` refuses while one is out. The `finally` sets it again.\n saveButtonLoading.value = false\n // `requestClose`, not `forceClose`: adding a bookmark says nothing\n // about a reorder pending on the other tab, so the guard still asks.\n requestClose()\n } catch (e) {\n if (\n isAnzuApiValidationError(e) &&\n hasAnzuApiValidationErrorSpecific(e, 'error_field_not_unique', 'cms.userAdminConfig.model.systemResource')\n ) {\n showWarningT('common.filter.bookmark.nameUniqueError')\n return\n }\n showErrorsDefault(e)\n } finally {\n saveButtonLoading.value = false\n }\n}\n\nconst onConfirm = () => {\n if (activeTab.value === 'add') {\n vCreate$.value.$touch()\n if (vCreate$.value.$invalid) {\n showValidationError()\n return\n }\n addBookmark()\n } else if (activeTab.value === 'manage') {\n // Not gated on a non-empty list. Deleting every row empties it while\n // the deletions are still pending, and only this button sends them.\n saveManage()\n }\n}\n\n// Tab switches can start fetches faster than they return. Only the\n// newest may apply, or an older answer could restore an outdated list.\nlet fetchGeneration = 0\nlet fetchesInFlight = 0\n\nconst fetchItems = async (): Promise<UserAdminConfig[] | null> => {\n const generation = ++fetchGeneration\n // A counter, not a flag. An older fetch finishing must not mark the tab\n // settled while a newer one is out, or the editor accepts edits in between.\n fetchesInFlight++\n listLoading.value = true\n loadFailed.value = false\n try {\n const items = await filterBookmarkStore.getBookmarks(\n {\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: systemResource,\n },\n useFetchUserAdminConfigList,\n true\n )\n if (generation !== fetchGeneration) return null\n // `null` means this request failed. The store's `error` flag is\n // shared with other fetches, including this dialog's bookmark count.\n if (items === null) {\n loadFailed.value = true\n showUnknownError()\n return null\n }\n return items\n } catch (e) {\n // An overtaken answer must not set the error state or raise an alert.\n if (generation !== fetchGeneration) return null\n loadFailed.value = true\n showErrorsDefault(e)\n return null\n } finally {\n fetchesInFlight--\n listLoading.value = fetchesInFlight > 0\n }\n}\n\n// Rows are handed to the editor directly, not via `v-model`, which lags a render.\n// A commit before the rows arrived would pin the baseline to the old list,\n// and every fetched difference would look like an unsaved user edit.\n// On first load the editor mounts later and takes its baseline from `itemsManage`.\nconst applyItems = (items: UserAdminConfig[] | null) => {\n if (!items) return\n itemsManage.value = items\n manageLoaded.value = true\n editor.value?.commit(items)\n}\n\nwatch(activeTab, async () => {\n errorCount.value = false\n if (activeTab.value !== 'manage') return\n void loadEditor()\n // Entering the tab refreshes it, for example after adding a bookmark on the other\n // tab. Never over unsaved work: the fetched order would replace the dragged one.\n if (editor.value?.hasUnsaved) return\n const items = await fetchItems()\n // Checked again after the fetch: the user may have started dragging while it ran.\n if (editor.value?.hasUnsaved) return\n applyItems(items)\n})\n</script>\n\n<template>\n <!--\n `persistent` while a write is out: Escape and outside clicks\n change the model directly, bypassing the write-phase disabling.\n -->\n <VDialog\n v-model=\"isOpen\"\n :persistent=\"saveButtonLoading\"\n :width=\"500\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"requestClose\">\n {{ t('common.filter.bookmark.title') }}\n </ADialogToolbar>\n <VCardText class=\"pt-0\">\n <VTabs\n v-model=\"activeTab\"\n fixed-tabs\n >\n <VTab\n value=\"add\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.add') }}\n </VTab>\n <VTab\n value=\"manage\"\n :disabled=\"saveButtonLoading\"\n >\n {{ t('common.filter.bookmark.manage') }}\n </VTab>\n </VTabs>\n <div\n v-if=\"activeTab === 'add'\"\n class=\"w-100 pt-4\"\n >\n <ARow :title=\"t('common.filter.bookmark.infoSave')\" />\n <ARow\n v-if=\"errorCount\"\n class=\"text-error\"\n :title=\"t('common.filter.bookmark.errorMax')\"\n />\n <ARow>\n <AFormTextField\n v-model=\"customName\"\n :label=\"t('common.filter.bookmark.name')\"\n required\n :disabled=\"saveButtonLoading\"\n :v=\"vCreate$.customName\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableHiddenColumns\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableColumns')\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableOrder\"\n :disabled=\"saveButtonLoading\"\n :label=\"t('common.filter.bookmark.storeTableOrder')\"\n />\n </ARow>\n </div>\n <!--\n `v-show`, not `v-if`: the guard sees pending work only through the section the editor registers.\n Unmounting on a tab switch would let the dialog close on a dragged order without asking.\n The spinner is the editor's own `loading` for the same reason.\n -->\n <div\n v-show=\"activeTab === 'manage'\"\n class=\"w-100 pt-4\"\n >\n <div\n v-if=\"!manageLoaded && !loadFailed\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Nothing loaded yet: the editor's empty state would wrongly\n claim there are no bookmarks after a failed fetch.\n -->\n <ARow\n v-else-if=\"!manageLoaded\"\n class=\"text-error\"\n :title=\"t('common.alert.unknownError')\"\n />\n <div\n v-else-if=\"editorLoadFailed\"\n class=\"d-flex w-100 align-center justify-space-between\"\n >\n <span class=\"text-error\">{{ t('common.alert.unknownError') }}</span>\n <ABtnTertiary\n data-cy=\"button-retry-editor\"\n @click.stop=\"loadEditor\"\n >\n {{ t('common.button.retry') }}\n </ABtnTertiary>\n </div>\n <div\n v-else-if=\"!listEditor\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <!--\n Mounted once the first fetch settles, even if empty, so an empty\n list shows the editor's empty state. Never unmounted after that.\n -->\n <component\n :is=\"listEditor\"\n v-else\n ref=\"editor\"\n v-model=\"itemsManage\"\n :position=\"false\"\n :loading=\"listLoading || saveButtonLoading\"\n compact-field=\"customName\"\n :validate=\"validateBookmarkName\"\n :show-add-button=\"false\"\n :unsaved-section-label=\"t('common.filter.bookmark.unsavedSection')\"\n >\n <template #item=\"{ raw, actions }: { raw: UserAdminConfig; actions: RowUpdate }\">\n <AFormTextField\n :model-value=\"raw.customName\"\n hide-details=\"auto\"\n @update:model-value=\"actions.update({ ...raw, customName: String($event ?? '') })\"\n />\n </template>\n </component>\n </div>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <!--\n Inputs are disabled while a write is out. The change set was read when the button\n was pressed, so later typing would be lost on the close after a successful save.\n -->\n <ABtnTertiary\n data-cy=\"button-cancel\"\n :disabled=\"saveButtonLoading\"\n @click.stop=\"requestClose\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <!-- Disabled while the list refreshes: the on-screen order is about to be replaced by the incoming answer. -->\n <ABtnPrimary\n data-cy=\"button-confirm\"\n :disabled=\"activeTab === 'manage' && (listLoading || !listEditor)\"\n :loading=\"saveButtonLoading\"\n @click.stop=\"onConfirm\"\n >\n {{ activeTab === 'add' ? t('common.button.add') : t('common.filter.bookmark.saveBookmarkOrder') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n\n <AUnsavedConfirmDialog\n v-model=\"guard.promptOpen.value\"\n :dirty-labels=\"guard.dirtyLabels.value\"\n @resolve=\"guard.resolvePrompt\"\n />\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBookmarks.js","names":["
|
|
1
|
+
{"version":3,"file":"FilterBookmarks.js","names":["FilterBookmarks_vue_vue_type_script_setup_true_lang_default","FilterBookmarks_default"],"sources":[],"mappings":""}
|