6 Commits

Author SHA1 Message Date
ordinarthur
f5671008a7 feat(admin): replace default edit view with visual preview editor
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 2m39s
Overriding admin.components.views.edit.default makes /admin/collections/
products/:id and /create render the product-detail panel directly —
text fields are contentEditable, the image is click-to-upload, and
price is inline-editable in the checkout-price-line. Fields that don't
fit the public template (slug, name, currency, availability, SEO,
isPublished, sortOrder, stripeID) live in a collapsible "Réglages
avancés" drawer below the panel.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:54:50 +02:00
ordinarthur
7962975dbd fix(admin): unblock product create page
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 2m39s
Two bugs compounded to render /admin/collections/products/create blank:

1. Dockerfile's STRIPE_SECRET_KEY build-time placeholder was too short
   (11 chars) to pass the regex that gates Stripe plugin sync. Build
   produced an importMap missing plugin-stripe components like LinkToDoc,
   warning at runtime and failing to render.

2. With autosave enabled, Payload creates a blank draft on page load.
   Plugin-stripe's beforeValidate hook fired against empty data, calling
   Stripe products.create with no name, throwing a 500 that aborted the
   page render.

Fix: use a 20+ char placeholder in the Dockerfile so the build-time
importMap mirrors runtime, and add a beforeValidate hook that sets
skipSync=true whenever productDisplayName is empty so Stripe sync
waits until the product has content.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:00:29 +02:00
ordinarthur
8fc3b2365a feat(admin): click-to-edit visual editor for products
Some checks failed
Build & Deploy to K3s / build-and-deploy (push) Failing after 14m11s
New "Édition visuelle" tab on the product edit view renders the
product panel with each text field wrapped in a contentEditable
InlineEditable that calls useField.setValue on blur. Combined with
the collection's existing autosave, changes persist automatically
without a manual save.

- InlineEditable: contentEditable wrapper backed by useField
- ProductPanelInfo: presentational product-panel JSX
- ProductPreviewEditor: default-exported custom view component
  registered at admin.components.views.edit.livePreview
- Image is read-only; slug/price/SEO still edited via default form tab

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 12:09:45 +02:00
ordinarthur
aeabd79ac6 fix: regenerate migration with stripe plugin fields
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 3m6s
Previous run generated the initial migration without STRIPE_SECRET_KEY
set, so the stripe plugin's sync was disabled and the stripeID/skipSync
columns were omitted. Prod then crashed on queries referencing
products.stripe_i_d. Regenerated with a placeholder key so the plugin
contributes its fields to the schema.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 11:02:19 +02:00
ordinarthur
955dbeb63b feat: add initial migration and run it on container start
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 3m6s
Payload's postgresAdapter `push: true` only runs in dev. Prod needs
committed migrations; the container now runs `payload migrate` before
starting Next.js so the schema is created on first deploy.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 10:45:03 +02:00
ordinarthur
bf5bf977e9 feat: replace Astro + Sanity + Fastify with Next.js + Payload CMS
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 4m13s
Single Next.js 15 app now serves frontend SSR, admin CMS, and Stripe API.
Replaces the Sanity quota-limited headless CMS with self-hosted Payload 3.0
on Postgres, removing the split-service topology (ssr/api/proxy → web).

- nextjs/: Next.js 15 app with Payload 3.0, Postgres adapter, Stripe plugin
- k8s/: new single-pod deployment + Postgres StatefulSet + PVCs (media, db)
- .gitea/workflows/deploy.yml: single-image build, tears down legacy pods

New Gitea secrets required: PAYLOAD_SECRET, POSTGRES_PASSWORD.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 10:28:29 +02:00