mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-14 01:20:03 +00:00
## Summary Stores and displays base64-encoded preview images from Civitai during the model upload flow, uploading the preview as a separate asset linked to the model. ## Changes - **Schema**: Added `preview_image` field to `AssetMetadata` schema - **Service**: Added `uploadAssetFromBase64` method to convert base64 data to blob and upload via FormData - **Upload Flow**: Modified wizard to first upload preview image as asset, then link it to model via `preview_id` - **UI**: Display 56x56px preview thumbnail alongside model filename in confirmation and success steps ## Review Focus - Base64 to blob conversion and FormData upload implementation - Sequential upload flow (preview first, then model with preview_id reference) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7274-feat-display-and-upload-Civitai-preview-images-in-model-upload-flow-2c46d73d365081ff9b74c1791d23f6dd) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude <noreply@anthropic.com>
77 lines
2.2 KiB
Vue
77 lines
2.2 KiB
Vue
<template>
|
|
<div class="flex flex-1 flex-col gap-6 text-sm text-muted-foreground">
|
|
<!-- Uploading State -->
|
|
<div
|
|
v-if="status === 'uploading'"
|
|
class="flex flex-1 flex-col items-center justify-center gap-2"
|
|
>
|
|
<i
|
|
class="icon-[lucide--loader-circle] animate-spin text-6xl text-muted-foreground"
|
|
/>
|
|
<div class="text-center">
|
|
<p class="m-0 font-bold">
|
|
{{ $t('assetBrowser.uploadingModel') }}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Success State -->
|
|
<div v-else-if="status === 'success'" class="flex flex-col gap-2">
|
|
<p class="m-0 font-bold">
|
|
{{ $t('assetBrowser.modelUploaded') }}
|
|
</p>
|
|
<p class="m-0">
|
|
{{ $t('assetBrowser.findInLibrary', { type: modelType }) }}
|
|
</p>
|
|
|
|
<div
|
|
class="flex flex-row items-center gap-3 p-4 bg-modal-card-background rounded-lg"
|
|
>
|
|
<img
|
|
v-if="previewImage"
|
|
:src="previewImage"
|
|
:alt="metadata?.filename || metadata?.name || 'Model preview'"
|
|
class="w-14 h-14 rounded object-cover flex-shrink-0"
|
|
/>
|
|
<div class="flex flex-col justify-center items-start gap-1 flex-1">
|
|
<p class="text-base-foreground m-0">
|
|
{{ metadata?.filename || metadata?.name }}
|
|
</p>
|
|
<p class="text-sm text-muted m-0">
|
|
<!-- Going to want to add another translation here to get a nice display name. -->
|
|
{{ modelType }}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Error State -->
|
|
<div
|
|
v-else-if="status === 'error'"
|
|
class="flex flex-1 flex-col items-center justify-center gap-6"
|
|
>
|
|
<i class="icon-[lucide--x-circle] text-6xl text-error" />
|
|
<div class="text-center">
|
|
<p class="m-0 text-sm font-bold">
|
|
{{ $t('assetBrowser.uploadFailed') }}
|
|
</p>
|
|
<p v-if="error" class="text-sm text-muted mb-0">
|
|
{{ error }}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import type { AssetMetadata } from '@/platform/assets/schemas/assetSchema'
|
|
|
|
defineProps<{
|
|
status: 'idle' | 'uploading' | 'success' | 'error'
|
|
error?: string
|
|
metadata?: AssetMetadata
|
|
modelType?: string
|
|
previewImage?: string
|
|
}>()
|
|
</script>
|