From 418957676cbac2b3b4f21a313f4d898743bfe2ae Mon Sep 17 00:00:00 2001 From: admin-valentin Date: Sun, 2 Aug 2026 12:21:34 +0000 Subject: [PATCH] feat(CC-069): add Dataset Registry page (system + user datasets, links to data sources) --- src/app/dashboard/data/registry/page.tsx | 124 +++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/app/dashboard/data/registry/page.tsx diff --git a/src/app/dashboard/data/registry/page.tsx b/src/app/dashboard/data/registry/page.tsx new file mode 100644 index 0000000..723b393 --- /dev/null +++ b/src/app/dashboard/data/registry/page.tsx @@ -0,0 +1,124 @@ +'use client'; + +import Link from 'next/link'; +import { useQuery } from '@tanstack/react-query'; +import { apiFetch } from '../../../../lib/api'; +import { useSession } from '../../../../components/session-provider'; + +interface DataSource { id: string; name: string; sourceType: string; description: string | null; status: string; lastSyncAt: string | null; recordCount: number | null; createdAt: string; } + +const TYPE_ICON: Record = { + manual: '✋', api: '🔌', file: '📄', database: '🗄️', integration: '🔗', clickhouse: '🏢', sheet: '📊', +}; + +const SYSTEM_DATASETS = [ + { name: 'ClickHouse — manual_ingest.people_data', type: 'clickhouse', records: '147M+', status: 'active', desc: 'Date persoane din ingestie manuală (C3 — restricționat)' }, + { name: 'ClickHouse — boardmind schema', type: 'clickhouse', records: 'live', status: 'active', desc: 'Toate tabelele PostgreSQL CEO OS (via MCP)' }, + { name: 'AnythingLLM — workspace agents', type: 'integration', records: '10 workspace-uri', status: 'active', desc: 'Agenți date peste ClickHouse la supersrv:3010' }, +]; + +export default function DataRegistryPage() { + const { activeTenant } = useSession(); + const tenantId = activeTenant?.tenantId ?? ''; + + const { data: userSources = [], isLoading } = useQuery({ + queryKey: ['data-sources', tenantId], + queryFn: () => apiFetch('/v1/data-sources', { tenantId }), + enabled: Boolean(tenantId), staleTime: 120_000, + }); + + const totalUserRecords = userSources.reduce((s, ds) => s + (ds.recordCount ?? 0), 0); + const activeUser = userSources.filter((ds) => ds.status === 'active').length; + + return ( +
+
+
+

Registru Dataset

+

+ {isLoading ? 'Se încarcă…' : `${SYSTEM_DATASETS.length} sistem · ${userSources.length} personalizate · ${activeUser} active`} +

+
+ + Gestionează surse → + +
+ + {/* System datasets */} +
+

Dataset-uri sistem

+
+ {SYSTEM_DATASETS.map((ds) => ( +
+ {TYPE_ICON[ds.type] ?? '❓'} +
+

{ds.name}

+

{ds.desc}

+
+
+

{ds.records}

+ ● activ +
+
+ ))} +
+
+ + {/* User-registered datasets */} +
+
+

Dataset-uri personalizate

+ {totalUserRecords > 0 && ( + {totalUserRecords.toLocaleString('ro-RO')} înregistrări totale + )} +
+ {isLoading ? ( +
Se încarcă…
+ ) : userSources.length === 0 ? ( +
+

Niciun dataset personalizat înregistrat.

+ + Adaugă prima sursă de date → + +
+ ) : ( +
+ {userSources.map((ds) => ( +
+ {TYPE_ICON[ds.sourceType] ?? '❓'} +
+

{ds.name}

+ {ds.description &&

{ds.description}

} + {ds.lastSyncAt && ( +

+ Sync: {new Date(ds.lastSyncAt).toLocaleDateString('ro-RO')} +

+ )} +
+
+ {ds.recordCount != null ? ( +

{ds.recordCount.toLocaleString('ro-RO')}

+ ) : ( +

+ )} + + ● {ds.status} + +
+
+ ))} +
+ )} +
+ + {/* Info note */} +
+

+ Arhitectură date: CEO OS funcționează cu date din ClickHouse (147M+ rânduri, procesate prin ingestie), + date din PostgreSQL (baza CEO OS), și surse externe configurate manual. + Agenții AnythingLLM pot interoga ClickHouse prin MCP direct. +

+
+
+ ); +}