LivaDataGrid
DevExtreme DataGrid üzerine kurulu, tam donanımlı veri tablosu bileşeni. Sayfalama, filtreleme, arama, seçim, satır içi düzenleme ve dışa aktarma gibi özellikler hazır prop'larla açılıp kapatılır. Veri kaynağı olarak yerel bir dizi veya ASP.NET uzak veri kaynağı tanımı kullanılabilir.
import { LivaDataGrid, type LivaDataGridColumn } from "@dataliva/livalib";
Temel kullanım
columns ve keyExpr zorunludur; dataSource düz bir dizi olabilir. Kolonlar
LivaDataGridColumn tipindedir ve en sık dataField, caption, dataType,
format ile alignment alanları kullanılır. showPager sayfalayıcıyı açar,
pagingDefaultPageSize ve pagingAllowedPageSizes sayfa boyutunu yönetir.
type Personel = { id: number; adSoyad: string; sehir: string; gorev: string; maas: number };
const personeller: Personel[] = [
{ id: 1, adSoyad: "Ayşe Yılmaz", sehir: "İstanbul", gorev: "Yönetici", maas: 82000 },
// ...
];
const kolonlar: LivaDataGridColumn[] = [
{ dataField: "adSoyad", caption: "Ad Soyad" },
{ dataField: "sehir", caption: "Şehir" },
{ dataField: "gorev", caption: "Görev" },
{ dataField: "maas", caption: "Maaş", dataType: "number", format: "#,##0 ₺", alignment: "right" },
];
Filtreleme ve arama
showFilterRow kolon altına filtre satırı, showHeaderFilter kolon başlığına
değer listesi, showSearchPanel ise tablo genelinde arama kutusu ekler.
rowAlternationEnabled satırları dönüşümlü renklendirerek okunabilirliği
artırır.
Ortak prop preset'i — getGridProps()
Çoğu sayfada aynı temel proplar tekrar eder. Bunları her tabloda tek tek yazmak yerine projenin kendi preset fonksiyonunu spread edin. Bir grid kurarken yazacağınız satır budur:
import { LivaDataGrid } from "@dataliva/livalib";
import { getGridProps } from "@/features/_shared/components";
<LivaDataGrid
{...getGridProps()}
keyExpr="id"
dataSource={personeller}
columns={kolonlar}
/>
Spread'i props listesinin en başına koyun; böylece sayfaya özel proplar preset'i ezebilir — tek bir ayarı değiştirmek için o prop'u yazmanız yeter:
<LivaDataGrid {...getGridProps()} editMode="cell" /> // editMode → "cell"
Yetki (allowAdding, allowEditing, allowDeleting), export, veri kaynağı
(remoteOperations dahil) ve olaylar preset'e girmez; bunlar her sayfanın
kendi kararıdır.
Preset fonksiyonunu tanımlama
Her proje bu fonksiyonu bir kez yazar ve tüm gridler onu çağırır. LivaBudget'ta
_shared/components/getGridProps.ts altında durur:
import { LivaDataGrid } from "@dataliva/livalib";
import type { ComponentProps } from "react";
type LivaGridProps = ComponentProps<typeof LivaDataGrid>;
export function getGridProps(): Partial<LivaGridProps> {
return {
gridSize: "xxs",
fullHeight: true,
editMode: "batch",
scrollingMode: "virtual",
showToolbar: true,
showSearchPanel: true,
columnChooser: true,
isLivaContextMenu: true,
allowGrouping: false,
lang: currentLanguage(), // Accept-Language başlığı
noDataText: t("Common.NoData"), // çeviriden
};
}
Değerler tahminle değil, mevcut kullanımların taranmasıyla seçilir: bir ayarı
sayfaların tamamına yakını aynı yazıyorsa preset'e girer. LivaBudget'taki 63
<LivaDataGrid> kullanımında gridSize: "xxs" 62/62, fullHeight 54/54,
scrollingMode: "virtual" 45/45, editMode: "batch" 51/51 çıktığı için bunlar
preset'e alındı.
Bu bir hook DEĞİLDİR ve hook çağırmaz. Fonksiyon JSX içinde koşullu dallarda (
yetkiVar ? <LivaDataGrid {...getGridProps()} /> : null) çağrılabildiği içinuseTranslation/useSelectorgibi bir hook barındırırsa render'lar arasında hook sayısı değişir ve React "Rendered more hooks than during the previous render" hatası verir. Dil ve çeviri değerlerini store'dan / i18n örneğinden doğrudan okuyun; sayfa zaten çeviri değişiminde yeniden render olduğu için değerler tazelenir.
Ağaç sürümü için LivaTreeList'teki getTreeList()
kullanılır.
Kütüphane tarafı — baseGridProps
@dataliva/livalib, baseGridProps adında asgari bir nesne de dışa aktarır:
| Prop | Değer |
|---|---|
gridSize | "xs" |
fullHeight | true |
showToolbar | true |
showSearchPanel | true |
editMode | "batch" |
as const satisfies Partial<LivaDataGridProps> ile tanımlıdır: değerler literal
tipte kalır, yanlış bir prop adı derleme hatası verir. Bu, kütüphane genelinde
güvenli olan en küçük ortak kümedir — bir projenin standardı bundan geniştir,
o yüzden sayfalarda doğrudan baseGridProps spread etmeyin. Yeni bir projede
preset fonksiyonuna başlangıç noktası olarak kullanabilirsiniz:
import { baseGridProps } from "@dataliva/livalib";
export function getGridProps(): Partial<LivaGridProps> {
return { ...baseGridProps, gridSize: "xxs", scrollingMode: "virtual" /* … */ };
}
Toplu işlemler
selectionMode="multiple" (varsayılan) iken alt araç çubuğunda, Kaydet'in
sağında bir İşlemler menüsü çıkar. Satır seçildiği anda buton primary renge
döner. Menü üç katmandan oluşur ve bu sırayla dizilir:
- Seçim araçları —
bulkSelectionToolsile yönetilir, varsayılan açık: Sadece Seçilileri Göster (mevcut filtrenin üstüne geçici bir filtre biner, kapatınca eski filtre geri gelir), Panoya Kopyala (başlıklarla) — Excel'e yapıştırılabilir TSV, Seçimi Tersine Çevir (yalnızca yüklü satırlarda) ve Seçimi Temizle. - Seçilenleri Sil —
allowBulkDeleteile açılır; verilmezseallowDeletingdeğerini devralır. Onay penceresinden sonra varsayılan silme çalışır;onBulkDeleteverirseniz davranışı siz üstlenirsiniz. bulkActions— sayfaya özel işlemler, listenin en altına eklenir.
import type { LivaGridBulkAction } from "@dataliva/livalib";
const islemler: LivaGridBulkAction[] = [
{
id: "approve",
text: (ctx) => `Onayla (${ctx.keys.length})`,
icon: "check",
disabled: (ctx) => ctx.keys.length === 0,
confirm: (ctx) => `${ctx.keys.length} kayıt onaylanacak, devam edilsin mi?`,
confirmTitle: "Toplu Onay",
confirmButtonText: "Onayla",
onClick: async (ctx) => {
await api.approve(ctx.keys);
ctx.component.refresh();
},
},
];
<LivaDataGrid {...getGridProps()} bulkActions={islemler} allowBulkDelete />
text, disabled ve confirm alanları düz değer ya da
(ctx: LivaGridBulkActionContext) => … fonksiyonu alabilir; fonksiyon menü her
açıldığında güncel seçimle çağrılır. danger: true öğeyi ve onay butonunu
kırmızıya çevirir.
Sayfalı veya sanal kaynakta
ctx.rowsyalnızca yüklü satırları taşır;ctx.keystam seçimdir. Sunucuya iş gönderirkenkeysüzerinden çalışın.
Ondalık basamak — sağ tık menüsü
Sayısal (dataType: "number") bir kolonun ya da V001…V012 kalıbındaki ay
kolonlarının hücresine sağ tıklandığında Görünüm → Ondalık Basamak alt menüsü
çıkar: Küsuratsız, 1–4 basamak ve Varsayılan. Seçim kolonun kendi format
tipini (para birimi, yüzde vb.) korur, yalnızca precision değerini ezer; string
format verilmişse { type, precision } nesnesine, format hiç verilmemişse
fixedPoint'e dönüştürülür.
Ay kolonlarında seçim tüm ay kolonlarına birden uygulanır — tek tek 12 kolonu ayarlamak gerekmez. Ayar bileşen state'inde tutulur; kalıcı değildir ve adlandırılmış düzenlere yazılmaz.
İçe/dışa aktarma
exportOptions Excel/CSV/PDF dışa aktarma butonlarını açar.
importExportSettings ise DataExchange sözleşmesine bağlanır: processKey
verdiğinizde içe aktarma sihirbazı grid'in içine kendiliğinden monte edilir.
Kurulum, uç noktalar ve adaptörler için
Veri Alışverişi sayfasına bakın.
Adlandırılmış düzenler
Grid'i bir LivaGridStateProvider altında kullanıp sabit bir id verdiğinizde
araç çubuğunda Düzen menüsü açılır. Kullanıcı kolon sırası, genişliği,
görünürlüğü, sıralama ve gruplama ayarlarını adlandırarak sunucuda saklayabilir.
Kolon şeması geriye uyumsuz değiştiğinde stateVersion değerini artırın.
Provider kurulumu ve REST sözleşmesi ayrı rehberde yer alır.
Temel ve veri
| Prop | Tip | Varsayılan |
|---|---|---|
columns | LivaDataGridColumn[] | — (zorunlu) |
keyExpr | string | — (zorunlu) |
dataSource | Array<any> | LivaDataGridDataSourceTypes | — |
title | string | — |
desc | string | — |
remoteOperations | boolean | — |
refreshMode | GridsEditRefreshMode | 'reshape' |
selectedRowKeys | any[] | — |
lang | string | — (uzak istekte Accept-Language başlığı) |
id | string | — (verilirse düzen saklama etkinleşir) |
stateVersion | number | — |
Görünüm ve düzen
| Prop | Tip | Varsayılan |
|---|---|---|
height | number | string | '100%' |
width | number | string | '100%' |
visible | boolean | true |
fullHeight | boolean | false |
gridSize | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'md' |
radius | 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'none' |
cursor | 'pointer' | 'default' | 'default' |
showBorders | boolean | true |
showRowLines | boolean | false |
showColumnLines | boolean | true |
showColumnHeaders | boolean | true |
rowAlternationEnabled | boolean | true |
hoverStateEnabled | boolean | true |
wordWrapEnabled | boolean | false |
columnAutoWidth | boolean | false |
columnHidingEnabled | boolean | false |
allowColumnResizing | boolean | true |
allowColumnReordering | boolean | düzen saklamada true, aksi halde false |
columnResizingMode | 'nextColumn' | 'widget' | 'widget' |
columnChooser | boolean | true |
allowGrouping | boolean | false |
rtlEnabled | boolean | false |
noDataText | string | 'No data' |
showSkeleton | boolean | true |
isInitializing | boolean | false |
loadPanel | { enabled?, text?, showPane?, showIndicator?, shading? } | etkin |
Seçim, kaydırma ve sayfalama
| Prop | Tip | Varsayılan |
|---|---|---|
selectionMode | 'none' | 'single' | 'multiple' | 'multiple' |
scrollingMode | 'standard' | 'virtual' | 'infinite' | 'infinite' |
showPager | boolean | false |
pagingDefaultPageSize | number | 10 |
pagingAllowedPageSizes | number[] | [5, 10, 20] |
Not:
selectionModevarsayılanı'multiple''dır — grid, siz istemeseniz de satır başına onay kutusu gösterir ve seçim yapıldığında alt araç çubuğunda İşlemler menüsü belirir. Seçim istemiyorsanızselectionMode="none"verin.
Not:
scrollingModevarsayılanı'infinite'olduğundan sayfalayıcı (showPager) ve sayfa boyutu ayarları etkisiz kalır — infinite/virtual kaydırmada tüm satırlar kaydırılarak yüklenir. Klasik sayfalayıcıyı görmek içinscrollingMode="standard"verin.
Filtreleme ve arama
| Prop | Tip | Varsayılan |
|---|---|---|
showFilterRow | boolean | false |
showFilterOperationChooser | boolean | false |
showFilterSearchIcon | boolean | true |
showHeaderFilter | boolean | true |
showFilterPanel | boolean | false |
showSearchPanel | boolean | true |
showCreateFilterButton | boolean | true |
showFilterOperationChooser, filtre hücresindeki büyüteç ikonuna "İçerir /
Eşittir / İle başlar…" menüsünü bağlar. Bu ikon sabit boyutlu, mutlak konumlu bir
katman olduğu için filtre satırının kısalabileceği yüksekliğe alt sınır koyar —
bu yüzden varsayılan olarak kapalıdır; kapalıyken de her kolon kendi varsayılan
operasyonuyla (metinde contains, sayıda =) filtrelemeye devam eder.
showFilterSearchIcon ise yalnızca dekoratif bir büyüteç çizer: tıklanabilir
değildir, menü açmaz ve satır yüksekliğini kısıtlamaz. Lookup ve tarih hücreleri
DevExtreme'in kendi açılır ikonunu gösterdiği için atlanır.
Düzenleme (CRUD)
| Prop | Tip | Varsayılan |
|---|---|---|
editMode | 'cell' | 'row' | 'popup' | 'form' | 'batch' | 'batch' |
allowAdding | boolean | false |
allowEditing | boolean | false |
allowDeleting | boolean | false |
allowCloning | boolean | false |
editPopup | { title?, width?, height?, readOnly?, onSave?, onCancel?, children?, ... } | — |
Araç çubuğu ve dışa/içe aktarma
| Prop | Tip | Varsayılan |
|---|---|---|
showToolbar | boolean | 'top' | 'bottom' | true |
toolbarItems | any[] | — |
headerToolbar | React.ReactNode | — |
isLivaContextMenu | boolean | true |
summary | Summary | — |
exportOptions | LivaDataGridExportOptions | — |
importExportSettings | LivaDataGridImportExportSettings | — |
enableRowDragging | boolean | false |
Toplu işlemler
Yalnızca selectionMode="multiple" iken görünür; satır seçildiği anda alt araç
çubuğundaki İşlemler butonu primary renge döner.
| Prop | Tip | Varsayılan |
|---|---|---|
bulkActions | LivaGridBulkAction[] | — |
bulkSelectionTools | boolean | true |
allowBulkDelete | boolean | allowDeleting |
onBulkDelete | (e: LivaGridBulkActionContext) => void | Promise<void> | — |
Master-detail
| Prop | Tip | Varsayılan |
|---|---|---|
masterDetailEnabled | boolean | false |
masterDetailRender | (data: { data, key }) => React.ReactNode | — |
masterDetailAutoExpandAll | boolean | false |
Ay (month) araçları
| Prop | Tip | Varsayılan |
|---|---|---|
monthOptions | MonthBuilderOptions | — |
monthAdjustOptions | LivaMonthAdjustOptions | — |
Olay geri çağrıları
| Prop | Tip |
|---|---|
onRowClick | (e: RowClickEvent) => void |
onRowDblClick | (e: RowDblClickEvent) => void |
onSelectionChanged | (e: SelectionChangedEvent) => void |
onRowUpdated | (e: any) => void |
onRowInserted | (e: RowInsertedEvent) => void |
onRowRemoved | (e: RowRemovedEvent) => void |
onRowPrepared | (e: RowPreparedEvent) => void |
onCellPrepared | (e: CellPreparedEvent) => void |
onCellClick | (e: CellClickEvent) => void |
onCellDblClick | (e: CellDblClickEvent) => void |
onEditingStart | (e: EditingStartEvent) => void |
onInitNewRow | (e: any) => void |
onInitialized | (e: any) => void |
onContentReady | (e: any) => void |
onSaving | (e: any) => void |
onToolbarPreparing | (e: any) => void |
onRowDragging | (e: LivaRowDraggingEvent) => void |
onAddClick | () => void |
onShowRowStatus | (rowData: any, rowKey?: any) => void |
Kolon tipi — LivaDataGridColumn
DevExtreme IColumnProps alanlarına ek olarak (dataField, caption,
dataType, format, width, visible, cellRender vb.) aşağıdaki Liva'ya
özgü alanları destekler:
| Alan | Tip | Açıklama |
|---|---|---|
alignment | 'left' | 'center' | 'right' | 'start' | Başlık/hücre hizası |
cellAlignment | 'left' | 'center' | 'right' | Yalnızca hücre içeriği hizası |
summary | LivaDataGridColumnSummary | Kolon bazlı özet (sum, min, max, avg, count) |
lookup | { dataSource, valueExpr?, displayExpr? } | Değer eşleme listesi |
dropdown | LivaDataGridColumnDropdown | Hücre içi açılır liste (plain | datagrid | treelist) |
fixed | boolean | Kolonu sabitle |
fixedPosition | 'left' | 'right' | Sabitleme yönü |
hidingPriority | number | Duyarlı gizleme önceliği |
Yardımcı tipler
LivaDataGridDataSourceTypes— ASP.NET uzak veri kaynağı seçenekleri;AspNetData.Optionsalanlarına ek olaraktoken?,customizeLoadParams?veerrorHandler?içerir.LivaDataGridExportOptions—{ enabled?, actions?, fileName? };actionsdeğeri'excelAll' \| 'excelSelected' \| 'csv' \| 'pdf'dizisidir.LivaDataGridImportExportSettings— içe/dışa aktarma yapılandırması. Bildirimsel yol:enabled,processKey,baseUrl,endpoints,headerPolicy,contract,autoProvision,routeParams,config,wizardTitle,closeOnComplete. Standart sihirbazdan çıkmak için eski kancalar:onImportExcel?,onExportExcel?,onDownloadTemplate?,onImportSettings?,onExportSettings?. Ayrıntı: Veri Alışverişi.LivaMonthAdjustOptions— ay sütunları için kümülatif / değer artırma aracı:monthFields,totalField,summaryFields,onApply.LivaGridBulkAction—İşlemlermenüsündeki tek bir toplu işlem:text(metin ya da(ctx) => string),icon?,danger?,hint?,disabled?,confirm?,confirmTitle?,confirmButtonText?,onClick.LivaGridBulkActionContext— işlemlere geçen bağlam:keys(seçili anahtarlar),rows(yüklü satırların verisi) vecomponent(DevExtreme örneği). Sayfalı/sanal kaynaktarows,keysten kısa olabilir.