diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 7fff6c1..37163e1 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -86,7 +86,8 @@ "Bash(git commit -m 'Feature: Add product selection when starting design from photo request *)", "Bash(git commit -m 'Refactor: Move start design server action to separate file *)", "Bash(git commit -m 'Add: Prominent '\\\\''Shop plain items'\\\\'' section to homepage *)", - "Bash(git commit -m 'Feature: Royal Mail shipping integration with weight-based postage *)" + "Bash(git commit -m 'Feature: Royal Mail shipping integration with weight-based postage *)", + "Bash(git commit -m 'Add: Weight field to product admin pages *)" ] } } diff --git a/src/app/admin/products/[id]/edit/page.tsx b/src/app/admin/products/[id]/edit/page.tsx index a202724..aac09a4 100644 --- a/src/app/admin/products/[id]/edit/page.tsx +++ b/src/app/admin/products/[id]/edit/page.tsx @@ -239,6 +239,25 @@ export default async function EditProductPage({ params }: { params: { id: string

+
+ + +

+ Used for Royal Mail shipping cost calculation at checkout. Enter weight in kilograms. +

+
+
{product.imageUrl && ( diff --git a/src/app/admin/products/actions.ts b/src/app/admin/products/actions.ts index 17eef95..adb0cb2 100644 --- a/src/app/admin/products/actions.ts +++ b/src/app/admin/products/actions.ts @@ -96,6 +96,10 @@ export async function createProduct(formData: FormData) { .map((s) => s.trim()) .filter(Boolean); + // Weight in kilograms converted to grams + const weightKgInput = String(formData.get('weightKg') ?? '').trim(); + const weightGrams = weightKgInput ? Math.round(Number(weightKgInput) * 1000) : null; + const imageUrl = imageFile && imageFile.size > 0 ? await fileToDataUrl(imageFile) : null; const imageUrlBack = imageBackFile && imageBackFile.size > 0 ? await fileToDataUrl(imageBackFile) : null; const colorPhotos = await extractColorPhotos(formData, colors, 'front'); @@ -132,6 +136,7 @@ export async function createProduct(formData: FormData) { description: description || `${name} — personalize it your way.`, basePrice: Math.round(priceDollars * 100), personalisedPrice: personalisedPriceDollars ? Math.round(Number(personalisedPriceDollars) * 100) : null, + weightGrams, ...saleFields, colors: JSON.stringify(colors), colorPhotos: Object.keys(colorPhotos).length > 0 ? JSON.stringify(colorPhotos) : null, @@ -173,6 +178,10 @@ export async function updateProduct(formData: FormData) { const referenceWidthCm = referenceWidthCmInput ? Number(referenceWidthCmInput) : null; const referenceHeightCm = referenceHeightCmInput ? Number(referenceHeightCmInput) : null; + // Weight in kilograms converted to grams + const weightKgInput = String(formData.get('weightKg') ?? '').trim(); + const weightGrams = weightKgInput ? Math.round(Number(weightKgInput) * 1000) : null; + if (!id) throw new Error('Missing product id.'); if (!name || !category || !priceDollars) { throw new Error('Name, category, and price are required.'); @@ -234,6 +243,7 @@ export async function updateProduct(formData: FormData) { showOnProducts: boolean; referenceWidthCm: number | null; referenceHeightCm: number | null; + weightGrams: number | null; imageUrl?: string; imageUrlBack?: string; printArea?: string; @@ -255,6 +265,7 @@ export async function updateProduct(formData: FormData) { showOnProducts, referenceWidthCm, referenceHeightCm, + weightGrams, }; // Only touch the front photo/print area if a new photo was actually uploaded — diff --git a/src/app/admin/products/new/page.tsx b/src/app/admin/products/new/page.tsx index 72bb0ea..2929b69 100644 --- a/src/app/admin/products/new/page.tsx +++ b/src/app/admin/products/new/page.tsx @@ -214,6 +214,24 @@ export default async function NewProductPage() {

+
+ + +

+ Used for Royal Mail shipping cost calculation at checkout. Enter weight in kilograms. +

+
+