# TASK-FE-012: Document Numbering Configuration UI **ID:** TASK-FE-012 **Title:** Document Numbering Template Management UI **Category:** Administration **Priority:** P2 (Medium) **Effort:** 3-4 days **Dependencies:** TASK-FE-010, TASK-BE-004 **Assigned To:** Frontend Developer --- ## ๐Ÿ“‹ Overview Build UI for configuring and managing document numbering templates including template builder, preview generator, and number sequence management. --- ## ๐ŸŽฏ Objectives 1. Create numbering template list and management 2. Build template editor with format preview 3. Implement template variable selector 4. Add numbering sequence viewer 5. Create template testing interface 6. Implement annual reset configuration --- ## โœ… Acceptance Criteria - [ ] List all numbering templates by document type - [ ] Create/edit templates with format preview - [ ] Template variables easily selectable - [ ] Preview shows example numbers - [ ] View current number sequences - [ ] Annual reset configurable - [ ] Validation prevents conflicts --- ## ๐Ÿ”ง Implementation Steps ### Step 1: Template List Page ```typescript // File: src/app/(admin)/admin/numbering/page.tsx 'use client'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Plus, Edit, Eye } from 'lucide-react'; export default function NumberingPage() { const [templates, setTemplates] = useState([]); return (

Document Numbering Configuration

Manage document numbering templates and sequences

{templates.map((template: any) => (

{template.document_type_name}

{template.discipline_code || 'All'} {template.is_active ? 'Active' : 'Inactive'}
{template.template_format}
Example: {template.example_number}
Current Sequence: {template.current_number}
Annual Reset: {template.reset_annually ? 'Yes' : 'No'}
Padding: {template.padding_length} digits
))}
); } ``` ### Step 2: Template Editor Component ```typescript // File: src/components/numbering/template-editor.tsx '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'; const VARIABLES = [ { key: '{ORG}', name: 'Organization Code', example: 'เธเธ—เธ—' }, { key: '{DOCTYPE}', name: 'Document Type', example: 'CORR' }, { key: '{DISC}', name: 'Discipline', example: 'STR' }, { key: '{YYYY}', name: 'Year (4-digit)', example: '2025' }, { key: '{YY}', name: 'Year (2-digit)', example: '25' }, { key: '{MM}', name: 'Month', example: '12' }, { key: '{SEQ}', name: 'Sequence Number', example: '0001' }, { key: '{CONTRACT}', name: 'Contract Code', example: 'C01' }, ]; export function TemplateEditor({ template, onSave }: any) { const [format, setFormat] = useState(template?.template_format || ''); const [preview, setPreview] = useState(''); useEffect(() => { // Generate preview let previewText = format; VARIABLES.forEach((v) => { previewText = previewText.replace(new RegExp(v.key, 'g'), v.example); }); setPreview(previewText); }, [format]); const insertVariable = (variable: string) => { setFormat((prev) => prev + variable); }; return (

Template Configuration

setFormat(e.target.value)} placeholder="e.g., {ORG}-{DOCTYPE}-{YYYY}-{SEQ}" className="font-mono" />
{VARIABLES.map((v) => ( ))}

Example number:

{preview || 'Enter format above'}

Number of digits (e.g., 4 = 0001, 0002)

{/* Variable Reference */}

Available Variables

{VARIABLES.map((v) => (
{v.key}

{v.name}

{v.example}
))}
); } ``` ### Step 3: Number Sequence Viewer ```typescript // File: src/components/numbering/sequence-viewer.tsx 'use client'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { RefreshCw } from 'lucide-react'; export function SequenceViewer({ templateId }: { templateId: number }) { const [sequences, setSequences] = useState([]); const [search, setSearch] = useState(''); return (

Number Sequences

setSearch(e.target.value)} />
{sequences.map((seq: any) => (
{seq.year} {seq.organization_code && ( {seq.organization_code} )} {seq.discipline_code && ( {seq.discipline_code} )}
Current: {seq.current_number} | Last Generated:{' '} {seq.last_generated_number}
Updated {new Date(seq.updated_at).toLocaleDateString()}
))}
); } ``` ### Step 4: Template Testing Dialog ```typescript // File: src/components/numbering/template-tester.tsx 'use client'; import { useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Label } from '@/components/ui/label'; import { Card } from '@/components/ui/card'; export function TemplateTester({ open, onOpenChange, template }: any) { const [testData, setTestData] = useState({ organization_id: 1, discipline_id: null, year: new Date().getFullYear(), }); const [generatedNumber, setGeneratedNumber] = useState(''); const handleTest = async () => { // Call API to generate test number const response = await fetch('/api/numbering/test', { method: 'POST', body: JSON.stringify({ template_id: template.template_id, ...testData }), }); const result = await response.json(); setGeneratedNumber(result.number); }; return ( Test Number Generation
{generatedNumber && (

Generated Number:

{generatedNumber}

)}
); } ``` --- ## ๐Ÿ“ฆ Deliverables - [ ] Template list page - [ ] Template editor with variable selector - [ ] Live preview generator - [ ] Number sequence viewer - [ ] Template testing interface - [ ] Annual reset configuration - [ ] Validation rules --- ## ๐Ÿงช Testing 1. **Template Creation** - Create template โ†’ Preview updates - Insert variables โ†’ Format correct - Save template โ†’ Persists 2. **Number Generation** - Test template โ†’ Generates number - Variables replaced correctly - Sequence increments 3. **Sequence Management** - View sequences โ†’ Shows all active sequences - Search sequences โ†’ Filters correctly --- ## ๐Ÿ”— Related Documents - [TASK-BE-004: Document Numbering](./TASK-BE-004-document-numbering.md) - [ADR-002: Document Numbering Strategy](../../05-decisions/ADR-002-document-numbering-strategy.md) --- **Created:** 2025-12-01 **Status:** Ready