import React, { useState, useEffect } from 'react' import { FaSave, FaTimes, FaFileAlt, FaCode, FaCog } from 'react-icons/fa' import { ReportHtmlEditor } from './ReportHtmlEditor' import { ReportParameterDto, ReportTemplateDto, ReportCategoryDto } from '@/proxy/reports/models' import { Button, Input, Dialog } from '../ui' import { useLocalization } from '@/utils/hooks/useLocalization' interface TemplateEditorProps { isOpen: boolean onClose: () => void onSave: (template: ReportTemplateDto) => Promise template?: ReportTemplateDto | null categories: ReportCategoryDto[] } export const TemplateEditor: React.FC = ({ isOpen, onClose, onSave, template, categories, }) => { const [activeTab, setActiveTab] = useState<'info' | 'parameters' | 'content'>('info') const [formData, setFormData] = useState({ name: '', description: '', htmlContent: '', categoryId: '', tags: [] as string[], parameters: [] as ReportParameterDto[], }) const { translate } = useLocalization() const [tagInput, setTagInput] = useState('') const [isSaving, setIsSaving] = useState(false) useEffect(() => { if (template) { setFormData({ name: template.name, description: template.description || '', htmlContent: template.htmlContent, categoryId: template.categoryId!, tags: template.tags, parameters: template.parameters, }) } else { setFormData({ name: '', description: '', htmlContent: '', categoryId: '', tags: [], parameters: [], }) } setActiveTab('info') }, [template, isOpen]) // Otomatik parametre algılama useEffect(() => { const extractParameters = (htmlContent: string) => { const paramRegex = /@@([\p{L}0-9_]+)/gu const matches = [...htmlContent.matchAll(paramRegex)] const uniqueParams = [...new Set(matches.map((match) => match[1]))] const newParameters: ReportParameterDto[] = uniqueParams.map((paramName) => { // Mevcut parametreyi kontrol et const existingParam = formData.parameters.find((p) => p.name === paramName) if (existingParam) { return existingParam } // Yeni parametre oluştur return { id: crypto.randomUUID(), templateId: template?.id || '', name: paramName, placeholder: `@@${paramName}`, type: 'text', required: true, description: `${paramName} parametresi`, } }) setFormData((prev) => ({ ...prev, parameters: newParameters, })) } if (formData.htmlContent) { extractParameters(formData.htmlContent) } }, [formData.htmlContent]) const handleSave = async () => { if (!formData.name.trim() || !formData.htmlContent.trim()) { return } console.log('FormData before save:', formData) console.log('Categories available:', categories) setIsSaving(true) try { await onSave(formData as unknown as ReportTemplateDto) onClose() } catch (error) { console.error('Error saving template:', error) // Handle error - could show toast notification } finally { setIsSaving(false) } } const addTag = () => { if (tagInput.trim() && !formData.tags.includes(tagInput.trim())) { setFormData((prev) => ({ ...prev, tags: [...prev.tags, tagInput.trim()], })) setTagInput('') } } const removeTag = (tagToRemove: string) => { setFormData((prev) => ({ ...prev, tags: prev.tags.filter((tag) => tag !== tagToRemove), })) } const updateParameter = (paramId: string, updates: Partial) => { setFormData((prev) => ({ ...prev, parameters: prev.parameters.map((param) => param.id === paramId ? { ...param, ...updates } : param, ), })) } const tabs = [ { id: 'info', label: translate('::App.Reports.TemplateEditor.Tab.Info'), icon: FaFileAlt }, { id: 'parameters', label: translate('::App.Reports.TemplateEditor.Tab.Parameters'), icon: FaCog, }, { id: 'content', label: translate('::App.Reports.TemplateEditor.Tab.Content'), icon: FaCode }, ] return ( <>
{template ? translate('::App.Reports.TemplateEditor.TitleEdit') : translate('::App.Reports.TemplateEditor.TitleNew')}
{/* Tab Navigation */}
{/* Tab Content */}
{activeTab === 'info' && (
{/* Left Column - Basic Info */}
setFormData((prev) => ({ ...prev, name: e.target.value, })) } placeholder={translate('::App.Reports.TemplateEditor.Placeholder.Name')} className="w-full flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
setTagInput(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && addTag()} placeholder={translate( '::App.Reports.TemplateEditor.Placeholder.AddTag', )} className="flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{formData.tags.map((tag) => ( {tag} ))}
{/* Right Column - Description */}
setFormData((prev) => ({ ...prev, description: e.target.value, })) } placeholder={translate( '::App.Reports.TemplateEditor.Placeholder.Description', )} textArea={true} rows={12} className="text-left h-full" />
)} {activeTab === 'content' && (
setFormData((prev) => ({ ...prev, htmlContent: content })) } height="50vh" />
)} {activeTab === 'parameters' && (
{formData.parameters.length === 0 ? (

{translate('::App.Reports.TemplateEditor.NoParameters')}

{translate('::App.Reports.TemplateEditor.NoParametersDescription')}

) : (
{formData.parameters.map((param) => (
@@{param.name}
updateParameter(param.id, { description: e.target.value }) } placeholder={translate( '::App.Reports.TemplateEditor.Placeholder.ParameterDescription', )} className="w-full text-xs text-gray-600 bg-transparent border-none outline-none resize-none" />
updateParameter(param.id, { defaultValue: e.target.value }) } placeholder={translate( '::App.Reports.TemplateEditor.Placeholder.DefaultValue', )} className="w-full text-xs bg-gray-50 px-1.5 py-0.5 rounded border border-gray-200 outline-none" />
))}
)}
)}
{/* Tab Footer */}
) }