Add saved bid preparation overview with actionable missing checks
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import React,{useEffect,useState} from 'react';
|
||||
import {listDocuments} from '../services/account';
|
||||
import {preparationSummary} from '../services/preparationSummary';
|
||||
import {useApp} from '../context/AppContext';
|
||||
import {getToken} from '../services/auth';
|
||||
|
||||
export function PreparationOverview({tenders,now}) {
|
||||
const {authUser}=useApp();
|
||||
return <Overview key={`${authUser?.email}:${getToken()}`} tenders={tenders} now={now}/>;
|
||||
}
|
||||
function Overview({tenders,now}) {
|
||||
const {setActiveTenderDetail}=useApp();
|
||||
const [vault,setVault]=useState({loading:true,error:null,documents:[]}),[refresh,setRefresh]=useState(0);
|
||||
useEffect(()=>{
|
||||
let cancelled=false;
|
||||
setVault({loading:true,error:null,documents:[]});
|
||||
listDocuments().then(data=>{if(!cancelled)setVault({loading:false,error:null,documents:data.belgeler});})
|
||||
.catch(error=>{if(!cancelled)setVault({loading:false,error:error.message,documents:[]});});
|
||||
return()=>{cancelled=true;};
|
||||
},[refresh]);
|
||||
const open=(tender,target)=>setActiveTenderDetail({...tender,preparationTarget:target});
|
||||
return <section aria-label="Hazırlık dosyaları özeti" className="bg-white border rounded-xl p-4 space-y-3">
|
||||
<h2 className="font-bold text-lg">Hazırlık dosyaları · {tenders.length}</h2>
|
||||
<p className="text-xs text-slate-600">Panodaki ve sorumlu filtresindeki kayıtlı taslaklar gösterilir. Kaydetmediğiniz değişiklikler bu özete girmez. Eksik sayısı başvuru onayı değildir; çıktı sırasında belgeler yeniden kontrol edilir.</p>
|
||||
<button className="border rounded px-3 py-2 text-xs" disabled={vault.loading} onClick={()=>setRefresh(n=>n+1)}>Belge durumunu yenile</button>
|
||||
{vault.loading&&<p role="status" className="text-xs">Belge durumu kontrol ediliyor…</p>}
|
||||
{vault.error&&<p role="alert" className="text-xs text-red-700">Belge durumu doğrulanamadı: {vault.error}</p>}
|
||||
{!tenders.length ? <p className="text-sm">İhaleyi takibe alın veya hazırlık görevi açın; dosyası burada görünsün.</p> :
|
||||
<div className="overflow-x-auto"><table className="w-full text-sm min-w-[700px]">
|
||||
<thead><tr className="text-left border-b"><th className="p-2">İhale</th><th className="p-2">Sorumlu</th><th className="p-2">Belge eksikleri</th><th className="p-2">Sıradaki kontrol</th></tr></thead>
|
||||
<tbody>{tenders.map(tender=>{
|
||||
const summary=preparationSummary(tender,vault,now);
|
||||
return <tr key={tender.id} className="border-b align-top">
|
||||
<td className="p-2"><button onClick={()=>open(tender,'source')} className="text-blue-800 underline text-left">{tender.ikn} · {tender.baslik}</button><p className="text-xs mt-1">{summary.issues.length ? `${summary.issues.length} kontrol eksik` : 'Kayıtlı kontroller tamam; son kontrol gerekli'}</p></td>
|
||||
<td className="p-2">{summary.owner}</td>
|
||||
<td className="p-2"><details><summary className="cursor-pointer">{summary.documentIssues.length ? `${summary.documentIssues.length} belge kontrolü` : 'Kayıtlı belgelerde eksik bulunmadı'}</summary>
|
||||
<ul className="space-y-2 mt-2">{summary.documentIssues.map((text,i)=><li key={i}><button onClick={()=>open(tender,'checks')} className="text-blue-800 underline text-left">{text}</button></li>)}</ul>
|
||||
</details></td>
|
||||
<td className="p-2"><button onClick={()=>open(tender,summary.next.target)} className="text-blue-800 underline text-left">{summary.next.text}</button>
|
||||
<details className="mt-2"><summary className="cursor-pointer text-xs">Tüm eksikleri göster</summary><ul className="space-y-2 mt-2">{summary.issues.map((item,i)=><li key={i}><button onClick={()=>open(tender,item.target)} className="text-blue-800 underline text-left">{item.text}</button></li>)}</ul></details>
|
||||
</td>
|
||||
</tr>;
|
||||
})}</tbody>
|
||||
</table></div>}
|
||||
</section>;
|
||||
}
|
||||
Reference in New Issue
Block a user