Refactor project structure to use pnpm monorepo; update Dockerfile and related configurations for frontend build process. Adjust .dockerignore and .gitignore to reflect new paths. Modify .env.example for cron job timing. Update CONTRIBUTING.md and README.md for new development instructions.
Build, Test, and Push CFDM Docker Image / test (push) Failing after 3h13m2s
Build, Test, and Push CFDM Docker Image / create-release (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / build-and-push (push) Has been cancelled
Build, Test, and Push CFDM Docker Image / update-wiki (push) Has been cancelled

This commit is contained in:
Denozordec
2026-06-15 15:37:36 +07:00
parent 87789fa82d
commit b1467575c5
803 changed files with 16646 additions and 8251 deletions
+89
View File
@@ -0,0 +1,89 @@
import { createFileRoute, Link } from '@tanstack/react-router'
import { useQuery } from '@tanstack/react-query'
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from '@cfdm/ui/components/card'
import { Button } from '@cfdm/ui/components/button'
import { certificatesQueryOptions, certSummaryQueryOptions, domainsListQueryOptions } from '@/queries'
import { PageHeader } from '@/components/page-header'
export const Route = createFileRoute('/_auth/')({
loader: ({ context: { queryClient } }) =>
Promise.all([
queryClient.ensureQueryData(domainsListQueryOptions()),
queryClient.ensureQueryData(certSummaryQueryOptions()),
]),
component: DashboardPage,
})
function DashboardPage() {
const { data: domains } = useQuery(domainsListQueryOptions())
const { data: summary } = useQuery(certSummaryQueryOptions())
const { data: certs } = useQuery(certificatesQueryOptions())
return (
<div className="@container/main flex flex-col gap-4 py-4 md:gap-6 md:py-6">
<PageHeader
title="Панель управления"
description="Обзор доменов и сертификатов Cloudflare"
/>
<div className="grid gap-4 md:grid-cols-3">
<Card>
<CardHeader>
<CardDescription>Домены</CardDescription>
<CardTitle className="text-3xl font-semibold tabular-nums">
{domains?.length ?? 0}
</CardTitle>
</CardHeader>
<CardFooter>
<Button
variant="link"
className="h-auto p-0"
render={<Link to="/domains" />}
>
Управление доменами
</Button>
</CardFooter>
</Card>
<Card>
<CardHeader>
<CardDescription>Сертификаты</CardDescription>
<CardTitle className="text-3xl font-semibold tabular-nums">
{certs?.length ?? 0}
</CardTitle>
</CardHeader>
<CardFooter>
<Button
variant="link"
className="h-auto p-0"
render={<Link to="/certificates" />}
>
Мониторинг сертификатов
</Button>
</CardFooter>
</Card>
<Card>
<CardHeader>
<CardDescription>Статусы сертификатов</CardDescription>
<CardTitle className="text-base font-medium">Сводка</CardTitle>
</CardHeader>
<CardContent>
<ul className="flex flex-col gap-1 text-sm">
{summary?.map(([status, count]) => (
<li key={status} className="flex justify-between">
<span className="text-muted-foreground">{status}</span>
<span className="font-medium tabular-nums">{count}</span>
</li>
))}
</ul>
</CardContent>
</Card>
</div>
</div>
)
}