Initial commit: ArchiTools modular dashboard platform

Complete Next.js 16 application with 13 fully implemented modules:
Email Signature, Word XML Generator, Registratura, Dashboard,
Tag Manager, IT Inventory, Address Book, Password Vault,
Mini Utilities, Prompt Generator, Digital Signatures,
Word Templates, and AI Chat.

Includes core platform systems (module registry, feature flags,
storage abstraction, i18n, theming, auth stub, tagging),
16 technical documentation files, Docker deployment config,
and legacy HTML tool reference.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Marius Tarau
2026-02-17 12:50:25 +02:00
commit 4c46e8bcdd
189 changed files with 33780 additions and 0 deletions
@@ -0,0 +1,102 @@
'use client';
import { Pencil, Trash2 } from 'lucide-react';
import { Button } from '@/shared/components/ui/button';
import { Badge } from '@/shared/components/ui/badge';
import type { RegistryEntry } from '../types';
import { cn } from '@/shared/lib/utils';
interface RegistryTableProps {
entries: RegistryEntry[];
loading: boolean;
onEdit: (entry: RegistryEntry) => void;
onDelete: (id: string) => void;
}
const TYPE_LABELS: Record<string, string> = {
incoming: 'Intrare',
outgoing: 'Ieșire',
internal: 'Intern',
};
const STATUS_LABELS: Record<string, string> = {
registered: 'Înregistrat',
'in-progress': 'În lucru',
completed: 'Finalizat',
archived: 'Arhivat',
};
const STATUS_VARIANT: Record<string, 'default' | 'secondary' | 'outline' | 'destructive'> = {
registered: 'default',
'in-progress': 'secondary',
completed: 'outline',
archived: 'outline',
};
export function RegistryTable({ entries, loading, onEdit, onDelete }: RegistryTableProps) {
if (loading) {
return <p className="py-8 text-center text-sm text-muted-foreground">Se încarcă...</p>;
}
if (entries.length === 0) {
return (
<p className="py-8 text-center text-sm text-muted-foreground">
Nicio înregistrare găsită. Adaugă prima înregistrare.
</p>
);
}
return (
<div className="overflow-x-auto rounded-lg border">
<table className="w-full text-sm">
<thead>
<tr className="border-b bg-muted/40">
<th className="px-3 py-2 text-left font-medium">Nr.</th>
<th className="px-3 py-2 text-left font-medium">Data</th>
<th className="px-3 py-2 text-left font-medium">Tip</th>
<th className="px-3 py-2 text-left font-medium">Subiect</th>
<th className="px-3 py-2 text-left font-medium">Expeditor</th>
<th className="px-3 py-2 text-left font-medium">Destinatar</th>
<th className="px-3 py-2 text-left font-medium">Status</th>
<th className="px-3 py-2 text-right font-medium">Acțiuni</th>
</tr>
</thead>
<tbody>
{entries.map((entry) => (
<tr key={entry.id} className={cn('border-b hover:bg-muted/20 transition-colors')}>
<td className="px-3 py-2 font-mono text-xs">{entry.number}</td>
<td className="px-3 py-2 text-xs whitespace-nowrap">{formatDate(entry.date)}</td>
<td className="px-3 py-2">
<Badge variant="outline" className="text-xs">{TYPE_LABELS[entry.type]}</Badge>
</td>
<td className="px-3 py-2 max-w-[250px] truncate">{entry.subject}</td>
<td className="px-3 py-2 max-w-[150px] truncate">{entry.sender}</td>
<td className="px-3 py-2 max-w-[150px] truncate">{entry.recipient}</td>
<td className="px-3 py-2">
<Badge variant={STATUS_VARIANT[entry.status]}>{STATUS_LABELS[entry.status]}</Badge>
</td>
<td className="px-3 py-2 text-right">
<div className="flex justify-end gap-1">
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => onEdit(entry)}>
<Pencil className="h-3.5 w-3.5" />
</Button>
<Button variant="ghost" size="icon" className="h-7 w-7 text-destructive" onClick={() => onDelete(entry.id)}>
<Trash2 className="h-3.5 w-3.5" />
</Button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
function formatDate(iso: string): string {
try {
return new Date(iso).toLocaleDateString('ro-RO', { day: '2-digit', month: '2-digit', year: 'numeric' });
} catch {
return iso;
}
}