f1fb06b0af
Merge pull request 'fix: rebrancher /espace-hote sur le dashboard' ( #60 ) from fix/host-dashboard-page into main
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)
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
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
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
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)
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
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)
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
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
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
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)
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
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)
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
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
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
bb2fee7659
Merge pull request 'chore(admin): findUnique composite key' ( #37 ) from chore/admin-content-composite-key into main
2026-05-31 11:48:16 +00:00
Claude Integration
8196a1a3f9
chore(admin): adapter findUnique/update à la PK composite (slug, lang)
...
Admin édite la version FR par défaut. Édition multi-langues = future feature.
2026-05-31 11:48:14 +00:00
df9eb5fcbd
Merge pull request 'feat: pages contenu bilingues' ( #36 ) from feat/i18n-content-pages into main
2026-05-31 11:45:49 +00:00
Claude Integration
87c3e7a581
feat: ContentPage bilingue (PK composite slug+lang) + seed pages EN
...
Migration : ContentPage.id devient PK composite (slug, lang) au lieu de slug
seul, pour stocker une version FR et une version EN du même slug. Index sur
slug seul pour les lookups.
Schema Prisma : @@id([slug, lang]).
Helpers :
- getContentPage(slug, lang) avec fallback FR si la version dans la langue
demandée n'existe pas
- listContentPages(category?, lang?) accepte un filtre lang
- upsertContentPage : utilise le composite key
Pages publiques (a-propos, faq, comment-ca-marche, pour-comites-entreprise,
devenir-loueur, cgv, mentions-legales, politique-de-confidentialite) :
ajoutent un appel à getLocale() et le passent à getContentPage.
Seeds :
- src/lib/plugins/seeds/content-pages-en.ts : 8 pages traduites en anglais
- hook onEnable du plugin i18n-fr-en : seed EN pages au toggle on. Désactiver
i18n n'efface pas les EN pages (elles dorment, fallback FR reprend).
Résultat : quand l'utilisateur switche vers EN, /a-propos, /faq, /cgv, etc.
basculent en anglais. Le contenu hors-DB (composants UI) bascule déjà via les
dictionnaires de la PR i18n-fr-en initiale.
2026-05-31 11:45:47 +00:00