# Doğrulama
Package: @dataliva/livalib
Description: @dataliva/livalib doğrulama bileşenleri: LivaValidationGroup, LivaValidator, LivaValidationSummary.

DevExtreme'in doğrulama altyapısını saran üç bileşen: `LivaValidationGroup`
alanları tek bir grup altında toplar, `LivaValidator` kuralları tanımlar,
`LivaValidationSummary` kırılan kuralları listeler. Kurallar `LivaValidator`'ın
`validationRules` prop'una nesne dizisi olarak verilir (`{ type, message, ... }`);
çocuk (children) olarak değil.

```tsx
import {
  LivaValidationGroup,
  LivaValidator,
  LivaValidationSummary,
} from "@dataliva/livalib";
```

## Grup doğrulama

`LivaValidator`, doğrulanacak değeri `adapter.getValue` geri çağrısından okur;
sonuç `adapter.applyValidationResults` ile geri döner ve buradan editörün
`errorMessage` prop'una yansıtılabilir. Grup içindeki bir `LivaButton`'ın
`onClick` olayı `e.validationGroup` nesnesini taşır; `validate()` çağrısı
gruptaki tüm doğrulayıcıları çalıştırır ve kırılan kurallar
`LivaValidationSummary` üzerinde listelenir.

**Örnek — Grup doğrulama:**

```tsx
<LivaValidationGroup>
  <div style={{ display: "flex", flexDirection: "column", gap: 12, width: 320 }}>
    <LivaTextBox
      label="Ad Soyad"
      errorMessage={adHata}
      onType={(v: string) => {
        ad.current = v;
      }}
    />
    <LivaValidator
      adapter={adAdapter}
      validationRules={[{ type: "required", message: "Ad Soyad alanı zorunludur." }]}
    />
    <LivaTextBox
      label="E-posta"
      errorMessage={epostaHata}
      onType={(v: string) => {
        eposta.current = v;
      }}
    />
    <LivaValidator
      adapter={epostaAdapter}
      validationRules={[
        { type: "required", message: "E-posta alanı zorunludur." },
        { type: "email", message: "Geçerli bir e-posta adresi girin." },
      ]}
    />
    <LivaValidationSummary />
    <LivaButton
      text="Doğrula"
      onClick={(e: { validationGroup?: { validate: () => { isValid: boolean } } }) => {
        const res = e.validationGroup?.validate();
        setSonuc(res && res.isValid ? "Form geçerli." : "Formda hatalar var.");
      }}
    />
    {sonuc && <p style={{ margin: 0 }}>{sonuc}</p>}
  </div>
</LivaValidationGroup>
```

## Kural tipleri

`validationRules` dizisinde DevExtreme kural nesneleri kullanılır:
`required`, `email`, `numeric`, `range`, `stringLength`, `pattern`, `compare`,
`custom` ve `async`. Her kurala `message` ile özel hata metni verilebilir;
`range` için `min`/`max`, `pattern` için `pattern`, `compare` için
`comparisonTarget` gibi ek alanlar bulunur.

## Prop'lar

### LivaValidationGroup

| Prop | Tip | Varsayılan |
|------|------|---------|
| `variant` | `'standard' \| 'highlighted' \| 'subtle'` | `'standard'` |
| `className` | `string` | — |
| `children` | `ReactNode` | — |

Ayrıca DevExtreme `IValidationGroupOptions`'tan gelen tüm prop'lar
(ör. `onInitialized`).

### LivaValidator

| Prop | Tip | Varsayılan |
|------|------|---------|
| `variant` | `'standard' \| 'inline' \| 'tooltip'` | `'standard'` |
| `validationRules` | `ValidationRule[]` | — |
| `adapter` | `{ getValue?, applyValidationResults?, reset?, focus?, bypass?, validationRequestsCallbacks? }` | — |
| `validationGroup` | `string` | en yakın grup |
| `name` | `string` | — |
| `className` | `string` | — |

Ayrıca DevExtreme `IValidatorOptions`'tan gelen tüm prop'lar
(ör. `onValidated`).

### LivaValidationSummary

| Prop | Tip | Varsayılan |
|------|------|---------|
| `variant` | `'standard' \| 'card' \| 'inline' \| 'toast'` | `'standard'` |
| `severity` | `'error' \| 'warning' \| 'info'` | `'error'` |
| `className` | `string` | — |

Ayrıca DevExtreme `IValidationSummaryOptions`'tan gelen tüm prop'lar
(ör. `hoverStateEnabled`, `onItemClick`).
