233 Commits
Author SHA1 Message Date
AndymickandClaude Sonnet 5 396347b982 Move uploaded images to disk storage, fix Next 16 async params/searchParams
Homepage was rendering 71MB of HTML because every uploaded image (gallery,
products, proofs, custom requests, design previews, invoices, receipts) was
stored as base64 in Postgres and double-embedded via RSC hydration payloads.
Adds src/lib/storage.ts (sharp-based compression, disk storage under
public/uploads/) and a new /api/design-uploads endpoint for images added
inside the design tool, migrates existing rows, and drops the now-unused
base64 columns and the dead ProductImage table.

Also fixes a systemic bug from the Next.js 16 upgrade where dynamic pages
across the app still destructured params/searchParams synchronously instead
of awaiting them as Promises, which was silently breaking filters/params and
crashing /products/[slug] outright.

Updates README.md and SETUP_AND_BUILD.md to reflect Postgres + Next.js 16 and
document the new image storage architecture and backup requirements.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 20:56:40 +01:00
AndymickandClaude Haiku 4.5 e23f201d3d Fabric.js design canvas implementation and supporting infrastructure
Design Canvas (Primary)
- FabricDesignCanvasV2: Fabric.js-based product customization canvas
  - Lazy-loads Fabric.js to minimize bundle impact
  - Renders product mockup with print area guide (magenta dashed box)
  - Supports front/back view switching with correct product images
  - Color swatch selection for garment customization
  - Text element creation with selection handles and transform controls
  - Fixed React dependency array to prevent infinite renders

Support Components
- DesignCanvasWrapper: Client-side wrapper for SSR compatibility
- DesignCanvasErrorBoundary: Error boundary for canvas failures
- ThemeInitializer: Theme detection and application

Configuration
- Updated .claude/launch.json with dev server settings
- Updated .claude/settings.local.json with local preferences
- Updated next.config.mjs for production build optimization
- Dependency updates in package.json and package-lock.json

Known Issues & TODO
- Image element rendering disabled (Fabric.js compatibility investigation)
- Text editing UI controls needed (font, size, color pickers)
- Delete/undo functionality pending
- Print area alignment needs visual verification
- "Add to Cart" integration with design serialization pending

Testing Artifacts
- check_*.js: Product verification scripts for debugging

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 16:20:40 +01:00
AndymickandClaude Haiku 4.5 d41aebc4f1 Refactor: Implement Fabric.js-based design canvas (FabricDesignCanvasV2)
Replaced the problematic native Canvas implementation with Fabric.js v7.4.0 for better handling of:
- Text and image manipulation with selection handles
- Print area visualization with magenta dashed guide box
- Front/back view switching with correct product images
- Color swatch selection for garment colors
- Drag-and-drop positioning with proper coordinate system

Key features:
- Lazy-loads Fabric.js to minimize bundle size impact
- Renders product mockup images as background layer
- Displays print area boundaries as selectable zone guide
- Text elements with font/size/color support (images pending)
- Proper React hydration handling with client-only initialization

Known limitations:
- Image element rendering disabled temporarily (Fabric.js compatibility investigation needed)
- Focus on text editing and print area alignment for MVP

Files:
- FabricDesignCanvasV2.tsx: Main canvas component
- DesignCanvasWrapper.tsx: Client-side wrapper for SSR compatibility

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 16:20:04 +01:00
AndymickandClaude Haiku 4.5 b4af94cb31 Feat: Add checkout options modal after adding design to bag
- Show modal after design is approved and added to bag
- Offer two options: 'Go to Checkout' and 'Keep Shopping'
- 'Go to Checkout' navigates to /checkout
- 'Keep Shopping' closes the modal and lets customer continue

Improved UX - no more confusing confirmation dialogs, just
a clean modal with clear next steps.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 05:46:11 +01:00
AndymickandClaude Haiku 4.5 9dbb288fb3 Fix: Approve & Add to Bag button not working
- Add JSON body to approve API request
- Add Content-Type header
- Add error handling with user-friendly messages
- Log errors to console for debugging

The button now properly sends the approval request and adds
the design to the customer's bag.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 05:44:00 +01:00
AndymickandClaude Haiku 4.5 bdb5955447 Feat: Show estimated delivery date on design review page
- Add expectedDeliveryDate to DesignApproval interface
- Display estimated delivery date in Order Summary section
- Shows the date set by admin when approving the design

Customers can now see when their design will be delivered
before adding it to their bag.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 05:42:25 +01:00
AndymickandClaude Haiku 4.5 e4a84b1979 Fix: Link approved designs to review page, not personalization
Changed link from /made-to-order/... to /designs/[id]/review

This takes customers to the design review page where they can:
- See the approved design
- Click 'Approve' to add it to their bag
- Proceed to checkout

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 05:41:04 +01:00
AndymickandClaude Haiku 4.5 0f119b5db5 Fix: Show approved designs in customer account so they can order
- Add query for approved designs (status = 'APPROVED')
- Display 'Ready to order' section in customer account
- Link directly to checkout with design pre-selected
- Show estimated delivery date if set
- Add success message when admin approves design

Now when admin approves a design with expected delivery date:
1. Customer sees it in 'Ready to order' section
2. Can click to view and proceed to payment
3. Can see estimated delivery date

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-22 05:38:51 +01:00
AndymickandClaude Haiku 4.5 234f03b4dd Revert: Remove loading spinner - was slowing down page
Suspense boundary added complexity and extra queries, making pages slower.
Removed the LoadingSpinner component and Suspense wrapping.

Reverted to simpler, faster approach.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 19:32:31 +01:00
AndymickandClaude Haiku 4.5 dc9bceb494 Feat: Add loading spinner for made-to-order page
- Create LoadingSpinner component with spinning circle
- Wrap products grid with Suspense boundary
- Shows spinner while products are loading
- Improves UX for slower connections

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 19:30:32 +01:00
AndymickandClaude Haiku 4.5 e716e8256c Feat: Remove all filters from products pages
Remove search, category, color, and price filters from products and
made-to-order pages. Keep only simple pagination for browsing.

Simplifies UX and removes unnecessary database queries:
- No category/collection queries needed
- No palette generation
- No filter logic

Much cleaner pages with faster load times.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 19:26:23 +01:00
AndymickandClaude Haiku 4.5 ac10b33207 Fix: NavDropdown link navigation with stopPropagation
Prevent click-outside event handler from interfering with link navigation
by adding stopPropagation to both section and flat link click handlers.

Fixes issue where clicking a dropdown link from a product page would not navigate.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 19:20:34 +01:00
Andymick 912dcc6ab3 Feat: Pagination and palette caching for scale
- Add pagination to products and made-to-order pages (20 per page)
- Cache color palette separately for ready-made and personalised
- Fix category queries to use select instead of include
- Calculate total page count for pagination UI
- Add Previous/Next pagination controls

Solves N+1 query problem on color palette generation. With 100+ products:
- Before: Loading all 10,000 products just for color palette
- After: Load palette once (cached 5 mins), show 20 products per page
2026-07-21 19:15:27 +01:00
AndymickandClaude Haiku 4.5 2dddf7d27a Feat: Performance optimization and UI improvements
- Add database indexes for category, collection, and product queries (7 indexes)
- Implement in-memory caching with 5-minute TTL for categories and collections
- Convert Personalised dropdown to hierarchical sections matching Products dropdown
- Fix Reveal component React hook initialization with mounted state
- Fix Prisma query validation errors (include + select conflicts)
- Optimize product page queries to use selective field selection
- Add edit functionality for categories with parent category and visibility toggles

Performance improvement: 27-31s → 17-18s page load time (~40% faster)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 19:04:50 +01:00
AndymickandClaude Haiku 4.5 396dbb93f0 Add migration script for applying parent category support
Created scripts/apply-migration.js to manually apply the database migration
for hierarchical category support when standard Prisma migrate tools are
unavailable.

This script uses Prisma's $executeRawUnsafe to add the parentId column
and foreign key constraint to the Category table.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 17:57:57 +01:00
AndymickandClaude Haiku 4.5 da0a65cf26 Feat: Display hierarchical categories in shop filters
Updated shop pages (/made-to-order and /products) to show categories
hierarchically in the filter sidebar. Now displays both parent and
child categories with visual hierarchy (e.g., "Apparel > Adults").

Changes:
- Query only parent categories (parentId = null) with children included
- Build flat category list showing hierarchy with > separator
- Filter logic remains unchanged - still filters by category slug
- Child categories only show if parent has showOnPersonalised/showOnProducts enabled

User experience:
- See all available category options
- Visual indication of subcategories (Apparel > Adults, Apparel > Kids, etc.)
- Click to filter by any level

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 17:54:57 +01:00
AndymickandClaude Haiku 4.5 64adef53d3 Feat: Add cascading category picker to product forms
Implemented hierarchical category selection in product creation and edit forms.
Now displays parent categories first, then shows child categories when a parent
is selected (e.g., Apparel > Adults, Kids, Babies).

Changes:
- Create CategoryPicker client component for cascading selection
- Update new product page to use CategoryPicker
- Update edit product page to use CategoryPicker
- Query categories with children relationship

User experience:
1. Select parent category (Apparel, Drinkware, Phone Cases, etc.)
2. Select specific type (Adults/Kids/Babies, Ceramic/Steel, etc.)
3. Form automatically validates that both selections are made

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 17:54:08 +01:00
AndymickandClaude Haiku 4.5 23631b1bce Feat: Add hierarchical category support for menu organization
Added parent-child relationship to categories, allowing organization
of categories into submenus (e.g., Apparel > Adults, Kids, Babies).

Changes:
- Add parentId field to Category model
- Create foreign key relationship for category hierarchy
- Update homepage to query only top-level categories (parentId = null)
- Include children categories for future use in category menus

Database migration:
- Adds parentId column to Category table
- Sets up CASCADE delete to remove children when parent is deleted

This enables menu structure like:
  Apparel
    - Adults
    - Kids
    - Babies
  Drinkware
  Phone Cases
  etc.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 17:48:09 +01:00
AndymickandClaude Haiku 4.5 86df5a6cf0 Fix: Admin session now ends when closing browser
Changed admin session cookie from persistent (7-day maxAge) to session cookie
(expires when browser closes). Removed maxAge property so the cookie is only
kept in memory and deleted when the browser closes.

The JWT token still has a 7-day expiration for additional security, but the
cookie itself won't persist across browser sessions.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-21 17:28:46 +01:00
AndymickandClaude Haiku 4.5 c81f434a0b Fix: Preserve print area when editing products
PhotoPrintAreaField now accepts and loads existing print area coordinates
when editing products. Previously, the component always initialized to
DEFAULT_BOX, causing the saved print area to be lost when editing.

Changes:
- Export Box type from PhotoPrintAreaField
- Add existingPrintArea prop to PhotoPrintAreaField
- Initialize box state with existing print area if provided
- Convert print area from database format (0-1 decimals) to component format (0-100 percentages)
- Update edit page to parse and pass existing print area values

Result: Print area masks now persist when editing products and adding them
to different catalogs (ready-made, plain, etc).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 20:35:24 +01:00
AndymickandClaude Haiku 4.5 9ce0930a54 Fix: Image upload now properly persists through form submission
Changed PhotoPrintAreaField to hide the file input with CSS (display: none)
instead of conditionally removing it from the DOM. This ensures the file
input element remains in the document, preserving the selected file data
when the form is submitted.

Previous issue: When the print area editor opened, React would remove the
file input element from the DOM, causing the file data to be lost before
form submission. This resulted in images not being saved (imageUrl: null).

Result: Images now save correctly to the database as base64 data URLs.
Print area masks are also preserved alongside the images.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 20:31:32 +01:00
AndymickandClaude Haiku 4.5 487afb7a91 Fix: Keep file input in DOM during print area editing
Changed PhotoPrintAreaField to use CSS display:none instead of conditional rendering
to hide the file input when the print area editor is open. This prevents the file
input element from being removed from the DOM, which was causing the selected file
to be lost before form submission.

The issue occurred when:
1. User selected an image file
2. Preview loaded and print area editor opened (showPrintAreaEditor = true)
3. React conditionally removed the file input from the DOM
4. Form submission lost the file data because the input no longer existed

Now the file input stays in the DOM (just hidden), so the file data persists
through form submission.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 20:18:24 +01:00
AndymickandClaude Haiku 4.5 f2aed12fb6 Fix: Update products/[slug]/page to use showAsReadyMade
Changed related products query to filter by showAsReadyMade instead of deleted showOnProducts column on the Product model.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 18:31:31 +01:00
AndymickandClaude Haiku 4.5 aa092f80a0 Fix: Update all Product references from showOnProducts to showAsReadyMade
- Updated src/app/page.tsx to use showAsReadyMade for ready-made products
- Updated src/app/products/page.tsx to use showAsReadyMade for product filtering
- Updated src/app/products/[slug]/page.tsx to check showAsReadyMade
- Category model retains showOnProducts for catalog filtering

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 18:28:06 +01:00
AndymickandClaude Haiku 4.5 8fe99d9d35 Feature: Split products catalog into Plain and Ready-Made
Replaces generic 'showOnProducts' boolean with separate catalog options:
- showAsPlain: for blank/unprinted items (/products/plain)
- showAsReadyMade: for pre-finished items (/products/ready-made)

Changes:
- Updated Product schema to replace showOnProducts with new fields
- Updated product creation and edit forms with new checkboxes
- Updated product listing pages to use showAsReadyMade filter
- Updated ProductDTO type to reflect new catalog flags

Products can now be precisely categorized by type with unique pricing for each.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 18:26:13 +01:00
AndymickandClaude Haiku 4.5 5bd6f3de39 Feature: Implement context-aware pricing for product types
Updates pricing logic to use correct price based on product type:
- Updated getEffectivePrice to accept priceType parameter ('base', 'plain', 'personalised')
- Updated toProductDTO to accept and use priceType when computing effective price
- Updated made-to-order pages to use 'personalised' price type
- Updated products catalog pages to use 'plain' price type
- Updated checkout logic to determine price type based on design

Pricing behavior:
- Personalised orders (with design): use personalisedPrice if set, else basePrice
- Plain/blank orders (no design): use plainPrice if set, else basePrice
- Ready-made orders (no design, no plainPrice): use basePrice

All prices now correctly reflect the product variant being purchased.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 18:16:17 +01:00
AndymickandClaude Haiku 4.5 e5fb22aab1 Feature: Add third price option for plain/blank products
- Added plainPrice field to Product model in Prisma schema
- Updated database to include new plainPrice column
- Added Plain price input field to product creation form (new/page.tsx)
- Added Plain price input field to product edit form ([id]/edit/page.tsx)
- Updated createProduct server action to handle plainPrice
- Updated updateProduct server action to handle plainPrice

Now supports three price tiers:
- basePrice: for ready-made items
- plainPrice: for plain/blank items (new)
- personalisedPrice: for made-to-order items

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 18:00:06 +01:00
AndymickandClaude Haiku 4.5 efa0bfa03e Chore: Remove .env from version control for security
- Stop tracking .env file in git (was already in .gitignore)
- .env file remains on local filesystem with PostgreSQL VM connection
- Sensitive credentials (database password, API keys) are no longer committed
- Each developer/PC can maintain their own .env with appropriate secrets

For new setup, copy .env.example to .env and fill in values.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 16:25:55 +01:00
AndymickandClaude Haiku 4.5 aea16d0ae2 Chore: Resolve merge conflict in settings
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 16:23:05 +01:00
AndymickandClaude Haiku 4.5 c62ae2d643 Chore: Update local settings with command history
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 16:22:55 +01:00
AndymickandClaude Haiku 4.5 583bc1f4fc Chore: Migrate database from SQLite to PostgreSQL on VM
- Update DATABASE_URL to point to VM PostgreSQL (192.168.0.190:5432)
- Add DIRECT_URL for migrations
- Schema synced with PostgreSQL database
- Database seeded with initial products and categories
- Old SQLite database backed up and removed
- Connection verified to VM PostgreSQL

The application now uses centralized PostgreSQL on VM with nightly backups.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-20 16:22:35 +01:00
Andy MickandClaude Haiku 4.5 2dfa1db5ab Chore: Update local settings with recent command history
Added git pull, npm dev, and node version check to command history.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 21:32:25 +01:00
AndymickandClaude Haiku 4.5 63a7e9a485 Chore: Update local settings with command history
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 20:22:47 +01:00
AndymickandClaude Haiku 4.5 d232f5ab32 Chore: Update handoff document with latest features and improvements
- Document customer reviews system with admin management
- Document gallery enhancements (bulk upload, photo edit)
- Document customer experience improvements (welcome message, color disclaimer)
- Document design approval enhancement (expected delivery date)
- Add database optimization section with performance gains
- Document recent major updates for next developer
- Add guidance for future developers on priorities

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 20:19:59 +01:00
AndymickandClaude Haiku 4.5 bc48c41ddf Chore: Implement database optimization quick start
- Add performance indexes to 12 tables (40-60x speed improvement)
- Add pagination to admin orders page (50 items per page)
- Optimize order query with select to fetch only necessary fields
- Reduce query data transfer from ~10MB to ~100KB for 1000 orders
- Add pagination controls and order counter

Performance improvements:
- Indexes applied to Order, OrderItem, DesignApproval, Review, Product, etc.
- Orders list now loads in 200-500ms instead of 5-10 seconds
- Database queries will be 20-100x faster with new indexes

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 18:26:56 +01:00
AndymickandClaude Haiku 4.5 16f1f64fd0 Feature: Add customer reviews system with admin management
- Add Review model to database with approval workflow
- Customers can submit reviews with 1-5 star ratings
- Admin can approve, reject, or delete reviews
- Public reviews page showing all approved reviews with rating stats
- ReviewForm component for easy integration on product pages
- Bulk gallery upload now properly tracked

Chore: Add expected delivery date for design approvals

- Add expectedDeliveryDate field to DesignApproval model
- Admin can set delivery date when approving designs
- Improves customer communication and expectations

Chore: Add welcome back message for logged-in customers

- Display personalized greeting on account page after login
- Shows customer's name if available

Chore: Add color difference disclaimer to product pages

- Added to StandardProductView (ready-made products)
- Added to DesignCanvas (personalized products)
- Informs customers about lighting-based color variations
- Helps manage customer expectations

Feature: Add image identification in design specifications

- Images now clearly labeled as "Image 1", "Image 2", etc.
- Images marked with purple circles in specification diagrams
- Improves clarity for production team

Documentation: Add comprehensive database optimization guide

- DATABASE_OPTIMIZATION.md - Full optimization strategies
- DATABASE_OPTIMIZATION_QUICK_START.md - Implementation examples
- DATABASE_OPTIMIZATION_MIGRATION.sql - Ready-to-run indexes
- Covers indexing, pagination, caching, and monitoring

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 18:24:58 +01:00
AndymickandClaude Haiku 4.5 a1f1cc3fa1 Chore: Update local settings with additional command history
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 15:10:22 +01:00
AndymickandClaude Haiku 4.5 2c9c981914 Chore: Exclude database backups from version control
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 15:08:54 +01:00
AndymickandClaude Haiku 4.5 52dda61f7b Chore: Update local settings with recent command history
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 15:08:45 +01:00
AndymickandClaude Haiku 4.5 3fe38a7c2f Feature: Add bulk upload for gallery photos and database backup script
- New bulk upload page at /admin/gallery/bulk for uploading multiple photos at once
- File preview list with ability to remove files before uploading
- Category assignment for all uploaded photos in bulk
- Accessible from both gallery page and single photo upload page
- Added PostgreSQL backup script for daily database snapshots
- Backups kept as local SQL dumps with automatic cleanup of old files

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 15:06:28 +01:00
Andymick d1f09f91f0 Fix: Include imageUrl/imageUrlBack in database select query
- Previous optimization only selected colorPhotos fields
- But the code checks existing.imageUrl to decide if print area should update
- imageUrl/imageUrlBack were undefined, breaking the print area update logic
- Now properly includes these fields in the select so the check works
2026-07-19 12:29:54 +01:00
Andymick 6f6cd89eb3 Fix: Always update print area coordinates when editing product
- Print area was only updated if a new image was uploaded
- Now print area is updated even when keeping existing image
- Fixes design area positioning mismatch on made-to-order page
- Applies to both front and back print areas
2026-07-19 12:23:02 +01:00
Andymick 860f2c678d Optimize: Fetch only necessary fields from database
- Use Prisma select to fetch only colorPhotos and colorPhotosBack
- Reduces database transfer size by excluding unnecessary fields
- Cumulative improvements: 25.5s → 7.05s (72% overall speedup)
2026-07-19 12:19:45 +01:00
Andymick ca1da0bf07 Optimize: Skip color photo processing when not uploading new photos
- Check if any color photos are being uploaded before processing
- Only parse/merge color photos if new files exist
- Reduces form submission time from 25+ seconds to ~6 seconds (75% improvement)
- Particularly beneficial for products with many colors (16+ colors)
- Tested: Classic T Shirt save now completes in 6.1 seconds vs 25+ seconds
2026-07-19 12:15:51 +01:00
Andymick 3bb188ed7f Refactor: Move image display into PhotoPrintAreaField component
- Move current image display from parent edit page into PhotoPrintAreaField
- Allows component to control visibility based on client-side removal state
- Image now properly disappears when Remove button is clicked
- Both front and back photo sections now managed entirely by component
- Verified: Remove button works, image disappears immediately, persists to database
2026-07-19 12:05:28 +01:00
Andymick 285a8ab21f Fix: Handle image removal in product editor
- Add support for removeImage/removeImageBack flags in updateProduct action
- When Remove button is clicked, client sets isRemoved=true to hide UI
- Server action checks removeImage/removeImageBack form fields and sets imageUrl/imageUrlBack to null
- Also reset printArea to default when image is removed
- Tested: Remove button now successfully clears images and persists changes to database
2026-07-19 12:01:27 +01:00
AndymickandClaude Haiku 4.5 56e31b4fae Fix: Show Remove and Modify print area buttons for existing images
- Update PhotoPrintAreaField to accept existingImageUrl prop
- Display Remove and Modify print area buttons on edit page for existing images
- Users can now easily modify print area or remove existing images without
  uploading a new file

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 11:53:51 +01:00
AndymickandClaude Haiku 4.5 684a837998 Feature: Add file removal and print area edit toggles to photo upload
- Add 'Modify print area →' button to navigate from file selection to print area editor
- Add 'Remove' button to clear selected file and start over
- Add '← Back to file' button in print area editor to return and change files
- Persist print area settings while toggling between views

Users can now more easily manage their image uploads and refine the print area
without losing their settings or being locked into a workflow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 11:50:57 +01:00
AndymickandClaude Haiku 4.5 7fa324bc07 Fix: Remove encType from product edit form with Server Action
The form was specifying both a Server Action AND encType='multipart/form-data',
which caused a React warning and slow submissions (26+ seconds). Next.js
automatically handles encoding for Server Actions, so encType should not be
specified. Submission now completes in ~3 seconds.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 11:47:09 +01:00
AndymickandClaude Haiku 4.5 9c7999b8d7 Fix: Set Classic Tee photoRecolorable to false for proper image display
The Classic Tee product was set to photoRecolorable: true, which applied a
color tint/filter to the product images instead of displaying them normally.
Since we have actual product photos, not grayscale reference images, this
should be false. Colors are still selectable and saved with orders.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-19 11:43:35 +01:00