feat(veri): bileşenler yılsız Program'a ve veri-yillari sözlüğüne geçti (P-B b)

- SiraSerisi = { siraGecmisi, ilkYil? }; yardımcılar dizinin kendi son iki
  elemanıyla çalışır, yıl ilkYil + indeks. raporSiraSerisi diziyi doldurmaz:
  5 elemanlı eski raporlar 2024→2025 trendini göstermeye devam eder.
- Tablo başlıkları "Son ${VERI_YIL_SAYISI} yıl"; rapor listesi başlığı kaydın
  kendi pencere uzunluğunu söyler (eski rapor: 5).
- siraYiliEtiketi SON_YIL/ONCEKI_YIL'dan; bölüm/üniversite sayfa metinleri ve
  metadata SON_YIL, TERCIH_YILI, BASLIK_YILI sözlüğünden.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 17:00:39 +03:00
parent ce40b7c5b3
commit ceeb70375d
10 changed files with 127 additions and 89 deletions

View File

@@ -2,7 +2,7 @@
// 24'lük listenin gövdesi. Görsel dil sonuç sayfasındaki ham program
// tablosuyla birebir aynıdır (bkz. program-tablosu.tsx): aynı beyaz kart,
// aynı satır düzeni, aynı "Son 5 yıl" / "Taban sıra" sütunları. Buradaki fark
// aynı satır düzeni, aynı "Son N yıl" / "Taban sıra" sütunları. Buradaki fark
// içerik: satır sırası tercih numarası, risk sütunu Yapay Zeka'dan gelir ve
// satır açıldığında gerekçe/risk notu görünür. Program adı ve tabanlar herkese
// açık; Yapay Zeka katmanı kilitliBaslangic sonrasında ücretlidir (metin
@@ -27,6 +27,7 @@ import {
TableRow,
} from "@/components/ui/table";
import { bolumSayfaSlug, uniSayfaSlug } from "@/lib/slug";
import { VERI_YIL_SAYISI } from "@/lib/veri-yillari";
import type { RaporSonuc } from "@/features/rapor/types/rapor";
import {
DILIM_ETIKET,
@@ -47,7 +48,7 @@ const RISK_STIL: Record<RiskSeviyesi, { nokta: string; icon: typeof Rocket }> =
guvenli: { nokta: "bg-emerald-500", icon: ShieldCheck },
};
// Sütun sayısı: # · Program · Son 5 yıl · Risk · Taban sıra · detay oku
// Sütun sayısı: # · Program · Son N yıl · Risk · Taban sıra · detay oku
const SUTUN_SAYISI = 6;
/**
@@ -161,6 +162,19 @@ export function RaporListesi({
return iller.size === 1 ? [...iller][0] : null;
}, [rapor]);
// Sütun başlığı kaydın KENDİ penceresini söyler: eski raporların sıra
// geçmişi üretildiği günün yıl sayısını taşır (dizi doldurulmaz), başlık
// çizgide olmayan bir yılı vaat etmesin. Geçmişi hiç olmayan kayıtta
// bugünkü pencereye düşer.
const yilSayisi = useMemo(() => {
let enUzun = 0;
for (const t of rapor.tercihler) {
const n = rapor.programlar[t.programId]?.siraGecmisi?.length ?? 0;
if (n > enUzun) enUzun = n;
}
return enUzun > 0 ? enUzun : VERI_YIL_SAYISI;
}, [rapor]);
const satir = (t: RaporSonuc["tercihler"][number], index: number) => {
const p = rapor.programlar[t.programId];
const analizKilitli = index >= kilitIdx;
@@ -168,7 +182,7 @@ export function RaporListesi({
(adaySira != null ? riskHesapla(p?.efektifSira, adaySira) : null) ??
dilimdenRisk(t.dilim);
const stil = RISK_STIL[risk];
const seri = raporSiraSerisi(p?.siraGecmisi);
const seri = raporSiraSerisi(p?.siraGecmisi, p?.ilkYil);
const taban = p?.efektifSira ?? programEtkinSira(seri);
const acikMi = acik.has(t.sira);
const devlet = p?.unitur === "DEVLET";
@@ -366,7 +380,7 @@ export function RaporListesi({
<TableHead className="w-8 pl-4 pr-0">#</TableHead>
<TableHead>Program</TableHead>
<TableHead className="hidden text-right md:table-cell">
Son 5 yıl
Son {yilSayisi} yıl
</TableHead>
<TableHead>
<span className="hidden sm:inline">Yapay Zeka </span>Risk

View File

@@ -105,7 +105,7 @@ export function TadimlikSatiri({
const p = satir.program;
const risk = riskHesapla(p.efektifSira, sira) ?? dilimdenRisk(satir.dilim);
const seri = raporSiraSerisi(p.siraGecmisi);
const seri = raporSiraSerisi(p.siraGecmisi, p.ilkYil);
const taban = p.efektifSira ?? programEtkinSira(seri);
const devlet = p.unitur === "DEVLET";
const girisUrl = `/giris?callback=${encodeURIComponent(sonucHref())}`;