diff --git a/src/composables/useFeatureFlags.ts b/src/composables/useFeatureFlags.ts index 697818c4e..043721b98 100644 --- a/src/composables/useFeatureFlags.ts +++ b/src/composables/useFeatureFlags.ts @@ -14,7 +14,8 @@ export enum ServerFeatureFlag { ASSET_UPDATE_OPTIONS_ENABLED = 'asset_update_options_enabled', PRIVATE_MODELS_ENABLED = 'private_models_enabled', ONBOARDING_SURVEY_ENABLED = 'onboarding_survey_enabled', - HUGGINGFACE_MODEL_IMPORT_ENABLED = 'huggingface_model_import_enabled' + HUGGINGFACE_MODEL_IMPORT_ENABLED = 'huggingface_model_import_enabled', + ASYNC_MODEL_UPLOAD_ENABLED = 'async_model_upload_enabled' } /** @@ -65,7 +66,6 @@ export function useFeatureFlags() { ) }, get huggingfaceModelImportEnabled() { - // Check remote config first (from /api/features), fall back to websocket feature flags return ( remoteConfig.value.huggingface_model_import_enabled ?? api.getServerFeature( @@ -73,6 +73,15 @@ export function useFeatureFlags() { false ) ) + }, + get asyncModelUploadEnabled() { + return ( + remoteConfig.value.async_model_upload_enabled ?? + api.getServerFeature( + ServerFeatureFlag.ASYNC_MODEL_UPLOAD_ENABLED, + false + ) + ) } }) diff --git a/src/locales/en/main.json b/src/locales/en/main.json index 712865735..df360ad74 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -181,6 +181,7 @@ "missing": "Missing", "inProgress": "In progress", "completed": "Completed", + "downloading": "Downloading", "interrupted": "Interrupted", "queued": "Queued", "running": "Running", @@ -2286,14 +2287,16 @@ "noAssetsFound": "No assets found", "noModelsInFolder": "No {type} available in this folder", "notSureLeaveAsIs": "Not sure? Just leave this as is", + "noValidSourceDetected": "No valid import source detected", "onlyCivitaiUrlsSupported": "Only Civitai URLs are supported", "ownership": "Ownership", "ownershipAll": "All", "ownershipMyModels": "My models", "ownershipPublicModels": "Public models", + "processingModel": "Download started", + "processingModelDescription": "You can close this dialog. The download will continue in the background.", "providerCivitai": "Civitai", "providerHuggingFace": "Hugging Face", - "noValidSourceDetected": "No valid import source detected", "selectFrameworks": "Select Frameworks", "selectModelType": "Select model type", "selectProjects": "Select Projects", @@ -2318,8 +2321,8 @@ "uploadModelDescription1": "Paste a Civitai model download link to add it to your library.", "uploadModelDescription1Generic": "Paste a model download link to add it to your library.", "uploadModelDescription2": "Only links from {link} are supported at the moment", - "uploadModelDescription2Link": "https://civitai.com/models", "uploadModelDescription2Generic": "Only URLs from the following providers are supported:", + "uploadModelDescription2Link": "https://civitai.com/models", "uploadModelDescription3": "Max file size: {size}", "uploadModelFailedToRetrieveMetadata": "Failed to retrieve metadata. Please check the link and try again.", "uploadModelFromCivitai": "Import a model from Civitai", @@ -2343,6 +2346,11 @@ "complete": "{assetName} has been deleted.", "failed": "{assetName} could not be deleted." }, + "download": { + "complete": "Download complete", + "failed": "Download failed", + "inProgress": "Downloading {assetName}..." + }, "rename": { "failed": "Could not rename asset." } diff --git a/src/platform/assets/components/AssetBrowserModal.vue b/src/platform/assets/components/AssetBrowserModal.vue index 40cc1fb1b..cd89591aa 100644 --- a/src/platform/assets/components/AssetBrowserModal.vue +++ b/src/platform/assets/components/AssetBrowserModal.vue @@ -83,6 +83,7 @@ import { useModelUpload } from '@/platform/assets/composables/useModelUpload' import type { AssetItem } from '@/platform/assets/schemas/assetSchema' import { assetService } from '@/platform/assets/services/assetService' import { formatCategoryLabel } from '@/platform/assets/utils/categoryLabel' +import { useAssetDownloadStore } from '@/stores/assetDownloadStore' import { useModelToNodeStore } from '@/stores/modelToNodeStore' import { OnCloseKey } from '@/types/widgetTypes' @@ -132,6 +133,17 @@ watch( { immediate: true } ) +const assetDownloadStore = useAssetDownloadStore() + +watch( + () => assetDownloadStore.hasActiveDownloads, + async (currentlyActive, previouslyActive) => { + if (previouslyActive && !currentlyActive) { + await execute() + } + } +) + const { searchQuery, selectedCategory, diff --git a/src/platform/assets/components/UploadModelDialog.vue b/src/platform/assets/components/UploadModelDialog.vue index d6be9e97e..3a7c76bfe 100644 --- a/src/platform/assets/components/UploadModelDialog.vue +++ b/src/platform/assets/components/UploadModelDialog.vue @@ -25,8 +25,8 @@ {{ $t('assetBrowser.upload') }} () const emit = defineEmits<{ diff --git a/src/platform/assets/components/UploadModelProgress.vue b/src/platform/assets/components/UploadModelProgress.vue index 839b5d3b4..e541e9bc0 100644 --- a/src/platform/assets/components/UploadModelProgress.vue +++ b/src/platform/assets/components/UploadModelProgress.vue @@ -1,22 +1,36 @@