# Grid Düzenleri
Package: @dataliva/livalib
Description: Livalib grid bileşenlerinde adlandırılmış, sunucu taraflı düzen saklama.

`LivaDataGrid`, `LivaTreeList` ve `LivaPivotGrid`; kolon veya alan düzenlerini
kullanıcı bazında adlandırarak sunucuda saklayabilir. Uygulama kökündeki
`LivaGridStateProvider` depolamayı, her grid'in kararlı kimliği ise kayıt alanını
belirler.

## Kurulum

```tsx
import { LivaGridStateProvider } from "@dataliva/livalib";

<LivaGridStateProvider
  apiUrl={`${API_URL}/UserGridLayout`}
  token={token}
  lang="TR"
  canSetDefault={currentUser.isSystemAdmin}
>
  <App />
</LivaGridStateProvider>
```

Her grid'e sayfa ve grid için benzersiz, sabit bir kimlik verin:

```tsx
<LivaDataGrid id="customer-list" stateVersion={1} {...props} />
<LivaTreeList id="cost-center-tree" stateVersion={1} {...props} />
<LivaPivotGrid stateStoringId="sales-analysis" stateVersion={1} {...props} />
```

Kimliği filtre, seçili kayıt veya kullanıcı gibi değişkenlerden üretmeyin. Kolon
ya da alan şeması geriye uyumsuz değiştiğinde `stateVersion` değerini artırın;
eski düzenler yeni şemaya uygulanmaz.

Provider veya grid kimliği yoksa **Düzen** menüsü gösterilmez ve durum saklanmaz.
DataGrid ve TreeList kolon sırasını, genişliğini, görünürlüğünü, sıralamayı ve
gruplamayı; PivotGrid ise alan konumu, sırası, filtreleri ve genişletme durumunu
saklar.

## REST sözleşmesi

| Metot | Rota | Amaç |
|---|---|---|
| `GET` | `/{gridId}` | Görünen düzenlerin metadatası |
| `GET` | `/{gridId}/default` | Varsayılan düzen (`{ layout }` veya 204) |
| `GET` | `/{gridId}/{layoutId}` | Tek düzen (`{ layout }`) |
| `POST` | `/{gridId}` | `{ name, layout }` ile kaydet/güncelle |
| `DELETE` | `/{gridId}/{layoutId}` | Düzeni sil |
| `PUT` | `/{gridId}/{layoutId}/default` | Genel varsayılan yap |
| `DELETE` | `/{gridId}/default` | Genel varsayılanı kaldır |

Liste kayıtları `id`, `name`, `isDefault`, `isShared` ve `isOwn` alanlarını
taşımalıdır. `layout`, JSON durumunun string'e çevrilmiş halidir. `canSetDefault`
yalnızca yönetici eylemini arayüzde gösterir; yetkiyi sunucu da denetlemelidir.

## Özel depolama

```tsx
import type { LivaGridStateStorage } from "@dataliva/livalib";

const storage: LivaGridStateStorage = {
  list: async (key) => [],
  loadDefault: async (key) => null,
  load: async (key, id) => null,
  save: async (key, name, value) => undefined,
  remove: async (key, id) => {},
  setDefault: async (key, id) => {},
};

<LivaGridStateProvider storage={storage}>{children}</LivaGridStateProvider>
```

`save` metoduna gelen değer `load` tarafından değiştirilmeden geri dönmelidir.
`storage` ile `apiUrl` aynı anda verilmez.
