Commit graph

118 commits

Author SHA1 Message Date
444fd1e6fd Merge pull request 'fix(backup): mc image entrypoint' (#62) from fix/backup-mc-entrypoint into main
All checks were successful
CI / test (push) Successful in 1m56s
2026-06-01 20:21:42 +00:00
Claude Integration
92deffa109 fix(backup): minio/mc a entrypoint=mc, ajouter --entrypoint /bin/sh pour wrapper
All checks were successful
CI / test (pull_request) Successful in 1m58s
2026-06-01 20:21:40 +00:00
cf9ee2bd1e Merge pull request 'feat(hardening): rate limit + cron + backup' (#61) from feat/production-hardening into main
All checks were successful
CI / test (push) Successful in 2m7s
2026-06-01 20:16:59 +00:00
Claude Integration
a373bd60ad feat(hardening): rate limit (signup/reset/bookings) + tâches cron + backup PostgreSQL nocturne
All checks were successful
CI / test (pull_request) Successful in 2m10s
2026-06-01 20:16:57 +00:00
f1fb06b0af Merge pull request 'fix: rebrancher /espace-hote sur le dashboard' (#60) from fix/host-dashboard-page into main
All checks were successful
CI / test (push) Successful in 2m7s
2026-06-01 16:20:08 +00:00
Claude Integration
55c0244336 fix: rebrancher espace-hote/page.tsx sur le nouveau dashboard (oubli PR#59)
All checks were successful
CI / test (pull_request) Successful in 2m24s
2026-06-01 16:20:06 +00:00
d1a1bb04de Merge pull request 'feat: espace hôte dashboard + lightbox galerie' (#59) from feat/host-dashboard-and-lightbox into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-01 16:16:27 +00:00
Claude Integration
1e6acf29b9 feat: dashboard espace hôte (KPIs + résa pending + carbets + activité) + lightbox galerie
All checks were successful
CI / test (pull_request) Successful in 2m42s
2026-06-01 16:16:25 +00:00
3e109fb7b4 Merge pull request 'fix: facettes search effectives' (#58) from fix/search-facets into main
All checks were successful
CI / test (push) Successful in 2m0s
2026-06-01 10:21:06 +00:00
Claude Integration
a58815ec9c fix: ajout effectif facettes priceMax + amenities dans SearchFilters (oubli PR#57)
All checks were successful
CI / test (pull_request) Successful in 2m10s
2026-06-01 10:21:03 +00:00
61ccb05c75 Merge pull request 'feat: reset password + mon-compte + facettes recherche' (#57) from feat/reset-profile-facets into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-01 10:16:39 +00:00
Claude Integration
a6df96db7e feat: reset password + page mon-compte (RGPD) + facettes recherche (prix max, équipements)
All checks were successful
CI / test (pull_request) Successful in 2m19s
2026-06-01 10:16:37 +00:00
0b5e5408e8 Merge pull request 'feat: calendrier visuel + carte Leaflet' (#56) from feat/visual-calendar-and-map into main
All checks were successful
CI / test (push) Successful in 1m53s
2026-06-01 05:27:35 +00:00
Claude Integration
31aa7a4865 feat: calendrier visuel mensuel + carte Leaflet sur fiche carbet
All checks were successful
CI / test (pull_request) Successful in 2m0s
2026-06-01 05:27:33 +00:00
231416dd08 Merge pull request 'feat: SiteHeader global' (#55) from feat/site-header into main
All checks were successful
CI / test (push) Successful in 1m58s
2026-06-01 04:29:53 +00:00
Claude Integration
3bc52b2b60 feat: global SiteHeader avec user menu (login/inscription, Mes réservations, Espace hôte, Admin)
All checks were successful
CI / test (pull_request) Successful in 2m9s
2026-06-01 04:29:52 +00:00
4e8b88ab34 Merge pull request 'fix(ci): lint errors qui bloquaient le runner' (#54) from fix/ci-lint-errors into main
All checks were successful
CI / test (push) Successful in 1m58s
2026-06-01 04:18:51 +00:00
Claude Integration
6eed6bffc8 fix(ci): 5 erreurs ESLint Next 16 (Date.now impure, <a> vers /admin, setState dans effect)
All checks were successful
CI / test (pull_request) Successful in 2m0s
2026-06-01 04:18:49 +00:00
ccaad1d546 Merge pull request 'feat(p2): tests + health + metrics + CI' (#53) from feat/p2-tests-health-ci into main
Some checks failed
CI / test (push) Failing after 1m2s
2026-06-01 02:27:16 +00:00
Claude Integration
14fd9a5940 feat(p2): vitest + 27 tests + /api/health enrichi + /api/metrics + workflow CI
Some checks failed
CI / test (pull_request) Failing after 2m13s
2026-06-01 02:27:14 +00:00
56e5c48a84 Merge pull request 'feat(p1): calendar + emails' (#52) from feat/p1-calendar-legal-emails into main 2026-06-01 02:20:40 +00:00
Claude Integration
b59b8a0af2 feat(p1): calendrier dispo + emails Resend + amount calculé + best-effort welcome/confirmation/refund 2026-06-01 02:20:38 +00:00
4e14854245 Merge pull request 'feat(p0): pricing + booking + signup' (#51) from feat/p0-pricing-booking-signup into main 2026-06-01 01:34:03 +00:00
Claude Integration
e79b6dd141 feat(p0): prix/nuit + booking form public + /inscription + /reservations/[id] 2026-06-01 01:34:00 +00:00
f09a680059 Merge pull request 'feat(admin): /admin/home — éditeur page d'accueil' (#50) from feat/admin-home-editor into main 2026-06-01 01:10:51 +00:00
Claude Integration
a9fcd18022 feat(admin): /admin/home — éditeur des textes de la page d'accueil (FR+EN, override DB) 2026-06-01 01:10:49 +00:00
d3cc5bdfb9 Merge pull request 'fix(admin): PATCH content-pages respecte ?lang=' (#49) from fix/admin-content-pages-patch-lang into main 2026-06-01 00:51:21 +00:00
Claude Integration
1f8dd90979 fix(admin): PATCH content-pages respecte ?lang= (sinon écrasait FR) 2026-06-01 00:51:19 +00:00
0244eb5029 Merge pull request 'fix(admin): content-pages multilang' (#48) from fix/admin-content-pages-multilang into main 2026-06-01 00:49:32 +00:00
Claude Integration
a5ae692cf4 fix(admin): content-pages éditait FR quel que soit le lien cliqué — support multilang complet 2026-06-01 00:49:31 +00:00
c8c97e467d Merge pull request 'feat(admin): Sprint 6 — Polish' (#47) from feat/admin-sprint6-polish into main 2026-06-01 00:44:41 +00:00
Claude Integration
4e6867b365 feat(admin): Sprint 6 — /admin/media gallery + theme write-through 2026-06-01 00:44:39 +00:00
f9c10f151c Merge pull request 'feat(admin): Sprint 5 — Gouvernance' (#46) from feat/admin-sprint5-gouvernance into main 2026-06-01 00:13:51 +00:00
Claude Integration
79ddcd23f5 feat(admin): Sprint 5 — Audit log + Settings (gouvernance) 2026-06-01 00:13:49 +00:00
2ad4cbed80 Merge pull request 'feat(admin): Sprint 4 — Écosystème' (#45) from feat/admin-sprint4-ecosysteme into main 2026-05-31 21:36:24 +00:00
Claude Integration
99f3bbdc71 feat(admin): Sprint 4 — Organisations CE + Prestataires pirogue (CRUD) 2026-05-31 21:36:22 +00:00
19b4ff8293 Merge pull request 'feat(admin): Sprint 3 — Activity' (#44) from feat/admin-sprint3-activity into main 2026-05-31 21:20:48 +00:00
Claude Integration
d9ee072744 feat(admin): Sprint 3 — Réservations, Utilisateurs, Avis 2026-05-31 21:20:46 +00:00
8f31047b36 Merge pull request 'chore: prisma type + cleanup' (#43) from chore/admin-carbets-prisma-where into main 2026-05-31 21:08:37 +00:00
Claude Integration
fea55a7ddb chore(admin): Prisma.CarbetWhereInput type + cleanup options orphelines 2026-05-31 21:08:35 +00:00
00a5533bea Merge pull request 'chore: split options client/server' (#42) from chore/admin-carbet-options-split into main 2026-05-31 21:06:49 +00:00
Claude Integration
fc01144e0e chore(admin): split options enum dans fichier neutre
Le client component CarbetForm importait des options depuis lib/admin/carbets
qui contient "server-only" → erreur build turbopack. Sortie des options dans
src/lib/admin/carbet-options.ts sans server-only.
2026-05-31 21:06:47 +00:00
820f7a821b Merge pull request 'feat(admin): CRUD carbets + médias (Sprint 2)' (#41) from feat/admin-carbets-crud into main 2026-05-31 21:04:56 +00:00
Claude Integration
9aa0771001 feat(admin): CRUD complet carbets + gestion médias (Sprint 2)
Server actions (src/app/admin/carbets/actions.ts) avec validation Zod :
- createCarbetAction → INSERT + audit + redirect /admin/carbets/[id]
- updateCarbetAction → UPDATE + revalidate page publique
- updateCarbetStatusAction → DRAFT/PUBLISHED/ARCHIVED
- deleteCarbetAction → soft archive (bookings/reviews FK Restrict)
- addMediaAction(carbetId, fd) → INSERT Media + sortOrder
- removeMediaAction, reorderMediaAction (transactionnel up/down)

Helpers (src/lib/admin/carbets.ts) :
- listCarbetsAdmin avec filtres (q/river/status/accessType)
- listDistinctRivers, listOwners, listPirogueProviders
- getCarbetForEdit (include owner, provider, media, _count bookings/reviews)
- Options enum pour les selects (ACCESS_TYPE, TRANSPORT_MODE, STATUS)

Pages :
- /admin/carbets : liste tableau dense avec recherche/filtres GET, status badge,
  liens vers édition, count médias/résas
- /admin/carbets/new : page création avec CarbetForm
- /admin/carbets/[id] : header titre+badge+actions, MediaManager, CarbetForm
  d'édition. Lien public si PUBLISHED.

Composants admin réutilisables :
- StatusBadge (DRAFT/PUBLISHED/ARCHIVED + statuts Booking)
- FormField + inputCls/selectCls/textareaCls
- CarbetForm (client, 5 sections : identité, localisation, accès, séjour,
  publication) avec useTransition + erreur + succès inline
- MediaManager (client, liste + reorder ↑↓ + suppression + ajout par URL)
- StatusActions (client, publier/dépublier/archiver/réactiver avec confirm)

API :
- GET /api/admin/carbets/[id]/media pour refresh client après mutation

Audit léger en log console (JSON structuré) — Sprint 5 ajoutera la table.
2026-05-31 19:51:33 +00:00
3ec7a3ff10 Merge pull request 'feat(admin): shell + dashboard + ⌘K (Sprint 1)' (#40) from feat/admin-shell-foundation into main 2026-05-31 18:22:08 +00:00
Claude Integration
bcb93c6b29 feat(admin): shell admin + dashboard KPI + recherche ⌘K (Sprint 1)
Layout admin :
- src/app/admin/layout.tsx : route protégée requireRole(ADMIN), sidebar + topbar + breadcrumbs, data-admin sur racine pour theme sobre indépendant du theme public
- Sidebar : 12 sections groupées (Vue d'ensemble, Catalogue, Activité, Membres, Contenu, Système), highlight de la route courante
- TopBar : prompt ⌘K, lien vers site public, email admin
- Breadcrumbs : auto depuis pathname
- CommandPalette : ⌘K / Ctrl K, navigation ↑↓ + Entrée, recherche live debounced 150ms

Dashboard :
- 7 KPI cards avec tone neutral/ok/warn/info (réservations semaine, confirmées 30j, revenus reversés, occupation, nouveaux users, carbets publiés, avis à modérer)
- Section raccourcis fréquents

Theme admin :
- globals.css : [data-admin] override le background+font, neutralise les borders sépia/papier teinté du theme aquarelle, garantit lisibilité permanente

Recherche globale :
- lib/admin/search.ts : query parallèle sur Carbet, User, Booking, ContentPage, PirogueProvider (5 résultats par catégorie, LIKE insensitive)
- api/admin/search?q=… route handler avec requireRole

KPI :
- lib/admin/kpis.ts : 7 métriques live (cache 0), Promise.all, helper formatEur

Pas de dépendance externe ajoutée (cmdk, shadcn) — composants custom Tailwind pour rester léger.
2026-05-31 18:21:50 +00:00
ffb39a3bf5 Merge pull request 'feat(plugin): aquarelle seed media + upload script' (#39) from feat/aquarelle-seed-media into main 2026-05-31 12:20:56 +00:00
Claude Integration
47258bf1be feat(plugin): image-gallery-aquarelle-seed hook + upload script
Hook onEnable du plugin image-gallery-aquarelle-seed :
- Pour chaque carbet démo, crée une entrée Media qui pointe vers son aquarelle
  hébergée dans MinIO sous karbe-medias/seed/aquarelle/.
- s3Key préfixé seed/aquarelle/ pour faciliter le détachement au disable.
- Idempotent (skip si Media existe déjà).

Hook onDisable :
- Supprime tous les Media avec s3Key startsWith seed/aquarelle/.
- Les fichiers MinIO restent (pas de coût de redéploiement).

Script scripts/upload-aquarelles.sh :
- Upload depuis /tmp/karbe-aquarelles/*.{jpg,png} vers le bucket karbe-medias.
- Applique la policy public-download au bucket pour que media.karbe.cosmolan.fr
  serve les fichiers sans auth.
- À exécuter une fois après génération des illustrations.
2026-05-31 12:20:35 +00:00
93aebc4e87 Merge pull request 'feat(plugin): theme-aquarelle + hero' (#38) from feat/theme-aquarelle into main 2026-05-31 12:15:30 +00:00
Claude Integration
c69c355f90 feat(plugin): theme-aquarelle + hero variant (Phase 2.4 partie 1/2)
Registry : ajoute 2 plugins :
- theme-aquarelle (carnet naturaliste XIXᵉ, mutual exclusion avec theme-guyane)
- image-gallery-aquarelle-seed (14 aquarelles → MinIO + Media carbets démo)

Hooks :
- theme-guyane et theme-aquarelle se désactivent mutuellement au toggle ON
  via disableOtherTheme()

CSS (globals.css) :
- body[data-theme=aquarelle] : background papier teinté #faf5e9 + texture
  grain papier inline SVG + radial gradients ocres/canopy délavés
- Surcharges automatiques des borders zinc/gray vers sépia délavé

Layout :
- PT_Serif (au lieu de Cormorant) en theme aquarelle, plus dense et encrée
- data-theme = aquarelle prioritaire sur guyane si les deux sont enabled
  (défensif — le hook garantit normalement la mutual exclusion)

Hero :
- 2 versions dans le composant : guyane (existant, SVG CarbetRiver) et
  aquarelle (image MinIO 01-hero-fleuve-maroni.jpg en fond, voile crème,
  texte sépia, CTAs carrés sans rounded, hairlines, ornement de planche)
- Branchement via getActiveTheme()
- aquarelleUrl() helper qui construit l'URL MinIO publique

Partie 2/2 (PR ultérieure) : upload des 14 images dans MinIO + hook
image-gallery-aquarelle-seed + variantes aquarelle des autres composants
(CarbetCard, ExperiencesSection, HowItWorksSection, CESection, Footer).
2026-05-31 12:15:07 +00:00