@medyat/react-data-table 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,736 @@
1
+ import { ComponentType } from 'react';
2
+ import { Dispatch } from 'react';
3
+ import { JSX } from 'react';
4
+ import { MouseEvent as MouseEvent_2 } from 'react';
5
+ import { ReactNode } from 'react';
6
+ import { SetStateAction } from 'react';
7
+
8
+ export declare interface BaseColumn<Row, V = unknown> {
9
+ /** Kararlı kimlik; `accessor` verilmezse değer bu yoldan okunur ('customer.title' → row.customer?.title). */
10
+ id: Path<Row> | string;
11
+ /** Header metni (uygulama i18n'den verir). */
12
+ header: string;
13
+ /** Dar alanlarda (telefon) kısa header. */
14
+ headerShort?: string;
15
+ /** Sütun açıklaması: header tooltip'inde ad altında ikinci satır, Columns dialog'unda ad altında; hücrede gösterilmez. */
16
+ description?: string;
17
+ /** Hesaplanan değer. Verilirse `fields` ile sunucudan istenecek alanlar bildirilir. */
18
+ accessor?: (row: Row) => V;
19
+ fields?: string[];
20
+ /** string → header'da soluk son ek ("pcs", "d"). Fonksiyon → hücrede, satır bazında. */
21
+ unit?: string | ((row: Row) => string);
22
+ align?: 'left' | 'right' | 'center';
23
+ /** px. Varsayılan tipe göre (05 · Sütun genişlikleri). Sabit sütunlar her zaman px. */
24
+ width?: number;
25
+ /** px. Varsayılan 80. */
26
+ minWidth?: number;
27
+ maxWidth?: number;
28
+ hidden?: boolean;
29
+ /** Gizlenemez. Birincil sütun için otomatik true. */
30
+ alwaysVisible?: boolean;
31
+ /** Birincil hücre: gerçek <a href> (D6); her zaman sola sabit (D45). Tabloda en fazla bir tane. */
32
+ primary?: boolean;
33
+ /** Birincil hücre veya `id`/`ajax` tipi için kayıt linki. */
34
+ href?: (row: Row) => string | undefined;
35
+ /** İkinci satır (yalnızca Comfortable). */
36
+ secondary?: (row: Row) => string | null | undefined;
37
+ /** Boş değer metni. Varsayılan "—". */
38
+ emptyText?: string;
39
+ sortable?: boolean;
40
+ filterable?: boolean;
41
+ filter?: ColumnFilterOptions;
42
+ searchable?: boolean;
43
+ suggested?: boolean;
44
+ filterNoun?: Plural;
45
+ priority?: number;
46
+ cell?: CellRender<Row, V>;
47
+ actions?: Array<CellAction<Row>>;
48
+ }
49
+
50
+ /** Toplu aksiyon. Seçim sayfa kapsamlıdır (D19): `rows` o anda seçili, yüklü satırlardır. */
51
+ export declare interface BulkAction<Row = any> {
52
+ id: string;
53
+ label: string;
54
+ /** Bar düğmesinde tooltip, ⋯ menüsünde ikinci satır (gerekçe varsa o) (D36). */
55
+ description?: string;
56
+ icon?: IconComponent;
57
+ /** Bar'da görünür; değilse ⋯ menüsünde. Bar'da en fazla 3. */
58
+ inBar?: boolean;
59
+ destructive?: boolean;
60
+ /** Yetkiye bağlı: false → bar'da ve menüde yok (D36). Duruma bağlı pasiflik için `disabled`. */
61
+ when?: (rows: Row[]) => boolean;
62
+ disabled?: (rows: Row[]) => boolean | string;
63
+ run: (rows: Row[]) => void | Promise<void>;
64
+ }
65
+
66
+ /** Hücre aksiyonu: paket sağ kenarda overlay olarak çizer (metin yerleşimi değişmez), ≤ 2 ikon + ⋯ menüsü. */
67
+ export declare interface CellAction<Row> {
68
+ id: string;
69
+ label: string;
70
+ icon: IconComponent;
71
+ /** 'hover': hover ve focus-within'de görünür (varsayılan). 'always': her zaman. */
72
+ reveal?: 'hover' | 'always';
73
+ /** Değere bağlı aksiyon: false → gösterilmez. */
74
+ when?: (row: Row) => boolean;
75
+ disabled?: (row: Row) => boolean | string;
76
+ destructive?: boolean;
77
+ /** Alt menü (⋯ olarak çizilir). */
78
+ menu?: Array<Omit<CellAction<Row>, 'reveal' | 'menu'>>;
79
+ run?: (row: Row) => void | Promise<void>;
80
+ }
81
+
82
+ /** Özel hücre içeriğine verilen bağlam. `value` tipe göre daralır (int → number | null, select → string | number | null …). */
83
+ export declare interface CellContext<Row, V = unknown> {
84
+ row: Row;
85
+ value: V;
86
+ /** Tipin varsayılan biçimlendirmesi ("12,400", "Oct 24"); özel içerik bunu sarabilir. */
87
+ formatted: string;
88
+ column: {
89
+ id: string;
90
+ type: ColumnType;
91
+ };
92
+ density: Density;
93
+ }
94
+
95
+ /**
96
+ * Özel hücre içeriği: bağlamdan ReactNode döndüren fonksiyon. Hook çağıran içerik bir bileşene sarılır
97
+ * (`cell: (ctx) => <Owner {...ctx} />`): fonksiyon her satır için düz çağrılır.
98
+ * Tipin kabuğu (hizalama, kesme, boş değer, yoğunluk, hover) korunur; yalnızca içerik değişir.
99
+ */
100
+ export declare type CellRender<Row, V = unknown> = (ctx: CellContext<Row, V>) => ReactNode;
101
+
102
+ export declare type ColumnDef<Row = any> = (BaseColumn<Row, number | null> & {
103
+ type: 'int';
104
+ }) | (BaseColumn<Row, number | null> & {
105
+ type: 'float';
106
+ decimalPlaces?: number;
107
+ }) | (BaseColumn<Row, number | null> & {
108
+ type: 'percentage';
109
+ display?: 'text' | 'bar';
110
+ decimalPlaces?: number;
111
+ }) | (BaseColumn<Row, number | null> & {
112
+ type: 'star';
113
+ max?: number;
114
+ }) | (BaseColumn<Row, number | null> & {
115
+ type: 'currency';
116
+ /** Sabit ISO kodu veya satırdan okuma. */
117
+ currency: string | ((row: Row) => string);
118
+ decimalPlaces?: number;
119
+ }) | (BaseColumn<Row, string | null> & {
120
+ type: 'string' | 'text' | 'uppercase' | 'lowercase' | 'email' | 'url' | 'id';
121
+ }) | (BaseColumn<Row, string | null> & {
122
+ type: 'phone';
123
+ }) | (BaseColumn<Row, string | null> & {
124
+ type: 'color';
125
+ display?: 'swatch' | 'fill';
126
+ palette?: string[];
127
+ }) | (BaseColumn<Row, boolean | null> & {
128
+ type: 'boolean';
129
+ falseTone?: 'neutral' | 'destructive';
130
+ }) | (BaseColumn<Row, string | number | null> & {
131
+ type: 'select';
132
+ options: OptionDef[];
133
+ }) | (BaseColumn<Row, Array<string | number> | null> & {
134
+ type: 'multiselect';
135
+ options: OptionDef[];
136
+ }) | (BaseColumn<Row, string | number | null> & {
137
+ type: 'ajax';
138
+ remote: RemoteOptions;
139
+ }) | (BaseColumn<Row, string | number | Array<string | number> | null> & {
140
+ type: 'user';
141
+ remote?: RemoteOptions<UserOption>;
142
+ options?: UserOption[];
143
+ /** Birden çok kişi (avatar yığını). */
144
+ multiple?: boolean;
145
+ }) | (BaseColumn<Row, IsoDate | Date | null> & {
146
+ type: 'date';
147
+ overdue?: boolean | ((row: Row) => boolean);
148
+ }) | (BaseColumn<Row, IsoDate | Date | null> & {
149
+ type: 'datetime';
150
+ relative?: boolean;
151
+ overdue?: boolean | ((row: Row) => boolean);
152
+ }) | (BaseColumn<Row, unknown> & {
153
+ type: 'object';
154
+ summary?: (value: unknown, row: Row) => string;
155
+ }) | (BaseColumn<Row, unknown[] | null> & {
156
+ type: 'array';
157
+ itemType?: 'string' | 'int' | 'float' | 'id';
158
+ });
159
+
160
+ export declare interface ColumnFilterOptions {
161
+ /** Tipin listesinden alt küme. */
162
+ operators?: FilterOp[];
163
+ defaultOperator?: FilterOp;
164
+ }
165
+
166
+ export declare interface ColumnLayout {
167
+ /** Görünür + gizli tüm sütunların sırası. */
168
+ order: string[];
169
+ /** Tanımlıysa beyaz liste: burada olmayan (sonradan eklenen) sütun gizlidir. */
170
+ visible: string[];
171
+ /** Yalnızca varsayılandan farklı genişlikler. */
172
+ widths: Record<string, number>;
173
+ pinned: {
174
+ left: string[];
175
+ right: string[];
176
+ };
177
+ }
178
+
179
+ /** Dialog taslağı: sıra, görünürler ve konumsal sabitleme (ilk `start`, son `end` görünür sütun). */
180
+ declare interface ColumnsDraft {
181
+ order: string[];
182
+ visible: string[];
183
+ start: number;
184
+ end: number;
185
+ }
186
+
187
+ /** 23 tip. `type` zorunludur; veriden çıkarsama yoktur. */
188
+ export declare type ColumnType = 'int' | 'float' | 'percentage' | 'star' | 'currency' | 'string' | 'text' | 'uppercase' | 'lowercase' | 'phone' | 'color' | 'email' | 'url' | 'id' | 'boolean' | 'select' | 'multiselect' | 'ajax' | 'user' | 'date' | 'datetime' | 'object' | 'array';
189
+
190
+ export declare function createLocalStoragePreferences(options: {
191
+ scope: string;
192
+ }): PreferencesAdapter;
193
+
194
+ export declare function createLocalStorageViews(options: {
195
+ scope: string;
196
+ }): ViewsAdapter;
197
+
198
+ export declare function DataTable<Row extends object>({ table, result, label, empty, toolbar, toolbarEnd, notice, searchPlaceholder, autoRefresh, onPrint, exportable, onExport, shortcuts, onRowClick, rowClick, onRowOpen, rowActions, selectable, selectionBar, bulkActions, selectionActions, onSelectionChange, renderExpanded, canExpand, rowError, }: {
199
+ table: DataTableInstance<Row>;
200
+ /** Sunucu modu: `useQuery` sonucu, dönüştürmeden (R4). İstemci modunda verilmez. */
201
+ result?: DataTableResult<Row>;
202
+ /** Izgaranın erişilebilir adı. Verilmezse `entityName.other`. */
203
+ label?: string;
204
+ /** Hiç satır yokken (filtre ve arama yokken) gövdede; verilmezse "No {entity} yet". */
205
+ empty?: ReactNode;
206
+ /** auto: yapılandırılana göre yuvalar; minimal: yalnızca arama (3a) + `toolbarEnd`; false: araç çubuğu yok. */
207
+ toolbar?: 'auto' | 'minimal' | false;
208
+ /** Ekrana özgü birincil aksiyon, araç çubuğunun sonunda (ör. "New order"). */
209
+ toolbarEnd?: ReactNode;
210
+ /**
211
+ * Araç çubuğu ile sütun başlıkları arasında uygulamanın şeridi (R16): listenin bağlamını anlatır
212
+ * ("Yalnızca arşivlenmiş kayıtlar"). İçerik ve rolü uygulamanındır; paket yer ve hizayı verir.
213
+ */
214
+ notice?: ReactNode;
215
+ /** Verilmezse "Search {entity}…". */
216
+ searchPlaceholder?: string;
217
+ /** Saniye. Verilirse ⋯ menüsünde Auto-refresh; açıkken footer "Live". */
218
+ autoRefresh?: number;
219
+ /** Verilirse ⋯ › Print. Sorgu sayfasızdır. */
220
+ onPrint?: (payload: {
221
+ query: QueryWithoutPage;
222
+ visibleColumns: string[];
223
+ }) => void;
224
+ /** ⋯ › Export (D46). Varsayılan açık; `false` gizler (ör. yetki). */
225
+ exportable?: boolean;
226
+ /** Verilirse paket dosya yazmaz; `rows` paketin yazacağı satırlardır (seçim varsa seçili, yoksa sayfadaki). */
227
+ onExport?: (payload: {
228
+ format: 'csv' | 'xlsx';
229
+ query: QueryWithoutPage;
230
+ selection: Row[];
231
+ rows: Row[];
232
+ visibleColumns: string[];
233
+ }) => void;
234
+ /** Tek harfli kısayollar (/ arama, F filtre, R yenile, V görünümler) ve ⌘S. Alt←/→ her zaman çalışır. */
235
+ shortcuts?: boolean;
236
+ /** Satır gövdesine düz tık; hücredeki düğme, link ve metin seçimi tetiklemez (05 §7). `rowClick`'ten bağımsız. */
237
+ onRowClick?: (row: Row, event: MouseEvent_2) => void;
238
+ /** Satır gövdesine tıklama (D6): 'open' birincil linki açar, 'expand' detayı açıp kapatır. Varsayılan 'none'. */
239
+ rowClick?: RowClickMode;
240
+ /** Birincil linke düz sol tık, menüde Open, `rowClick="open"`. Paket gezinmeyi durdurmaz: `event.preventDefault()` dinleyicide. */
241
+ onRowOpen?: (payload: {
242
+ row: Row;
243
+ href: string;
244
+ event: MouseEvent_2;
245
+ }) => void;
246
+ /** Satır menüsü (⋯): Open / Copy yerleşik + bunlar. */
247
+ rowActions?: Array<RowAction<Row>>;
248
+ /** Seçim sütunu; seçim sayfa kapsamlıdır (D19), durum `table.selection`'da. */
249
+ selectable?: boolean;
250
+ /** Seçim çubuğu: yüzer (varsayılan) ya da araç çubuğunun yerine. */
251
+ selectionBar?: 'floating' | 'toolbar';
252
+ bulkActions?: Array<BulkAction<Row>>;
253
+ /** `bulkActions` yerine seçim çubuğunun içeriği. */
254
+ selectionActions?: (props: {
255
+ rows: Row[];
256
+ clear: () => void;
257
+ }) => ReactNode;
258
+ /** Seçim her değiştiğinde; sayfadaki seçili satırlar (D19). */
259
+ onSelectionChange?: (rows: Row[]) => void;
260
+ /** Satır detayı (05 §7): birincil hücrede chevron; veriyi detay bileşeni çeker. */
261
+ renderExpanded?: (props: {
262
+ row: Row;
263
+ close: () => void;
264
+ }) => ReactNode;
265
+ /** Bu satırın detayı var mı? Yoksa chevron yerinde boşluk kalır. */
266
+ canExpand?: (row: Row) => boolean;
267
+ /** Satır hatası (D35): metin ya da metin listesi → hata zemini, ⋯ hücresinde uyarı ikonu, satırda tooltip. Harita
268
+ * uygulamanın: paket hata saklamaz, temizlemez. */
269
+ rowError?: (row: Row) => string | string[] | null | undefined;
270
+ }): JSX.Element;
271
+
272
+ export declare interface DataTableContext {
273
+ locale: string;
274
+ i18n: I18n;
275
+ /** null → yalnızca `views` seçeneğindeki görünümler, kaydetme yok (01 · plugin). */
276
+ viewsAdapter: ViewsAdapter | null;
277
+ /** null → tercihler oturumluk; arayüz "kaydedildi" demez. */
278
+ preferences: PreferencesAdapter | null;
279
+ }
280
+
281
+ export declare type DataTableInstance<Row extends object> = ReturnType<typeof useDataTable<Row>>;
282
+
283
+ /** Uygulama genelinde bir kez: `<DataTableProvider locale="tr" viewsAdapter={…}>` (R7). */
284
+ export declare interface DataTableOptions {
285
+ /** Varsayılan navigator.language. Sayı/tarih biçimi ve metin karşılaştırması bu locale ile. */
286
+ locale?: string;
287
+ /** Sabit bir nesne verin (modül düzeyinde): her çizimde yeni nesne, bağlamı ve tüm tabloyu yeniden kurar. */
288
+ messages?: Partial<Messages>;
289
+ /** Yoksa yalnızca `views` seçeneğindeki görünümler; kaydetme yok. */
290
+ viewsAdapter?: ViewsAdapter;
291
+ /** Yoksa tercihler oturumluk (kalıcı değil) ve arayüz bunu "kaydedildi" gibi sunmaz. */
292
+ preferences?: PreferencesAdapter;
293
+ }
294
+
295
+ /** Vue'daki `createDataTable` plugin'inin karşılığı (R7). İç içe kullanılırsa en yakın sağlayıcı geçerlidir. */
296
+ export declare function DataTableProvider({ children, locale, messages, viewsAdapter, preferences, }: DataTableOptions & {
297
+ children: ReactNode;
298
+ }): JSX.Element;
299
+
300
+ /**
301
+ * Sorgu sonucu: TanStack Query'nin `UseQueryResult`'ının yapısal alt kümesi; `useQuery` sonucu dönüştürülmeden verilir (R4).
302
+ * `placeholderData: keepPreviousData` önerilir: yoksa her sorgu değişiminde gövde iskelete döner.
303
+ */
304
+ export declare interface DataTableResult<Row extends object> {
305
+ status: 'pending' | 'error' | 'success';
306
+ data?: {
307
+ rows: Row[];
308
+ /** Sonraki sayfa var mı (Laravel `next_page_url !== null`). */
309
+ hasMore?: boolean;
310
+ /** Biliniyorsa toplam. */
311
+ total?: number;
312
+ };
313
+ /** `message` ve `id` alanları okunur: hata ekranı ve "Copy error ID". */
314
+ error?: unknown;
315
+ isFetching?: boolean;
316
+ isPlaceholderData?: boolean;
317
+ dataUpdatedAt?: number;
318
+ /** Refresh, Retry ve `R` bunu çağırır; yoksa görünmezler. */
319
+ refetch?: () => unknown;
320
+ }
321
+
322
+ export declare type DatePreset = 'today' | 'this_week' | 'next_7_days' | 'this_month' | 'last_30_days' | 'this_quarter' | 'overdue';
323
+
324
+ export declare type Density = 'comfortable' | 'standard' | 'compact';
325
+
326
+ /** Operatöre göre ayrışan koşul. `currency` sütununda değer düz sayıdır; para birimi `currency` alanıyla gelir. */
327
+ export declare type FilterCondition = {
328
+ column: string;
329
+ op: 'is_empty' | 'is_not_empty';
330
+ } | {
331
+ column: string;
332
+ op: 'eq' | 'neq';
333
+ value: string | number | boolean;
334
+ } | {
335
+ column: string;
336
+ op: 'contains' | 'not_contains' | 'starts_with' | 'ends_with';
337
+ value: string;
338
+ } | {
339
+ column: string;
340
+ op: 'gt' | 'gte' | 'lt' | 'lte';
341
+ value: number;
342
+ currency?: string;
343
+ }
344
+ /** Uçlar dahil; tek taraflıysa biri null. */
345
+ | {
346
+ column: string;
347
+ op: 'between';
348
+ value: [number | null, number | null];
349
+ currency?: string;
350
+ } | {
351
+ column: string;
352
+ op: 'in' | 'not_in';
353
+ value: Array<string | number>;
354
+ } | {
355
+ column: string;
356
+ op: 'before' | 'after';
357
+ value: IsoDate | {
358
+ preset: 'today';
359
+ };
360
+ } | {
361
+ column: string;
362
+ op: 'within';
363
+ value: {
364
+ preset: DatePreset;
365
+ } | {
366
+ from: IsoDate;
367
+ to: IsoDate;
368
+ };
369
+ };
370
+
371
+ /** 18 operatör (04). Çok değerli hücrelerde (multiselect) `in` "şunlardan birini içerir" anlamındadır. */
372
+ export declare type FilterOp = 'is_empty' | 'is_not_empty' | 'eq' | 'neq' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'before' | 'after' | 'within';
373
+
374
+ export declare interface I18n {
375
+ readonly locale: string;
376
+ /** Anahtar yoksa anahtarın kendisini döndürür; geliştirme modunda bir kez uyarır. */
377
+ t: (key: string, params?: MessageParams) => string;
378
+ has: (key: string) => boolean;
379
+ }
380
+
381
+ /** İkon bileşeni: Phosphor ikonları doğrudan verilir; paket `size`, `weight` ve `aria-hidden` geçirir. */
382
+ export declare type IconComponent = ComponentType<{
383
+ size?: number | string;
384
+ weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';
385
+ className?: string;
386
+ 'aria-hidden'?: boolean | 'true' | 'false';
387
+ }>;
388
+
389
+ /** ISO tarih ("2026-10-24") veya tarih-saat ("2026-10-24T09:42:00Z"). */
390
+ export declare type IsoDate = string;
391
+
392
+ /** Izgaranın çizdiği, TanStack'ten bağımsız sütun görünümü. Genişlik burada değil, `cols()`/`offsets()`'ta. */
393
+ declare interface LayoutColumn<Row extends object = object> {
394
+ id: string;
395
+ def: ColumnDef<Row>;
396
+ pinned: PinSide;
397
+ /** Bölgenin kenarındaki sabit sütun: kaydırma gölgesini bu taşır. */
398
+ pinEdge: boolean;
399
+ /** Sabit hücrelerin sticky ofsetini taşıyan CSS değişkeni (`--dt-off-…`). */
400
+ offsetVar: string;
401
+ canHide: boolean;
402
+ /** Resize tutamacının TanStack işleyicisi (fare ve dokunma). */
403
+ resizeHandler: (event: unknown) => void;
404
+ }
405
+
406
+ /** `user` filtrelerinde oturumdaki kullanıcı. Sunucuda çözülür. */
407
+ export declare const ME: "@me";
408
+
409
+ /** `{name}` düz değer, `{entity.one}` nokta yolu (09 · kurallar). `count` çoğul seçimini de yönetir. */
410
+ export declare type MessageParams = Record<string, string | number | boolean | null | undefined | Record<string, string> | Plural>;
411
+
412
+ export declare type Messages = Record<string, MessageValue>;
413
+
414
+ /** Parametreli metinler fonksiyon olabilir. */
415
+ export declare type MessageValue = string | ((params: Record<string, string | number>) => string);
416
+
417
+ export declare interface OptionDef {
418
+ value: string | number;
419
+ label: string;
420
+ /** Hazır ton veya tema başına açık renk. Verilmezse 'gray'. */
421
+ tone?: Tone | {
422
+ light: string;
423
+ dark: string;
424
+ };
425
+ description?: string;
426
+ }
427
+
428
+ /** Columns dialog'unun satırı (05 §5, D45): tüm sütunlar ekran sırasıyla. */
429
+ declare interface PanelColumn<Row extends object = object> {
430
+ id: string;
431
+ def: ColumnDef<Row>;
432
+ visible: boolean;
433
+ pinned: PinSide;
434
+ canHide: boolean;
435
+ /** Her zaman sola sabit (birincil): listede kilitli, taşınmaz, gizlenmez. */
436
+ fixed: boolean;
437
+ }
438
+
439
+ /** Nokta yolu: 'customer.title'. Gerçek koşullu tip Faz 2'de (api-draft: src/types/path.ts). */
440
+ export declare type Path<Row> = string & {
441
+ __row?: Row;
442
+ };
443
+
444
+ declare type PinSide = 'start' | 'end' | null;
445
+
446
+ /** Çoğul biçimli metin: { one: 'status', other: 'statuses' } */
447
+ export declare interface Plural {
448
+ one: string;
449
+ other: string;
450
+ }
451
+
452
+ export declare interface Preferences {
453
+ density: Density;
454
+ verticalLines: boolean;
455
+ pageSize: number;
456
+ /** Kullanıcının "Set as default" seçtiği görünüm (system veya personal). */
457
+ defaultViewId: string | null;
458
+ }
459
+
460
+ export declare interface PreferencesAdapter {
461
+ get: (tableId: TableId) => Partial<Preferences> | Promise<Partial<Preferences>>;
462
+ set: (tableId: TableId, prefs: Partial<Preferences>) => void | Promise<void>;
463
+ }
464
+
465
+ export declare type QueryWithoutPage = Omit<TableQuery, 'page'>;
466
+
467
+ /** `ajax` ve `user` sütunlarının seçenek kaynağı (sütunun kendi verisi; metin filtresi önerisi değildir). */
468
+ export declare interface RemoteOptions<O extends OptionDef = OptionDef> {
469
+ /** Yazdıkça arama. Varsayılan sayfa boyutu 20. */
470
+ search: (q: string, page: number, ctx: {
471
+ signal: AbortSignal;
472
+ }) => Promise<{
473
+ items: O[];
474
+ hasMore: boolean;
475
+ }>;
476
+ /** Kayıtlı filtre değerlerinin, yapıştırılan değerlerin ve hücre değerlerinin etiketlerini çözer. */
477
+ resolve: (values: Array<string | number>, ctx: {
478
+ signal: AbortSignal;
479
+ }) => Promise<O[]>;
480
+ pageSize?: number;
481
+ }
482
+
483
+ /** Satır aksiyonu (05 §4, D34, D36): ⋯ menüsünde; `inline` ise ⋯'nın solunda ikon düğmesi. */
484
+ export declare interface RowAction<Row = any> {
485
+ id: string;
486
+ label: string;
487
+ /** Menüde etiketin altında ikinci satır (gerekçe varsa o); inline düğmede tooltip "Label — description" (D36). */
488
+ description?: string;
489
+ icon?: IconComponent;
490
+ /** Gösterim için ("⌘↵"); paket kısayol bağlamaz. */
491
+ shortcut?: string;
492
+ /** Yetkiye bağlı: false → ne menüde ne inline (D34). Duruma bağlı pasiflik için `disabled`. */
493
+ when?: (row: Row) => boolean;
494
+ /** ⋯'nın solunda 28 px ikon düğmesi (`icon` zorunlu); o satırın menüsünde yer almaz. Satır başına ilk 2 (D36). */
495
+ inline?: boolean;
496
+ /** true veya gerekçe metni ("Already running") → pasif, gerekçe ikinci satırda. */
497
+ disabled?: (row: Row) => boolean | string;
498
+ destructive?: boolean;
499
+ /** Menüde üstündeki ayırıcı. */
500
+ separatorBefore?: boolean;
501
+ /** Onay, toast ve refresh uygulamanın işidir; paket sonucu beklemez (D20). */
502
+ run: (row: Row) => void | Promise<void>;
503
+ }
504
+
505
+ /** Satır gövdesine tıklama. Varsayılan 'none': metin seçilip kopyalanabilir, seçim ve açma yapmaz (D6). */
506
+ export declare type RowClickMode = 'none' | 'open' | 'expand';
507
+
508
+ export declare type RowKey = string | number;
509
+
510
+ export declare interface SortRule {
511
+ column: string;
512
+ dir: 'asc' | 'desc';
513
+ }
514
+
515
+ /** Tablo örneğinin kalıcı kimliği: görünümler ve tercihler bununla saklanır (ör. "production-orders"). */
516
+ export declare type TableId = string;
517
+
518
+ /**
519
+ * `table.request` (R4): uygulama bunu sorgu anahtarına koyar ve isteğini bununla kurar. Sütun taşımak, gizlemek ya da
520
+ * genişletmek isteği değiştirmez; yalnızca yeni görünen bir sütunun alanı listede yoksa `fields` büyür.
521
+ */
522
+ export declare interface TableQuery {
523
+ search: string;
524
+ filters: FilterCondition[];
525
+ /** Öncelik sırasıyla, en fazla 3. */
526
+ sort: SortRule[];
527
+ /** Sayfa numarası 1'den başlar (Laravel simplePaginate ile aynı). */
528
+ page: {
529
+ number: number;
530
+ size: number;
531
+ };
532
+ /** Sunucudan istenen alan yolları: satır anahtarı + görünür sütunların yolları ve `fields`'i + tablonun `fields`'i, koddaki sırayla. */
533
+ fields: string[];
534
+ }
535
+
536
+ /** Uygulamanın açabildiği durum (R5). Her alan ayrı ayrı controlled olabilir: `state`'te olan alan dışarıdan okunur. */
537
+ export declare interface TableState {
538
+ /** Aktif görünümün kimliği (04 §7); `null`: görünüm yok ya da hiçbiri seçili değil. Verilmezse varsayılan görünüm açılır. */
539
+ view: string | null;
540
+ /** Toolbar araması (D3): filtre değildir, görünüme girmez. */
541
+ search: string;
542
+ /** Yalnızca tam koşullar; değeri seçilmemiş çip ekranda kalır, buraya girmez (04 §1). */
543
+ filters: FilterCondition[];
544
+ sort: SortRule[];
545
+ /** 1 tabanlı. */
546
+ page: number;
547
+ pageSize: number;
548
+ }
549
+
550
+ export declare type Tone = 'gray' | 'blue' | 'green' | 'amber' | 'red' | 'violet' | 'pink' | 'teal';
551
+
552
+ export declare function useDataTable<Row extends object>(options: UseDataTableOptions<Row>): {
553
+ id: string;
554
+ columns: ColumnDef<Row>[];
555
+ entityName: Plural;
556
+ /** Sunucu modunda `useQuery` anahtarına ve isteğe girer (R4). */
557
+ request: TableQuery;
558
+ state: TableState;
559
+ /** İstemci modu: verilen tüm satırlar (filtre öncesi). Sunucu modunda undefined. */
560
+ allRows: Row[] | undefined;
561
+ /** İstemci modu: sayfadaki satırlar ve toplam. Sunucu modunda undefined. */
562
+ rows: Row[] | undefined;
563
+ total: number | undefined;
564
+ density: Density;
565
+ /** Uygulama `density` verdiyse kullanıcının seçimi etkisiz; Display'de seçici gösterilmez. */
566
+ densityFixed: boolean;
567
+ prefs: {
568
+ prefs: Preferences;
569
+ set: (patch: Partial< Preferences>) => void;
570
+ reset: () => void;
571
+ persistent: boolean;
572
+ ready: boolean;
573
+ };
574
+ views: {
575
+ all: View[];
576
+ sections: {
577
+ system: View[];
578
+ personal: View[];
579
+ };
580
+ active: View | null;
581
+ edited: boolean;
582
+ hasViews: boolean;
583
+ canSave: boolean;
584
+ hasDraft: (id: string) => boolean;
585
+ writable: (v: View | null) => boolean;
586
+ select: (id: string) => void;
587
+ saveChanges: () => Promise<void>;
588
+ discard: () => void;
589
+ create: (input: {
590
+ name: string;
591
+ state: ViewState;
592
+ makeDefault: boolean;
593
+ fromCurrent: boolean;
594
+ }) => Promise<void>;
595
+ rename: (id: string, name: string) => Promise<void>;
596
+ remove: (id: string) => Promise<void>;
597
+ };
598
+ /** Görünümün kayıtlı (kısmi) durumu → tam durum (Duplicate dialog'unun özeti). */
599
+ resolveView: (v: {
600
+ state: ViewPatch;
601
+ }) => ViewState;
602
+ /** Display › Reset: tercihler ve sütun düzeni aktif görünümün kayıtlı haline döner; filtre ve sıralama kalır (04 §8). */
603
+ resetDisplay: () => void;
604
+ /** Seçili satır anahtarları (05 §6). Satırların kendisi `DataTable`'ın `onSelectionChange`'inde. */
605
+ selection: Record<string, true>;
606
+ setSelection: (ids: Record<string, true>) => void;
607
+ clearSelection: () => void;
608
+ pageSizes: number[];
609
+ count: ((query: QueryWithoutPage, signal: AbortSignal) => Promise<number>) | undefined;
610
+ rowId: (row: Row) => string;
611
+ layout: {
612
+ columns: LayoutColumn<Row>[];
613
+ start: LayoutColumn<Row>[];
614
+ center: LayoutColumn<Row>[];
615
+ end: LayoutColumn<Row>[];
616
+ scale: number;
617
+ setScale: Dispatch<SetStateAction<number>>;
618
+ phone: boolean;
619
+ setPhone: Dispatch<SetStateAction<boolean>>;
620
+ cols: () => string;
621
+ offsets: () => Record<string, string>;
622
+ minWidth: () => number;
623
+ resizing: () => {
624
+ id: string;
625
+ size: number;
626
+ } | null;
627
+ subscribeSizing: (listener: () => void) => () => void;
628
+ move: (id: string, delta: -1 | 1) => void;
629
+ panel: PanelColumn<Row>[];
630
+ counts: {
631
+ shown: number;
632
+ total: number;
633
+ };
634
+ state: () => ColumnLayout;
635
+ resolve: (l: Partial< ColumnLayout> | undefined) => ColumnLayout;
636
+ arrange: (d: ColumnsDraft) => void;
637
+ reset: (l?: Partial< ColumnLayout> | undefined) => void;
638
+ widthOf: (id: string) => number;
639
+ setWidth: (id: string, px: number) => void;
640
+ setVisible: (id: string, visible: boolean) => void | undefined;
641
+ };
642
+ /** Header tıklaması ve ⇧ ile ikincil sıralama; sayfa 1'e döner. */
643
+ toggleSort: (column: string, multi: boolean) => void;
644
+ setSort: (column: string, dir: "asc" | "desc" | null) => void;
645
+ /** Arama ve filtre değişince sayfa 1'e döner (D19). */
646
+ setSearch: (search: string) => void;
647
+ setFilters: (filters: FilterCondition[]) => void;
648
+ /** Filtre ve sıralama tek istekte (telefon Filters › Show results, ⋯ › Sort); sayfa 1. */
649
+ setQuery: (patch: {
650
+ filters?: FilterCondition[];
651
+ sort?: SortRule[];
652
+ }) => void;
653
+ setPage: (page: number) => void;
654
+ setPageSize: (pageSize: number) => void;
655
+ };
656
+
657
+ /** Sağlayıcı yoksa varsayılanlar: navigator.language, paket metinleri, adapter yok. */
658
+ export declare function useDataTableContext(): DataTableContext;
659
+
660
+ export declare interface UseDataTableOptions<Row extends object> {
661
+ /** Kalıcı kimlik: görünümler ve tercihler bununla saklanır (ör. "production-orders"). */
662
+ id: string;
663
+ columns: Array<ColumnDef<Row>>;
664
+ /** İstemci modu: satırlar burada verilir, paket sıralar ve sayfalar; `request` kullanılmaz (R4). */
665
+ rows?: Row[];
666
+ /** Satır kimliği yolu. Varsayılan 'id'. */
667
+ rowKey?: string;
668
+ /** Verilmezse tercihten (Display › Density), o da yoksa standard. */
669
+ density?: Density;
670
+ /** Boş durum, hata ve sayfa metinlerinde: { one: 'order', other: 'orders' }. Verilmezse `id`. */
671
+ entityName?: Plural;
672
+ /** Controlled alanlar (R5). */
673
+ state?: Partial<TableState>;
674
+ /** Uncontrolled başlangıç. */
675
+ initialState?: Partial<TableState>;
676
+ /** Her değişimde tam durum; controlled alanlar burada güncellenir. */
677
+ onStateChange?: (state: TableState) => void;
678
+ /** Tercih yoksa sayfa boyutu. Varsayılan 100. */
679
+ pageSize?: number;
680
+ /** Varsayılan [50, 100, 250, 500]. */
681
+ pageSizes?: number[];
682
+ /** System görünümler (04 §7, D4): kodda tanımlı, herkes görür; kişisel görünümler provider'ın `viewsAdapter`'ından. */
683
+ views?: View[];
684
+ /** Her istekte `fields`'e eklenen alanlar. */
685
+ fields?: string[];
686
+ /** Sunucu modu: footer'da "Count total". Sayı sorgu değişene kadar geçerli; `signal` sorgu değişince iptal edilir. */
687
+ count?: (query: QueryWithoutPage, signal: AbortSignal) => Promise<number>;
688
+ }
689
+
690
+ export declare interface UserOption extends OptionDef {
691
+ avatarUrl?: string;
692
+ /** Avatar yoksa gösterilecek baş harfler; verilmezse label'dan üretilir. */
693
+ initials?: string;
694
+ }
695
+
696
+ /** Tek görünüm tipi (D4, D30). system: kodla tanımlı, değiştirilemez (Duplicate, Set as default). personal: yalnızca sahibine. */
697
+ export declare interface View {
698
+ id: string;
699
+ name: string;
700
+ kind: 'system' | 'personal';
701
+ state: ViewPatch;
702
+ /** Ekranın varsayılanı (system içinde en fazla bir tane). Kullanıcı varsayılanı tercihlerde (`defaultViewId`). */
703
+ default?: boolean;
704
+ updatedAt?: IsoDate;
705
+ /** Sunucu sürüm numarası (çakışma tespiti için, opsiyonel). */
706
+ v?: number;
707
+ }
708
+
709
+ /** Kısmi görünüm (system view tanımı ve adapter'dan gelen kayıtlar). Eksik alanlar tablonun varsayılanlarıyla tamamlanır. */
710
+ export declare interface ViewPatch {
711
+ filters?: FilterCondition[];
712
+ sort?: SortRule[];
713
+ columns?: Partial<ColumnLayout>;
714
+ }
715
+
716
+ export declare interface ViewsAdapter {
717
+ list: (tableId: TableId) => Promise<View[]>;
718
+ create: (tableId: TableId, input: {
719
+ name: string;
720
+ state: ViewState;
721
+ }) => Promise<View>;
722
+ update: (tableId: TableId, id: string, patch: {
723
+ name?: string;
724
+ state?: ViewState;
725
+ }) => Promise<View>;
726
+ remove: (tableId: TableId, id: string) => Promise<void>;
727
+ }
728
+
729
+ /** D5: görünüm = filtre + sıralama + sütun düzeni. Arama, yoğunluk, tema, sayfa yazılmaz. Kaydedilen tam snapshot. */
730
+ export declare interface ViewState {
731
+ filters: FilterCondition[];
732
+ sort: SortRule[];
733
+ columns: ColumnLayout;
734
+ }
735
+
736
+ export { }