feat: Adressbuch-Block mit Suche, Org- und Buchstabenfilter
Deploy / verify (push) Successful in 1m14s
Deploy / deploy (push) Successful in 1m18s

- AdressbuchBlock: listet alle Kontakte alphabetisch mit Suche,
  Org-Filter-Chips und A–Z-Buchstabenfilter; /adressbuch-Seite
- ContactCard: neues Design passend zu OrganisationsCard (Badges, Links)
- ContactsBlock: Karussell mit snap-scroll, volle Breite
- block-types, blog-utils, cms: AdressbuchBlockData, resolveAdressbuchBlocks,
  getContacts; BlockRenderer registriert adressbuch
- Kontakt-Seite: Link auf /adressbuch statt eingebettetem Block

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Peter Meier
2026-06-04 10:08:54 +02:00
parent 7bd62b75b0
commit 363d4edb76
9 changed files with 298 additions and 23 deletions
+17
View File
@@ -1067,3 +1067,20 @@ export async function getCommentCounts(
return {};
}
}
/** Alle Kontakte (GET /api/content/contact), alphabetisch nach Name. */
export async function getContacts(): Promise<Record<string, unknown>[]> {
return cached("contact", "contact:list:all", async () => {
const base = getBaseUrl();
const url = new URL(`${base}/api/content/contact`);
url.searchParams.set("_per_page", "1000");
url.searchParams.set("_resolve", "all");
url.searchParams.set("_depth", "2");
url.searchParams.set("_sort", "name");
url.searchParams.set("_order", "asc");
const res = await cmsFetch(url.toString());
if (!res.ok) return [];
const data = (await res.json()) as { items?: Record<string, unknown>[] };
return data.items ?? [];
});
}