@object-ui/plugin-aggrid 3.3.0 → 3.3.1

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 (96) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +20 -0
  3. package/dist/AddressField-CP-8JJvR.js +98 -0
  4. package/dist/{AgGridImpl-DBqxIsko.js → AgGridImpl-DJWnS8p3.js} +1 -1
  5. package/dist/AutoNumberField-DCL2eUJj.js +14 -0
  6. package/dist/{AvatarField-C5b9biGa.js → AvatarField-CpFxJRdO.js} +4 -3
  7. package/dist/{BooleanField-DRzAZhSq.js → BooleanField-Chphr8cB.js} +2 -1
  8. package/dist/CodeField-BWngVIw1.js +23 -0
  9. package/dist/ColorField-GygyYArR.js +38 -0
  10. package/dist/CurrencyField-O8Pn59RO.js +49 -0
  11. package/dist/DateField-u6U8wmvI.js +22 -0
  12. package/dist/DateTimeField-D1z1Ovvy.js +30 -0
  13. package/dist/EmailField-IOcDmGjJ.js +26 -0
  14. package/dist/FileField-D3mZIrJ1.js +158 -0
  15. package/dist/FormulaField-MuyWzQx0.js +17 -0
  16. package/dist/GeolocationField-BfhC7QLw.js +161 -0
  17. package/dist/GridField-gN34gk4b.js +49 -0
  18. package/dist/ImageField-BZfSFwmJ.js +75 -0
  19. package/dist/LocationField-B-zwfw3h.js +36 -0
  20. package/dist/{LookupField-DoOmbbZF.js → LookupField-Cms1Cu_l.js} +347 -349
  21. package/dist/{MasterDetailField-BnSPGAtS.js → MasterDetailField-DGUmvg2f.js} +5 -4
  22. package/dist/NumberField-BV5sKwZ7.js +27 -0
  23. package/dist/{ObjectAgGridImpl-DrI0aa8t.js → ObjectAgGridImpl-yiHlXYgp.js} +5804 -5804
  24. package/dist/ObjectField-DJ5s3ciA.js +50 -0
  25. package/dist/{PasswordField-k5JeKk9f.js → PasswordField-BJboeBJY.js} +3 -2
  26. package/dist/PercentField-DO3be_bL.js +61 -0
  27. package/dist/PhoneField-CT6XcO6O.js +26 -0
  28. package/dist/{QRCodeField-BIrSW1Zr.js → QRCodeField-COLyc5iQ.js} +31 -30
  29. package/dist/{RatingField-5iMhn2GL.js → RatingField-B2momIna.js} +3 -2
  30. package/dist/RichTextField-C7qzDPJy.js +33 -0
  31. package/dist/SelectField-oo6vnNhQ.js +36 -0
  32. package/dist/{SignatureField-BAMvNrE6.js → SignatureField-DUgoK09r.js} +3 -2
  33. package/dist/{SliderField-C9IhmjbF.js → SliderField-DrggtBSX.js} +2 -1
  34. package/dist/SummaryField-DuMsFoY5.js +22 -0
  35. package/dist/TextAreaField-CLzzmPce.js +37 -0
  36. package/dist/TextField-CZE7SzK4.js +30 -0
  37. package/dist/TimeField-Bha4cayv.js +22 -0
  38. package/dist/UrlField-Dff4WLlN.js +31 -0
  39. package/dist/UserField-eT5njHwQ.js +77 -0
  40. package/dist/VectorField-BHe8lDOH.js +34 -0
  41. package/dist/{image-DlUdeTgT.js → image-DmzU2ETO.js} +1 -1
  42. package/dist/index.js +2 -2
  43. package/dist/index.umd.cjs +77 -77
  44. package/dist/{jsx-runtime-CGDkM_Jn.js → jsx-runtime-CXSCp6pT.js} +30 -39
  45. package/dist/{plus-BwEV_Q5_.js → plus-bvZ2f9T_.js} +1 -1
  46. package/dist/rolldown-runtime-CkxV0rQ3.js +14 -0
  47. package/dist/{upload-DPiohvXv.js → upload-BdzwEMeV.js} +1 -1
  48. package/dist/{useFieldTranslation-C69OtouR.js → useFieldTranslation-CfXaJRC4.js} +2 -2
  49. package/dist/{x-BFq2GeQ5.js → x-98xe-fYG.js} +1 -1
  50. package/package.json +34 -11
  51. package/.turbo/turbo-build.log +0 -71
  52. package/OBJECT_AGGRID_CN.md +0 -483
  53. package/QUICKSTART.md +0 -186
  54. package/dist/AddressField-DKqaE9pD.js +0 -93
  55. package/dist/AutoNumberField-0RU2dNKe.js +0 -13
  56. package/dist/CodeField-RWhnDMyL.js +0 -22
  57. package/dist/ColorField-B-YAFXdz.js +0 -37
  58. package/dist/CurrencyField-Bu80a-sI.js +0 -51
  59. package/dist/DateField-CV-NpLbM.js +0 -21
  60. package/dist/DateTimeField--YTsgTjw.js +0 -32
  61. package/dist/EmailField-B-3fWJsH.js +0 -28
  62. package/dist/FileField-BcGMvBnI.js +0 -160
  63. package/dist/FormulaField-MQXJZOep.js +0 -13
  64. package/dist/GeolocationField-D3BrmwqV.js +0 -156
  65. package/dist/GridField-DHsGo9l2.js +0 -51
  66. package/dist/ImageField-BBqwJEkk.js +0 -77
  67. package/dist/LocationField-DSvhU9Dz.js +0 -35
  68. package/dist/LookupField-KfYQlgUd.js +0 -2
  69. package/dist/NumberField-Kz4_o5DE.js +0 -26
  70. package/dist/ObjectField-C1qkl6s4.js +0 -52
  71. package/dist/PercentField-Dmipqv0I.js +0 -63
  72. package/dist/PhoneField-Dn4h6V9H.js +0 -28
  73. package/dist/RichTextField-CN5BRd_7.js +0 -32
  74. package/dist/SelectField-Bjk_S2zT.js +0 -31
  75. package/dist/SelectField-CcWvzp9g.js +0 -2
  76. package/dist/SummaryField-R9RENAZv.js +0 -18
  77. package/dist/TextAreaField-BY63Nr6-.js +0 -36
  78. package/dist/TextField-SIw8aMzf.js +0 -29
  79. package/dist/TimeField-xxziHPjE.js +0 -21
  80. package/dist/UrlField-Ihk3_ff5.js +0 -33
  81. package/dist/UserField-BHl6mmIH.js +0 -79
  82. package/dist/VectorField-Ci167cxr.js +0 -35
  83. package/src/AgGridImpl.tsx +0 -405
  84. package/src/ObjectAgGridImpl.tsx +0 -509
  85. package/src/VirtualScrolling.ts +0 -74
  86. package/src/ag-grid.d.ts +0 -10
  87. package/src/field-renderers.test.tsx +0 -383
  88. package/src/field-renderers.tsx +0 -224
  89. package/src/index.test.ts +0 -139
  90. package/src/index.tsx +0 -514
  91. package/src/object-aggrid.test.ts +0 -99
  92. package/src/object-aggrid.types.ts +0 -123
  93. package/src/types.ts +0 -184
  94. package/tsconfig.json +0 -17
  95. package/vite.config.ts +0 -64
  96. /package/dist/{createLucideIcon-BjfZYZey.js → createLucideIcon-C_5JZ35b.js} +0 -0
@@ -1,509 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';
10
- import { AgGridReact } from 'ag-grid-react';
11
- import type {
12
- ColDef,
13
- GridReadyEvent,
14
- CellClickedEvent,
15
- RowClickedEvent,
16
- SelectionChangedEvent,
17
- CellValueChangedEvent,
18
- StatusPanelDef,
19
- GetContextMenuItemsParams,
20
- MenuItemDef,
21
- DefaultMenuItem,
22
- } from 'ag-grid-community';
23
- import type { FieldMetadata, ObjectSchemaMetadata } from '@object-ui/types';
24
- import type { ObjectAgGridImplProps } from './object-aggrid.types';
25
- import { FIELD_TYPE_TO_FILTER_TYPE } from './object-aggrid.types';
26
- import { createFieldCellRenderer, createFieldCellEditor } from './field-renderers';
27
- import { buildExpandFields } from '@object-ui/core';
28
-
29
- /**
30
- * ObjectAgGridImpl - Metadata-driven AG Grid implementation
31
- * Fetches object metadata and data from ObjectStack and renders the grid
32
- */
33
- export default function ObjectAgGridImpl({
34
- objectName,
35
- dataSource,
36
- fields: providedFields,
37
- fieldNames,
38
- filters,
39
- sort,
40
- pageSize = 10,
41
- pagination = true,
42
- domLayout = 'normal',
43
- animateRows = true,
44
- rowSelection,
45
- theme = 'quartz',
46
- height = 500,
47
- className = '',
48
- editable = false,
49
- editType,
50
- singleClickEdit = false,
51
- stopEditingWhenCellsLoseFocus = true,
52
- exportConfig,
53
- statusBar,
54
- callbacks,
55
- columnConfig,
56
- enableRangeSelection = false,
57
- enableCharts = false,
58
- contextMenu,
59
- }: ObjectAgGridImplProps) {
60
- const gridRef = useRef<any>(null);
61
- const [loading, setLoading] = useState(true);
62
- const [error, setError] = useState<Error | null>(null);
63
- const [objectSchema, setObjectSchema] = useState<ObjectSchemaMetadata | null>(null);
64
- const [rowData, setRowData] = useState<any[]>([]);
65
-
66
- // Fetch object metadata
67
- useEffect(() => {
68
- if (!dataSource) {
69
- setError(new Error('DataSource is required'));
70
- setLoading(false);
71
- return;
72
- }
73
-
74
- const fetchMetadata = async () => {
75
- try {
76
- setLoading(true);
77
- setError(null);
78
-
79
- // Fetch object schema/metadata
80
- const schema = await (dataSource as any).getObjectSchema(objectName);
81
- setObjectSchema(schema);
82
- } catch (err) {
83
- const error = err instanceof Error ? err : new Error(String(err));
84
- setError(error);
85
- callbacks?.onDataError?.(error);
86
- } finally {
87
- setLoading(false);
88
- }
89
- };
90
-
91
- fetchMetadata();
92
- }, [objectName, dataSource, callbacks]);
93
-
94
- // Fetch data
95
- useEffect(() => {
96
- if (!dataSource || !objectSchema) return;
97
-
98
- const fetchData = async () => {
99
- try {
100
- setLoading(true);
101
- setError(null);
102
-
103
- const queryParams: any = {
104
- $top: pageSize,
105
- $skip: 0,
106
- };
107
-
108
- if (filters) {
109
- queryParams.$filter = filters;
110
- }
111
-
112
- if (sort) {
113
- queryParams.$orderby = sort;
114
- }
115
-
116
- // Auto-inject $expand for lookup/master_detail fields
117
- const expand = buildExpandFields(objectSchema?.fields);
118
- if (expand.length > 0) {
119
- queryParams.$expand = expand;
120
- }
121
-
122
- const result = await dataSource.find(objectName, queryParams);
123
- setRowData(result.data || []);
124
- callbacks?.onDataLoaded?.(result.data || []);
125
- } catch (err) {
126
- const error = err instanceof Error ? err : new Error(String(err));
127
- setError(error);
128
- callbacks?.onDataError?.(error);
129
- } finally {
130
- setLoading(false);
131
- }
132
- };
133
-
134
- fetchData();
135
- }, [objectName, dataSource, objectSchema, filters, sort, pageSize, callbacks]);
136
-
137
- // Generate column definitions from metadata
138
- const columnDefs = useMemo((): ColDef[] => {
139
- if (!objectSchema?.fields) return [];
140
-
141
- // Use provided fields or get from schema
142
- const fieldMetadata = providedFields || Object.values(objectSchema.fields);
143
-
144
- // Filter fields if fieldNames is provided
145
- const fieldsToShow = fieldNames
146
- ? fieldMetadata.filter(field => fieldNames.includes(field.name))
147
- : fieldMetadata;
148
-
149
- return fieldsToShow.map(field => {
150
- const colDef: ColDef = {
151
- field: field.name,
152
- headerName: field.label || field.name,
153
- sortable: field.sortable !== false,
154
- filter: getFilterType(field),
155
- editable: editable && !field.readonly,
156
- // visible_on will be evaluated by the core renderer
157
- // For now, we just show all fields. Conditional visibility
158
- // should be handled at a higher level or via dynamic column updates
159
- };
160
-
161
- // Apply column config defaults
162
- if (columnConfig) {
163
- if (columnConfig.resizable !== undefined) {
164
- colDef.resizable = columnConfig.resizable;
165
- }
166
- if (columnConfig.sortable !== undefined && colDef.sortable === undefined) {
167
- colDef.sortable = columnConfig.sortable;
168
- }
169
- }
170
-
171
- // Add custom renderers and formatters based on field type
172
- applyFieldTypeFormatting(colDef, field);
173
-
174
- return colDef;
175
- });
176
- }, [objectSchema, providedFields, fieldNames, editable, columnConfig]);
177
-
178
- // Build status bar panels
179
- const statusPanels = useMemo((): StatusPanelDef[] | undefined => {
180
- if (!statusBar?.enabled) return undefined;
181
-
182
- const aggregations = statusBar.aggregations || ['count', 'sum', 'avg'];
183
- const panels: StatusPanelDef[] = [];
184
-
185
- if (aggregations.includes('count')) {
186
- panels.push({ statusPanel: 'agAggregationComponent', statusPanelParams: { aggFuncs: ['count'] } });
187
- }
188
- if (aggregations.includes('sum')) {
189
- panels.push({ statusPanel: 'agAggregationComponent', statusPanelParams: { aggFuncs: ['sum'] } });
190
- }
191
- if (aggregations.includes('avg')) {
192
- panels.push({ statusPanel: 'agAggregationComponent', statusPanelParams: { aggFuncs: ['avg'] } });
193
- }
194
- if (aggregations.includes('min')) {
195
- panels.push({ statusPanel: 'agAggregationComponent', statusPanelParams: { aggFuncs: ['min'] } });
196
- }
197
- if (aggregations.includes('max')) {
198
- panels.push({ statusPanel: 'agAggregationComponent', statusPanelParams: { aggFuncs: ['max'] } });
199
- }
200
-
201
- return panels;
202
- }, [statusBar]);
203
-
204
- // CSV Export handler
205
- const handleExportCSV = useCallback(() => {
206
- if (!gridRef.current?.api) return;
207
-
208
- const params = {
209
- fileName: exportConfig?.fileName || `${objectName}-export.csv`,
210
- skipColumnHeaders: exportConfig?.skipColumnHeaders || false,
211
- allColumns: exportConfig?.allColumns || false,
212
- onlySelected: exportConfig?.onlySelected || false,
213
- };
214
-
215
- gridRef.current.api.exportDataAsCsv(params);
216
-
217
- if (callbacks?.onExport) {
218
- const data = exportConfig?.onlySelected
219
- ? gridRef.current.api.getSelectedRows()
220
- : rowData;
221
- callbacks.onExport(data || [], 'csv');
222
- }
223
- }, [exportConfig, callbacks, rowData, objectName]);
224
-
225
- // Context Menu handler
226
- const getContextMenuItems = useCallback((params: GetContextMenuItemsParams): (DefaultMenuItem | MenuItemDef)[] => {
227
- if (!contextMenu?.enabled) return [];
228
-
229
- const items: (DefaultMenuItem | MenuItemDef)[] = [];
230
- const defaultItems = contextMenu.items || ['copy', 'copyWithHeaders', 'separator', 'export'];
231
-
232
- defaultItems.forEach(item => {
233
- if (item === 'export') {
234
- items.push({
235
- name: 'Export CSV',
236
- icon: '<span>📥</span>',
237
- action: () => handleExportCSV(),
238
- });
239
- } else if (item === 'autoSizeAll') {
240
- items.push({
241
- name: 'Auto-size All Columns',
242
- action: () => {
243
- if (gridRef.current?.api) {
244
- gridRef.current.api.autoSizeAllColumns();
245
- }
246
- },
247
- });
248
- } else if (item === 'resetColumns') {
249
- items.push({
250
- name: 'Reset Columns',
251
- action: () => {
252
- if (gridRef.current?.api) {
253
- gridRef.current.api.resetColumnState();
254
- }
255
- },
256
- });
257
- } else {
258
- items.push(item as DefaultMenuItem);
259
- }
260
- });
261
-
262
- // Add custom items
263
- if (contextMenu.customItems) {
264
- if (items.length > 0) {
265
- items.push('separator');
266
- }
267
- contextMenu.customItems.forEach(customItem => {
268
- items.push({
269
- name: customItem.name,
270
- disabled: customItem.disabled,
271
- action: () => {
272
- if (callbacks?.onContextMenuAction) {
273
- callbacks.onContextMenuAction(customItem.action, params.node?.data);
274
- }
275
- },
276
- });
277
- });
278
- }
279
-
280
- return items;
281
- }, [contextMenu, handleExportCSV, callbacks]);
282
-
283
- // Event handlers
284
- const handleCellClicked = useCallback((event: CellClickedEvent) => {
285
- callbacks?.onCellClicked?.(event);
286
- }, [callbacks]);
287
-
288
- const handleRowClicked = useCallback((event: RowClickedEvent) => {
289
- callbacks?.onRowClicked?.(event);
290
- }, [callbacks]);
291
-
292
- const handleSelectionChanged = useCallback((event: SelectionChangedEvent) => {
293
- callbacks?.onSelectionChanged?.(event);
294
- }, [callbacks]);
295
-
296
- const handleCellValueChanged = useCallback(async (event: CellValueChangedEvent) => {
297
- callbacks?.onCellValueChanged?.(event);
298
-
299
- // Save changes to backend if dataSource supports update
300
- // Note: Assumes records have an 'id' field as primary key
301
- // TODO: Make the ID field name configurable via schema
302
- if (dataSource && event.data && event.data.id) {
303
- try {
304
- await dataSource.update(objectName, event.data.id, {
305
- [event.colDef.field!]: event.newValue
306
- });
307
- } catch (err) {
308
- console.error('Failed to update record:', err);
309
- // Revert the change
310
- event.node.setDataValue(event.colDef.field!, event.oldValue);
311
- }
312
- }
313
- }, [callbacks, dataSource, objectName]);
314
-
315
- const onGridReady = useCallback((params: GridReadyEvent) => {
316
- gridRef.current = params;
317
- }, []);
318
-
319
- // Merge grid options with props
320
- const gridOptions = useMemo(() => ({
321
- pagination,
322
- paginationPageSize: pageSize,
323
- domLayout,
324
- animateRows,
325
- rowSelection,
326
- editType,
327
- singleClickEdit,
328
- stopEditingWhenCellsLoseFocus,
329
- statusBar: statusPanels ? { statusPanels } : undefined,
330
- enableRangeSelection,
331
- enableCharts,
332
- getContextMenuItems: contextMenu?.enabled ? getContextMenuItems : undefined,
333
- suppressCellFocus: !editable,
334
- enableCellTextSelection: true,
335
- ensureDomOrder: true,
336
- onCellClicked: handleCellClicked,
337
- onRowClicked: handleRowClicked,
338
- onSelectionChanged: handleSelectionChanged,
339
- onCellValueChanged: handleCellValueChanged,
340
- onGridReady,
341
- }), [
342
- pagination,
343
- pageSize,
344
- domLayout,
345
- animateRows,
346
- rowSelection,
347
- editType,
348
- singleClickEdit,
349
- stopEditingWhenCellsLoseFocus,
350
- statusPanels,
351
- enableRangeSelection,
352
- enableCharts,
353
- contextMenu,
354
- getContextMenuItems,
355
- editable,
356
- handleCellClicked,
357
- handleRowClicked,
358
- handleSelectionChanged,
359
- handleCellValueChanged,
360
- onGridReady,
361
- ]);
362
-
363
- // Compute container style
364
- const containerStyle = useMemo(() => ({
365
- height: typeof height === 'number' ? `${height}px` : height,
366
- width: '100%',
367
- }), [height]);
368
-
369
- // Determine theme class and build complete class list
370
- const themeClass = `ag-theme-${theme}`;
371
- const classList = [
372
- themeClass,
373
- 'rounded-xl',
374
- 'border',
375
- 'border-border',
376
- 'overflow-hidden',
377
- 'shadow-lg',
378
- className
379
- ].filter(Boolean).join(' ');
380
-
381
- if (loading) {
382
- return (
383
- <div className="flex items-center justify-center" style={containerStyle}>
384
- <div className="text-muted-foreground">Loading {objectName}...</div>
385
- </div>
386
- );
387
- }
388
-
389
- if (error) {
390
- return (
391
- <div className="flex items-center justify-center" style={containerStyle}>
392
- <div className="text-destructive">Error loading data: {error.message}</div>
393
- </div>
394
- );
395
- }
396
-
397
- return (
398
- <div className="object-aggrid-container">
399
- {exportConfig?.enabled && (
400
- <div className="mb-2 flex gap-2">
401
- <button
402
- onClick={handleExportCSV}
403
- className="px-3 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors"
404
- >
405
- Export CSV
406
- </button>
407
- </div>
408
- )}
409
- <div
410
- className={classList}
411
- style={containerStyle}
412
- >
413
- <AgGridReact
414
- ref={gridRef}
415
- rowData={rowData}
416
- columnDefs={columnDefs}
417
- gridOptions={gridOptions}
418
- />
419
- </div>
420
- </div>
421
- );
422
- }
423
-
424
- /**
425
- * Get filter type based on field metadata
426
- */
427
- function getFilterType(field: FieldMetadata): string | boolean {
428
- if (field.filterable === false) {
429
- return false;
430
- }
431
-
432
- return FIELD_TYPE_TO_FILTER_TYPE[field.type] || 'agTextColumnFilter';
433
- }
434
-
435
- /**
436
- * Apply field type-specific formatting to column definition
437
- * Uses field widgets from @object-ui/fields for consistent rendering
438
- */
439
- function applyFieldTypeFormatting(colDef: ColDef, field: FieldMetadata): void {
440
- // Define field types that should use field widgets for rendering
441
- const fieldWidgetTypes = [
442
- 'text', 'textarea', 'number', 'currency', 'percent',
443
- 'boolean', 'select', 'date', 'datetime', 'time',
444
- 'email', 'phone', 'url', 'password', 'color',
445
- 'rating', 'image', 'avatar', 'lookup', 'slider', 'code'
446
- ];
447
-
448
- // Use field widget renderer if the type is supported
449
- if (fieldWidgetTypes.includes(field.type)) {
450
- colDef.cellRenderer = createFieldCellRenderer(field);
451
-
452
- // Add cell editor for editable fields
453
- if (colDef.editable) {
454
- colDef.cellEditor = createFieldCellEditor(field);
455
-
456
- // Configure editor based on field type
457
- if (['date', 'datetime', 'select', 'lookup', 'color'].includes(field.type)) {
458
- colDef.cellEditorPopup = true;
459
- }
460
- }
461
- } else {
462
- // Fallback to simple rendering for unsupported types
463
- switch (field.type) {
464
- case 'master_detail':
465
- colDef.valueFormatter = (params: any) => {
466
- if (!params.value) return '';
467
- // Handle lookup values - could be an object or just an ID
468
- if (typeof params.value === 'object') {
469
- return params.value.name || params.value.label || params.value.id || '';
470
- }
471
- return String(params.value);
472
- };
473
- break;
474
-
475
- case 'object':
476
- colDef.cellRenderer = () => {
477
- const span = document.createElement('span');
478
- span.className = 'text-gray-500 italic';
479
- span.textContent = '[Object]';
480
- return span;
481
- };
482
- break;
483
-
484
- case 'vector':
485
- colDef.cellRenderer = () => {
486
- const span = document.createElement('span');
487
- span.className = 'text-gray-500 italic';
488
- span.textContent = '[Vector]';
489
- return span;
490
- };
491
- break;
492
-
493
- case 'grid':
494
- colDef.cellRenderer = () => {
495
- const span = document.createElement('span');
496
- span.className = 'text-gray-500 italic';
497
- span.textContent = '[Grid]';
498
- return span;
499
- };
500
- break;
501
-
502
- default:
503
- // Default text rendering
504
- colDef.valueFormatter = (params: any) => {
505
- return params.value != null ? String(params.value) : '';
506
- };
507
- }
508
- }
509
- }
@@ -1,74 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- /**
10
- * Virtual Scrolling in AG Grid
11
- *
12
- * AG Grid provides built-in virtual scrolling by default, which renders only
13
- * the visible rows in the viewport. This is a core feature of AG Grid and
14
- * requires no additional configuration.
15
- *
16
- * ## How It Works
17
- *
18
- * - AG Grid automatically virtualizes rows by rendering only visible rows
19
- * - As you scroll, rows are recycled and reused for new data
20
- * - This provides excellent performance even with datasets of 100,000+ rows
21
- *
22
- * ## Performance Tips
23
- *
24
- * 1. **Row Buffer**: Adjust `rowBuffer` to control how many extra rows are rendered
25
- * ```ts
26
- * gridOptions: { rowBuffer: 10 } // Render 10 extra rows above/below viewport
27
- * ```
28
- *
29
- * 2. **Suppress Animations**: Disable animations for very large datasets
30
- * ```ts
31
- * animateRows: false
32
- * ```
33
- *
34
- * 3. **Debounce Vertical Scroll**: Add delay to vertical scroll updates
35
- * ```ts
36
- * gridOptions: { debounceVerticalScrollbar: true }
37
- * ```
38
- *
39
- * 4. **Row Height**: Use fixed row heights for better performance
40
- * ```ts
41
- * gridOptions: { rowHeight: 40 }
42
- * ```
43
- *
44
- * ## Example Usage
45
- *
46
- * ```tsx
47
- * <AgGrid
48
- * rowData={largeDataset} // 10,000+ items
49
- * columnDefs={columns}
50
- * gridOptions={{
51
- * rowBuffer: 10,
52
- * rowHeight: 40,
53
- * debounceVerticalScrollbar: true,
54
- * }}
55
- * animateRows={false}
56
- * />
57
- * ```
58
- *
59
- * ## References
60
- *
61
- * - [AG Grid Row Virtualisation](https://www.ag-grid.com/javascript-data-grid/dom-virtualisation/)
62
- * - [Performance Best Practices](https://www.ag-grid.com/javascript-data-grid/performance/)
63
- */
64
-
65
- export const VIRTUAL_SCROLLING_DOCS = {
66
- enabled: true,
67
- automatic: true,
68
- recommendedSettings: {
69
- rowBuffer: 10,
70
- rowHeight: 40,
71
- debounceVerticalScrollbar: true,
72
- animateRows: false,
73
- },
74
- };
package/src/ag-grid.d.ts DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Type declarations for AG Grid CSS imports
3
- * Allows importing CSS files as modules without TypeScript errors
4
- */
5
-
6
- declare module 'ag-grid-community/styles/ag-grid.css';
7
- declare module 'ag-grid-community/styles/ag-theme-quartz.css';
8
- declare module 'ag-grid-community/styles/ag-theme-alpine.css';
9
- declare module 'ag-grid-community/styles/ag-theme-balham.css';
10
- declare module 'ag-grid-community/styles/ag-theme-material.css';