diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 232ebde..3ecb29b 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2100,3 +2100,7 @@ Doğrulama: HTTP readiness testi geçti; 290/290 otomatik test ve üretim derlem Takvim ekranı artık Google/Outlook’tan dışa aktarılan `.ics` dosyalarını yerel oturumda içe alıyor. Ayrıştırıcı 200 KB ve 100 etkinlik sınırı uyguluyor, geçersiz tarihleri reddediyor ve harici etkinlikleri kaynak ihale kayıtlarından ayrı, salt okunur takvim girdileri olarak gösteriyor. OAuth ile otomatik senkronizasyon bu özelliğin kapsamı dışında tutuldu. Doğrulama: ICS round-trip, İstanbul saat dönüşümü, kaçış karakterleri, bozuk tarih, boyut ve etkinlik sayısı sınırları test edildi; 292/292 test ve üretim derlemesi başarılı. + +İçe aktarılan harici etkinlikler artık `sessionStorage` içinde tutuluyor; kullanıcı takvim sekmesinden ayrılıp döndüğünde aynı tarayıcı oturumunda kayıtlar korunuyor. Temizleme düğmesi tüm harici etkinlikleri kaldırıyor; özel tarama modunda storage yazımı başarısız olursa uygulama akışı devam ediyor. + +Doğrulama: 292/292 otomatik test ve üretim derlemesi başarılı. diff --git a/src/components/tools/TenderCalendar.jsx b/src/components/tools/TenderCalendar.jsx index 86912a7..8ea80dd 100644 --- a/src/components/tools/TenderCalendar.jsx +++ b/src/components/tools/TenderCalendar.jsx @@ -10,7 +10,11 @@ export const TenderCalendar = () => { const today = istanbulDateKey(now); const [month,setMonth] = useState(today.slice(0,7)); const [selectedDay, setSelectedDay] = useState(today); - const [imported,setImported] = useState([]), [importError,setImportError] = useState(''); + const [imported,setImported] = useState(() => { + try { const saved = JSON.parse(sessionStorage.getItem('ihaleist_imported_calendar') || '[]'); return Array.isArray(saved) && saved.length <= 100 ? saved : []; } + catch { return []; } + }), [importError,setImportError] = useState(''); + React.useEffect(() => { try { sessionStorage.setItem('ihaleist_imported_calendar', JSON.stringify(imported)); } catch { /* private browsing can deny storage */ } }, [imported]); const allTenders = useMemo(() => [...tenders, ...imported], [tenders, imported]); const agenda=useMemo(()=>calendarAgenda(allTenders,now),[allTenders,now]); const daysList=calendarMonthDays(month).map(day=>({...day,count:agenda.days.get(day.key)?.length || 0})); @@ -59,7 +63,7 @@ export const TenderCalendar = () => { catch(error) { setImported([]); setImportError(error.message); } event.target.value=''; }} className="block text-xs" /> - {imported.length>0&&

{imported.length} harici etkinlik içe aktarıldı.

} + {imported.length>0&&

{imported.length} harici etkinlik içe aktarıldı.

} {importError&&

Takvim içe aktarılamadı: {importError}

}