// 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 = `
| 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('')} |