feat: redesign CMS and unify German admin UI

This commit is contained in:
2026-09-17 16:51:24 +02:00
parent a2b3e99174
commit 7ec0c51ff5
129 changed files with 952 additions and 550 deletions
+3 -3
View File
@@ -8,9 +8,9 @@ import { canViewAnalytics, isAdmin } from "@/access";
*/
export const AnalyticsSettings: GlobalConfig = {
slug: "analytics-settings",
label: "Analytics-Einstellungen",
label: "Auswertungs-Einstellungen",
admin: {
description: "Aufbewahrungsdauer für Analytics-Rohdaten und aggregierte Tagesstatistiken.",
description: "Aufbewahrungsdauer für Rohdaten und zusammengefasste Tagesstatistiken.",
group: "Datenschutz",
},
access: {
@@ -27,7 +27,7 @@ export const AnalyticsSettings: GlobalConfig = {
min: 7,
admin: {
description:
"Wie lange einzelne Analytics-Events gespeichert bleiben. Begrenzt auch den wählbaren Zeitraum im Analytics-Dashboard.",
"Wie lange einzelne Messwerte gespeichert bleiben. Begrenzt auch den wählbaren Zeitraum in der Auswertung.",
},
},
{
+5 -5
View File
@@ -3,12 +3,12 @@ import { isAdmin } from "@/access";
/**
* Consent-category configuration shown in the public cookie banner
* (components/Analytics.tsx). Read access is intentionally public — the
* (components/Analytics.tsx). Read access is intentionally public - the
* unauthenticated frontend needs the labels/descriptions and the
* enabled/disabled flags before a visitor has logged in anywhere.
*
* "necessary" deliberately has no `enabled` field at all, anywhere in this
* schema — there is no toggle to accidentally switch off, so it can never
* schema - there is no toggle to accidentally switch off, so it can never
* be disabled through the admin UI (see requirement: technically required
* functionality must not be disable-able by an admin).
*/
@@ -32,14 +32,14 @@ export const CookieSettings: GlobalConfig = {
defaultValue: "1.0",
admin: {
description:
"Bei Änderung müssen alle Besucher erneut zustimmen — bereits gespeicherte Einwilligungen mit einer älteren Version werden ignoriert und der Banner erscheint erneut.",
"Bei Änderung müssen alle Besucher erneut zustimmen - bereits gespeicherte Einwilligungen mit einer älteren Version werden ignoriert und der Banner erscheint erneut.",
},
},
{
type: "group",
name: "necessary",
label: "Notwendig",
admin: { description: "Immer aktiv — technisch erforderlich, kann nicht deaktiviert werden." },
admin: { description: "Immer aktiv - technisch erforderlich, kann nicht deaktiviert werden." },
fields: [
{ name: "label", type: "text", label: "Bezeichnung", required: true, defaultValue: "Notwendig" },
{
@@ -93,7 +93,7 @@ export const CookieSettings: GlobalConfig = {
defaultValue: true,
admin: {
description:
"Globaler Schalter für das gesamte Analytics-System. Wenn deaktiviert, wird diese Kategorie im Banner nicht mehr angeboten und Analytics-Daten werden serverseitig abgelehnt — auch bei einer noch gespeicherten alten Zustimmung.",
"Globaler Schalter für die gesamte Reichweitenmessung. Wenn deaktiviert, wird diese Kategorie im Banner nicht mehr angeboten und Messdaten werden serverseitig abgelehnt - auch bei einer noch gespeicherten alten Zustimmung.",
},
},
],
+8 -8
View File
@@ -13,7 +13,7 @@ const WEEKDAYS = [
/**
* Central SEO settings, edited once by Anna, applied automatically across
* the whole website (see lib/seo/*). Everything here is optional — nothing
* the whole website (see lib/seo/*). Everything here is optional - nothing
* is invented if a field is left blank (see lib/seo/jsonld.ts, which only
* emits LocalBusiness structured data once real address data exists).
*/
@@ -21,7 +21,7 @@ export const SEOSettings: GlobalConfig = {
slug: "seo-settings",
label: "SEO-Einstellungen",
admin: {
description: "Globale SEO-Vorgaben für die gesamte Website — greift automatisch überall dort, wo eine Seite keine eigenen SEO-Angaben hat.",
description: "Globale SEO-Vorgaben für die gesamte Website - greift automatisch überall dort, wo eine Seite keine eigenen SEO-Angaben hat.",
group: "SEO",
},
access: {
@@ -40,7 +40,7 @@ export const SEOSettings: GlobalConfig = {
type: "text",
label: "Website-URL",
admin: {
description: "Nur bei Bedarf setzen (z. B. https://anouma.org) — überschreibt die Server-Konfiguration. Leer lassen, um die technische Standardeinstellung zu verwenden.",
description: "Nur bei Bedarf setzen (z. B. https://anouma.org) - überschreibt die Server-Konfiguration. Leer lassen, um die technische Standardeinstellung zu verwenden.",
},
validate: (value: string | null | undefined) => {
if (!value) return true;
@@ -58,8 +58,8 @@ export const SEOSettings: GlobalConfig = {
name: "defaultOgImage",
type: "upload",
relationTo: "media",
label: "Standard Social-Media-Bild",
admin: { description: "Wird verwendet, wenn eine Seite kein eigenes Open-Graph-Bild hat." },
label: "Standardbild für soziale Netzwerke",
admin: { description: "Wird verwendet, wenn eine Seite kein eigenes Bild für soziale Netzwerke hat." },
},
{
name: "robotsIndexable",
@@ -67,14 +67,14 @@ export const SEOSettings: GlobalConfig = {
label: "Website für Suchmaschinen sichtbar",
defaultValue: true,
admin: {
description: "Deaktivieren, um die gesamte öffentliche Website vorübergehend für Suchmaschinen zu sperren (z. B. während des Aufbaus). Betrifft nicht Admin/Konto — die sind ohnehin immer gesperrt.",
description: "Deaktivieren, um die gesamte öffentliche Website vorübergehend für Suchmaschinen zu sperren (z. B. während des Aufbaus). Betrifft nicht Admin/Konto - die sind ohnehin immer gesperrt.",
},
},
],
},
{
label: "Lokale Informationen",
admin: { description: "Werden nur verwendet, wenn tatsächlich ausgefüllt — es werden keine Angaben erfunden." },
admin: { description: "Werden nur verwendet, wenn tatsächlich ausgefüllt - es werden keine Angaben erfunden." },
fields: [
{
name: "businessName",
@@ -99,7 +99,7 @@ export const SEOSettings: GlobalConfig = {
name: "openingHours",
type: "array",
label: "Öffnungs-/Erreichbarkeitszeiten",
admin: { description: "Optional — nur für tatsächlich feste Zeiten (z. B. Sprechzeiten)." },
admin: { description: "Optional - nur für tatsächlich feste Zeiten (z. B. Sprechzeiten)." },
fields: [
{
type: "row",