koddiv-dyn-table 0.1.2
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.
- package/README.md +491 -0
- package/dist/App.d.ts +1 -0
- package/dist/components/Table/Table.d.ts +3 -0
- package/dist/components/Table/Table.types.d.ts +195 -0
- package/dist/components/Table/index.d.ts +3 -0
- package/dist/components/Table/utils.d.ts +5 -0
- package/dist/components/Table/valueFormats.d.ts +3 -0
- package/dist/components/TableFormatters/TableFormatters.d.ts +12 -0
- package/dist/components/TableFormatters/index.d.ts +2 -0
- package/dist/components/TableRowActions/TableRowActions.d.ts +15 -0
- package/dist/components/TableRowActions/index.d.ts +2 -0
- package/dist/dyn-table.js +1387 -0
- package/dist/dyn-table.js.map +1 -0
- package/dist/dyn-table.umd.cjs +2 -0
- package/dist/dyn-table.umd.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/main.d.ts +1 -0
- package/dist/style.css +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
export type SortDirection = 'asc' | 'desc' | null;
|
|
4
|
+
/** Yerleşik hücre formatı — valueFormatter yazmadan kullan */
|
|
5
|
+
export type ValueFormatType = 'date' | 'datetime' | 'time' | 'number' | 'currency' | 'percent';
|
|
6
|
+
/** Yerleşik hücre formatörü tipi (TableFormatters ile kullanılır) */
|
|
7
|
+
export type CellFormatType = 'status' | 'yesNo' | 'onOff' | 'published' | 'approved' | 'badge';
|
|
8
|
+
/** cellFormat seçenekleri — tüm boolean/badge formatörleri için (etiketler varsayılanı override eder) */
|
|
9
|
+
export interface CellFormatStatusOptions {
|
|
10
|
+
/** true iken gösterilecek metin */
|
|
11
|
+
activeLabel?: string;
|
|
12
|
+
/** false iken gösterilecek metin */
|
|
13
|
+
inactiveLabel?: string;
|
|
14
|
+
/** true iken badge CSS class */
|
|
15
|
+
activeClass?: string;
|
|
16
|
+
/** false iken badge CSS class */
|
|
17
|
+
inactiveClass?: string;
|
|
18
|
+
}
|
|
19
|
+
export type CellFormatOptions = CellFormatStatusOptions;
|
|
20
|
+
/** valueFormat için seçenekler (Intl / toLocaleString uyumlu) */
|
|
21
|
+
export interface ValueFormatOptions {
|
|
22
|
+
/** Locale (varsayılan: tr-TR) */
|
|
23
|
+
locale?: string;
|
|
24
|
+
/** Tarih formatı (date / datetime için) */
|
|
25
|
+
dateStyle?: 'short' | 'medium' | 'long' | 'full';
|
|
26
|
+
/** Saat formatı (time / datetime için) */
|
|
27
|
+
timeStyle?: 'short' | 'medium' | 'long' | 'full';
|
|
28
|
+
/** Para birimi kodu (currency için: TRY, USD vb.) */
|
|
29
|
+
currency?: string;
|
|
30
|
+
/** Ondalık min basamak (number / currency / percent) */
|
|
31
|
+
minimumFractionDigits?: number;
|
|
32
|
+
/** Ondalık max basamak (number / currency / percent) */
|
|
33
|
+
maximumFractionDigits?: number;
|
|
34
|
+
}
|
|
35
|
+
/** AG Grid tarzı kolon tanımı */
|
|
36
|
+
export interface ColumnDef<T = unknown> {
|
|
37
|
+
/** Benzersiz kolon id (AG Grid: colId) */
|
|
38
|
+
id: string;
|
|
39
|
+
/** Başlık veya özel React node (AG Grid: headerName) */
|
|
40
|
+
header: string | ReactNode;
|
|
41
|
+
/** Veri alanı (AG Grid: field) */
|
|
42
|
+
accessorKey?: keyof T | string;
|
|
43
|
+
/** Ham değeri almak için custom getter (AG Grid: valueGetter) */
|
|
44
|
+
valueGetter?: (row: T) => unknown;
|
|
45
|
+
/** Yerleşik format: date, datetime, time, number, currency, percent — valueFormatter yazmaya gerek yok */
|
|
46
|
+
valueFormat?: ValueFormatType;
|
|
47
|
+
/** valueFormat için seçenekler (locale, dateStyle, currency vb.) */
|
|
48
|
+
valueFormatOptions?: ValueFormatOptions;
|
|
49
|
+
/** Görüntülenen değeri formatlamak için (valueFormat’tan öncelikli) (AG Grid: valueFormatter) */
|
|
50
|
+
valueFormatter?: (value: unknown, row: T) => ReactNode;
|
|
51
|
+
/** Hücre içeriği tam kontrol (valueFormatter’dan öncelikli) (AG Grid: cellRenderer) */
|
|
52
|
+
cell?: (row: T) => ReactNode;
|
|
53
|
+
/** Yerleşik hücre formatörü: cell yazmadan badge/status göster (TableFormatters) */
|
|
54
|
+
cellFormat?: CellFormatType;
|
|
55
|
+
/** cellFormat için seçenekler */
|
|
56
|
+
cellFormatOptions?: CellFormatOptions;
|
|
57
|
+
/** Sıralanabilir */
|
|
58
|
+
sortable?: boolean;
|
|
59
|
+
/** Özel karşılaştırıcı (AG Grid: comparator) */
|
|
60
|
+
comparator?: (valueA: unknown, valueB: unknown, rowA: T, rowB: T) => number;
|
|
61
|
+
/** Genişlik (px veya string) */
|
|
62
|
+
width?: string | number;
|
|
63
|
+
minWidth?: string | number;
|
|
64
|
+
maxWidth?: string | number;
|
|
65
|
+
/** Kalan alanı paylaş (AG Grid: flex) — number = oran */
|
|
66
|
+
flex?: number;
|
|
67
|
+
/** Hücre hizalama */
|
|
68
|
+
align?: 'left' | 'center' | 'right';
|
|
69
|
+
headerAlign?: 'left' | 'center' | 'right';
|
|
70
|
+
/** Başlangıçta gizli (AG Grid: hide) */
|
|
71
|
+
hide?: boolean;
|
|
72
|
+
/** Sabit sol/sağ (AG Grid: pinned) */
|
|
73
|
+
pinned?: 'left' | 'right';
|
|
74
|
+
/** Kullanıcı genişlik değiştirebilir (AG Grid: resizable) */
|
|
75
|
+
resizable?: boolean;
|
|
76
|
+
/** Hücre CSS class — string veya (row) => string */
|
|
77
|
+
cellClass?: string | ((row: T, value: unknown) => string);
|
|
78
|
+
/** Başlık CSS class */
|
|
79
|
+
headerClass?: string;
|
|
80
|
+
/** Hücre inline style — object veya (row, value) => object */
|
|
81
|
+
cellStyle?: CSSProperties | ((row: T, value: unknown) => CSSProperties);
|
|
82
|
+
/** Başlık inline style */
|
|
83
|
+
headerStyle?: CSSProperties;
|
|
84
|
+
/** Başlık tooltip */
|
|
85
|
+
headerTooltip?: string;
|
|
86
|
+
/** Hücre tooltip (row, value) => string */
|
|
87
|
+
tooltip?: (row: T, value: unknown) => string;
|
|
88
|
+
/** Düzenlenebilir (AG Grid: editable) */
|
|
89
|
+
editable?: boolean;
|
|
90
|
+
/** Metin satır içinde kırılsın (AG Grid: wrapText) */
|
|
91
|
+
wrapText?: boolean;
|
|
92
|
+
/** Sıralamayı kapat (kolon bazlı) */
|
|
93
|
+
suppressSort?: boolean;
|
|
94
|
+
/** Filtre tipi — toolbar filtre panelinde gösterilir */
|
|
95
|
+
filter?: 'text' | 'number' | 'date' | 'select';
|
|
96
|
+
/** select filtresi için seçenekler */
|
|
97
|
+
filterSelectOptions?: {
|
|
98
|
+
value: string | number;
|
|
99
|
+
label: string;
|
|
100
|
+
}[];
|
|
101
|
+
}
|
|
102
|
+
export type TableTheme = 'light' | 'dark';
|
|
103
|
+
export interface TableProps<T = unknown> {
|
|
104
|
+
data: T[];
|
|
105
|
+
columns: ColumnDef<T>[];
|
|
106
|
+
/** Satır benzersiz anahtarı (fonksiyon) — keyColumnId verilmezse zorunlu */
|
|
107
|
+
keyExtractor?: (row: T) => string | number;
|
|
108
|
+
/** Satır anahtarının alınacağı kolon id’si (örn. DB’deki id alanı); keyExtractor verilmezse kullanılır */
|
|
109
|
+
keyColumnId?: string;
|
|
110
|
+
sortable?: boolean;
|
|
111
|
+
defaultSort?: {
|
|
112
|
+
id: string;
|
|
113
|
+
direction: SortDirection;
|
|
114
|
+
};
|
|
115
|
+
onSort?: (id: string, direction: SortDirection) => void;
|
|
116
|
+
emptyMessage?: ReactNode;
|
|
117
|
+
/** Tema: light (açık) veya dark (koyu) */
|
|
118
|
+
theme?: TableTheme;
|
|
119
|
+
className?: string;
|
|
120
|
+
headerClassName?: string;
|
|
121
|
+
bodyClassName?: string;
|
|
122
|
+
rowClassName?: string | ((row: T, index: number) => string);
|
|
123
|
+
/** Satır bazlı aksiyon butonları — son kolon olarak eklenir */
|
|
124
|
+
actions?: (row: T) => ReactNode;
|
|
125
|
+
/** Aksiyon kolonu başlığı */
|
|
126
|
+
actionsHeader?: ReactNode;
|
|
127
|
+
/** Aksiyon kolonu hizalama */
|
|
128
|
+
actionsAlign?: 'left' | 'center' | 'right';
|
|
129
|
+
/** Aksiyon kolonu genişliği; verilmezse içeriğe (buton sayısına) göre otomatik hesaplanır */
|
|
130
|
+
actionsWidth?: string | number;
|
|
131
|
+
/** Sayfalama açık */
|
|
132
|
+
pagination?: boolean;
|
|
133
|
+
/** Sayfa başına satır (varsayılan: 10) */
|
|
134
|
+
pageSize?: number;
|
|
135
|
+
/** Sayfa boyutu seçenekleri (dropdown) */
|
|
136
|
+
pageSizeOptions?: number[];
|
|
137
|
+
/** Kontrollü mevcut sayfa (1 tabanlı); verilmezse defaultPage + iç state */
|
|
138
|
+
page?: number;
|
|
139
|
+
/** Başlangıç sayfası (pagination açık, page verilmediğinde) */
|
|
140
|
+
defaultPage?: number;
|
|
141
|
+
/** Sayfa veya sayfa boyutu değişince; server-side için kullan */
|
|
142
|
+
onPageChange?: (page: number, pageSize: number) => void;
|
|
143
|
+
/** Toplam kayıt (server-side); verilmezse client-side: data.length, veri dilimlenir */
|
|
144
|
+
totalCount?: number;
|
|
145
|
+
/** Blok tabanlı sayfalama: kullanıcı bu sayfaya geçti ama data bu sayfayı kapsamıyor; blok yüklemesi yap (page 1 tabanlı) */
|
|
146
|
+
onBlockNeeded?: (page: number) => void;
|
|
147
|
+
/** Blok boyutu (örn. 100); API’den her istekte kaç kayıt geldiği — bilgi/doğrulama için (opsiyonel) */
|
|
148
|
+
blockSize?: number;
|
|
149
|
+
/** Tablo alanı min yükseklik (px veya string); sayfa değişince kısalmasın */
|
|
150
|
+
minHeight?: string | number;
|
|
151
|
+
/** Tablo alanı sabit yükseklik (px veya string); verilirse scroll alanı bu yükseklikte kalır */
|
|
152
|
+
height?: string | number;
|
|
153
|
+
/** Mobil kart görünümü: bu genişliğin (px) altında satırlar kart olarak aşağı doğru listelenir */
|
|
154
|
+
mobileBreakpoint?: number;
|
|
155
|
+
/** Satır seçimi (checkbox kolonu) */
|
|
156
|
+
rowSelection?: boolean;
|
|
157
|
+
/** Seçili satır anahtarları (kontrollü) */
|
|
158
|
+
selectedRowKeys?: (string | number)[];
|
|
159
|
+
/** Başlangıç seçili anahtarlar (kontrollü değilse) */
|
|
160
|
+
defaultSelectedRowKeys?: (string | number)[];
|
|
161
|
+
/** Seçim değişince: (selectedKeys, selectedRows) */
|
|
162
|
+
onSelectionChange?: (selectedKeys: (string | number)[], selectedRows: T[]) => void;
|
|
163
|
+
/** Seçim toolbar'da badge metni (satır başına); verilmezse key gösterilir */
|
|
164
|
+
selectionToolbarLabel?: (row: T) => string;
|
|
165
|
+
/** Filtre paneli (toolbar’da Filtre butonu, sağdan açılan panel) */
|
|
166
|
+
filterable?: boolean;
|
|
167
|
+
/** Filtre değerleri (kontrollü); kolon id → değer */
|
|
168
|
+
filterModel?: Record<string, string | number | null>;
|
|
169
|
+
/** Başlangıç filtre değerleri (kontrollü değilse) */
|
|
170
|
+
defaultFilterModel?: Record<string, string | number | null>;
|
|
171
|
+
/** Filtre değişince */
|
|
172
|
+
onFilterChange?: (filterModel: Record<string, string | number | null>) => void;
|
|
173
|
+
/** Filtre paneli genişliği (px; varsayılan 280) */
|
|
174
|
+
filterPanelWidth?: number;
|
|
175
|
+
/** Sanal listeleme: sadece görünen satırları render eder (çok büyük veri için); height veya minHeight gerekir */
|
|
176
|
+
virtualization?: boolean;
|
|
177
|
+
/** Satır yüksekliği (px; varsayılan 44); virtualization açıkken kullanılır */
|
|
178
|
+
rowHeight?: number;
|
|
179
|
+
/** Görünür alanın dışında kaç satır daha render edilsin (varsayılan 5) */
|
|
180
|
+
virtualizationOverscan?: number;
|
|
181
|
+
/** Kolon görünürlüğü (kontrollü); id -> visible */
|
|
182
|
+
columnVisibility?: Record<string, boolean>;
|
|
183
|
+
/** Kolon görünürlüğü değişince */
|
|
184
|
+
onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;
|
|
185
|
+
/** Kolon sırası (kontrollü); id listesi */
|
|
186
|
+
columnOrder?: string[];
|
|
187
|
+
/** Kolon sırası değişince */
|
|
188
|
+
onColumnOrderChange?: (order: string[]) => void;
|
|
189
|
+
/** Kolon sürükle-bırak (header’da tutamaç ile sıra değiştirme); true iken etkin (varsayılan: true) */
|
|
190
|
+
columnReorder?: boolean;
|
|
191
|
+
/** Yükleme durumu; true iken skeleton satırlar (veya mobilde skeleton kartlar) gösterilir */
|
|
192
|
+
loading?: boolean;
|
|
193
|
+
/** Yapışkan header; true iken dikey scroll’da thead sabit kalır; height veya minHeight verilmeli */
|
|
194
|
+
stickyHeader?: boolean;
|
|
195
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ColumnDef } from './Table.types';
|
|
2
|
+
|
|
3
|
+
/** Genişlik değerini px sayısına çevirir (number veya "100px" / "100") */
|
|
4
|
+
export declare function parseWidth(w: string | number | undefined): number | undefined;
|
|
5
|
+
export declare function getCellValue<T>(row: T, column: ColumnDef<T>): unknown;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { CellFormatType, CellFormatOptions } from '../Table/Table.types';
|
|
3
|
+
|
|
4
|
+
export interface StatusBadgeProps {
|
|
5
|
+
value: unknown;
|
|
6
|
+
activeLabel?: string;
|
|
7
|
+
inactiveLabel?: string;
|
|
8
|
+
activeClass?: string;
|
|
9
|
+
inactiveClass?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function StatusBadge({ value, activeLabel, inactiveLabel, activeClass, inactiveClass, }: StatusBadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function renderCellFormat(formatType: CellFormatType, value: unknown, _row: unknown, options?: CellFormatOptions): ReactNode;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
/** Tek bir aksiyon butonunun genişliği (px) — CSS .table-row-actions__btn ile uyumlu */
|
|
3
|
+
export declare const ACTION_BUTTON_WIDTH = 32;
|
|
4
|
+
/** Butonlar arası boşluk (px) — CSS .table-row-actions gap ile uyumlu */
|
|
5
|
+
export declare const ACTION_BUTTON_GAP = 8;
|
|
6
|
+
/** Aksiyon kolonu genişliği: buton sayısına göre hesaplar. actionsWidth={getActionsColumnWidth(2)} */
|
|
7
|
+
export declare function getActionsColumnWidth(buttonCount: number): number;
|
|
8
|
+
export interface TableRowActionsProps<T> {
|
|
9
|
+
row: T;
|
|
10
|
+
onEdit: (row: T) => void;
|
|
11
|
+
onDelete: (row: T) => void;
|
|
12
|
+
editLabel?: string;
|
|
13
|
+
deleteLabel?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function TableRowActions<T>({ row, onEdit, onDelete, editLabel, deleteLabel, }: TableRowActionsProps<T>): import("react/jsx-runtime").JSX.Element;
|