Ajoute la page Annuaire publique (/annuaire) reliée aux fiches adhérents

Liste des adhérents actifs avec recherche (nom/métier), filtre par commune,
filtres catégories (chips + compteurs), tri (A–Z / avec promotions), état vide
et CTA d'adhésion — fidèle à la maquette. Chaque carte ouvre la fiche adhérent
(/adherents/[id]). La recherche de l'accueil et la nav pointent vers /annuaire
(la barre de recherche pré-remplit via ?q=). Nouvelles requêtes annuaire.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
This commit is contained in:
Claude committed 2026-06-26 21:13:59 +00:00
1 parent 3a6273c5b4
commit a6718c90f1
5 files changed
+455 -6

No files matched your search

+32 -1
View File
@@ -1,7 +1,38 @@
import { and, count, desc, eq } from "drizzle-orm";
import { and, asc, count, desc, eq } from "drizzle-orm";
import { db } from "@/db";
import { categories, members, promotions } from "@/db/schema";
export async function getActiveMembersWithCategory() {
return db
.select({
id: members.id,
name: members.name,
description: members.description,
city: members.city,
address: members.address,
categoryLabel: categories.label,
accent: categories.accent,
})
.from(members)
.leftJoin(categories, eq(members.categoryId, categories.id))
.where(eq(members.status, "active"))
.orderBy(asc(members.name));
}
export async function getAllCategories() {
return db
.select({ id: categories.id, label: categories.label, accent: categories.accent })
.from(categories)
.orderBy(asc(categories.sort));
}
export async function getLiveBadgesByMember() {
return db
.select({ memberId: promotions.memberId, badge: promotions.badge })
.from(promotions)
.where(eq(promotions.status, "live"));
}
export async function getCategoriesWithCounts(limit = 6) {
const rows = await db
.select({