'use client'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Plus, Edit, Play } from 'lucide-react'; import { NumberingTemplate, SaveTemplateDto } from '@/lib/api/numbering'; import { useTemplates, useSaveTemplate } from '@/hooks/use-numbering'; import { TemplateEditor } from '@/components/numbering/template-editor'; import { SequenceViewer } from '@/components/numbering/sequence-viewer'; import { TemplateTester } from '@/components/numbering/template-tester'; import { toast } from 'sonner'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useProjects, useCorrespondenceTypes, useContracts, useDisciplines } from '@/hooks/use-master-data'; interface ProjectItem { publicId: string; // ADR-019: UUID from API projectName: string; projectCode: string; isActive?: boolean; } import { ManualOverrideForm } from '@/components/numbering/manual-override-form'; import { MetricsDashboard } from '@/components/numbering/metrics-dashboard'; import { AuditLogsTable } from '@/components/numbering/audit-logs-table'; import { VoidReplaceForm } from '@/components/numbering/void-replace-form'; import { CancelNumberForm } from '@/components/numbering/cancel-number-form'; import { BulkImportForm } from '@/components/numbering/bulk-import-form'; export default function NumberingPage() { const { data: projects = [] } = useProjects(); // Initialize with empty string or first project if available const [selectedProjectId, setSelectedProjectId] = useState(''); const [activeTab, setActiveTab] = useState('templates'); useEffect(() => { if (projects.length > 0 && !selectedProjectId) { const first = projects[0] as ProjectItem; setSelectedProjectId(String(first.publicId)); } }, [projects, selectedProjectId]); // View states const [isEditing, setIsEditing] = useState(false); const [activeTemplate, setActiveTemplate] = useState(undefined); const [isTesting, setIsTesting] = useState(false); const [testTemplate, setTestTemplate] = useState(null); const selectedProject = (projects as ProjectItem[]).find((p) => String(p.publicId) === selectedProjectId); const selectedProjectName = selectedProject?.projectName || 'Unknown Project'; // Master Data const { data: correspondenceTypes = [] } = useCorrespondenceTypes(); const { data: contractsData } = useContracts(selectedProjectId); const contracts = Array.isArray(contractsData) ? contractsData : []; const firstContract = contracts[0] as { id?: number; publicId?: string } | undefined; const contractId = firstContract?.publicId ?? firstContract?.id; const { data: disciplines = [] } = useDisciplines(contractId); const { data: templateResponse, isLoading: _isLoadingTemplates } = useTemplates(); const saveTemplateMutation = useSaveTemplate(); // Extract templates array from response const templates: NumberingTemplate[] = Array.isArray(templateResponse) ? templateResponse : ((templateResponse as { data?: NumberingTemplate[] } | undefined)?.data ?? []); const handleEdit = (template?: NumberingTemplate) => { setActiveTemplate(template); setIsEditing(true); }; const handleSave = async (data: SaveTemplateDto) => { try { await saveTemplateMutation.mutateAsync(data); toast.success(data.id ? 'Template updated' : 'Template created'); setIsEditing(false); } catch { toast.error('Failed to save template'); } }; const handleTest = (template: NumberingTemplate) => { setTestTemplate(template); setIsTesting(true); }; if (isEditing) { return (
setIsEditing(false)} />
); } return (

Document Numbering

Manage numbering templates, audit logs, and tools

Templates Metrics & Audit Admin Tools
{templates .filter( (t) => !t.projectId || String(t.project?.publicId) === selectedProjectId ) .map((template) => (

{template.correspondenceType?.typeName || 'Default Format'}

{template.project?.projectCode || selectedProjectName} {template.description && {template.description}}
{template.formatTemplate}
Type Code: {template.correspondenceType?.typeCode || 'DEFAULT'}
Reset: {template.resetSequenceYearly ? 'Annually' : 'Continuous'}
))}

Audit Logs

); }