// Export Modal — CSV & PDF export const EXPIcons = window.Icons; function ExportModal({ state, onClose }) { const [projId, setProjId] = React.useState(state.activeProjectId || 'all'); const [format, setFormat] = React.useState('csv'); const [statuses, setStatuses] = React.useState(['todo','doing','review','done']); const [dateFrom, setDateFrom] = React.useState(''); const [dateTo, setDateTo] = React.useState(''); React.useEffect(()=>{ const fn = e=>{ if(e.key==='Escape') onClose(); }; window.addEventListener('keydown', fn); return ()=>window.removeEventListener('keydown', fn); },[onClose]); const toggleStatus = s => setStatuses(prev => prev.includes(s) ? prev.filter(x=>x!==s) : [...prev, s]); const getFilteredTasks = () => { let tasks = state.tasks.filter(t => !t.archived); if (projId !== 'all') tasks = tasks.filter(t => t.projectId === projId); tasks = tasks.filter(t => statuses.includes(t.status)); if (dateFrom) tasks = tasks.filter(t => t.due && t.due >= dateFrom); if (dateTo) tasks = tasks.filter(t => t.due && t.due <= dateTo); return tasks.sort((a,b) => (a.due||'').localeCompare(b.due||'')); }; const STATUS_LABEL = {todo:'Yapılacak', doing:'Devam Ediyor', review:'İncelemede', done:'Tamamlandı'}; const STATUS_COLOR = {todo:'#94a3b8', doing:'#3b82f6', review:'#a855f7', done:'#ff601f'}; const PRIO_LABEL = {high:'Yüksek', medium:'Orta', low:'Düşük'}; const fmtDate = iso => iso ? new Date(iso+'T12:00').toLocaleDateString('tr-TR',{day:'numeric',month:'short',year:'numeric'}) : '—'; // ── CSV ────────────────────────────────────────────────────── const exportCSV = () => { const tasks = getFilteredTasks(); const headers = ['Görev','Firma','Durum','Öncelik','Veriliş','Teslim','SP','Tahmini Süre (dk)','Etiketler','Açıklama']; const esc = v => `"${String(v==null?'':v).replace(/"/g,'""')}"`; const rows = tasks.map(t => { const proj = state.projects.find(p=>p.id===t.projectId); const tags = (t.tags||[]).map(id=>state.tags.find(tg=>tg.id===id)?.name||'').filter(Boolean).join('; '); return [ t.title, proj?.name||'', STATUS_LABEL[t.status]||t.status, PRIO_LABEL[t.priority]||t.priority, t.startDate||'', t.due||'', t.storyPoints||'', t.estimatedTime||'', tags, (t.description||'').replace(/\n/g,' '), ].map(esc).join(','); }); const csv = [headers.map(esc).join(','), ...rows].join('\r\n'); const blob = new Blob([''+csv], { type:'text/csv;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); const name = projId==='all' ? 'tum-firmalar' : (state.projects.find(p=>p.id===projId)?.name||'export').replace(/\s+/g,'-'); a.href = url; a.download = `navia-${name}-${new Date().toISOString().slice(0,10)}.csv`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); onClose(); }; // ── PDF ────────────────────────────────────────────────────── const exportPDF = () => { const tasks = getFilteredTasks(); const projName = projId==='all' ? 'Tüm Firmalar' : (state.projects.find(p=>p.id===projId)?.name||''); const counts = Object.fromEntries( Object.keys(STATUS_LABEL).map(k=>[k, tasks.filter(t=>t.status===k).length]) ); const today = new Date().toISOString().slice(0,10); const html = ` Navia — ${projName} Raporu
Navia · Proje Yönetimi

${projName} — Görev Raporu

Oluşturulma: ${fmtDate(today)} · Toplam ${tasks.length} görev${dateFrom||dateTo ? ` · ${dateFrom||'—'} / ${dateTo||'—'}` : ''}
${Object.entries(STATUS_LABEL).map(([k,v])=>`
${counts[k]||0}${v}
`).join('')}
${tasks.reduce((s,t)=>s+(t.estimatedTime||0),0)} dkToplam Tahmin
${tasks.map(t => { const proj = state.projects.find(p=>p.id===t.projectId); const tags = (t.tags||[]).map(id=>state.tags.find(tg=>tg.id===id)?.name||'').filter(Boolean); const overdue = t.due && t.due < today && t.status !== 'done'; return ``; }).join('')}
Görev Firma Durum Öncelik Teslim SP Etiketler
${t.title}
${t.description?`
${t.description.slice(0,90)}${t.description.length>90?'…':''}
`:''}
${proj?.name||'—'} ${STATUS_LABEL[t.status]||t.status} ${PRIO_LABEL[t.priority]||t.priority} ${t.due?fmtDate(t.due):'—'} ${t.storyPoints||'—'} ${tags.map(tg=>`${tg}`).join('')}
`; const win = window.open('','_blank','width=900,height=700'); win.document.write(html); win.document.close(); onClose(); }; const tasks = getFilteredTasks(); return (
e.stopPropagation()}> {/* Header */}
Dışa Aktar
Görev listesini CSV veya PDF olarak indir
{/* Format seçimi */}
{/* Firma seçimi */}
{/* Durum filtresi */}
{Object.entries(STATUS_LABEL).map(([k,v])=>( ))}
{/* Tarih aralığı */}
setDateFrom(e.target.value)} style={{flex:1}}/> setDateTo(e.target.value)} style={{flex:1}}/>
{/* Özet */}
{tasks.length} görev dışa aktarılacak
{Object.entries(STATUS_LABEL).map(([k,v])=>{ const n = tasks.filter(t=>t.status===k).length; if (!n) return null; return {n} {v}; })}
{/* Footer */}
); } window.ExportModal = ExportModal;