# Paylaş Kutusu — Parametre Seti Sistemi

**Tarih:** 2026-03-14
**Durum:** Tasarım onaylandı

## Amaç

Paylaş kutusuna hibrit (kod + DB) parametre seti grupları ekleyerek, farklı projelerde farklı parametre şablonları sunmak ve kullanıcıları rol bazlı kısıtlamak.

## Genel Mimari

```
Parametre Seti Kaynakları (Hibrit):
  ├─ Kod tarafı: Servisler parametreSetleri input'u ile sabit setler tanımlar
  ├─ DB tarafı: Admin panelden parametre_seti_gruplari koleksiyonuna dinamik ekleme
  └─ Birleştirme: Aynı id'li set varsa DB kazanır (override)
```

## Veri Modeli

### IParametreSetiGrubu (Üst Grup)

```typescript
interface IParametreSetiGrubu {
  id: string;
  baslik: string;                    // "Projeler"
  simge: string;                     // "📁"
  renk?: string;                     // gradient renk
  aciklama?: string;                 // kısa açıklama
  altGruplar?: IParametreSeti[];     // nested alt setler (varsa)
  parametreler?: IParametre[];       // direkt parametreler (altGrubu yoksa)
  yetkiler?: {
    gorebilir?: string[];            // hangi roller görebilir
    kullanabilir?: string[];         // hangi roller kullanabilir
  };
  kaynak: 'kod' | 'db';             // nereden geldiği
  sira?: number;                     // gösterim sırası
}
```

### IParametreSeti (Alt Set)

```typescript
interface IParametreSeti {
  id: string;
  baslik: string;                    // "Kategori"
  simge: string;                     // "📂"
  aciklama?: string;
  parametreler: IParametre[];        // bu setin parametreleri
  yetkiler?: {
    gorebilir?: string[];
    kullanabilir?: string[];
  };
  sayfaKurallari?: {
    yeniSayfaEngelle?: boolean;      // set seçildiyse yeni sayfa eklenemez
    maxSayfa?: number;               // max sayfa limiti (ör: 3)
  };
  sira?: number;
}
```

### IParametreSetiGrubu: Discriminated Union

`altGruplar` ve `parametreler` birlikte bulunamaz. Runtime'da `altGruplar` varsa grup, yoksa yaprak olarak islenir:

```typescript
// altGruplar varsa → grup (navigasyon), parametreler ignore edilir
// altGruplar yoksa → yaprak (parametre gosterimi), parametreler kullanilir
```

### ID Namespace Kurali

Cakisma onlemek icin ID'ler `<uygulama>.<grup>.<set>` formatinda olmalidir:
- Kod tarafi: `uyar.proje.kategori`, `uyar.proje.ekle`
- DB tarafi: `admin.uretim.rapor`, `admin.kalite.kontrol`

### DB Koleksiyonu: `parametre_seti_gruplari`

```json
{
  "_id": "ObjectId",
  "id": "uyar.proje",
  "baslik": "Projeler",
  "simge": "📁",
  "renk": "linear-gradient(135deg, #1e3a5f, #1677ff)",
  "altGruplar": [
    {
      "id": "uyar.proje.ekle",
      "baslik": "Ekle",
      "simge": "➕",
      "parametreler": [
        { "turu": "Yazı", "ismi": "kategoriAdi", "baslik": "Kategori Adı", "ayarlar": { "zorunlu": true } },
        { "turu": "Renk", "ismi": "renk", "baslik": "Renk" }
      ],
      "sayfaKurallari": { "yeniSayfaEngelle": true }
    }
  ],
  "yetkiler": { "gorebilir": ["Yönetici", "Operatör"], "kullanabilir": ["Yönetici"] },
  "olusturan": "userId",
  "olusturmaTarihi": "ISODate",
  "guncellenmeTarihi": "ISODate"
}
```

## UI Tasarımı

### Akış

1. Paylaş kutusunun toolbar'ına **⚙️ buton** eklenir (mevcut butonların yanına)
2. Tıklayınca içerik alanında (icerik editörün olduğu yerde) Windows Start tile benzeri **parametre seti kartları** gösterilir
3. Alt grubu olan sete tıklayınca → animasyonlu sayfa geçişi ile **alt set kartları** gösterilir (geri butonu ile üst gruba dönülür)
4. Yaprak set (parametreleri olan) seçilince → kartların altında parametreler render edilir, kullanıcı direkt değerleri değiştirir
5. Seçilen setin parametreleri kartın ilgili sayfasının `parametreler[]` alanına yazılır

### İçerik Sayfası Kuralları

- **Her içerik sayfasında en fazla 1 parametre seti** seçilebilir
- **Farklı sayfalarda farklı setler** olabilir (sayfa 1: "Projeler→Kategori", sayfa 2: "Projeler→Ekle")
- Seçili setin `sayfaKurallari` aktifse:
  - `yeniSayfaEngelle: true` → yeni sayfa ekleme butonu gizlenir
  - `maxSayfa: N` → sayfa sayısı N'i geçemez
- Set değiştirme: mevcut parametreler temizlenip yeni setin parametreleri yüklenir (onay dialogu ile)

### Tile Kartları Görünümü

```
┌─────────────────────────────────────────────┐
│  ⚙️ Parametre Seti Seçin                    │
│                                             │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐    │
│  │ 📁       │ │ 🏭       │ │ 📋       │    │
│  │ Projeler │ │ Üretim   │ │ Basit    │    │
│  │    →     │ │ Raporu   │ │ Not      │    │
│  └──────────┘ └──────────┘ └──────────┘    │
│                                             │
│  "Projeler" tıklandı →                      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐    │
│  │ ← Geri   │ │ 📂       │ │ ➕       │    │
│  │          │ │ Kategori │ │ Ekle     │    │
│  │          │ │          │ │          │    │
│  └──────────┘ └──────────┘ └──────────┘    │
│                                             │
│  "Kategori" seçildi →                        │
│  ── Projeler / Kategori ──────────────────  │
│  Kategori Adı:  [________]                  │
│  Renk:          [🔴 ▼]                      │
│  Öncelik:       [Normal ▼]                  │
└─────────────────────────────────────────────┘
```

### Animasyonlar

- Tile kartları: mevcut `girisYuksel` animasyonu ile stagger giriş
- Alt sayfa geçişi: mevcut `sayfa-cikis-sol` / `sayfa-giris-sag` animasyonları
- Parametre açılması: slide-down + fade-in
- Set seçim badge: pulse animasyonu (seçili sette ✓ badge)

## Yetki Kontrolü

### Set Bazlı

- `yetkiler.gorebilir`: Kullanicinin `FikoYT.kimlik.aktifKullaniciJson()._uyeYetkiler` listesi ile karsilastirilir. Eslesmezse tile gizlenir.
- `yetkiler.kullanabilir`: Tile gorunur ama disabled, tiklanamaz (tooltip ile "Yetkiniz yok")
- Yetki bossa (`undefined/null/[]`): herkes gorebilir ve kullanabilir

### Parametre Bazlı

- Mevcut `IParametre.yetkiler` altyapısı aynen kullanılır
- `gorebilir`: parametre alanı gizlenir
- `degistirebilir`: parametre readonly render edilir
- `silebilir`: parametre değeri temizlenemez

### Yetki Kontrolü Akışı

```
Kullanıcı rolü → Set grubu görünür mü? → Alt set görünür mü? → Set kullanılabilir mi? → Parametre düzenlenebilir mi?
```

## Entegrasyon

### Kod Tarafı (Input)

```typescript
// Servis veya parent component'ten:
<fikoyt-paylas-kutusu
  [kart]="kart"
  [parametreSetleri]="projelerinParametreSetleri"
  (paylasimYapildi)="yenile()">
</fikoyt-paylas-kutusu>
```

```typescript
// Servis örneği:
readonly projelerinParametreSetleri: IParametreSetiGrubu[] = [
  {
    id: 'proje-kategori',
    baslik: 'Projeler',
    simge: '📁',
    kaynak: 'kod',
    altGruplar: [
      { id: 'proje-kat', baslik: 'Kategori', simge: '📂', parametreler: [...] },
      { id: 'proje-ekle', baslik: 'Ekle', simge: '➕', parametreler: [...], sayfaKurallari: { yeniSayfaEngelle: true } },
    ],
  },
];
```

### DB Tarafı

- Koleksiyon: `parametre_seti_gruplari`
- Admin panelde CRUD sayfası: `/🧩/👑/parametre-setleri`
- Component init'te DB'den çekilir, kod tarafı setlerle merge edilir
- Aynı `id`'li set varsa DB versiyonu kazanır

### Birleştirme Algoritması

```
kodSetleri = input'tan gelen setler (kaynak: 'kod')
dbSetleri  = DB'den çekilen setler (kaynak: 'db')

birlesik = [...kodSetleri]
for (dbSet of dbSetleri):
  existing = birlesik.find(s => s.id === dbSet.id)
  if existing:
    birlesik'te replace et (DB override)
  else:
    birlesik'e ekle
sırala(birlesik, s => s.sira ?? 999)
```

## IKart Entegrasyonu

### Sayfa-Set Eslestirme (Component State)

Sayfa bazli set secimi `IIcerik`'e dokunmadan component state'inde tutulur:

```typescript
// ikart-kutusu.component.ts icinde:
readonly sayfaSetMap = signal<Map<number, string>>(new Map());  // sayfaIndex → setId

// Aktif sayfanin set kurallarini cozumle:
readonly aktifSayfaKurallari = computed(() => {
  const setId = this.sayfaSetMap().get(this.aktifIcerikNo);
  if (!setId) return null;
  return this.tumSetler().find(s => s.id === setId)?.sayfaKurallari ?? null;
});
```

### Submission Pipeline

`paylasTiklandi()` icinde set bilgisi ayri alan olarak eklenir:

```typescript
// Kart gonderilirken:
kart.veri._parametreSetleri = Object.fromEntries(this.sayfaSetMap());
// { 0: "uyar.proje.kategori", 1: "uyar.proje.ekle" }
```

Bu yaklasim mevcut `icerikler[i] = icerikler[i]._id` replace mantigi ile catismaz.

### Sayfa Kurallari Guard

`icerikEkle()` metodu set kurallarini kontrol eder:

```typescript
icerikEkle() {
  const kurallar = this.aktifSayfaKurallari();
  if (kurallar?.yeniSayfaEngelle) return;
  if (kurallar?.maxSayfa && this.kart.veri.icerikler.length >= kurallar.maxSayfa) return;
  // ... mevcut ekleme mantigi
}
```

## Dosya Yapısı

```
src/service/fikoyt-ui/src/lib/paylasim-sistemi/
  paylas-kutusu/IKart/
    parametre-seti-secici/
      parametre-seti-secici.component.ts    // ana tile grid + navigasyon
      parametre-seti-secici.component.html
      parametre-seti-secici.component.scss
      parametre-seti-tile.component.ts      // tekil tile kartı
      parametre-seti-tile.component.html
      parametre-seti-tile.component.scss

src/service/fikoyt-ui/interfaces/
  IParametreSeti.interface.ts               // IParametreSetiGrubu, IParametreSeti

src/app/uygulamalar/admin/parametre-setleri/  // admin CRUD sayfası (sonraki faz)
```

## Uygulama Fazları

### Faz 1: Temel Altyapi
- Interface tanimlari (`IParametreSetiGrubu`, `IParametreSeti`)
- `parametre-seti-secici` component (tile grid, navigasyon, animasyonlar)
- `ikart-kutusu` entegrasyonu (buton, input binding, sayfa kurallari)
- Kod tarafi parametre setleri destegi
- `sayfaSetMap` state + `icerikEkle()` guard
- Taslak sistemiyle entegrasyon (`taslakKaydet` icinde `sayfaSetMap` persist edilir, yuklemede restore edilir)
- DB fetch sirasinda tile grid'de NzSpin skeleton gosterimi

### Faz 2: DB Entegrasyonu
- `parametre_seti_gruplari` koleksiyonu
- DB'den cekme servisi + kod setleriyle birlestirme
- Admin panel CRUD sayfasi
- DB fetch hatasi durumunda: sadece kod setleri gosterilir + uyari badge

### Faz 3: Gelismis Ozellikler
- Parametre bazli yetki kontrolu UI
- Set degistirme onay dialogu
