refactor: /sonuc tablosundaki "Filtreler:" çip alanını kaldır

Filtreleme davranışı (URL'deki il+tip paramlarının tabloya ve
sayfalamaya uygulanması) aynen korunur; yalnızca tablo üstündeki
kaldırılabilir çip satırı gösterilmez.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-08-09 00:26:10 +03:00
parent 14f9b622b0
commit e0ff9dec0a

View File

@@ -7,13 +7,11 @@
import { useMemo, useState } from "react"; import { useMemo, useState } from "react";
import Link from "next/link"; import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { import {
ChevronDown, ChevronDown,
Rocket, Rocket,
Scale, Scale,
ShieldCheck, ShieldCheck,
X,
} from "lucide-react"; } from "lucide-react";
import type { import type {
DilimKey, DilimKey,
@@ -22,7 +20,7 @@ import type {
RankResultsListe, RankResultsListe,
} from "@/types/yokatlas"; } from "@/types/yokatlas";
import { riskHesapla, type RiskSeviyesi } from "@/lib/risk"; import { riskHesapla, type RiskSeviyesi } from "@/lib/risk";
import { bolumSayfaSlug, trBaslikDuzeni, uniSayfaSlug } from "@/lib/slug"; import { bolumSayfaSlug, uniSayfaSlug } from "@/lib/slug";
import { import {
ProgramSiraGecmisi, ProgramSiraGecmisi,
ProgramTabanTrendi, ProgramTabanTrendi,
@@ -105,29 +103,13 @@ export function ProgramTablosu({
filtreIller?: string[]; filtreIller?: string[];
filtreTip?: "devlet" | "vakif"; filtreTip?: "devlet" | "vakif";
}) { }) {
const router = useRouter();
const arama = useSearchParams();
const [aktifDilim, setAktifDilim] = useState<DilimKey>(() => const [aktifDilim, setAktifDilim] = useState<DilimKey>(() =>
varsayilanDilim(sonuclar), varsayilanDilim(sonuclar),
); );
// Sihirbaz seçimlerinden URL'e yazılan filtreler (bkz. sonucHref) —
// sayfalama isteklerinde ve veri anahtarında kullanılır.
const iller = useMemo(() => filtreIller ?? [], [filtreIller]); const iller = useMemo(() => filtreIller ?? [], [filtreIller]);
// Filtre çipini kaldırmak yalnızca URL'i günceller (tek doğruluk kaynağı
// URL); localStorage'taki sihirbaz profiline DOKUNULMAZ — kullanıcı
// tabloda filtreyi kaldırıp tüm sonuçları görebilir, AI listesi seçimleri
// etkilenmez.
function filtreKaldir(tip: "il" | "tip", deger?: string) {
const q = new URLSearchParams(arama.toString());
if (tip === "tip") {
q.delete("tip");
} else {
const kalanlar = q.getAll("il").filter((i) => i !== deger);
q.delete("il");
for (const i of kalanlar) q.append("il", i);
}
router.replace(`?${q}`, { scroll: false });
}
// "Daha fazla göster" ile sayfalanan devam satırları. Sıra/tür/filtre // "Daha fazla göster" ile sayfalanan devam satırları. Sıra/tür/filtre
// değişince (puan türü seçici aynı bileşeni yeniden render eder, remount // değişince (puan türü seçici aynı bileşeni yeniden render eder, remount
// etmez) render sırasında sıfırlanır ki eski kümenin satırları karışmasın. // etmez) render sırasında sıfırlanır ki eski kümenin satırları karışmasın.
@@ -193,39 +175,6 @@ export function ProgramTablosu({
onPointerEnter={preloadTercihHaritasi} onPointerEnter={preloadTercihHaritasi}
onFocusCapture={preloadTercihHaritasi} onFocusCapture={preloadTercihHaritasi}
> >
{/* Sihirbaz seçimlerinden gelen aktif filtreler — görünür ve tek tek
kaldırılabilir; sayılar neden azaldı sorusunu burada yanıtlar. */}
{iller.length > 0 || filtreTip ? (
<div className="mb-3 flex flex-wrap items-center gap-2">
<span className="text-xs font-semibold text-slate-400">
Filtreler:
</span>
{filtreTip ? (
<button
type="button"
onClick={() => filtreKaldir("tip")}
title="Üniversite tipi filtresini kaldır"
className="inline-flex cursor-pointer items-center gap-1 rounded-full border border-slate-200 bg-white px-3 py-1.5 text-xs font-medium text-slate-700 transition-colors duration-150 hover:border-slate-300 hover:bg-slate-50"
>
{filtreTip === "devlet" ? "Devlet" : "Vakıf"}
<X className="size-3" aria-hidden />
</button>
) : null}
{iller.map((il) => (
<button
key={il}
type="button"
onClick={() => filtreKaldir("il", il)}
title={`${trBaslikDuzeni(il)} filtresini kaldır`}
className="inline-flex cursor-pointer items-center gap-1 rounded-full border border-slate-200 bg-white px-3 py-1.5 text-xs font-medium text-slate-700 transition-colors duration-150 hover:border-slate-300 hover:bg-slate-50"
>
{trBaslikDuzeni(il)}
<X className="size-3" aria-hidden />
</button>
))}
</div>
) : null}
<Tabs <Tabs
value={aktifDilim} value={aktifDilim}
onValueChange={(v) => setAktifDilim(v as DilimKey)} onValueChange={(v) => setAktifDilim(v as DilimKey)}