All checks were successful
Container-Image bauen und veröffentlichen / build-and-push (push) Successful in 2m3s
Sortierung: Erklaerungen erscheinen im Admin wie im oeffentlichen
Bereich alphabetisch nach Titel. Bewusst in JavaScript statt ueber die
Datenbank - SQLite vergleicht binaer, dort landeten "Aenderungs-
mitteilung" und "Uebernahme" hinter "Zaehlerstandsablesung". Intl mit
deutscher Kollation sortiert Ae bei A. Gemeinsame Regel in
lib/policy-sort.ts, benutzt von der Server-Komponente, der API und der
Admin-Tabelle; die Spaltenkoepfe bleiben umschaltbar.
Overlay: @radix-ui/react-select verlangte react-dismissable-layer
1.1.11, alle anderen Radix-Pakete 1.1.19. Dieses Paket setzt und
entfernt pointer-events auf dem body und fuehrt dazu eine Liste offener
Layer im Modulzustand - bei zwei Kopien zwei getrennte Listen. Ein
Select im Dialog liess deshalb beim Schliessen das Overlay des Dialogs
verschwinden und pointer-events: none stehen. Die Seite war danach bis
zum Neuladen tot.
Belegt im Browser mit einer Wegwerfseite (Select im Dialog):
zwei Versionen -> Dialog nach Select-Schliessen nicht mehr bedienbar,
body pointer-events bleibt "none"
eine Version -> body wieder leer, Seite klickbar
react-select, -label, -slot und -tabs auf aktuelle Versionen gehoben;
damit liegt jedes Radix-Kernpaket nur noch einmal im Baum.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { PrismaClient } from "@prisma/client"
|
|
|
|
import { PolicyList } from "@/components/policy-list"
|
|
import { PublicHeader } from "@/components/public-header"
|
|
import { SiteFooter } from "@/components/site-footer"
|
|
import { readPolicyDefaults, toApiPolicy } from "@/lib/policy-defaults.server"
|
|
import { sortByTitle } from "@/lib/policy-sort"
|
|
|
|
// Prisma client instance
|
|
const prisma = new PrismaClient()
|
|
|
|
// Liste und Fußzeile kommen aus der Datenbank.
|
|
export const dynamic = "force-dynamic"
|
|
|
|
/**
|
|
* Öffentliche Übersicht.
|
|
*
|
|
* Die Liste wird serverseitig geladen und als Startwert an die Suchkomponente
|
|
* gegeben: So stehen alle Erklärungen samt Adresse bereits im ausgelieferten
|
|
* HTML und sind auch ohne JavaScript erreichbar.
|
|
*/
|
|
export default async function PublicDashboard() {
|
|
const [policies, defaults] = await Promise.all([
|
|
prisma.privacyPolicy.findMany({
|
|
where: { isPublic: true },
|
|
}),
|
|
readPolicyDefaults(prisma),
|
|
])
|
|
|
|
return (
|
|
<div className="flex min-h-screen flex-col bg-background">
|
|
<PublicHeader subtitle="Datenschutz" />
|
|
<PolicyList
|
|
initial={sortByTitle(policies.map((policy) => toApiPolicy(policy, defaults)))}
|
|
/>
|
|
<SiteFooter />
|
|
</div>
|
|
)
|
|
}
|