import React, { useState } from 'react' import { ContractTemplate } from '../types' import { TemplateEditor } from '../components/templates/TemplateEditor' // Default built-in templates const DEFAULT_TEMPLATES: ContractTemplate[] = [ { id: 'simple', name: 'Simple', description: 'A simple contract with plan and execute phases.', isBuiltIn: true, phases: [ { id: 'plan', name: 'Plan', deliverables: [{ id: 'plan-deliverable', name: 'Plan' }] }, { id: 'execute', name: 'Execute', deliverables: [{ id: 'pr-deliverable', name: 'PR' }] } ] }, { id: 'specification', name: 'Specification', description: 'A comprehensive contract with research, specification, planning, execution, and review phases.', isBuiltIn: true, phases: [ { id: 'research', name: 'Research', deliverables: [{ id: 'research-notes', name: 'Research Notes' }] }, { id: 'specify', name: 'Specify', deliverables: [{ id: 'requirements', name: 'Requirements' }] }, { id: 'plan', name: 'Plan', deliverables: [{ id: 'plan-deliverable', name: 'Plan' }] }, { id: 'execute', name: 'Execute', deliverables: [{ id: 'pr-deliverable', name: 'PR' }] }, { id: 'review', name: 'Review', deliverables: [{ id: 'release-notes', name: 'Release Notes' }] } ] }, { id: 'execute', name: 'Execute', description: 'A minimal contract with only an execute phase and no deliverables.', isBuiltIn: true, phases: [ { id: 'execute', name: 'Execute', deliverables: [] } ] } ] type Props = { onClose: () => void } export const TemplatesPage: React.FC = ({ onClose }) => { const [templates, setTemplates] = useState(() => { const saved = localStorage.getItem('contractTemplates') if (saved) { try { return JSON.parse(saved) } catch { return DEFAULT_TEMPLATES } } return DEFAULT_TEMPLATES }) const [editingTemplate, setEditingTemplate] = useState(null) const [showNewTemplateForm, setShowNewTemplateForm] = useState(false) const [newTemplateName, setNewTemplateName] = useState('') const [newTemplateDescription, setNewTemplateDescription] = useState('') const saveTemplates = (newTemplates: ContractTemplate[]) => { setTemplates(newTemplates) localStorage.setItem('contractTemplates', JSON.stringify(newTemplates)) } const handleSaveTemplate = (updatedTemplate: ContractTemplate) => { const newTemplates = templates.map(t => t.id === updatedTemplate.id ? updatedTemplate : t ) saveTemplates(newTemplates) setEditingTemplate(null) } const handleCreateTemplate = () => { if (!newTemplateName.trim()) return const newTemplate: ContractTemplate = { id: `custom-${Date.now()}`, name: newTemplateName.trim(), description: newTemplateDescription.trim() || 'Custom contract template', isBuiltIn: false, phases: [ { id: `phase-${Date.now()}`, name: 'Execute', deliverables: [] } ] } saveTemplates([...templates, newTemplate]) setNewTemplateName('') setNewTemplateDescription('') setShowNewTemplateForm(false) } const handleDeleteTemplate = (templateId: string) => { const template = templates.find(t => t.id === templateId) if (template?.isBuiltIn) return if (window.confirm(`Are you sure you want to delete "${template?.name}"?`)) { saveTemplates(templates.filter(t => t.id !== templateId)) } } const handleResetToDefaults = () => { if (window.confirm('Reset all templates to defaults? This will remove any custom templates.')) { saveTemplates(DEFAULT_TEMPLATES) } } if (editingTemplate) { return (
setEditingTemplate(null)} />
) } return (

Contract Templates

Manage contract types and their phase deliverables

{showNewTemplateForm && (
setNewTemplateName(e.target.value)} /> setNewTemplateDescription(e.target.value)} />
)}
{templates.map(template => (

{template.name}

{template.isBuiltIn && Built-in} {!template.isBuiltIn && Custom}

{template.description}

{template.phases.map((phase, index) => (
{index < template.phases.length - 1 && }
{phase.name} {phase.deliverables.length === 0 ? '(no deliverables)' : phase.deliverables.map(d => d.name).join(', ')}
))}
{!template.isBuiltIn && ( )}
))}
) }