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
- Products catalog (/products) — same photos, browse and buy as-is
+ Plain catalog (/products/plain) — blank/unprinted items
+
+
+
+ Ready-Made catalog (/products/ready-made) — pre-finished items
-
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
-
- Products catalog (/products) — same photos, browse and buy as-is
+
+ Plain catalog (/products/plain) — blank/unprinted items
+
+
+
+ Ready-Made catalog (/products/ready-made) — pre-finished items
- 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