@comitor/ui 1.10.0 → 2.0.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.
Files changed (110) hide show
  1. package/README.md +24 -5
  2. package/dist/data-grid/compose-refs.d.ts +19 -0
  3. package/dist/data-grid/compose-refs.js +41 -0
  4. package/dist/data-grid/compose-refs.js.map +1 -0
  5. package/dist/data-grid/data-grid-cell-variants.d.ts +15 -0
  6. package/dist/data-grid/data-grid-cell-variants.js +1738 -0
  7. package/dist/data-grid/data-grid-cell-variants.js.map +1 -0
  8. package/dist/data-grid/data-grid-cell-wrapper.d.ts +9 -0
  9. package/dist/data-grid/data-grid-cell-wrapper.js +179 -0
  10. package/dist/data-grid/data-grid-cell-wrapper.js.map +1 -0
  11. package/dist/data-grid/data-grid-cell.d.ts +8 -0
  12. package/dist/data-grid/data-grid-cell.js +101 -0
  13. package/dist/data-grid/data-grid-cell.js.map +1 -0
  14. package/dist/data-grid/data-grid-column-header.d.ts +12 -0
  15. package/dist/data-grid/data-grid-column-header.js +207 -0
  16. package/dist/data-grid/data-grid-column-header.js.map +1 -0
  17. package/dist/data-grid/data-grid-context-menu.d.ts +12 -0
  18. package/dist/data-grid/data-grid-context-menu.js +161 -0
  19. package/dist/data-grid/data-grid-context-menu.js.map +1 -0
  20. package/dist/data-grid/data-grid-filter-menu.d.ts +23 -0
  21. package/dist/data-grid/data-grid-filter-menu.js +725 -0
  22. package/dist/data-grid/data-grid-filter-menu.js.map +1 -0
  23. package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +31 -0
  24. package/dist/data-grid/data-grid-keyboard-shortcuts.js +229 -0
  25. package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -0
  26. package/dist/data-grid/data-grid-locale.d.ts +24 -0
  27. package/dist/data-grid/data-grid-locale.js +25 -0
  28. package/dist/data-grid/data-grid-locale.js.map +1 -0
  29. package/dist/data-grid/data-grid-paste-dialog.d.ts +11 -0
  30. package/dist/data-grid/data-grid-paste-dialog.js +104 -0
  31. package/dist/data-grid/data-grid-paste-dialog.js.map +1 -0
  32. package/dist/data-grid/data-grid-presence.d.ts +14 -0
  33. package/dist/data-grid/data-grid-presence.js +16 -0
  34. package/dist/data-grid/data-grid-presence.js.map +1 -0
  35. package/dist/data-grid/data-grid-row-height-menu.d.ts +25 -0
  36. package/dist/data-grid/data-grid-row-height-menu.js +53 -0
  37. package/dist/data-grid/data-grid-row-height-menu.js.map +1 -0
  38. package/dist/data-grid/data-grid-row.d.ts +28 -0
  39. package/dist/data-grid/data-grid-row.js +206 -0
  40. package/dist/data-grid/data-grid-row.js.map +1 -0
  41. package/dist/data-grid/data-grid-search.d.ts +10 -0
  42. package/dist/data-grid/data-grid-search.js +184 -0
  43. package/dist/data-grid/data-grid-search.js.map +1 -0
  44. package/dist/data-grid/data-grid-select-column.d.ts +12 -0
  45. package/dist/data-grid/data-grid-select-column.js +179 -0
  46. package/dist/data-grid/data-grid-select-column.js.map +1 -0
  47. package/dist/data-grid/data-grid-skeleton.d.ts +13 -0
  48. package/dist/data-grid/data-grid-skeleton.js +52 -0
  49. package/dist/data-grid/data-grid-skeleton.js.map +1 -0
  50. package/dist/data-grid/data-grid-sort-menu.d.ts +23 -0
  51. package/dist/data-grid/data-grid-sort-menu.js +283 -0
  52. package/dist/data-grid/data-grid-sort-menu.js.map +1 -0
  53. package/dist/data-grid/data-grid-view-menu.d.ts +24 -0
  54. package/dist/data-grid/data-grid-view-menu.js +74 -0
  55. package/dist/data-grid/data-grid-view-menu.js.map +1 -0
  56. package/dist/data-grid/data-grid.d.ts +44 -0
  57. package/dist/data-grid/data-grid.js +238 -0
  58. package/dist/data-grid/data-grid.js.map +1 -0
  59. package/dist/data-grid/filters.d.ts +27 -0
  60. package/dist/data-grid/filters.js +233 -0
  61. package/dist/data-grid/filters.js.map +1 -0
  62. package/dist/data-grid/index.d.ts +25 -0
  63. package/dist/data-grid/index.js +95 -0
  64. package/dist/data-grid/index.js.map +1 -0
  65. package/dist/data-grid/messages-en.d.ts +294 -0
  66. package/dist/data-grid/messages-en.js +279 -0
  67. package/dist/data-grid/messages-en.js.map +1 -0
  68. package/dist/data-grid/messages-vi.d.ts +12 -0
  69. package/dist/data-grid/messages-vi.js +279 -0
  70. package/dist/data-grid/messages-vi.js.map +1 -0
  71. package/dist/data-grid/messages.d.ts +567 -0
  72. package/dist/data-grid/messages.js +20 -0
  73. package/dist/data-grid/messages.js.map +1 -0
  74. package/dist/data-grid/sortable.d.ts +50 -0
  75. package/dist/data-grid/sortable.js +361 -0
  76. package/dist/data-grid/sortable.js.map +1 -0
  77. package/dist/data-grid/toast.d.ts +10 -0
  78. package/dist/data-grid/toast.js +21 -0
  79. package/dist/data-grid/toast.js.map +1 -0
  80. package/dist/data-grid/types.d.ts +189 -0
  81. package/dist/data-grid/types.js +1 -0
  82. package/dist/data-grid/types.js.map +1 -0
  83. package/dist/data-grid/use-as-ref.d.ts +5 -0
  84. package/dist/data-grid/use-as-ref.js +13 -0
  85. package/dist/data-grid/use-as-ref.js.map +1 -0
  86. package/dist/data-grid/use-badge-overflow.d.ts +24 -0
  87. package/dist/data-grid/use-badge-overflow.js +123 -0
  88. package/dist/data-grid/use-badge-overflow.js.map +1 -0
  89. package/dist/data-grid/use-callback-ref.d.ts +10 -0
  90. package/dist/data-grid/use-callback-ref.js +12 -0
  91. package/dist/data-grid/use-callback-ref.js.map +1 -0
  92. package/dist/data-grid/use-data-grid-undo-redo.d.ts +45 -0
  93. package/dist/data-grid/use-data-grid-undo-redo.js +348 -0
  94. package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -0
  95. package/dist/data-grid/use-data-grid.d.ts +372 -0
  96. package/dist/data-grid/use-data-grid.js +2697 -0
  97. package/dist/data-grid/use-data-grid.js.map +1 -0
  98. package/dist/data-grid/use-debounced-callback.d.ts +6 -0
  99. package/dist/data-grid/use-debounced-callback.js +19 -0
  100. package/dist/data-grid/use-debounced-callback.js.map +1 -0
  101. package/dist/data-grid/use-isomorphic-layout-effect.d.ts +5 -0
  102. package/dist/data-grid/use-isomorphic-layout-effect.js +6 -0
  103. package/dist/data-grid/use-isomorphic-layout-effect.js.map +1 -0
  104. package/dist/data-grid/use-lazy-ref.d.ts +5 -0
  105. package/dist/data-grid/use-lazy-ref.js +12 -0
  106. package/dist/data-grid/use-lazy-ref.js.map +1 -0
  107. package/dist/data-grid/utils.d.ts +81 -0
  108. package/dist/data-grid/utils.js +409 -0
  109. package/dist/data-grid/utils.js.map +1 -0
  110. package/package.json +33 -15
@@ -0,0 +1,372 @@
1
+ import * as _tanstack_react_virtual from '@tanstack/react-virtual';
2
+ import * as _tanstack_react_table from '@tanstack/react-table';
3
+ import { TableOptions, TableMeta, ColumnDef } from '@tanstack/react-table';
4
+ import * as React from 'react';
5
+ import { DataGridLocale } from './messages.js';
6
+ import { CellPosition, CellUpdate, FileCellData, RowHeightValue, Direction, SearchState, ContextMenuState, PasteDialogState } from './types.js';
7
+ import { DataGridMessages } from './messages-en.js';
8
+ import './messages-vi.js';
9
+
10
+ /**
11
+ * Tuỳ chọn của {@link useDataGrid} — mở rộng `TableOptions` của TanStack Table v8.
12
+ *
13
+ * Hook KHÔNG tự gọi API nào: mọi thay đổi dữ liệu đều đi ra ngoài qua callback
14
+ * (`onDataChange`, `onRowAdd`, `onRowsDelete`, `onFilesUpload`…) để ứng dụng tự
15
+ * quyết định lưu ở đâu (REST, GraphQL, state cục bộ…).
16
+ */
17
+ interface UseDataGridProps<TData> extends Omit<TableOptions<TData>, "pageCount" | "getCoreRowModel"> {
18
+ /**
19
+ * Nhận MẢNG DỮ LIỆU MỚI sau mỗi lần sửa ô/dán/xoá nội dung.
20
+ * Ứng dụng tự setState + gọi API lưu (thường lưu lạc quan rồi rollback khi lỗi).
21
+ */
22
+ onDataChange?: (data: TData[]) => void;
23
+ /**
24
+ * Người dùng bấm "Thêm dòng" (hoặc Shift+Enter). Trả về ô cần focus sau khi thêm
25
+ * (`{ rowIndex, columnId }`), hoặc `null` để lưới không cuộn/focus.
26
+ */
27
+ onRowAdd?: (event?: React.MouseEvent<HTMLDivElement>) => Partial<CellPosition> | Promise<Partial<CellPosition> | null> | null;
28
+ /** Dán nhiều dòng hơn số dòng hiện có → thêm `count` dòng trong MỘT lần gọi API */
29
+ onRowsAdd?: (count: number) => void | Promise<void>;
30
+ /** Xoá dòng (menu chuột phải hoặc Ctrl+Backspace) — nhận cả bản ghi lẫn chỉ số dòng */
31
+ onRowsDelete?: (rows: TData[], rowIndices: number[]) => void | Promise<void>;
32
+ /** Chạy TRƯỚC khi áp dụng dữ liệu dán — dùng để gọi API bulk update nếu cần */
33
+ onPaste?: (updates: Array<CellUpdate>) => void | Promise<void>;
34
+ /**
35
+ * Tải tệp lên cho ô `variant: "file"`. Không truyền thì tệp chỉ nằm trong bộ nhớ
36
+ * trình duyệt (blob URL) và mất khi tải lại trang.
37
+ */
38
+ onFilesUpload?: (params: {
39
+ files: File[];
40
+ rowIndex: number;
41
+ columnId: string;
42
+ }) => Promise<FileCellData[]>;
43
+ onFilesDelete?: (params: {
44
+ fileIds: string[];
45
+ rowIndex: number;
46
+ columnId: string;
47
+ }) => void | Promise<void>;
48
+ /** Chiều cao dòng ban đầu (mặc định "short" = 36px) */
49
+ rowHeight?: RowHeightValue;
50
+ onRowHeightChange?: (rowHeight: RowHeightValue) => void;
51
+ /** Số dòng render thêm ngoài vùng nhìn thấy (mặc định 6) */
52
+ overscan?: number;
53
+ dir?: Direction;
54
+ /** Tự focus ô đầu tiên (hoặc ô chỉ định) khi có dữ liệu */
55
+ autoFocus?: boolean | Partial<CellPosition>;
56
+ /** Bấm chuột vào ô là chọn luôn ô đó (mặc định chỉ focus) */
57
+ enableSingleCellSelection?: boolean;
58
+ /** Bấm tiêu đề cột để chọn cả cột */
59
+ enableColumnSelection?: boolean;
60
+ /** Bật tìm trong bảng (Ctrl+F) */
61
+ enableSearch?: boolean;
62
+ /** Bật dán từ clipboard (Ctrl+V) */
63
+ enablePaste?: boolean;
64
+ /** Chỉ xem: khoá mọi thao tác sửa/xoá/dán */
65
+ readOnly?: boolean;
66
+ /**
67
+ * Ngôn ngữ của lưới: `"en"` (mặc định) · `"vi"`, hoặc cả một bảng chuỗi tự soạn.
68
+ *
69
+ * Giá trị này đi ra theo kết quả của hook, nên `<DataGrid {...gridProps}>` tự nhận được và tự
70
+ * phát xuống cây con. Hook cũng giữ một bản cho RIÊNG nó, vì toast render ở gốc app
71
+ * (`<Toaster />`) chứ không nằm trong cây của lưới — không có context nào ở đó để đọc.
72
+ *
73
+ * ⚠ Thanh công cụ nằm ngoài `<DataGrid>` nên KHÔNG nhận được giá trị này: bọc cả màn bằng
74
+ * `DataGridLocaleProvider`, hoặc truyền `locale` cho từng menu.
75
+ */
76
+ locale?: DataGridLocale | DataGridMessages;
77
+ }
78
+ declare function useDataGrid<TData>({ data, columns, rowHeight: rowHeightProp, overscan, dir: dirProp, initialState, locale, ...props }: UseDataGridProps<TData>): {
79
+ dataGridRef: React.RefObject<HTMLDivElement | null>;
80
+ headerRef: React.RefObject<HTMLDivElement | null>;
81
+ rowMapRef: React.RefObject<Map<number, HTMLDivElement>>;
82
+ footerRef: React.RefObject<HTMLDivElement | null>;
83
+ dir: "ltr" | "rtl";
84
+ table: _tanstack_react_table.Table<TData>;
85
+ tableMeta: TableMeta<TData>;
86
+ virtualTotalSize: number;
87
+ virtualItems: _tanstack_react_virtual.VirtualItem[];
88
+ measureElement: (node: Element | null) => void;
89
+ columns: ColumnDef<TData, any>[];
90
+ columnSizeVars: {
91
+ [key: string]: number;
92
+ };
93
+ searchState: SearchState | undefined;
94
+ searchMatchesByRow: Map<number, Set<string>> | null;
95
+ activeSearchMatch: CellPosition | null;
96
+ cellSelectionMap: Map<number, Set<string>> | null;
97
+ focusedCell: CellPosition | null;
98
+ editingCell: CellPosition | null;
99
+ rowHeight: RowHeightValue;
100
+ contextMenu: ContextMenuState;
101
+ pasteDialog: PasteDialogState;
102
+ onRowAdd: ((event?: React.MouseEvent<HTMLDivElement>) => Promise<void>) | undefined;
103
+ adjustLayout: boolean;
104
+ locale: {
105
+ grid: {
106
+ label: string;
107
+ addRow: string;
108
+ };
109
+ search: {
110
+ placeholder: string;
111
+ label: string;
112
+ prevMatch: string;
113
+ nextMatch: string;
114
+ close: string;
115
+ matchPosition: (index: number, total: number) => string;
116
+ noResults: string;
117
+ typeToSearch: string;
118
+ };
119
+ column: {
120
+ sortAsc: string;
121
+ sortDesc: string;
122
+ removeSort: string;
123
+ pinLeft: string;
124
+ unpinLeft: string;
125
+ pinRight: string;
126
+ unpinRight: string;
127
+ hide: string;
128
+ resize: (label: string) => string;
129
+ variant: {
130
+ shortText: string;
131
+ longText: string;
132
+ number: string;
133
+ url: string;
134
+ checkbox: string;
135
+ select: string;
136
+ multiSelect: string;
137
+ date: string;
138
+ file: string;
139
+ };
140
+ };
141
+ select: {
142
+ all: string;
143
+ row: string;
144
+ rowNumber: (rowNumber: number) => string;
145
+ };
146
+ contextMenu: {
147
+ copy: string;
148
+ cut: string;
149
+ clear: string;
150
+ deleteRows: string;
151
+ };
152
+ pasteDialog: {
153
+ title: string;
154
+ description: (rowsNeeded: number) => string;
155
+ expandTitle: string;
156
+ expandDescription: (rowsNeeded: number) => string;
157
+ keepTitle: string;
158
+ keepDescription: string;
159
+ cancel: string;
160
+ confirm: string;
161
+ };
162
+ rowHeight: {
163
+ label: string;
164
+ short: string;
165
+ medium: string;
166
+ tall: string;
167
+ extraTall: string;
168
+ };
169
+ view: {
170
+ trigger: string;
171
+ toggleColumns: string;
172
+ searchPlaceholder: string;
173
+ empty: string;
174
+ };
175
+ sort: {
176
+ trigger: string;
177
+ title: string;
178
+ emptyTitle: string;
179
+ description: string;
180
+ emptyDescription: string;
181
+ add: string;
182
+ reset: string;
183
+ remove: string;
184
+ drag: string;
185
+ fieldPlaceholder: string;
186
+ fieldEmpty: string;
187
+ asc: string;
188
+ desc: string;
189
+ };
190
+ filter: {
191
+ trigger: string;
192
+ title: string;
193
+ emptyTitle: string;
194
+ description: string;
195
+ emptyDescription: string;
196
+ add: string;
197
+ reset: string;
198
+ remove: string;
199
+ drag: string;
200
+ where: string;
201
+ and: string;
202
+ fieldPlaceholder: string;
203
+ fieldEmpty: string;
204
+ valuePlaceholder: string;
205
+ rangeStart: string;
206
+ rangeEnd: string;
207
+ pickDate: string;
208
+ pickRange: string;
209
+ optionPlaceholder: string;
210
+ optionEmpty: string;
211
+ selectedCount: (count: number) => string;
212
+ emptyValue: (label: string) => string;
213
+ operators: {
214
+ contains: string;
215
+ notContains: string;
216
+ equals: string;
217
+ notEquals: string;
218
+ startsWith: string;
219
+ endsWith: string;
220
+ isEmpty: string;
221
+ isNotEmpty: string;
222
+ lessThan: string;
223
+ lessThanOrEqual: string;
224
+ greaterThan: string;
225
+ greaterThanOrEqual: string;
226
+ isBetween: string;
227
+ dateEquals: string;
228
+ dateNotEquals: string;
229
+ before: string;
230
+ after: string;
231
+ onOrBefore: string;
232
+ onOrAfter: string;
233
+ is: string;
234
+ isNot: string;
235
+ isAnyOf: string;
236
+ isNoneOf: string;
237
+ isTrue: string;
238
+ isFalse: string;
239
+ };
240
+ };
241
+ cell: {
242
+ longTextPlaceholder: string;
243
+ optionSearchPlaceholder: string;
244
+ optionEmpty: string;
245
+ clearAll: string;
246
+ invalidUrlTitle: string;
247
+ invalidUrlDescription: string;
248
+ };
249
+ file: {
250
+ uploadLabel: string;
251
+ dropHere: string;
252
+ dragHere: string;
253
+ browse: string;
254
+ limits: (maxSize?: string, maxFiles?: number) => string;
255
+ count: (count: number) => string;
256
+ clearAll: string;
257
+ remove: string;
258
+ uploading: string;
259
+ deleting: string;
260
+ tooMany: (maxFiles: number) => string;
261
+ tooLarge: (maxSize: string) => string;
262
+ wrongType: string;
263
+ rejectedOne: (name: string) => string;
264
+ rejectedMany: (name: string, others: number) => string;
265
+ uploadFailed: (count: number) => string;
266
+ deleteFailed: (name: string) => string;
267
+ deleteFailedMany: string;
268
+ };
269
+ toast: {
270
+ cellsCopied: (count: number) => string;
271
+ copyFailed: string;
272
+ cellsCut: (count: number) => string;
273
+ cutFailed: string;
274
+ cellsPasted: (count: number) => string;
275
+ cellsPastedWithSkipped: (count: number, skipped: number) => string;
276
+ pasteSkipped: (skipped: number) => string;
277
+ pasteFailed: string;
278
+ cellsCleared: (count: number) => string;
279
+ rowsDeleted: (count: number) => string;
280
+ nothingToUndo: string;
281
+ nothingToRedo: string;
282
+ undone: (count: number) => string;
283
+ redone: (count: number) => string;
284
+ };
285
+ booleanText: {
286
+ checked: string;
287
+ unchecked: string;
288
+ };
289
+ shortcuts: {
290
+ trigger: string;
291
+ title: string;
292
+ description: string;
293
+ searchPlaceholder: string;
294
+ emptyTitle: string;
295
+ emptyDescription: string;
296
+ close: string;
297
+ groups: {
298
+ navigation: string;
299
+ selection: string;
300
+ editing: string;
301
+ search: string;
302
+ filtering: string;
303
+ sorting: string;
304
+ general: string;
305
+ };
306
+ keys: {
307
+ click: string;
308
+ doubleClick: string;
309
+ };
310
+ navigation: {
311
+ move: string;
312
+ nextCell: string;
313
+ prevCell: string;
314
+ firstColumn: string;
315
+ lastColumn: string;
316
+ firstRowSameColumn: string;
317
+ lastRowSameColumn: string;
318
+ firstColumnSameRow: string;
319
+ lastColumnSameRow: string;
320
+ firstCell: string;
321
+ lastCell: string;
322
+ pageUp: string;
323
+ pageDown: string;
324
+ scrollUp: string;
325
+ scrollDown: string;
326
+ scrollLeft: string;
327
+ scrollRight: string;
328
+ };
329
+ selection: {
330
+ extend: string;
331
+ toTop: string;
332
+ toBottom: string;
333
+ toFirstColumn: string;
334
+ toLastColumn: string;
335
+ all: string;
336
+ toggle: string;
337
+ range: string;
338
+ clear: string;
339
+ };
340
+ editing: {
341
+ start: string;
342
+ insertRow: string;
343
+ copy: string;
344
+ cut: string;
345
+ paste: string;
346
+ clear: string;
347
+ deleteRows: string;
348
+ undo: string;
349
+ redo: string;
350
+ };
351
+ search: {
352
+ open: string;
353
+ next: string;
354
+ prev: string;
355
+ close: string;
356
+ };
357
+ filtering: {
358
+ toggle: string;
359
+ remove: string;
360
+ };
361
+ sorting: {
362
+ toggle: string;
363
+ remove: string;
364
+ };
365
+ general: {
366
+ shortcuts: string;
367
+ };
368
+ };
369
+ } | "en" | "vi" | undefined;
370
+ };
371
+
372
+ export { type UseDataGridProps, useDataGrid };