18 KiB
Product Requirements Document: Media Library Modal System
Overview
Implement a comprehensive Media Library modal system that provides a unified interface for browsing, selecting, and managing media across all admin forms. The primary workflow is direct upload from computer within forms, with the Media Library serving as a secondary browsing interface and management tool for previously uploaded content.
📋 Updated Approach Summary
🎯 Primary Focus: Direct upload components that allow users to drag-and-drop or browse files directly within project/post/album forms, with immediate preview and alt text capture.
🎯 Secondary Feature: Media Library modal for selecting previously uploaded content when needed.
🎯 Key Addition: Alt text storage and editing capabilities for accessibility compliance and SEO.
Goals
Primary Goals (Direct Upload Workflow)
- Enable direct file upload within forms where content will be used (projects, posts, albums)
- Provide immediate upload and preview without requiring navigation to separate media management
- Store comprehensive metadata including alt text for accessibility and SEO
- Support drag-and-drop and click-to-browse for intuitive file selection
Secondary Goals (Media Library Browser)
- Create a reusable media browser for selecting previously uploaded content
- Provide media management interface showing where files are referenced
- Enable bulk operations and metadata editing (especially alt text)
- Support file organization and usage tracking
Technical Goals
- Maintain consistent UX across all media interactions
- Support different file type filtering based on context
- Integrate seamlessly with existing admin components
Current State Analysis
✅ What We Have
- Complete media API (
/api/media,/api/media/upload,/api/media/bulk-upload) - Media management page with grid/list views and search/filtering
- Modal base component (
Modal.svelte) - Complete admin UI component library (Button, Input, etc.)
- Media upload infrastructure with Cloudinary integration
- Pagination and search functionality
🎯 What We Need
High Priority (Direct Upload Focus)
- Enhanced upload components with immediate preview and metadata capture
- Alt text input fields for accessibility compliance
- Direct upload integration in form components (ImagePicker, GalleryManager)
- Metadata management during upload process
Medium Priority (Media Library Browser)
- Reusable MediaLibraryModal component for browsing existing content
- Selection state management for previously uploaded files
- Usage tracking and reference management
Database Updates Required
- Add
alt_textfield to Media table - Add
usage_referencesor similar tracking for where media is used
Workflow Priorities
🥇 Primary Workflow: Direct Upload in Forms
This is the main workflow that users will use 90% of the time:
- User creates content (project, post, album)
- User uploads files directly in the form where they'll be used
- Files are immediately processed and previewed
- Alt text and metadata are captured during upload
- Content is saved with proper media references
Key Components:
ImageUploader- Direct drag-and-drop/click upload with previewGalleryUploader- Multiple file upload with immediate gallery previewMediaMetadataForm- Alt text and description capture during upload
🥈 Secondary Workflow: Browse Existing Media
This workflow is for reusing previously uploaded content:
- User needs to select existing media (rare case)
- User clicks "Browse Library" (secondary button)
- Media Library Modal opens showing all uploaded files
- User selects from existing content
- Media references are updated
Key Components:
MediaLibraryModal- Browse and select existing mediaMediaSelector- Grid interface for selectionMediaManager- Edit alt text and view usage
Technical Requirements
1. Enhanced Upload Components (Primary)
ImageUploader Component
Purpose: Direct image upload with immediate preview and metadata capture
interface ImageUploaderProps {
label: string
value?: Media | null
onUpload: (media: Media) => void
aspectRatio?: string
required?: boolean
error?: string
allowAltText?: boolean // Enable alt text input
maxFileSize?: number // MB limit
}
Features:
- Drag-and-drop upload zone with visual feedback
- Click to browse files from computer
- Immediate image preview with proper aspect ratio
- Alt text input field (when enabled)
- Upload progress indicator
- File validation with helpful error messages
- Replace/remove functionality
GalleryUploader Component
Purpose: Multiple file upload with gallery preview and reordering
interface GalleryUploaderProps {
label: string
value?: Media[]
onUpload: (media: Media[]) => void
onReorder?: (media: Media[]) => void
maxItems?: number
allowAltText?: boolean
required?: boolean
error?: string
}
Features:
- Multiple file drag-and-drop
- Immediate gallery preview grid
- Individual alt text inputs for each image
- Drag-and-drop reordering
- Individual remove buttons
- Bulk upload progress
2. MediaLibraryModal Component (Secondary)
Purpose: Main modal component that wraps the media browser functionality
Props Interface:
interface MediaLibraryModalProps {
isOpen: boolean
mode: 'single' | 'multiple'
fileType?: 'image' | 'video' | 'all'
onSelect: (media: Media | Media[]) => void
onClose: () => void
selectedIds?: number[] // Pre-selected items
title?: string // Modal title
confirmText?: string // Confirm button text
}
Features:
- Modal overlay with proper focus management
- Header with title and close button
- Media browser grid with selection indicators
- Search and filter controls
- Upload area with drag-and-drop
- Footer with selection count and action buttons
- Responsive design (desktop and tablet)
2. MediaSelector Component
Purpose: The actual media browsing interface within the modal
Features:
- Grid layout with thumbnail previews
- Individual item selection with visual feedback
- Keyboard navigation support
- Loading states and error handling
- "Select All" / "Clear Selection" bulk actions (for multiple mode)
Item Display:
- Thumbnail image
- Filename (truncated)
- File size and dimensions
- Usage indicator (if used elsewhere)
- Selection checkbox/indicator
3. MediaUploader Component
Purpose: Handle file uploads within the modal
Features:
- Drag-and-drop upload zone
- Click to browse files
- Upload progress indicators
- Error handling and validation
- Multiple file upload support
- Automatic refresh of media grid after upload
Validation:
- File type restrictions based on context
- File size limits (10MB per file)
- Maximum number of files for bulk upload
4. Form Integration Components
MediaInput Component
Purpose: Generic input field that opens media library modal
interface MediaInputProps {
label: string
value?: Media | Media[] | null
mode: 'single' | 'multiple'
fileType?: 'image' | 'video' | 'all'
onSelect: (media: Media | Media[] | null) => void
placeholder?: string
required?: boolean
error?: string
}
Display:
- Label and optional required indicator
- Preview of selected media (thumbnail + filename)
- "Browse" button to open modal
- "Clear" button to remove selection
- Error state display
ImagePicker Component
Purpose: Specialized single image selector with enhanced preview
interface ImagePickerProps {
label: string
value?: Media | null
onSelect: (media: Media | null) => void
aspectRatio?: string // e.g., "16:9", "1:1"
placeholder?: string
required?: boolean
error?: string
}
Display:
- Large preview area with placeholder
- Image preview with proper aspect ratio
- Overlay with "Change" and "Remove" buttons on hover
- Upload progress indicator
GalleryManager Component
Purpose: Multiple image selection with drag-and-drop reordering
interface GalleryManagerProps {
label: string
value?: Media[]
onSelect: (media: Media[]) => void
onReorder?: (media: Media[]) => void
maxItems?: number
required?: boolean
error?: string
}
Display:
- Grid of selected images with reorder handles
- "Add Images" button to open modal
- Individual remove buttons on each image
- Drag-and-drop reordering with visual feedback
User Experience Flows
🥇 Primary Flow: Direct Upload in Forms
1. Single Image Upload (Project Featured Image)
- User creates/edits project and reaches featured image field
- User drags image file directly onto ImageUploader component OR clicks to browse
- File is immediately uploaded with progress indicator
- Image preview appears with proper aspect ratio
- Alt text input field appears below preview (if enabled)
- User enters alt text for accessibility
- Form can be saved with media reference and metadata
2. Multiple Image Upload (Project Gallery)
- User reaches gallery section of project form
- User drags multiple files onto GalleryUploader OR clicks to browse multiple
- Upload progress shown for each file individually
- Gallery grid appears with all uploaded images
- Alt text inputs available for each image
- User can reorder images with drag-and-drop
- User can remove individual images with X button
- Form saves with complete gallery and metadata
3. Media Management and Alt Text Editing
- User visits Media Library page to manage uploaded content
- User clicks on any media item to open details modal
- User can edit alt text and other metadata
- User can see usage references (which projects/posts use this media)
- Changes are saved and reflected wherever media is used
🥈 Secondary Flow: Browse Existing Media
1. Selecting Previously Uploaded Image
- User clicks "Browse Library" button (secondary option in forms)
- MediaLibraryModal opens showing all previously uploaded media
- User browses or searches existing content
- User selects image and confirms selection
- Modal closes and form shows selected media with existing alt text
2. Managing Media Library
- User visits dedicated Media Library page
- User can view all uploaded media in grid/list format
- User can edit metadata including alt text for any media
- User can see usage tracking - which content references each media
- User can perform bulk operations like deleting unused media
Design Specifications
Modal Layout
- Width: 1200px max, responsive on smaller screens
- Height: 80vh max with scroll
- Grid: 4-6 columns depending on screen size
- Item Size: 180px × 140px thumbnails
Visual States
- Default: Border with subtle background
- Selected: Blue border and checkmark overlay
- Hover: Slight scale and shadow effect
- Loading: Skeleton loader animation
- Upload: Progress overlay with percentage
Colors (Using Existing Variables)
- Selection:
$blue-60for selected state - Hover:
$grey-10background - Upload Progress:
$green-60for success,$red-60for error
API Integration
Endpoints Used
GET /api/media- Browse media with search/filter/paginationPOST /api/media/upload- Single file uploadPOST /api/media/bulk-upload- Multiple file upload
Search and Filtering
- Search: By filename (case-insensitive)
- Filter by Type: image/, video/, all
- Filter by Usage: unused only, all
- Sort: Most recent first
Pagination
- 24 items per page
- Infinite scroll or traditional pagination
- Loading states during page changes
Implementation Plan
Phase 1: Database Schema Updates (Required First)
-
Add Alt Text Support
ALTER TABLE media ADD COLUMN alt_text TEXT; ALTER TABLE media ADD COLUMN description TEXT; -
Add Usage Tracking (Optional)
-- Track where media is referenced CREATE TABLE media_usage ( id SERIAL PRIMARY KEY, media_id INTEGER REFERENCES media(id), content_type VARCHAR(50), -- 'project', 'post', 'album' content_id INTEGER, field_name VARCHAR(100), -- 'featured_image', 'gallery', etc. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Phase 2: Direct Upload Components (High Priority)
-
ImageUploader Component
- Drag-and-drop upload zone with visual feedback
- Immediate upload and preview functionality
- Alt text input integration
- Replace existing ImagePicker with upload-first approach
-
GalleryUploader Component
- Multiple file drag-and-drop
- Individual alt text inputs per image
- Drag-and-drop reordering
- Remove individual images functionality
-
Upload API Enhancement
- Accept alt text in upload request
- Return complete media object with metadata
- Handle batch uploads with individual alt text
Phase 3: Form Integration (High Priority)
-
Project Forms Enhancement
- Replace logo field with ImageUploader
- Add featured image with ImageUploader
- Implement gallery section with GalleryUploader
- Add secondary "Browse Library" buttons
-
Post Forms Enhancement
- Photo post type with GalleryUploader
- Album creation with GalleryUploader
- Featured image selection for text posts
Phase 4: Media Library Management (Medium Priority)
-
Enhanced Media Library Page
- Alt text editing for existing media
- Usage tracking display (shows where media is used)
- Bulk alt text editing
- Search and filter by alt text
-
MediaLibraryModal for Selection
- Browse existing media interface
- Single and multiple selection modes
- Integration as secondary option in forms
Phase 5: Polish and Advanced Features (Low Priority)
-
Advanced Upload Features
- Image resizing/optimization options
- Automatic alt text suggestions (AI integration)
- Bulk upload with CSV metadata import
-
Usage Analytics
- Dashboard showing media usage statistics
- Unused media cleanup tools
- Duplicate detection and management
Success Criteria
Functional Requirements
Primary Workflow (Direct Upload)
- Drag-and-drop upload works in all form components
- Click-to-browse file selection works reliably
- Immediate upload and preview happens without page navigation
- Alt text input appears and saves with uploaded media
- Upload progress is clearly indicated with percentage
- Error handling provides helpful feedback for failed uploads
- Multiple file upload works with individual progress tracking
- Gallery reordering works with drag-and-drop after upload
Secondary Workflow (Media Library)
- Media Library Modal opens and closes properly with smooth animations
- Single and multiple selection modes work correctly
- Search and filtering return accurate results
- Usage tracking shows where media is referenced
- Alt text editing works in Media Library management
- All components are keyboard accessible
Performance Requirements
- Modal opens in under 200ms
- Media grid loads in under 1 second
- Search results appear in under 500ms
- Upload progress updates in real-time
- No memory leaks when opening/closing modal multiple times
UX Requirements
- Interface is intuitive without instruction
- Visual feedback is clear for all interactions
- Error messages are helpful and actionable
- Mobile/tablet interface is fully functional
- Loading states prevent user confusion
Technical Considerations
State Management
- Use Svelte runes for reactive state
- Maintain selection state during modal lifecycle
- Handle API loading and error states properly
Accessibility
- Proper ARIA labels and roles
- Keyboard navigation support
- Focus management when modal opens/closes
- Screen reader announcements for state changes
Performance
- Lazy load thumbnails as they come into view
- Debounce search input to prevent excessive API calls
- Efficient reordering without full re-renders
- Memory cleanup when modal is closed
Error Handling
- Network failure recovery
- Upload failure feedback
- File validation error messages
- Graceful degradation for missing thumbnails
Future Enhancements
Nice-to-Have Features
- Bulk Operations: Delete multiple files, bulk tag editing
- Advanced Search: Search by tags, date range, file size
- Preview Mode: Full-size preview with navigation
- Folder Organization: Create folders/categories for organization
- Smart Suggestions: Recently used, similar images
- Crop Tool: Basic cropping interface within modal
- Alt Text Editor: Quick alt text editing for accessibility
Integration Opportunities
- CDN Optimization: Automatic image optimization settings
- AI Tagging: Automatic tag generation for uploaded images
- Duplicate Detection: Warn about similar/duplicate uploads
- Usage Analytics: Track which media is used most frequently
Development Checklist
Core Components
- MediaLibraryModal base structure
- MediaSelector with grid layout
- MediaUploader with drag-and-drop
- Search and filter interface
- Pagination implementation
Form Integration
- MediaInput generic component
- ImagePicker specialized component
- GalleryManager with reordering
- Integration with existing project forms
- Integration with post forms
Polish and Testing
- Responsive design implementation
- Accessibility testing and fixes
- Performance optimization
- Error state handling
- Cross-browser testing
- Mobile device testing
This Media Library system will serve as the foundation for all media-related functionality in the CMS, enabling rich content creation across projects, posts, and albums.