diff --git a/docs/quality/qa-navigation-groups.json b/docs/quality/qa-navigation-groups.json new file mode 100644 index 0000000..378cb9a --- /dev/null +++ b/docs/quality/qa-navigation-groups.json @@ -0,0 +1,17 @@ +{ + "date": "2026-09-06", + "environment": "localhost:5182 normal test user", + "checks": { + "discoverVisible": true, + "prepareVisible": true, + "marketVisible": true, + "managementVisible": true, + "adminHidden": true, + "shortcutSelectsGroup": true + }, + "limits": [ + "Four group navigation and sidebar shortcut tested", + "No full mobile viewport or keyboard-only audit in this run", + "Admin visibility rule retained; normal-user hiding tested" + ] +} diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index b60feac..b091445 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -882,3 +882,10 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - 200 otomatik test ve derleme geçti. Beş ayrı sorumlu/belge içeren taslak özeti, eski belge sürümü/depo hatası ve geçmiş deadline önceliği test edildi. - 5182 yerel tarayıcıda beş sentetik görev tek tabloda görüldü; vergi alanına doğrudan odak, kaydedilen düzeltmenin özetten kalkması, sorumlu atamasının yansıması ve yenileme sonrası kalıcılık dahil 6 kontrol geçti (qa-preparation-overview.json). - Bu sentetik kabul gerçek beş resmi dosyanın uygunluğunu kanıtlamaz. Firma portföyü/ürün kapasitesi, tam mobil erişilebilirlik, her eksik belgeye ayrı alt-alan odağı ve resmi çıktılarla ilgili açık maddeler devam eder. Özet kontrolleri kayıtlı taslağa dayanır; yeni AI analizi veya kaydedilmemiş değişiklikler dosya ekranında ayrıca değerlendirilir. + +### D07 — Keşfet / Hazırlan / Pazar / Yönetim — 6 Eylül 2026 +- Tek uzun araç şeridi dört çalışma alanına ayrıldı. Keşfet: liste/bülten/takvim/TED; Hazırlan: Kanban/doküman/KDV/sınır değer/KİK; Pazar: sonuç/sözleşme/fiyat/radar/analitik/kırmızı bayrak; Yönetim: planlar/API/PWA ve yalnız yönetici AI ayarları. +- Grup değişimi ilk aracı açar; etkin ekran ve bekleyen geçiş ilgili grubu belirler. Yan panel gibi başka yerlerden açılan ekranlarda grup otomatik uyum sağlar. Mevcut alt şerit taşma okları ve etkin aracı görünür tutma korunur. Grup düğmeleri aria-pressed, etkin araç aria-current taşır. +- Kullanım kılavuzuna grup açıklaması eklendi. Kanban yardımı yeni durum seçimi, kaydetme, hazırlık özeti ve desteklenmeyen Slack/Teams gönderimine göre güncellendi. +- Yerel normal hesapta dört grup, hazırlık panosunun açılması, normal kullanıcıda AI ayarının gizli olması ve yan panel kısayoluyla grubun değişmesi dahil 6 kontrol geçti (qa-navigation-groups.json). Derleme geçti. Önceki 200 otomatik test tekrar çalıştırılmadı; sunucu/hizmet hesabı değişmedi. +- Yeni menünün tam mobil/yalnız-klavye kabulü ve yardım metinlerinin kalan ekranlardaki iddiaları ayrıca incelenmeli. Bu değişiklik gizlenen yönetici araçlarının sunucu yetkilendirmesi yerine geçmez. diff --git a/src/components/KullanimKilavuzu.jsx b/src/components/KullanimKilavuzu.jsx index 4de61ee..d47c88f 100644 --- a/src/components/KullanimKilavuzu.jsx +++ b/src/components/KullanimKilavuzu.jsx @@ -38,8 +38,8 @@ const KILAVUZ = { kanban: { baslik: 'Kanban Pano', ne: 'Takipteki ihalelerin süreç panosu: İncelenecek → İnceleniyor → Teklif Hazırlanıyor → Verildi → Kazanıldı/Kaybedildi.', - adimlar: ['Kartları sürükleyerek kolon değiştirin.', 'İhale detayında "Hazırlık Görevi Aç" deyin: teslim tarihi ihale saati olur, kartta geri sayım başlar (BUGÜN / 2 gün / süresi geçti).', 'Derin analizden gelen belge kontrol listesi görevin içinde işaretlenir.'], - ipuclari: ['Görev açılmış ihale sonuçlanınca bildirim gelir: kim, kaça, %kaç kırım.'], + adimlar: ['Kartın iş akışı durumunu seçin veya kartı sürükleyin. Kayıt tamamlanana kadar bekleyin; hata varsa işlem kaydedilmiş sayılmaz.', 'İhale detayında "Hazırlık Görevi Aç" ile dosyayı panoya ekleyin; sorumluyu karttan atayın.', 'Hazırlık dosyaları özetinde eksik belge ve sıradaki kontrolü açın. Eksik bağlantısı dosyanın ilgili hazırlık alanına götürür; değişikliği taslağa kaydedince özet güncellenir.'], + ipuclari: ['Kontrol sayısı kayıtlı taslağa dayanır ve resmi başvuru onayı değildir. Belge durumunu yenile düğmesiyle depo kayıtlarını tekrar kontrol edin.', 'Slack/Teams gönderimi bu panoda desteklenmez.'], }, rakip_radar: { baslik: 'Rakip Radar', ne: 'Kazanan firmalar, kırım oranı, ortalama teklif sayısı, tek teklifle kazanma oranı.', adimlar: ['"Radara Ekle" ile izleyin; teklif verince/kazanınca uyarı alın.', '"⛔ yasaklı sorgula" KİK sorgusunu açar, firma adını panoya kopyalar.'], ipuclari: ['Kırım oranı yalnız kısımsız ihalelerde hesaplanır — kısmi ihalede sayı yanıltıcı olurdu.'] }, dokuman_deposu: { @@ -127,6 +127,7 @@ export const KullanimKilavuzu = () => {
+

Üst menüde Keşfet ilanları ve takvimi, Hazırlan dosyaları ve hesap araçlarını, Pazar sonuçları ve analizleri, Yönetim hesap ve bağlantı ayarlarını açar. AI model ayarları yalnız yöneticilere görünür.

{k.ne}

diff --git a/src/components/TopNavigation.jsx b/src/components/TopNavigation.jsx index 8dde389..c58b7cc 100644 --- a/src/components/TopNavigation.jsx +++ b/src/components/TopNavigation.jsx @@ -27,6 +27,13 @@ const RENK = { }; const RENK_VARSAYILAN = { ikon: 'text-slate-500', aktif: 'border-blue-200 bg-blue-50 text-blue-700', hover: 'hover:bg-slate-50' }; +const NAV_GROUPS = [ + {id:'discover',label:'Keşfet',tabs:['list','bulten','takvim','ted_eu']}, + {id:'prepare',label:'Hazırlan',tabs:['kanban','dokuman_deposu','kdv','sinir','kik_kararlari']}, + {id:'market',label:'Pazar',tabs:['sonuc','sozlesme','fiyat','rakip_radar','analitik_dashboard','kirmizi_bayrak']}, + {id:'manage',label:'Yönetim',tabs:['planlar','api_webhooks','pwa_settings','ai_ayarlari']}, +]; + export const TopNavigation = () => { const { activeTab, setActiveTab, isAdmin } = useApp(); @@ -66,6 +73,9 @@ export const TopNavigation = () => { { id: 'pwa_settings', label: 'Mobil PWA', icon: Smartphone } ]; + const activeGroup=NAV_GROUPS.find(group=>group.tabs.includes(bekleyen || activeTab)) || NAV_GROUPS[0]; + const visibleItems=activeGroup.tabs.map(id=>navItems.find(item=>item.id===id)).filter(Boolean); + // 18 sekme çoğu ekrana sığmıyor. Kaydırma çubuğu gizli olduğu için sondaki // sekmeler (Planlar, API & Webhooks, Mobil PWA) görünmez kalıyordu; taşma // olduğunda ok düğmeleri gösterilir ve etkin sekme görünür alana kaydırılır. @@ -97,7 +107,8 @@ export const TopNavigation = () => { useEffect(() => { const el = seritRef.current?.querySelector(`[data-tab="${activeTab}"]`); el?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' }); - }, [activeTab]); + tasmaHesapla(); + }, [activeTab, activeGroup.id, tasmaHesapla]); const kaydir = (yon) => { seritRef.current?.scrollBy({ left: yon * 280, behavior: 'smooth' }); @@ -105,6 +116,13 @@ export const TopNavigation = () => { return (
+
{tasma.sol && ( )} -
- {navItems.map(item => { +
+
);