diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 60e8bca..a49204e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -50,7 +50,8 @@ model Product { // instead of being shown as a fixed image. Only looks right for black/white/gray // source photos — recoloring an already-colored photo produces muddy results. showOnPersonalised Boolean @default(true) // list on /made-to-order - showOnProducts Boolean @default(false) // list on /products — same product/photo can show on both + showAsPlain Boolean @default(false) // list on /products/plain — blank/unprinted items + showAsReadyMade Boolean @default(false) // list on /products/ready-made — pre-finished items createdAt DateTime @default(now()) salePrice Int? // cents — set alongside a date window below to put this product on sale diff --git a/src/app/admin/products/[id]/edit/page.tsx b/src/app/admin/products/[id]/edit/page.tsx index 9479ed9..f83fad9 100644 --- a/src/app/admin/products/[id]/edit/page.tsx +++ b/src/app/admin/products/[id]/edit/page.tsx @@ -48,15 +48,25 @@ export default async function EditProductPage({ params }: { params: { id: string + -

Check both to list the same product on both pages.

+

Select which catalog(s) this product appears in.

diff --git a/src/app/admin/products/actions.ts b/src/app/admin/products/actions.ts index 2c84e3e..8c1bc5b 100644 --- a/src/app/admin/products/actions.ts +++ b/src/app/admin/products/actions.ts @@ -76,7 +76,8 @@ export async function createProduct(formData: FormData) { const imageBackFile = formData.get('imageBack') as File | null; const photoRecolorable = String(formData.get('photoRecolorable') ?? '') === '1'; const showOnPersonalised = String(formData.get('showOnPersonalised') ?? '') === '1'; - const showOnProducts = String(formData.get('showOnProducts') ?? '') === '1'; + const showAsPlain = String(formData.get('showAsPlain') ?? '') === '1'; + const showAsReadyMade = String(formData.get('showAsReadyMade') ?? '') === '1'; const collectionIds = formData.getAll('collections').map((v) => String(v)); if (!name || !category || !priceDollars) { @@ -151,7 +152,8 @@ export async function createProduct(formData: FormData) { imageUrlBack, photoRecolorable, showOnPersonalised, - showOnProducts, + showAsPlain, + showAsReadyMade, collections: { connect: collectionIds.map((id) => ({ id })) }, }, }); @@ -174,7 +176,8 @@ export async function updateProduct(formData: FormData) { const imageBackFile = formData.get('imageBack') as File | null; const photoRecolorable = String(formData.get('photoRecolorable') ?? '') === '1'; const showOnPersonalised = String(formData.get('showOnPersonalised') ?? '') === '1'; - const showOnProducts = String(formData.get('showOnProducts') ?? '') === '1'; + const showAsPlain = String(formData.get('showAsPlain') ?? '') === '1'; + const showAsReadyMade = String(formData.get('showAsReadyMade') ?? '') === '1'; const collectionIds = formData.getAll('collections').map((v) => String(v)); const referenceWidthCmInput = String(formData.get('referenceWidthCm') ?? '').trim(); const referenceHeightCmInput = String(formData.get('referenceHeightCm') ?? '').trim(); @@ -267,7 +270,8 @@ export async function updateProduct(formData: FormData) { mockup: string; photoRecolorable: boolean; showOnPersonalised: boolean; - showOnProducts: boolean; + showAsPlain: boolean; + showAsReadyMade: boolean; referenceWidthCm: number | null; referenceHeightCm: number | null; weightGrams: number | null; @@ -290,7 +294,8 @@ export async function updateProduct(formData: FormData) { mockup, photoRecolorable, showOnPersonalised, - showOnProducts, + showAsPlain, + showAsReadyMade, referenceWidthCm, referenceHeightCm, weightGrams, diff --git a/src/app/admin/products/new/page.tsx b/src/app/admin/products/new/page.tsx index ab539a4..f555642 100644 --- a/src/app/admin/products/new/page.tsx +++ b/src/app/admin/products/new/page.tsx @@ -30,11 +30,15 @@ export default async function NewProductPage() { Personalised catalog (/made-to-order) — customers design their own +
-

Check both to list the same product on both pages.

+

Select which catalog(s) this product appears in.

diff --git a/src/app/products/page.tsx b/src/app/products/page.tsx index 5366b80..df1bfa8 100644 --- a/src/app/products/page.tsx +++ b/src/app/products/page.tsx @@ -47,7 +47,7 @@ export default async function ReadyMadeProductsPage({ searchParams }: { searchPa } const palette = Array.from(paletteSet); - const where: Prisma.ProductWhereInput = { showOnProducts: true }; + const where: Prisma.ProductWhereInput = { showAsReadyMade: true }; if (selectedCategories.length) { where.category = { in: selectedCategories }; } diff --git a/src/lib/product.ts b/src/lib/product.ts index fdc6496..22297de 100644 --- a/src/lib/product.ts +++ b/src/lib/product.ts @@ -28,7 +28,8 @@ export function toProductDTO(p: PrismaProduct, activePromotions: ActivePromotion imageUrlBack: p.imageUrlBack, photoRecolorable: p.photoRecolorable, showOnPersonalised: p.showOnPersonalised, - showOnProducts: p.showOnProducts, + showAsPlain: p.showAsPlain, + showAsReadyMade: p.showAsReadyMade, createdAt: p.createdAt.toISOString(), onSale, effectivePrice: price, diff --git a/src/lib/types.ts b/src/lib/types.ts index cf8db79..74feda2 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -52,7 +52,8 @@ export type ProductDTO = { imageUrlBack: string | null; photoRecolorable: boolean; showOnPersonalised: boolean; - showOnProducts: boolean; + showAsPlain: boolean; + showAsReadyMade: boolean; createdAt: string; onSale: boolean; effectivePrice: number; // basePrice, or the sale price while a sale is active