LinkDesk/frontend/docs/project-thumbnail-implement...

9.6 KiB

Project Thumbnail Upload Implementation

Overview

This document describes the frontend implementation of project thumbnail upload functionality for the VFX Project Management System, completing Task 22 from the implementation plan.

Completed Tasks

Task 22.4: Update Project Type Definitions

File: frontend/src/services/project.ts

Added thumbnail_url field to the Project interface:

export interface Project {
  // ... existing fields ...
  thumbnail_url?: string | null
}

Added thumbnail upload and delete methods to projectService:

async uploadThumbnail(projectId: number, file: File): Promise<{ message: string; thumbnail_url: string }>
async deleteThumbnail(projectId: number): Promise<void>

Task 22.1: Add Thumbnail Preview and Management

File: frontend/src/components/project/ProjectThumbnailUpload.vue

Created a comprehensive thumbnail upload component with:

Features:

  • Current thumbnail display with 48x32 preview
  • Project initials placeholder when no thumbnail exists
  • Click-to-upload button with file input
  • Drag-and-drop upload area (shown when no thumbnail)
  • Replace thumbnail functionality
  • Remove thumbnail button
  • Upload progress indicator
  • Client-side file validation (format and size)
  • Error message display
  • Responsive layout

Validation:

  • Accepted formats: JPG, JPEG, PNG, GIF, WEBP
  • Maximum file size: 10MB
  • Real-time validation feedback

User Experience:

  • Camera icon overlay for quick upload
  • Visual drag-and-drop zone with hover states
  • Loading states during upload/removal
  • Toast notifications for success/error
  • Confirmation dialog before removal

Task 22.2: Integrate Thumbnail Upload in Project Settings

File: frontend/src/views/ProjectSettingsView.vue

Integrated the thumbnail upload component into the General Settings tab:

Changes:

  1. Imported ProjectThumbnailUpload component
  2. Added thumbnail section at the top of General Settings tab
  3. Separated thumbnail and project details with a divider
  4. Added event handlers for thumbnail updates:
    • handleThumbnailUpdated: Updates project in store when thumbnail is uploaded
    • handleThumbnailRemoved: Clears thumbnail in store when removed

Layout:

General Settings Tab
├── Project Thumbnail Section (new)
│   └── ProjectThumbnailUpload component
├── Separator
└── Project Details Section
    └── ProjectEditForm component

Task 22.3: Update Project Card to Display Thumbnails

File: frontend/src/views/ProjectsView.vue

Enhanced project cards to display thumbnails:

Visual Changes:

  1. Added 40px height thumbnail area at top of each card
  2. Displays uploaded thumbnail with object-cover for proper aspect ratio
  3. Shows gradient placeholder with project initials when no thumbnail
  4. Moved status badge to overlay on thumbnail (top-right corner)
  5. Implemented lazy loading for performance

Placeholder Design:

  • Gradient background (primary colors)
  • Large project initials (4xl font)
  • Folder icon below initials
  • Consistent with brand aesthetic

Helper Functions:

getThumbnailUrl(url): Constructs full URL from API path
getProjectInitials(name): Generates 2-letter initials from project name

Component API

ProjectThumbnailUpload

Props:

  • projectId: number - The project ID for upload/delete operations
  • currentThumbnailUrl?: string | null - Current thumbnail URL (if exists)
  • projectName?: string - Project name for generating initials

Events:

  • thumbnail-updated(thumbnailUrl: string) - Emitted when thumbnail is uploaded
  • thumbnail-removed() - Emitted when thumbnail is deleted

Usage Example:

<ProjectThumbnailUpload
  :project-id="project.id"
  :current-thumbnail-url="project.thumbnail_url"
  :project-name="project.name"
  @thumbnail-updated="handleThumbnailUpdated"
  @thumbnail-removed="handleThumbnailRemoved"
/>

User Workflows

Upload Thumbnail Workflow

  1. User navigates to Project Settings → General tab
  2. User sees current thumbnail or placeholder with initials
  3. User clicks "Upload Thumbnail" button or drags file to drop zone
  4. File is validated (format and size)
  5. Upload progress is shown
  6. On success:
    • Thumbnail is displayed in preview
    • Success toast notification appears
    • Project card in projects list updates automatically
  7. On error:
    • Error message is displayed
    • Error toast notification appears

Replace Thumbnail Workflow

  1. User sees existing thumbnail in settings
  2. User clicks "Replace Thumbnail" button
  3. Selects new file
  4. Old thumbnail is automatically deleted
  5. New thumbnail is uploaded and displayed

Remove Thumbnail Workflow

  1. User clicks "Remove" button
  2. Confirmation dialog appears
  3. On confirm:
    • Thumbnail is deleted from server
    • Placeholder with initials is shown
    • Success toast notification appears
    • Project card reverts to placeholder

Technical Details

File Upload

  • Uses FormData for multipart file upload
  • Sends to POST /api/projects/{projectId}/thumbnail
  • Backend processes and resizes image
  • Returns thumbnail URL in response

File Deletion

  • Sends to DELETE /api/projects/{projectId}/thumbnail
  • Backend removes file from filesystem
  • Clears thumbnail_path in database

State Management

  • Thumbnail URL is stored in project object
  • Updates propagate through Pinia store
  • All components using project data see updates automatically

URL Construction

Thumbnails are served from the backend:

http://localhost:8000/api/files/projects/{projectId}/thumbnail

The component handles both relative and absolute URLs.

Testing

A comprehensive test file is provided at frontend/test-project-thumbnail.html:

Test Cases:

  1. Fetch projects with thumbnail URLs
  2. Upload thumbnail to selected project
  3. Delete thumbnail from project
  4. Display all projects with thumbnails/placeholders

To Run Tests:

  1. Ensure backend is running on http://localhost:8000
  2. Open frontend/test-project-thumbnail.html in browser
  3. Tests will auto-login and fetch projects
  4. Use UI to test upload/delete operations

Integration Points

Backend API Endpoints

  • POST /api/projects/{project_id}/thumbnail - Upload thumbnail
  • DELETE /api/projects/{project_id}/thumbnail - Delete thumbnail
  • GET /api/files/projects/{project_id}/thumbnail - Serve thumbnail
  • GET /api/projects/ - List projects (includes thumbnail_url)
  • GET /api/projects/{project_id} - Get project (includes thumbnail_url)

Frontend Components

  • ProjectThumbnailUpload.vue - Main upload component
  • ProjectSettingsView.vue - Settings integration
  • ProjectsView.vue - Project cards display

Services

  • projectService.uploadThumbnail() - Upload API call
  • projectService.deleteThumbnail() - Delete API call

Stores

  • projectsStore - Manages project state including thumbnails

Design Decisions

Thumbnail Size

  • Preview: 48x32 (3:2 aspect ratio)
  • Card display: Full width, 40px height
  • Backend processes to max 800x600 while maintaining aspect ratio

Placeholder Design

  • Uses project initials (first letter of first two words)
  • Gradient background for visual appeal
  • Folder icon for context
  • Consistent with avatar placeholder pattern

Upload UX

  • Drag-and-drop for convenience
  • Click-to-browse for traditional users
  • Immediate visual feedback
  • Progress indicators during operations
  • Toast notifications for all outcomes

Validation

  • Client-side validation before upload (saves bandwidth)
  • Server-side validation for security
  • Clear error messages for users

Future Enhancements

Potential improvements for future iterations:

  1. Image Cropping: Add client-side cropping tool before upload
  2. Multiple Thumbnails: Support different sizes for different contexts
  3. Thumbnail Gallery: Show history of previous thumbnails
  4. Bulk Upload: Upload thumbnails for multiple projects at once
  5. Auto-generation: Generate thumbnail from project assets
  6. Thumbnail Templates: Provide pre-designed templates
  7. Compression Options: Let users choose quality vs. file size
  • Backend Implementation: backend/docs/project-thumbnail-implementation.md
  • Requirements: Requirement 2.1 in requirements.md
  • Design: Project Thumbnail section in design.md
  • Tasks: Task 22 in tasks.md

Files Modified

Created

  • frontend/src/components/project/ProjectThumbnailUpload.vue
  • frontend/test-project-thumbnail.html
  • frontend/docs/project-thumbnail-implementation.md

Modified

  • frontend/src/services/project.ts - Added thumbnail methods and type
  • frontend/src/views/ProjectSettingsView.vue - Integrated upload component
  • frontend/src/views/ProjectsView.vue - Added thumbnail display to cards

Verification

To verify the implementation:

  1. Visual Check: Open project settings and see thumbnail upload section
  2. Upload Test: Upload a thumbnail and verify it appears
  3. Display Test: Check projects list shows thumbnails
  4. Replace Test: Replace existing thumbnail with new one
  5. Delete Test: Remove thumbnail and verify placeholder appears
  6. Persistence Test: Refresh page and verify thumbnail persists

All tests should pass with the provided test HTML file.

Conclusion

Task 22 has been successfully completed with all subtasks implemented:

  • 22.1: Thumbnail preview and management component
  • 22.2: Integration in project settings
  • 22.3: Display in project cards
  • 22.4: Type definitions updated

The implementation provides a complete, user-friendly thumbnail management system that enhances project visual identification throughout the application.