fix: provide visible prepared Excel download link

This commit is contained in:
2026-09-06 09:28:58 +03:00
parent 90fc789a7a
commit 5e9f17969c
3 changed files with 22 additions and 6 deletions
+13 -6
View File
@@ -101,12 +101,16 @@ export const TenderList = () => {
const [exporting,setExporting] = useState(false);
const [exportError,setExportError] = useState(null);
const [preparedExport,setPreparedExport] = useState(null);
const preparedUrl = useRef(null);
const exportPending = useRef(false);
const mounted = useRef(true);
useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]);
useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;if(preparedUrl.current)URL.revokeObjectURL(preparedUrl.current);};},[]);
const handleExportExcel = async () => {
if (exportPending.current) return;
exportPending.current = true; setExporting(true); setExportError(null);
if(preparedUrl.current) URL.revokeObjectURL(preparedUrl.current);
preparedUrl.current=null;setPreparedExport(null);
const session = getToken();
// Export the full filtered result at click time, including rows below the fold.
const selected = filteredTenders.map(t=>({...t}));
@@ -114,10 +118,9 @@ export const TenderList = () => {
const bytes = await createTenderWorkbook(selected);
if (!mounted.current || getToken() !== session) return;
const url = URL.createObjectURL(new Blob([bytes], {type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
const link = document.createElement('a');
link.href = url; link.download = `ihaleist_ihale_listesi_${Date.now()}.xlsx`;
document.body.appendChild(link); link.click(); link.remove();
setTimeout(()=>URL.revokeObjectURL(url),1000);
preparedUrl.current=url;
setPreparedExport({url,name:`ihaleist_ihale_listesi_${Date.now()}.xlsx`,count:selected.length,
query:searchQuery.trim(),session,createdAt:new Date().toLocaleTimeString('tr-TR')});
} catch (error) { if (mounted.current && getToken() === session) setExportError(error.message); }
finally { exportPending.current=false; if (mounted.current) setExporting(false); }
};
@@ -165,12 +168,16 @@ export const TenderList = () => {
className="bg-emerald-600 hover:bg-emerald-500 text-white font-bold text-xs px-3.5 py-2 rounded-lg flex items-center gap-1.5 transition-colors shadow-xs shrink-0"
>
<Download className="w-4 h-4" />
<span>{exporting ? 'Excel hazırlanıyor…' : 'Excel İndir'}</span>
<span>{exporting ? 'Excel hazırlanıyor…' : 'Excel Hazırla'}</span>
</button>
</div>
</div>
{sortBy === 'newest' && <p className="text-xs text-slate-500">Yayın tarihi bilinmeyen kayıtlar sonda gösterilir. Aynı gün içinde saati bilinen kayıtlar önce gelir.</p>}
{preparedExport && preparedExport.session === getToken() && <div role="status" className="rounded-lg border border-emerald-200 bg-emerald-50 p-3 text-xs space-y-1">
<p>{preparedExport.createdAt} itibarıyla {preparedExport.count} ihale için Excel hazır{preparedExport.query ? ` — arama: ${preparedExport.query}` : ''}.</p>
<a href={preparedExport.url} download={preparedExport.name} className="font-bold text-emerald-800 underline">Excel dosyasını indir — {preparedExport.name}</a>
</div>}
{exportError && <p role="alert" className="text-sm text-red-700">{exportError}</p>}
{/* Tender Cards List */}
{gorunenTenders.length === 0 ? (