From 8d6f3bc3ea67e9b1a310fe28be23d71eb435f4d7 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 10:51:13 +0300 Subject: [PATCH] Verify paginated source history in the browser and fix QA route matching --- docs/quality/qa-source-history.json | 13 +++++++++++++ docs/quality/uygulama-durumu.md | 8 ++++++++ src/components/TenderDetailModal.jsx | 2 +- tests/browser-qa.mjs | 7 ++++++- 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 docs/quality/qa-source-history.json diff --git a/docs/quality/qa-source-history.json b/docs/quality/qa-source-history.json new file mode 100644 index 0000000..223150b --- /dev/null +++ b/docs/quality/qa-source-history.json @@ -0,0 +1,13 @@ +{ + "checks": { + "firstPage20": true, + "beforeShown": true, + "afterShown": true, + "total23": true, + "initialObservation": true, + "noMorePages": true + }, + "first": "\n - generic \"Kaynak değişiklik geçmişi\"\n - paragraph: Uygulamanın gözlemlediği sürümler gösterilir. Gözlem zamanı resmi değişiklik tarihi değildir; kayıt öncesindeki veya iki kontrol arasındaki değişiklikler bulunmayabilir. Farklı kaynaklar ayrı izlenir.\n - list:\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - button \"Daha eski kayıtlar\"\n - button \"Listeye Geri Dön\":\n - generic: Listeye Geri Dön\n - button \"İncelendi olarak işaretle\"\n - button \"Takip Et\":\n - generic: Takip Et\n - button \"🗂 Hazırlık Görevi Aç\"\n - button \"İhale detayını kapat\":\n - generic: Mal Alımı\n - generic: \"İKN: 2026/1582991\"\n - generic: \"Ekleme:\"\n - heading \"QA — Giresun laboratuvar\" [level=1]\n - generic: Kurum Adı\n - generic \"Giresun TEST KURUMU\"\n - generic: İhale Tarihi & Saat\n - generic: 10.09.2026 - 10:00\n - generic: Şehir / Bölge\n - generic: Giresun ()\n - generic: Yaklaşık Maliyet\n - generic: Gizli / Belirtilmemiş\n - button \"İhale Detayları\":\n - generic: İhale Detayları\n - button \"Birim Fiyat Cetveli (PDF & Kaşe) İnteraktif\":\n - generic: Birim Fiyat Cetveli (PDF & Kaşe)\n - generic: İnteraktif\n - button \"Yapay Zeka Asistanı\":\n - generic: Yapay Zeka Asistanı\n - button \"Hazırlık Checklist\":\n - generic: Hazırlık Checklist\n - button \"Teklif Asistanı AI\":\n - generic: Teklif Asistanı\n - generic: AI\n - heading \"İhale Açıklaması & Teslimat Koşulları\" [level=3]:\n - text: İhale Açıklaması & Teslimat Koşulları\n - paragraph: Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif.\n - generic: Teslimat Süresi\n - generic: Teslimat Yeri\n - heading \"Teklif Cetveli Kalemleri\" [level=3]:\n - text: Teklif Cetveli Kalemleri\n - paragraph: İhale kaydında aşağıda gösterilen 1 kalem var. Ortak doküman havuzunda ayrıca çıkarılmış bir cetvel bulunamadı; mevcut kalemleri resmi dokümanla karşılaştırın. İhale dokümanından ortak havuza aktarılan kalemler diğer kullanıcılara da görünür.\n - heading \"Malzeme / Kalem Listesi (1 Kalem)\" [level=3]\n - table:\n - rowgroup:\n - row \"# Malzeme Adı Miktar Tahmini Birim Fiyat Toplam Tutarlar\":\n - columnheader \"#\"\n - columnheader \"Malzeme Adı\"\n - columnheader \"Miktar\"\n - columnheader \"Tahmini Birim Fiyat\"\n - columnheader \"Toplam Tutarlar\"\n - rowgroup:\n - row \"1 Sentetik test kalemi 2 adet — —\":\n - cell \"1\"\n - cell \"Sentetik test kalemi\"\n - cell \"2 adet\"\n - cell \"—\"\n - cell \"—\"\n - heading \"Ekip Notları\" [level=3]\n - textbox \"Ekip notu\":\n - /placeholder: Ekip arkadaşlarınıza not yazın...\n - button \"Not Ekle\" [disabled]:\n - text: Not Ekle\n - text: Kur Farkı Hesaplayıcı\n - generic: TCMB döviz satış\n - paragraph:\n - 'link \"TCMB bülteni: 04.09.2026\"':\n - /url: https://www.tcmb.gov.tr/kurlar/today.xml\n - text: \"· Alındı: 06.09.2026 10:50:22\"\n - generic: USD / TRY\n - text: ₺48.3195\n - generic: EUR / TRY\n - text: ₺56.1581\n - text: Teklif Tutarı (TL)\n - spinbutton: \"15000\"\n - generic: \"Dolar Karşılığı:\"\n - generic: $310.43\n - generic: \"Euro Karşılığı:\"\n - generic: €267.10\n - heading \"İhale Dosyaları & Takvim\" [level=4]\n - button \"Birim Fiyat Cetveli (PDF Aç/Düzenle)\":\n - text: Birim Fiyat Cetveli (PDF Aç/Düzenle)\n - button \"Google / Outlook Takvime Ekle\":\n - text: Google / Outlook Takvime Ekle\n- button \"Kullanım kılavuzu (? tuşu)\":", + "expanded": "\n - generic \"Kaynak değişiklik geçmişi\"\n - paragraph: Uygulamanın gözlemlediği sürümler gösterilir. Gözlem zamanı resmi değişiklik tarihi değildir; kayıt öncesindeki veya iki kontrol arasındaki değişiklikler bulunmayabilir. Farklı kaynaklar ayrı izlenir.\n - list:\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\" [active]\n - paragraph: \"Önce: 11:00\"\n - paragraph: \"Sonra: 10:00\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - button \"Daha eski kayıtlar\"\n - button \"Listeye Geri Dön\":\n - generic: Listeye Geri Dön\n - button \"İncelendi olarak işaretle\"\n - button \"Takip Et\":\n - generic: Takip Et\n - button \"🗂 Hazırlık Görevi Aç\"\n - button \"İhale detayını kapat\":\n - generic: Mal Alımı\n - generic: \"İKN: 2026/1582991\"\n - generic: \"Ekleme:\"\n - heading \"QA — Giresun laboratuvar\" [level=1]\n - generic: Kurum Adı\n - generic \"Giresun TEST KURUMU\"\n - generic: İhale Tarihi & Saat\n - generic: 10.09.2026 - 10:00\n - generic: Şehir / Bölge\n - generic: Giresun ()\n - generic: Yaklaşık Maliyet\n - generic: Gizli / Belirtilmemiş\n - button \"İhale Detayları\":\n - generic: İhale Detayları\n - button \"Birim Fiyat Cetveli (PDF & Kaşe) İnteraktif\":\n - generic: Birim Fiyat Cetveli (PDF & Kaşe)\n - generic: İnteraktif\n - button \"Yapay Zeka Asistanı\":\n - generic: Yapay Zeka Asistanı\n - button \"Hazırlık Checklist\":\n - generic: Hazırlık Checklist\n - button \"Teklif Asistanı AI\":\n - generic: Teklif Asistanı\n - generic: AI\n - heading \"İhale Açıklaması & Teslimat Koşulları\" [level=3]:\n - text: İhale Açıklaması & Teslimat Koşulları\n - paragraph: Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif.\n - generic: Teslimat Süresi\n - generic: Teslimat Yeri\n - heading \"Teklif Cetveli Kalemleri\" [level=3]:\n - text: Teklif Cetveli Kalemleri\n - paragraph: İhale kaydında aşağıda gösterilen 1 kalem var. Ortak doküman havuzunda ayrıca çıkarılmış bir cetvel bulunamadı; mevcut kalemleri resmi dokümanla karşılaştırın. İhale dokümanından ortak havuza aktarılan kalemler diğer kullanıcılara da görünür.\n - heading \"Malzeme / Kalem Listesi (1 Kalem)\" [level=3]\n - table:\n - rowgroup:\n - row \"# Malzeme Adı Miktar Tahmini Birim Fiyat Toplam Tutarlar\":\n - columnheader \"#\"\n - columnheader \"Malzeme Adı\"\n - columnheader \"Miktar\"\n - columnheader \"Tahmini Birim Fiyat\"\n - columnheader \"Toplam Tutarlar\"\n - rowgroup:\n - row \"1 Sentetik test kalemi 2 adet — —\":\n - cell \"1\"\n - cell \"Sentetik test kalemi\"\n - cell \"2 adet\"\n - cell \"—\"\n - cell \"—\"\n - heading \"Ekip Notları\" [level=3]\n - textbox \"Ekip notu\":\n - /placeholder: Ekip arkadaşlarınıza not yazın...\n - button \"Not Ekle\" [disabled]:\n - text: Not Ekle\n - text: Kur Farkı Hesaplayıcı\n - generic: TCMB döviz satış\n - paragraph:\n - 'link \"TCMB bülteni: 04.09.2026\"':\n - /url: https://www.tcmb.gov.tr/kurlar/today.xml\n - text: \"· Alındı: 06.09.2026 10:50:22\"\n - generic: USD / TRY\n - text: ₺48.3195\n - generic: EUR / TRY\n - text: ₺56.1581\n - text: Teklif Tutarı (TL)\n - spinbutton: \"15000\"\n - generic: \"Dolar Karşılığı:\"\n - generic: $310.43\n - generic: \"Euro Karşılığı:\"\n - generic: €267.10\n - heading \"İhale Dosyaları & Takvim\" [level=4]\n - button \"Birim Fiyat Cetveli (PDF Aç/Düzenle)\":\n - text: Birim Fiyat Cetveli (PDF Aç/Düzenle)\n - button \"Google / Outlook Takvime Ekle\":\n - text: Google / Outlook Takvime Ekle\n- button \"Kullanım kılavuzu (? tuşu)\":", + "all": "\n - generic \"Kaynak değişiklik geçmişi\"\n - paragraph: Uygulamanın gözlemlediği sürümler gösterilir. Gözlem zamanı resmi değişiklik tarihi değildir; kayıt öncesindeki veya iki kontrol arasındaki değişiklikler bulunmayabilir. Farklı kaynaklar ayrı izlenir.\n - list:\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: \"Önce: 11:00\"\n - paragraph: \"Sonra: 10:00\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - generic \"Saat değişti\"\n - paragraph: 06.09.2026 10:50:16 · qa-1582991\n - paragraph: Bu kaynak için ilk gözlem.\n - button \"Listeye Geri Dön\":\n - generic: Listeye Geri Dön\n - button \"İncelendi olarak işaretle\"\n - button \"Takip Et\":\n - generic: Takip Et\n - button \"🗂 Hazırlık Görevi Aç\"\n - button \"İhale detayını kapat\":\n - generic: Mal Alımı\n - generic: \"İKN: 2026/1582991\"\n - generic: \"Ekleme:\"\n - heading \"QA — Giresun laboratuvar\" [level=1]\n - generic: Kurum Adı\n - generic \"Giresun TEST KURUMU\"\n - generic: İhale Tarihi & Saat\n - generic: 10.09.2026 - 10:00\n - generic: Şehir / Bölge\n - generic: Giresun ()\n - generic: Yaklaşık Maliyet\n - generic: Gizli / Belirtilmemiş\n - button \"İhale Detayları\":\n - generic: İhale Detayları\n - button \"Birim Fiyat Cetveli (PDF & Kaşe) İnteraktif\":\n - generic: Birim Fiyat Cetveli (PDF & Kaşe)\n - generic: İnteraktif\n - button \"Yapay Zeka Asistanı\":\n - generic: Yapay Zeka Asistanı\n - button \"Hazırlık Checklist\":\n - generic: Hazırlık Checklist\n - button \"Teklif Asistanı AI\":\n - generic: Teklif Asistanı\n - generic: AI\n - heading \"İhale Açıklaması & Teslimat Koşulları\" [level=3]:\n - text: İhale Açıklaması & Teslimat Koşulları\n - paragraph: Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif.\n - generic: Teslimat Süresi\n - generic: Teslimat Yeri\n - heading \"Teklif Cetveli Kalemleri\" [level=3]:\n - text: Teklif Cetveli Kalemleri\n - paragraph: İhale kaydında aşağıda gösterilen 1 kalem var. Ortak doküman havuzunda ayrıca çıkarılmış bir cetvel bulunamadı; mevcut kalemleri resmi dokümanla karşılaştırın. İhale dokümanından ortak havuza aktarılan kalemler diğer kullanıcılara da görünür.\n - heading \"Malzeme / Kalem Listesi (1 Kalem)\" [level=3]\n - table:\n - rowgroup:\n - row \"# Malzeme Adı Miktar Tahmini Birim Fiyat Toplam Tutarlar\":\n - columnheader \"#\"\n - columnheader \"Malzeme Adı\"\n - columnheader \"Miktar\"\n - columnheader \"Tahmini Birim Fiyat\"\n - columnheader \"Toplam Tutarlar\"\n - rowgroup:\n - row \"1 Sentetik test kalemi 2 adet — —\":\n - cell \"1\"\n - cell \"Sentetik test kalemi\"\n - cell \"2 adet\"\n - cell \"—\"\n - cell \"—\"\n - heading \"Ekip Notları\" [level=3]\n - textbox \"Ekip notu\":\n - /placeholder: Ekip arkadaşlarınıza not yazın...\n - button \"Not Ekle\" [disabled]:\n - text: Not Ekle\n - text: Kur Farkı Hesaplayıcı\n - generic: TCMB döviz satış\n - paragraph:\n - 'link \"TCMB bülteni: 04.09.2026\"':\n - /url: https://www.tcmb.gov.tr/kurlar/today.xml\n - text: \"· Alındı: 06.09.2026 10:50:22\"\n - generic: USD / TRY\n - text: ₺48.3195\n - generic: EUR / TRY\n - text: ₺56.1581\n - text: Teklif Tutarı (TL)\n - spinbutton: \"15000\"\n - generic: \"Dolar Karşılığı:\"\n - generic: $310.43\n - generic: \"Euro Karşılığı:\"\n - generic: €267.10\n - heading \"İhale Dosyaları & Takvim\" [level=4]\n - button \"Birim Fiyat Cetveli (PDF Aç/Düzenle)\":\n - text: Birim Fiyat Cetveli (PDF Aç/Düzenle)\n - button \"Google / Outlook Takvime Ekle\":\n - text: Google / Outlook Takvime Ekle\n- button \"Kullanım kılavuzu (? tuşu)\":" +} \ No newline at end of file diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 080c676..c55a492 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -681,3 +681,11 @@ Resmi İKN ortak ihale anahtarıdır; doğrudan temin numarası kurumla birlikte Oturum gerektiren sayfalı geçmiş API'si ve ayrıntı ekranında isteğe bağlı geçmiş görünümü eklendi. Önce/sonra metinleri açılabilir, daha eski kayıtlar getirilebilir. Boş geçmiş değişiklik yokluğunun kanıtı olarak sunulmaz. Kayıt hatası havuz uyarısına, okuma hatası yeniden denemeli ekran durumuna yansır. Kaynak kaydı yalnız uygulamanın gözlemlediği andan itibaren birikir; geçmişe dönük resmi zeyilnameler yüklenmiş değildir. Doğrulama: gerçek SQLite yeniden açılışları, aynı veriyi tekrar alma, değer geri dönüşü, kaynak ayrımı, kurum kapsamlı DT kimliği, sayfalama; HTTP oturum/boş sonuç/geçersiz sayfa/metot. Tüm 147 test ve üretim derlemesi geçti. Son depo-açılış temizliği değişikliğinden sonra iki depo testi tekrar geçti. Canlı kaynak birikimi, tarayıcıdan dolu geçmiş ve zeyilname bildirim kabulü açık. Bu volume kullanıcı yedeğinin kapsamı dışında; tam D11 yedeğine ayrıca dahil edilmeli. Canlı yayın yapılmadı. + +### D04 / D09 — Kaynak geçmişi tarayıcı kabulü + +Yerel QA yardımcı sunucusu geçici gerçek SQLite deposuna ilk gözlem ve 22 saat değişikliği ekleyecek şekilde genişletildi. İlk tarayıcı denemesi test middleware'inin `/api/tenders` önekli bütün yolları örnek listeyle karşıladığını ortaya çıkardı. Eşleşme yalnız liste yoluna ve sorgusuna daraltıldı; çalışan test sunucusu bu kod değişikliği için kontrollü yeniden başlatıldı. + +Gerçek geçmiş API'si üzerinden Giresun ayrıntısı → Kaynak değişiklik geçmişi → Geçmişi yükle akışında 20 kayıt; ilk Saat değişti başlığında Önce 11:00 / Sonra 10:00; Daha eski kayıtlar ile toplam 23 kayıt ve ilk gözlem; son sayfada devam düğmesinin kaybolması doğrulandı. Altı kontrol doğru. Kanıt qa-source-history.json. Veriler sentetik ve geçici; canlı resmi zeyilname kabulü değildir. + +Yeni açılır başlıkların klavye erişimi için modal odak döngüsüne summary öğeleri eklendi. Üretim derlemesi geçti. Önceki 147 otomatik test bu yalnız QA/odak seçicisi turunda tekrarlanmadı. Ağ hata/yeniden deneme ve gerçek kaynak birikimi kabulü açık. Canlı yayın yapılmadı. diff --git a/src/components/TenderDetailModal.jsx b/src/components/TenderDetailModal.jsx index 8830058..6b939e2 100644 --- a/src/components/TenderDetailModal.jsx +++ b/src/components/TenderDetailModal.jsx @@ -31,7 +31,7 @@ export const TenderDetailModal = () => { e.preventDefault(); e.stopPropagation(); setActiveTenderDetail(null); return; } if (e.key !== 'Tab') return; - const focusable = [...dialogRef.current.querySelectorAll('button, a[href], input, select, textarea, [tabindex]')] + const focusable = [...dialogRef.current.querySelectorAll('button, a[href], input, select, textarea, summary, [tabindex]')] .filter(el => el.tabIndex >= 0 && !el.disabled && el.getClientRects().length && !el.closest('[inert]')); const first = focusable[0], last = focusable.at(-1); if (!first) { e.preventDefault(); dialogRef.current.focus(); } diff --git a/tests/browser-qa.mjs b/tests/browser-qa.mjs index 9b37b6a..8887308 100644 --- a/tests/browser-qa.mjs +++ b/tests/browser-qa.mjs @@ -18,12 +18,17 @@ const probe=netServer();await new Promise(r=>probe.listen(0,'127.0.0.1',r));cons const api=spawn(process.execPath,['server/index.js'],{cwd:new URL('..',import.meta.url),env:{PATH:process.env.PATH,NODE_ENV:'test',AUTH_SECRET:process.env.AUTH_SECRET,IHALEIST_USER_DATA_DIR:dir,IHALEIST_SHARED_DATA_DIR:join(dir,'shared'),PORT:String(port),UYUM_GOMME:'0'},stdio:'ignore'}); const entries=[['1582991','Giresun','10.09.2026','10:00'],['1534665','Kayseri','22.09.2026','11:00'],['1499061','Akdeniz','22.09.2026','10:30'],['1573235','Aksaray','09.09.2026','10:00'],['1523851','Tepecik','11.09.2026','10:00']]; const tenders=entries.map(([id,city,date,time])=>({id:'qa-'+id,ikn:'2026/'+id,baslik:'QA — '+city+' laboratuvar',kurum:city+' TEST KURUMU',sehir:city,tarih:date,saat:time,alimTuru:'Mal Alımı',sektor:'Laboratuvar & Ölçüm',sektorler:['Laboratuvar & Ölçüm'],durum:'Açık',takipte:false,kanbanStatus:'incelenecek',items:[{id:'1',ad:'Sentetik test kalemi',miktar:2,birim:'adet'}],aciklama:'Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. '.repeat(3)})); +// Seed actual persistent history only in this disposable QA volume. +process.env.IHALEIST_SHARED_DATA_DIR=join(dir,'shared'); +const {observeTenders}=await import('../server/tender-history.mjs'); +observeTenders(tenders); +for(let revision=1;revision<=22;revision++) observeTenders([{...tenders[0],saat:revision%2?'11:00':'10:00'}]); const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{target:'http://127.0.0.1:'+port}}},plugins:[{name:'qa-fixtures',configureServer(server){server.middlewares.use((req,res,next)=>{ if(req.url==='/qa-api-controls') {res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`

Yerel API testi

Yalnız geçici test deposunu etkiler.

`);return;} if(req.method==='POST' && req.url?.startsWith('/qa-api-failure?')) {apiKeyListFailure=new URL(req.url,'http://localhost').searchParams.get('mode')==='on';res.end('ok');return;} if(apiKeyListFailure && req.method==='GET' && req.url==='/api/me/apikeys') {res.writeHead(503,{'Content-Type':'application/json'});res.end(JSON.stringify({success:false,error:'QA: Anahtar deposuna erişilemiyor.'}));return;} if(req.url==='/qa-signin') {res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`

Yerel laboratuvar testi

Sentetik ihale verileri ve geçici kullanıcı deposu kullanılır.

`);return;} - if(req.url?.startsWith('/api/tenders')){res.setHeader('Content-Type','application/json');res.end(JSON.stringify({success:true,tenders,totalCount:5,todayCount:0,historyCount:0,source:'Yerel sentetik QA',fetchedAt:new Date().toISOString()}));return;} + if(req.url==='/api/tenders' || req.url?.startsWith('/api/tenders?')){res.setHeader('Content-Type','application/json');res.end(JSON.stringify({success:true,tenders,totalCount:5,todayCount:0,historyCount:0,source:'Yerel sentetik QA',fetchedAt:new Date().toISOString()}));return;} next(); });}}]}); await ui.listen();console.log('QA_URL='+ui.resolvedUrls.local[0]+'qa-signin');