feat(liste): varyant çipi — sonuç tablosu, kendi listem çekmecesi, katalog tabloları
Satır altı meta satırında tür çipinin hemen ardından SATIR_CIP sınıfıyla "Burslu · İngilizce" çipi (DESIGN.md §4.15); null ise hiçbir şey çizilmez. Çekmecede üniversite adından sonra "· %50 İndirimli". Manuel liste kaydı varyantı opsiyonel taşır (eski localStorage kayıtları geçer); + butonu ve programEkleIste etiketi kopyalar, programOzetle client'a serileştirir. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import {
|
|||||||
SATIR_BUTON_BASLIK,
|
SATIR_BUTON_BASLIK,
|
||||||
SATIR_BUTON_HUCRE,
|
SATIR_BUTON_HUCRE,
|
||||||
SATIR_BUTON_KABI,
|
SATIR_BUTON_KABI,
|
||||||
|
SATIR_CIP,
|
||||||
SATIR_GRUP,
|
SATIR_GRUP,
|
||||||
SATIR_IKINCIL_LINK,
|
SATIR_IKINCIL_LINK,
|
||||||
SATIR_META,
|
SATIR_META,
|
||||||
@@ -242,6 +243,10 @@ export function BolumProgramListesi({
|
|||||||
)}
|
)}
|
||||||
<span className={SATIR_META}>
|
<span className={SATIR_META}>
|
||||||
<TurCipi unitur={p.unitur} />
|
<TurCipi unitur={p.unitur} />
|
||||||
|
{/* Burs/dil/öğretim türü: aynı adlı satırları ayırt eder (§4.15 çip) */}
|
||||||
|
{p.varyant ? (
|
||||||
|
<span className={SATIR_CIP}>{p.varyant}</span>
|
||||||
|
) : null}
|
||||||
{p.il ? (
|
{p.il ? (
|
||||||
<Link
|
<Link
|
||||||
href={ilSayfaHref(p.il)}
|
href={ilSayfaHref(p.il)}
|
||||||
|
|||||||
@@ -107,6 +107,10 @@ export function UniversiteProgramTablosu({
|
|||||||
<span className={SATIR_CIP}>
|
<span className={SATIR_CIP}>
|
||||||
{TUR_ETIKET[p.tur] ?? p.tur}
|
{TUR_ETIKET[p.tur] ?? p.tur}
|
||||||
</span>
|
</span>
|
||||||
|
{/* Burs/dil/öğretim türü: aynı adlı satırları ayırt eder (§4.15 çip) */}
|
||||||
|
{p.varyant ? (
|
||||||
|
<span className={SATIR_CIP}>{p.varyant}</span>
|
||||||
|
) : null}
|
||||||
{p.sure ? (
|
{p.sure ? (
|
||||||
<span className="shrink-0">{p.sure} yıl</span>
|
<span className="shrink-0">{p.sure} yıl</span>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -452,6 +452,10 @@ function CekmeceSatiri({
|
|||||||
>
|
>
|
||||||
{trBaslikDuzeni(tercih.universite)}
|
{trBaslikDuzeni(tercih.universite)}
|
||||||
</Link>
|
</Link>
|
||||||
|
{/* Burs/dil/öğretim türü: aynı adlı satırları ayırt eder */}
|
||||||
|
{tercih.varyant ? (
|
||||||
|
<span className="shrink-0 text-slate-500">· {tercih.varyant}</span>
|
||||||
|
) : null}
|
||||||
</span>
|
</span>
|
||||||
{tercih.risk || tercih.efektifSira != null ? (
|
{tercih.risk || tercih.efektifSira != null ? (
|
||||||
<span className="mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-slate-500">
|
<span className="mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-slate-500">
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ type ProgramOzet = Pick<
|
|||||||
| "unitur"
|
| "unitur"
|
||||||
| "tur"
|
| "tur"
|
||||||
| "efektifSira"
|
| "efektifSira"
|
||||||
|
| "varyant"
|
||||||
>;
|
>;
|
||||||
|
|
||||||
const PROFILSIZ_EKLEME_TOAST_ID = "profilsiz-ekleme";
|
const PROFILSIZ_EKLEME_TOAST_ID = "profilsiz-ekleme";
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import {
|
|||||||
SATIR_BUTON_HUCRE,
|
SATIR_BUTON_HUCRE,
|
||||||
SATIR_BUTON_KABI,
|
SATIR_BUTON_KABI,
|
||||||
SATIR_ALT_GRUP,
|
SATIR_ALT_GRUP,
|
||||||
|
SATIR_CIP,
|
||||||
SATIR_IKINCIL_LINK,
|
SATIR_IKINCIL_LINK,
|
||||||
SATIR_META,
|
SATIR_META,
|
||||||
SATIR_MOBIL_SAYI,
|
SATIR_MOBIL_SAYI,
|
||||||
@@ -373,6 +374,10 @@ function ProgramSatiri({
|
|||||||
unitur={p.unitur}
|
unitur={p.unitur}
|
||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
/>
|
/>
|
||||||
|
{/* Burs/dil/öğretim türü: aynı adlı satırları ayırt eder (§4.15 çip) */}
|
||||||
|
{p.varyant ? (
|
||||||
|
<span className={SATIR_CIP}>{p.varyant}</span>
|
||||||
|
) : null}
|
||||||
{p.il ? (
|
{p.il ? (
|
||||||
<Link
|
<Link
|
||||||
href={ilSayfaHref(p.il)}
|
href={ilSayfaHref(p.il)}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ export type BekleyenProgram = {
|
|||||||
| "unitur"
|
| "unitur"
|
||||||
| "tur"
|
| "tur"
|
||||||
| "efektifSira"
|
| "efektifSira"
|
||||||
|
| "varyant"
|
||||||
>;
|
>;
|
||||||
kaynak: ManuelKaynak;
|
kaynak: ManuelKaynak;
|
||||||
adaySira?: number;
|
adaySira?: number;
|
||||||
@@ -271,11 +272,16 @@ export function programEkleIste(opts: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const profil = profilsiz ? null : (durum.profil ?? tercihProfiliOku());
|
const profil = profilsiz ? null : (durum.profil ?? tercihProfiliOku());
|
||||||
const tercih = programdanManuelTercih(
|
// programdanManuelTercih (liste-store) varyantı bilmez; etiket burada
|
||||||
|
// kopyalanır ki çekmece aynı adlı satırları ayırt edebilsin.
|
||||||
|
const tercih = {
|
||||||
|
...programdanManuelTercih(
|
||||||
program,
|
program,
|
||||||
adaySira ?? profil?.sira ?? null,
|
adaySira ?? profil?.sira ?? null,
|
||||||
kaynak,
|
kaynak,
|
||||||
);
|
),
|
||||||
|
varyant: program.varyant ?? null,
|
||||||
|
};
|
||||||
const ok = ekle(tercih);
|
const ok = ekle(tercih);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ export type ManuelTercih = {
|
|||||||
/** Ekleme / profil anındaki aday sıralamasına göre risk */
|
/** Ekleme / profil anındaki aday sıralamasına göre risk */
|
||||||
risk: RiskSeviyesi | null;
|
risk: RiskSeviyesi | null;
|
||||||
kaynak?: ManuelKaynak;
|
kaynak?: ManuelKaynak;
|
||||||
|
/** Burs/dil/öğretim türü etiketi (Program.varyant); eski kayıtlarda yok */
|
||||||
|
varyant?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Güvenilmeyen JSON'u (localStorage veya sunucu kaydı) listeye süzer. */
|
/** Güvenilmeyen JSON'u (localStorage veya sunucu kaydı) listeye süzer. */
|
||||||
@@ -66,6 +68,7 @@ export function dogrula(ham: unknown): ManuelTercih[] {
|
|||||||
: null,
|
: null,
|
||||||
risk,
|
risk,
|
||||||
kaynak,
|
kaynak,
|
||||||
|
varyant: typeof kayit.varyant === "string" ? kayit.varyant : null,
|
||||||
});
|
});
|
||||||
if (sonuc.length >= MANUEL_LISTE_MAX) break;
|
if (sonuc.length >= MANUEL_LISTE_MAX) break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export function programOzetle(p: Program): ProgramListeSatiri {
|
|||||||
efektifSira: p.efektifSira,
|
efektifSira: p.efektifSira,
|
||||||
kontenjanSon: p.kontenjanSon,
|
kontenjanSon: p.kontenjanSon,
|
||||||
yerlesenSon: p.yerlesenSon,
|
yerlesenSon: p.yerlesenSon,
|
||||||
|
varyant: p.varyant,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user