diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index d3e4c1d..46298de 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1004,3 +1004,9 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - Gün seçiminde aria-pressed ve tam tarihli erişilebilir ad eklendi. İhale kartları klavye davranışı elle yazılmış div yerine doğal button oldu. Mevcut ay seçicisi korunur. - 227 otomatik test ve derleme geçti. Karışık saat sırası, bilinmeyen saat, geçersiz/eksik tarihin kaybolmaması, geçmiş kayıt ve girdi sırasının değiştirilmemesi test edildi. - Yeni takvim kartlarının tarayıcı/mobil kabulü ve Google/Outlook aktarım kabulü açık. Bu değişiklik ICS aktarımını test etmiş sayılmaz. Canlıya yayın yapılmadı. + +### Takvim ay girişinin düzeltilmesi ve tarayıcı kabulü — 6 Eylül 2026 +- Tarayıcıda month alanı Ekim değerini gösterirken takvim günleri Eylül'de kaldı; alandan çıkmak da güncellemedi. Ay seçimi onInput ile de işlenerek görünüm/state uyuşmazlığı giderildi. Önceki ay, sonraki ay ve bugüne dön düğmeleri eklendi; yıl geçişleri ve desteklenen yıl sınırları doğrulanır. +- İzole QA tarayıcısında altı kontrol geçti: 22 Eylül'deki 10:30 Akdeniz önce, 11:00 Kayseri sonra; Ekim girişinde 31 gün ve 1 Ekim başlığı; sonraki ay Kasım; önceki ay Ekim; bugüne dönüş; Akdeniz detayında aynı tarih/saat. Kanıt qa-calendar-navigation.json. +- 228 otomatik test ve derleme geçti. Test sunucusunun çıktısında önceki firma alanı değişikliğinde yinelenmiş aria-invalid niteliği görüldü; tek niteliğe indirildi. Son derleme bu uyarı olmadan geçti; büyük paket uyarısı sürüyor. +- QA sekmesi ve yalnız bu test için açılan sunucu kapatıldı (exit 0). Mobil genişlikler, tarihi bilinmeyen kaydın tarayıcı senaryosu ve Google/Outlook aktarımı bu kabul kapsamında değil; açık kalır. Canlıya yayın yapılmadı. diff --git a/src/components/BidPackageBuilder.jsx b/src/components/BidPackageBuilder.jsx index fabce03..60c428f 100644 --- a/src/components/BidPackageBuilder.jsx +++ b/src/components/BidPackageBuilder.jsx @@ -340,7 +340,6 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu { const agenda=useMemo(()=>calendarAgenda(tenders,now),[tenders,now]); const daysList=calendarMonthDays(month).map(day=>({...day,count:agenda.days.get(day.key)?.length || 0})); const dayTenders=agenda.days.get(selectedDay) || []; + const chooseMonth=value=>{if(calendarMonthDays(value).length){setMonth(value);setSelectedDay(value+'-01');}}; const card=({tender:t,info})=> + + + {/* Day Selector Buttons */}
{daysList.map(d => ( diff --git a/src/services/tenderCalendar.js b/src/services/tenderCalendar.js index d24870c..8bf04ab 100644 --- a/src/services/tenderCalendar.js +++ b/src/services/tenderCalendar.js @@ -86,3 +86,10 @@ export function calendarAgenda(tenders, now=new Date()) { undated.sort(compare); return {days,undated}; } +export function shiftCalendarMonth(month,delta) { + if(!/^\d{4}-(0[1-9]|1[0-2])$/.test(month) || !Number.isInteger(delta))return null; + const [year,m]=month.split('-').map(Number),index=year*12+m-1+delta; + const nextYear=Math.floor(index/12),nextMonth=index%12+1; + if(nextYear<1 || nextYear>9999)return null; + return `${String(nextYear).padStart(4,'0')}-${String(nextMonth).padStart(2,'0')}`; +} diff --git a/tests/calendar.test.mjs b/tests/calendar.test.mjs index bbe82f9..753ecb1 100644 --- a/tests/calendar.test.mjs +++ b/tests/calendar.test.mjs @@ -79,3 +79,12 @@ test('calendar agenda sorts known times before unknown and preserves undated rec assert.equal([...agenda.days.values()].flat().length+agenda.undated.length,records.length); assert.equal(records[0].id,'late'); }); +test('calendar month navigation crosses year boundaries without invalid months',async()=>{ + const {shiftCalendarMonth}=await import('../src/services/tenderCalendar.js'); + assert.equal(shiftCalendarMonth('2026-12',1),'2027-01'); + assert.equal(shiftCalendarMonth('2026-01',-1),'2025-12'); + assert.equal(shiftCalendarMonth('2024-02',1),'2024-03'); + assert.equal(shiftCalendarMonth('9999-12',1),null); + assert.equal(shiftCalendarMonth('0001-01',-1),null); + assert.equal(shiftCalendarMonth('2026-13',1),null); +});