'use client'; import { useState, useEffect } from 'react'; import { Card } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { Badge } from '@/components/ui/badge'; import { NumberingTemplate } from '@/lib/api/numbering'; import { cn } from '@/lib/utils'; import { HoverCard, HoverCardContent, HoverCardTrigger, } from '@/components/ui/hover-card'; // Aligned with Backend replacement logic const VARIABLES = [ { key: '{PROJECT}', name: 'Project Code', example: 'LCBP3' }, { key: '{ORG}', name: 'Originator Code', example: 'PAT' }, { key: '{RECIPIENT}', name: 'Recipient Code', example: 'CN' }, { key: '{TYPE}', name: 'Type Code', example: 'RFA' }, { key: '{DISCIPLINE}', name: 'Discipline Code', example: 'STR' }, { key: '{SUBTYPE}', name: 'Sub-Type Code', example: 'GEN' }, { key: '{SUBTYPE_NUM}', name: 'Sub-Type Number', example: '01' }, { key: '{YEAR}', name: 'Year (B.E.)', example: '2568' }, { key: '{YEAR_SHORT}', name: 'Year Short (68)', example: '68' }, { key: '{SEQ:4}', name: 'Sequence (4-digit)', example: '0001' }, ]; export interface TemplateEditorProps { template?: NumberingTemplate; projectId: number; projectName: string; correspondenceTypes: any[]; disciplines: any[]; onSave: (data: Partial) => void; onCancel: () => void; } export function TemplateEditor({ template, projectId, projectName, correspondenceTypes, disciplines, onSave, onCancel }: TemplateEditorProps) { const [format, setFormat] = useState(template?.formatTemplate || template?.templateFormat || ''); const [typeId, setTypeId] = useState(template?.correspondenceTypeId?.toString() || ''); const [disciplineId, setDisciplineId] = useState(template?.disciplineId?.toString() || '0'); const [padding, setPadding] = useState(template?.paddingLength || 4); const [reset, setReset] = useState(template?.resetAnnually ?? true); const [isActive, setIsActive] = useState(template?.isActive ?? true); const [preview, setPreview] = useState(''); useEffect(() => { // Generate preview let previewText = format || ''; VARIABLES.forEach((v) => { // Simple mock replacement for preview let replacement = v.example; if (v.key === '{YEAR}') replacement = (new Date().getFullYear() + 543).toString(); if (v.key === '{YEAR_SHORT}') replacement = (new Date().getFullYear() + 543).toString().slice(-2); // Dynamic context based on selection (optional visual enhancement) if (v.key === '{TYPE}' && typeId) { const t = correspondenceTypes.find(ct => ct.id.toString() === typeId); if (t) replacement = t.typeCode; } if (v.key === '{DISCIPLINE}' && disciplineId !== '0') { const d = disciplines.find(di => di.id.toString() === disciplineId); if (d) replacement = d.disciplineCode; } previewText = previewText.replace(new RegExp(v.key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), replacement); }); setPreview(previewText); }, [format, typeId, disciplineId, correspondenceTypes, disciplines]); const insertVariable = (variable: string) => { setFormat((prev) => prev + variable); }; const handleSave = () => { onSave({ ...template, projectId: projectId, correspondenceTypeId: Number(typeId), disciplineId: Number(disciplineId), formatTemplate: format, templateFormat: format, // Legacy support paddingLength: padding, resetAnnually: reset, isActive: isActive, exampleNumber: preview }); }; const isValid = format.length > 0 && typeId; return (

{template ? 'Edit Template' : 'New Template'}

{isActive ? 'Active' : 'Inactive'}

Define how document numbers are generated for this project.

Project: {projectName}
{/* Configuration Column */}

Specific discipline templates take precedence over 'All'.

setPadding(Number(e.target.value))} min={1} max={10} />
{/* Format Column */}
setFormat(e.target.value)} placeholder="{ORG}-{TYPE}-{SEQ:4}" className="font-mono text-base mb-2" />
{VARIABLES.map((v) => (

{v.name}

Example: {v.example}

))}

Preview Output

{preview || '...'}

* This is an approximation. Actual numbers depend on runtime context.

); }