@cocoar/data-grid 0.1.0-beta.148

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 ADDED
@@ -0,0 +1,7 @@
1
+ # data-table
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test data-table` to execute the unit tests.
@@ -0,0 +1,686 @@
1
+ import { Subject, takeUntil } from 'rxjs';
2
+ import { themeQuartz } from 'ag-grid-community';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, Input, Directive } from '@angular/core';
5
+ import { AgGridAngular } from 'ag-grid-angular';
6
+
7
+ /**
8
+ * Fluent builder for AG Grid column definitions.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const column = new CoarGridColumnBuilder<User>('name')
13
+ * .header('Full Name')
14
+ * .sortable()
15
+ * .flex(1)
16
+ * .build();
17
+ * ```
18
+ */
19
+ class CoarGridColumnBuilder {
20
+ #colDef;
21
+ constructor(field) {
22
+ this.#colDef = {
23
+ field: field?.toString(),
24
+ headerName: field?.toString(),
25
+ resizable: true,
26
+ sortable: false,
27
+ };
28
+ }
29
+ // ============================================================
30
+ // Basic Properties
31
+ // ============================================================
32
+ /** Set the field name (data property) */
33
+ field(value) {
34
+ this.#colDef.field = value.toString();
35
+ this.#colDef.headerName = this.#colDef.headerName || value.toString();
36
+ return this;
37
+ }
38
+ /** Set the column header text */
39
+ header(value) {
40
+ this.#colDef.headerName = value;
41
+ return this;
42
+ }
43
+ /** Set header tooltip */
44
+ headerTooltip(value) {
45
+ this.#colDef.headerTooltip = value;
46
+ return this;
47
+ }
48
+ // ============================================================
49
+ // Sizing
50
+ // ============================================================
51
+ /** Set fixed width in pixels */
52
+ width(value, minWidth, maxWidth) {
53
+ this.#colDef.width = value;
54
+ if (minWidth !== undefined)
55
+ this.#colDef.minWidth = minWidth;
56
+ if (maxWidth !== undefined)
57
+ this.#colDef.maxWidth = maxWidth;
58
+ return this;
59
+ }
60
+ /** Set fixed width (min, max, and width all the same) */
61
+ fixedWidth(value) {
62
+ this.#colDef.width = value;
63
+ this.#colDef.minWidth = value;
64
+ this.#colDef.maxWidth = value;
65
+ return this;
66
+ }
67
+ /** Set minimum width */
68
+ minWidth(value) {
69
+ this.#colDef.minWidth = value;
70
+ return this;
71
+ }
72
+ /** Set maximum width */
73
+ maxWidth(value) {
74
+ this.#colDef.maxWidth = value;
75
+ return this;
76
+ }
77
+ /** Set flex grow factor for fluid width */
78
+ flex(value = 1) {
79
+ this.#colDef.flex = value;
80
+ return this;
81
+ }
82
+ // ============================================================
83
+ // Behavior
84
+ // ============================================================
85
+ /** Enable/disable sorting */
86
+ sortable(value = true) {
87
+ this.#colDef.sortable = value;
88
+ return this;
89
+ }
90
+ /** Enable/disable resizing */
91
+ resizable(value = true) {
92
+ this.#colDef.resizable = value;
93
+ return this;
94
+ }
95
+ /** Hide/show column */
96
+ hidden(value = true) {
97
+ this.#colDef.hide = value;
98
+ return this;
99
+ }
100
+ /** Pin column to left or right */
101
+ pinned(value) {
102
+ this.#colDef.pinned = value;
103
+ return this;
104
+ }
105
+ /** Lock column position */
106
+ lockPosition(value = true) {
107
+ this.#colDef.lockPosition = value;
108
+ return this;
109
+ }
110
+ // ============================================================
111
+ // Cell Rendering
112
+ // ============================================================
113
+ /** Set custom cell renderer component */
114
+ cellRenderer(component, params) {
115
+ this.#colDef.cellRenderer = component;
116
+ if (params) {
117
+ this.#colDef.cellRendererParams = { ...this.#colDef.cellRendererParams, ...params };
118
+ }
119
+ return this;
120
+ }
121
+ /** Set cell renderer parameters */
122
+ cellRendererParams(params) {
123
+ this.#colDef.cellRendererParams = { ...this.#colDef.cellRendererParams, ...params };
124
+ return this;
125
+ }
126
+ /** Set value formatter for display */
127
+ valueFormatter(fn) {
128
+ this.#colDef.valueFormatter = fn;
129
+ return this;
130
+ }
131
+ /** Set value getter to transform data before display */
132
+ valueGetter(fn) {
133
+ this.#colDef.valueGetter = fn;
134
+ return this;
135
+ }
136
+ // ============================================================
137
+ // Styling
138
+ // ============================================================
139
+ /** Set CSS class for cells */
140
+ cellClass(value) {
141
+ this.#colDef.cellClass = value;
142
+ return this;
143
+ }
144
+ /** Set CSS style for cells */
145
+ cellStyle(value) {
146
+ this.#colDef.cellStyle = value;
147
+ return this;
148
+ }
149
+ /** Add a conditional CSS class rule */
150
+ classRule(className, condition) {
151
+ if (!this.#colDef.cellClassRules) {
152
+ this.#colDef.cellClassRules = {};
153
+ }
154
+ this.#colDef.cellClassRules[className] = condition;
155
+ return this;
156
+ }
157
+ // ============================================================
158
+ // Tooltips
159
+ // ============================================================
160
+ /** Show tooltip with field value or custom function */
161
+ tooltip(value) {
162
+ if (value === undefined) {
163
+ this.#colDef.tooltipField = this.#colDef.field;
164
+ }
165
+ else if (typeof value === 'string') {
166
+ this.#colDef.tooltipField = value;
167
+ }
168
+ else {
169
+ this.#colDef.tooltipValueGetter = value;
170
+ }
171
+ return this;
172
+ }
173
+ // ============================================================
174
+ // Events
175
+ // ============================================================
176
+ /** Handle cell double-click */
177
+ onCellDoubleClicked(handler) {
178
+ this.#colDef.onCellDoubleClicked = handler;
179
+ return this;
180
+ }
181
+ // ============================================================
182
+ // Filtering
183
+ // ============================================================
184
+ /** Enable/disable filtering */
185
+ filter(value = true) {
186
+ this.#colDef.filter = value;
187
+ return this;
188
+ }
189
+ /** Set filter parameters */
190
+ filterParams(params) {
191
+ this.#colDef.filterParams = params;
192
+ return this;
193
+ }
194
+ // ============================================================
195
+ // Advanced Options
196
+ // ============================================================
197
+ /** Set any AG Grid ColDef option directly */
198
+ option(key, value) {
199
+ this.#colDef[key] = value;
200
+ return this;
201
+ }
202
+ /** Apply custom modifications to the column definition */
203
+ customize(fn) {
204
+ fn(this.#colDef);
205
+ return this;
206
+ }
207
+ // ============================================================
208
+ // Build
209
+ // ============================================================
210
+ /** Build and return the AG Grid ColDef */
211
+ build() {
212
+ return { ...this.#colDef };
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Factory for creating typed column builders.
218
+ * Provides convenient methods for common column types.
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * // In column definitions:
223
+ * CoarGridBuilder.create<User>()
224
+ * .columns([
225
+ * col => col.field('name').header('Name').flex(1),
226
+ * col => col.field('createdAt').header('Created').width(150),
227
+ * ])
228
+ * ```
229
+ */
230
+ class CoarGridColumnFactory {
231
+ /**
232
+ * Create a column builder for the given field
233
+ */
234
+ field(fieldName) {
235
+ return new CoarGridColumnBuilder(fieldName);
236
+ }
237
+ /**
238
+ * Create a date column with standard formatting
239
+ */
240
+ date(fieldName, format = 'short') {
241
+ const builder = new CoarGridColumnBuilder(fieldName);
242
+ // Add basic date formatting
243
+ builder.valueFormatter((params) => {
244
+ const value = params.value;
245
+ if (!value)
246
+ return '';
247
+ const date = value instanceof Date ? value : new Date(value);
248
+ if (isNaN(date.getTime()))
249
+ return String(value);
250
+ // Use Intl for locale-aware formatting
251
+ switch (format) {
252
+ case 'short':
253
+ return date.toLocaleDateString();
254
+ case 'long':
255
+ return date.toLocaleDateString(undefined, {
256
+ year: 'numeric',
257
+ month: 'long',
258
+ day: 'numeric',
259
+ });
260
+ case 'datetime':
261
+ return date.toLocaleString();
262
+ default:
263
+ return date.toLocaleDateString();
264
+ }
265
+ });
266
+ return builder;
267
+ }
268
+ /**
269
+ * Create a number column with standard formatting
270
+ */
271
+ number(fieldName, decimals = 0) {
272
+ const builder = new CoarGridColumnBuilder(fieldName);
273
+ builder.valueFormatter((params) => {
274
+ const value = params.value;
275
+ if (value === null || value === undefined)
276
+ return '';
277
+ return value.toLocaleString(undefined, {
278
+ minimumFractionDigits: decimals,
279
+ maximumFractionDigits: decimals,
280
+ });
281
+ });
282
+ // Right-align numbers
283
+ builder.cellClass('text-right');
284
+ return builder;
285
+ }
286
+ /**
287
+ * Create a currency column
288
+ */
289
+ currency(fieldName, currency = 'USD') {
290
+ const builder = new CoarGridColumnBuilder(fieldName);
291
+ builder.valueFormatter((params) => {
292
+ const value = params.value;
293
+ if (value === null || value === undefined)
294
+ return '';
295
+ return value.toLocaleString(undefined, {
296
+ style: 'currency',
297
+ currency,
298
+ });
299
+ });
300
+ // Right-align currency
301
+ builder.cellClass('text-right');
302
+ return builder;
303
+ }
304
+ /**
305
+ * Create a boolean column (displays Yes/No or custom values)
306
+ */
307
+ boolean(fieldName, options = {}) {
308
+ const { trueValue = 'Yes', falseValue = 'No' } = options;
309
+ const builder = new CoarGridColumnBuilder(fieldName);
310
+ builder.valueFormatter((params) => {
311
+ if (params.value === null || params.value === undefined)
312
+ return '';
313
+ return params.value ? trueValue : falseValue;
314
+ });
315
+ return builder;
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Cocoar Theme for AG Grid
321
+ *
322
+ * Creates a customized AG Grid theme using the v33+ theming API.
323
+ * Maps Cocoar design tokens to AG Grid parameters.
324
+ */
325
+ /**
326
+ * Creates the Cocoar AG Grid theme
327
+ *
328
+ * @example
329
+ * ```typescript
330
+ * import { createCocoarTheme } from '@cocoar/data-grid';
331
+ *
332
+ * const gridOptions = {
333
+ * theme: createCocoarTheme(),
334
+ * // ...
335
+ * };
336
+ * ```
337
+ */
338
+ function createCocoarTheme() {
339
+ return themeQuartz.withParams({
340
+ // Typography - Use CSS variables from Cocoar tokens
341
+ fontFamily: 'var(--coar-font-family-body, Poppins, sans-serif)',
342
+ fontSize: 14,
343
+ // Spacing
344
+ spacing: 4,
345
+ cellHorizontalPadding: 16,
346
+ rowHeight: 40,
347
+ headerHeight: 40,
348
+ // Colors (use CSS vars for light/dark mode support)
349
+ backgroundColor: 'var(--coar-color-surface, #ffffff)',
350
+ foregroundColor: 'var(--coar-color-text-primary, #1a1a1a)',
351
+ borderColor: 'var(--coar-color-border, #e5e7eb)',
352
+ // Header
353
+ headerBackgroundColor: 'var(--coar-color-surface-alt, #f9fafb)',
354
+ headerTextColor: 'var(--coar-color-text-primary, #1a1a1a)',
355
+ headerFontWeight: 600,
356
+ // Rows
357
+ oddRowBackgroundColor: 'var(--coar-color-surface, #ffffff)',
358
+ rowHoverColor: 'var(--coar-color-surface-hover, #f3f4f6)',
359
+ // Selection
360
+ selectedRowBackgroundColor: 'var(--coar-color-primary-light, #e0e7ff)',
361
+ rangeSelectionBackgroundColor: 'var(--coar-color-primary-light, #e0e7ff)',
362
+ // Borders
363
+ borderRadius: 6,
364
+ wrapperBorder: false,
365
+ columnBorder: true,
366
+ rowBorder: true,
367
+ });
368
+ }
369
+ /**
370
+ * Pre-configured Cocoar theme instance
371
+ *
372
+ * @example
373
+ * ```typescript
374
+ * import { cocoarTheme } from '@cocoar/data-grid';
375
+ *
376
+ * <ag-grid-angular [theme]="cocoarTheme" />
377
+ * ```
378
+ */
379
+ const cocoarTheme = createCocoarTheme();
380
+
381
+ /**
382
+ * Fluent builder for AG Grid configuration.
383
+ *
384
+ * @example
385
+ * ```ts
386
+ * const gridBuilder = CoarGridBuilder.create<User>()
387
+ * .columns([
388
+ * col => col.field('name').header('Name').flex(1),
389
+ * col => col.field('email').header('Email').flex(1),
390
+ * col => col.field('role').header('Role').width(100),
391
+ * ])
392
+ * .rowData(users)
393
+ * .rowId(user => user.id)
394
+ * .onRowClicked(event => console.log(event.data));
395
+ * ```
396
+ */
397
+ class CoarGridBuilder {
398
+ #grid;
399
+ #destroy$ = new Subject();
400
+ #gridReady$ = new Subject();
401
+ #gridOptions = {};
402
+ #columnDefs = [];
403
+ #rowData = null;
404
+ #rowData$;
405
+ /** Observable that emits when grid is ready */
406
+ gridReady$ = this.#gridReady$.asObservable();
407
+ constructor() {
408
+ this.#gridOptions = this.#createDefaultOptions();
409
+ }
410
+ /** Create a new grid builder */
411
+ static create() {
412
+ return new CoarGridBuilder();
413
+ }
414
+ /** Get the AG Grid API (available after grid ready) */
415
+ get api() {
416
+ return this.#grid?.api;
417
+ }
418
+ // ============================================================
419
+ // Private helpers
420
+ // ============================================================
421
+ #createDefaultOptions() {
422
+ return {
423
+ theme: cocoarTheme,
424
+ suppressPropertyNamesCheck: true,
425
+ animateRows: true,
426
+ rowSelection: undefined,
427
+ };
428
+ }
429
+ #mergeOptions(options) {
430
+ this.#gridOptions = { ...this.#gridOptions, ...options };
431
+ }
432
+ // ============================================================
433
+ // Column Configuration
434
+ // ============================================================
435
+ /** Define columns using builders or factory functions */
436
+ columns(definitions) {
437
+ const factory = new CoarGridColumnFactory();
438
+ this.#columnDefs = definitions.map((def) => {
439
+ if (def instanceof CoarGridColumnBuilder) {
440
+ return def.build();
441
+ }
442
+ return def(factory).build();
443
+ });
444
+ return this;
445
+ }
446
+ /** Set default column definition applied to all columns */
447
+ defaultColDef(definition) {
448
+ if (typeof definition === 'function') {
449
+ const builder = new CoarGridColumnBuilder();
450
+ this.#gridOptions.defaultColDef = definition(builder).build();
451
+ }
452
+ else {
453
+ this.#gridOptions.defaultColDef = definition;
454
+ }
455
+ return this;
456
+ }
457
+ // ============================================================
458
+ // Data Configuration
459
+ // ============================================================
460
+ /** Set row data (static array) */
461
+ rowData(data) {
462
+ this.#rowData = data;
463
+ this.#rowData$ = undefined;
464
+ return this;
465
+ }
466
+ /** Set row data (observable) */
467
+ rowData$(data$) {
468
+ this.#rowData$ = data$;
469
+ this.#rowData = null;
470
+ return this;
471
+ }
472
+ /** Set row ID getter for immutable data updates */
473
+ rowId(getRowId) {
474
+ this.#gridOptions.getRowId = getRowId;
475
+ return this;
476
+ }
477
+ // ============================================================
478
+ // Row Selection
479
+ // ============================================================
480
+ /** Enable row selection */
481
+ rowSelection(mode) {
482
+ this.#mergeOptions({ rowSelection: mode });
483
+ return this;
484
+ }
485
+ // ============================================================
486
+ // Row Styling
487
+ // ============================================================
488
+ /** Set row class rules */
489
+ rowClassRules(rules) {
490
+ this.#mergeOptions({ rowClassRules: rules });
491
+ return this;
492
+ }
493
+ /** Set dynamic row class */
494
+ rowClass(fn) {
495
+ this.#mergeOptions({ getRowClass: fn });
496
+ return this;
497
+ }
498
+ // ============================================================
499
+ // Event Handlers
500
+ // ============================================================
501
+ /** Handle grid ready event */
502
+ onGridReady(handler) {
503
+ const existing = this.#gridOptions.onGridReady;
504
+ this.#gridOptions.onGridReady = (event) => {
505
+ existing?.(event);
506
+ handler(event);
507
+ };
508
+ return this;
509
+ }
510
+ /** Handle row click */
511
+ onRowClicked(handler) {
512
+ this.#mergeOptions({ onRowClicked: handler });
513
+ return this;
514
+ }
515
+ /** Handle row double-click */
516
+ onRowDoubleClicked(handler) {
517
+ this.#mergeOptions({ onRowDoubleClicked: handler });
518
+ return this;
519
+ }
520
+ /** Handle cell click */
521
+ onCellClicked(handler) {
522
+ this.#mergeOptions({ onCellClicked: handler });
523
+ return this;
524
+ }
525
+ /** Handle cell double-click */
526
+ onCellDoubleClicked(handler) {
527
+ this.#mergeOptions({ onCellDoubleClicked: handler });
528
+ return this;
529
+ }
530
+ // ============================================================
531
+ // External Filtering
532
+ // ============================================================
533
+ /** Set external filter */
534
+ externalFilter(doesFilterPass, isFilterPresent) {
535
+ this.#mergeOptions({
536
+ isExternalFilterPresent: isFilterPresent ?? (() => true),
537
+ doesExternalFilterPass: doesFilterPass,
538
+ });
539
+ return this;
540
+ }
541
+ // ============================================================
542
+ // Grid Options
543
+ // ============================================================
544
+ /** Enable row animation */
545
+ animateRows(value = true) {
546
+ this.#mergeOptions({ animateRows: value });
547
+ return this;
548
+ }
549
+ /** Set any AG Grid option directly */
550
+ option(key, value) {
551
+ this.#gridOptions[key] = value;
552
+ return this;
553
+ }
554
+ /** Merge additional grid options */
555
+ options(options) {
556
+ this.#mergeOptions(options);
557
+ return this;
558
+ }
559
+ // ============================================================
560
+ // Internal - Used by directive
561
+ // ============================================================
562
+ /** @internal Called by the directive to bind to AG Grid */
563
+ _bind(grid) {
564
+ this.#grid = grid;
565
+ // Set grid options
566
+ grid.gridOptions = this.#gridOptions;
567
+ grid.columnDefs = this.#columnDefs;
568
+ // Set static row data if provided
569
+ if (this.#rowData !== null) {
570
+ grid.rowData = this.#rowData;
571
+ }
572
+ // Subscribe to grid ready
573
+ grid.gridReady.pipe(takeUntil(this.#destroy$)).subscribe((event) => {
574
+ this.#gridReady$.next(event);
575
+ // Subscribe to observable row data if provided
576
+ if (this.#rowData$) {
577
+ this.#rowData$.pipe(takeUntil(this.#destroy$)).subscribe((data) => {
578
+ if (data === null || data === undefined) {
579
+ event.api.setGridOption('rowData', []);
580
+ event.api.setGridOption('loading', true);
581
+ }
582
+ else {
583
+ event.api.setGridOption('rowData', data);
584
+ event.api.setGridOption('loading', false);
585
+ }
586
+ });
587
+ }
588
+ });
589
+ }
590
+ /** @internal Called by the directive on destroy */
591
+ _destroy() {
592
+ this.#destroy$.next();
593
+ this.#destroy$.complete();
594
+ this.#gridReady$.complete();
595
+ }
596
+ /** Get column definitions (for directive) */
597
+ _getColumnDefs() {
598
+ return this.#columnDefs;
599
+ }
600
+ /** Get grid options (for directive) */
601
+ _getGridOptions() {
602
+ return this.#gridOptions;
603
+ }
604
+ /** Get static row data (for directive) */
605
+ _getRowData() {
606
+ return this.#rowData;
607
+ }
608
+ }
609
+
610
+ /**
611
+ * Directive that binds a CoarGridBuilder to an AG Grid instance.
612
+ *
613
+ * @example
614
+ * ```html
615
+ * <ag-grid-angular
616
+ * [coarDataGrid]="gridBuilder"
617
+ * class="ag-theme-cocoar"
618
+ * />
619
+ * ```
620
+ *
621
+ * @example
622
+ * ```ts
623
+ * // In component:
624
+ * readonly gridBuilder = CoarGridBuilder.create<User>()
625
+ * .columns([
626
+ * col => col.field('name').header('Name').flex(1),
627
+ * col => col.field('email').header('Email').flex(1),
628
+ * ])
629
+ * .rowData(this.users);
630
+ * ```
631
+ */
632
+ class CoarDataGridDirective {
633
+ #agGrid = inject((AgGridAngular));
634
+ #gridBuilder;
635
+ /**
636
+ * The grid builder configuration
637
+ */
638
+ set coarDataGrid(value) {
639
+ this.#gridBuilder = value;
640
+ }
641
+ ngOnInit() {
642
+ if (!this.#gridBuilder) {
643
+ console.warn('CoarDataGridDirective: No grid builder provided');
644
+ return;
645
+ }
646
+ // Bind the builder to the AG Grid instance
647
+ this.#gridBuilder._bind(this.#agGrid);
648
+ }
649
+ ngOnDestroy() {
650
+ this.#gridBuilder?._destroy();
651
+ }
652
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CoarDataGridDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
653
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: CoarDataGridDirective, isStandalone: true, selector: "ag-grid-angular[coarDataGrid]", inputs: { coarDataGrid: "coarDataGrid" }, host: { styleAttribute: "display: flex; flex-direction: column; flex-grow: 1;", classAttribute: "ag-theme-cocoar" }, exportAs: ["coarDataGrid"], ngImport: i0 });
654
+ }
655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CoarDataGridDirective, decorators: [{
656
+ type: Directive,
657
+ args: [{
658
+ selector: 'ag-grid-angular[coarDataGrid]',
659
+ exportAs: 'coarDataGrid',
660
+ standalone: true,
661
+ host: {
662
+ class: 'ag-theme-cocoar',
663
+ style: 'display: flex; flex-direction: column; flex-grow: 1;',
664
+ },
665
+ }]
666
+ }], propDecorators: { coarDataGrid: [{
667
+ type: Input
668
+ }] } });
669
+
670
+ /**
671
+ * Minimal type definitions for @cocoar/data-grid
672
+ * Re-exports commonly used AG Grid types and adds Cocoar-specific extensions
673
+ */
674
+
675
+ // @cocoar/data-grid - AG Grid wrapper with Cocoar theme
676
+ // Builders (fluent API for grid configuration)
677
+ // Note: Theme CSS should be imported separately in your app's styles:
678
+ // @import '@cocoar/data-grid/lib/theme/ag-theme-cocoar.css';
679
+ // or include the path in angular.json styles array
680
+
681
+ /**
682
+ * Generated bundle index. Do not edit.
683
+ */
684
+
685
+ export { CoarDataGridDirective, CoarGridBuilder, CoarGridColumnBuilder, CoarGridColumnFactory, cocoarTheme, createCocoarTheme };
686
+ //# sourceMappingURL=cocoar-data-grid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cocoar-data-grid.mjs","sources":["../../../../libs/data-grid/src/lib/builders/coar-grid-column-builder.ts","../../../../libs/data-grid/src/lib/builders/coar-grid-column-factory.ts","../../../../libs/data-grid/src/lib/theme/cocoar-theme.ts","../../../../libs/data-grid/src/lib/builders/coar-grid-builder.ts","../../../../libs/data-grid/src/lib/directive/coar-data-grid.directive.ts","../../../../libs/data-grid/src/lib/models/index.ts","../../../../libs/data-grid/src/index.ts","../../../../libs/data-grid/src/cocoar-data-grid.ts"],"sourcesContent":["import { Type } from '@angular/core';\nimport type {\n ColDef,\n CellClassParams,\n CellStyle,\n ValueFormatterParams,\n ValueGetterFunc,\n CellDoubleClickedEvent,\n ITooltipParams,\n} from 'ag-grid-community';\n\n/**\n * Fluent builder for AG Grid column definitions.\n *\n * @example\n * ```ts\n * const column = new CoarGridColumnBuilder<User>('name')\n * .header('Full Name')\n * .sortable()\n * .flex(1)\n * .build();\n * ```\n */\nexport class CoarGridColumnBuilder<TData = unknown, TValue = unknown> {\n readonly #colDef: ColDef<TData, TValue>;\n\n constructor(field?: keyof TData | string) {\n this.#colDef = {\n field: field?.toString() as ColDef<TData, TValue>['field'],\n headerName: field?.toString(),\n resizable: true,\n sortable: false,\n };\n }\n\n // ============================================================\n // Basic Properties\n // ============================================================\n\n /** Set the field name (data property) */\n field(value: keyof TData | string): this {\n this.#colDef.field = value.toString() as ColDef<TData, TValue>['field'];\n this.#colDef.headerName = this.#colDef.headerName || value.toString();\n return this;\n }\n\n /** Set the column header text */\n header(value: string): this {\n this.#colDef.headerName = value;\n return this;\n }\n\n /** Set header tooltip */\n headerTooltip(value: string): this {\n this.#colDef.headerTooltip = value;\n return this;\n }\n\n // ============================================================\n // Sizing\n // ============================================================\n\n /** Set fixed width in pixels */\n width(value: number, minWidth?: number, maxWidth?: number): this {\n this.#colDef.width = value;\n if (minWidth !== undefined) this.#colDef.minWidth = minWidth;\n if (maxWidth !== undefined) this.#colDef.maxWidth = maxWidth;\n return this;\n }\n\n /** Set fixed width (min, max, and width all the same) */\n fixedWidth(value: number): this {\n this.#colDef.width = value;\n this.#colDef.minWidth = value;\n this.#colDef.maxWidth = value;\n return this;\n }\n\n /** Set minimum width */\n minWidth(value: number): this {\n this.#colDef.minWidth = value;\n return this;\n }\n\n /** Set maximum width */\n maxWidth(value: number): this {\n this.#colDef.maxWidth = value;\n return this;\n }\n\n /** Set flex grow factor for fluid width */\n flex(value = 1): this {\n this.#colDef.flex = value;\n return this;\n }\n\n // ============================================================\n // Behavior\n // ============================================================\n\n /** Enable/disable sorting */\n sortable(value = true): this {\n this.#colDef.sortable = value;\n return this;\n }\n\n /** Enable/disable resizing */\n resizable(value = true): this {\n this.#colDef.resizable = value;\n return this;\n }\n\n /** Hide/show column */\n hidden(value = true): this {\n this.#colDef.hide = value;\n return this;\n }\n\n /** Pin column to left or right */\n pinned(value: 'left' | 'right' | null): this {\n this.#colDef.pinned = value;\n return this;\n }\n\n /** Lock column position */\n lockPosition(value: boolean | 'left' | 'right' = true): this {\n this.#colDef.lockPosition = value;\n return this;\n }\n\n // ============================================================\n // Cell Rendering\n // ============================================================\n\n /** Set custom cell renderer component */\n cellRenderer(component: Type<unknown>, params?: Record<string, unknown>): this {\n this.#colDef.cellRenderer = component;\n if (params) {\n this.#colDef.cellRendererParams = { ...this.#colDef.cellRendererParams, ...params };\n }\n return this;\n }\n\n /** Set cell renderer parameters */\n cellRendererParams(params: Record<string, unknown>): this {\n this.#colDef.cellRendererParams = { ...this.#colDef.cellRendererParams, ...params };\n return this;\n }\n\n /** Set value formatter for display */\n valueFormatter(fn: (params: ValueFormatterParams<TData, TValue>) => string): this {\n this.#colDef.valueFormatter = fn;\n return this;\n }\n\n /** Set value getter to transform data before display */\n valueGetter(fn: ValueGetterFunc<TData, TValue>): this {\n this.#colDef.valueGetter = fn;\n return this;\n }\n\n // ============================================================\n // Styling\n // ============================================================\n\n /** Set CSS class for cells */\n cellClass(\n value: string | string[] | ((params: CellClassParams<TData, TValue>) => string | string[])\n ): this {\n this.#colDef.cellClass = value;\n return this;\n }\n\n /** Set CSS style for cells */\n cellStyle(\n value: CellStyle | ((params: CellClassParams<TData, TValue>) => CellStyle | null | undefined)\n ): this {\n this.#colDef.cellStyle = value;\n return this;\n }\n\n /** Add a conditional CSS class rule */\n classRule(\n className: string,\n condition: string | ((params: CellClassParams<TData, TValue>) => boolean)\n ): this {\n if (!this.#colDef.cellClassRules) {\n this.#colDef.cellClassRules = {};\n }\n this.#colDef.cellClassRules[className] = condition;\n return this;\n }\n\n // ============================================================\n // Tooltips\n // ============================================================\n\n /** Show tooltip with field value or custom function */\n tooltip(value?: string | ((params: ITooltipParams<TData, TValue>) => string)): this {\n if (value === undefined) {\n this.#colDef.tooltipField = this.#colDef.field;\n } else if (typeof value === 'string') {\n this.#colDef.tooltipField = value as ColDef<TData, TValue>['tooltipField'];\n } else {\n this.#colDef.tooltipValueGetter = value;\n }\n return this;\n }\n\n // ============================================================\n // Events\n // ============================================================\n\n /** Handle cell double-click */\n onCellDoubleClicked(handler: (event: CellDoubleClickedEvent<TData, TValue>) => void): this {\n this.#colDef.onCellDoubleClicked = handler;\n return this;\n }\n\n // ============================================================\n // Filtering\n // ============================================================\n\n /** Enable/disable filtering */\n filter(value: boolean | string = true): this {\n this.#colDef.filter = value;\n return this;\n }\n\n /** Set filter parameters */\n filterParams(params: Record<string, unknown>): this {\n this.#colDef.filterParams = params;\n return this;\n }\n\n // ============================================================\n // Advanced Options\n // ============================================================\n\n /** Set any AG Grid ColDef option directly */\n option<K extends keyof ColDef<TData, TValue>>(key: K, value: ColDef<TData, TValue>[K]): this {\n this.#colDef[key] = value;\n return this;\n }\n\n /** Apply custom modifications to the column definition */\n customize(fn: (colDef: ColDef<TData, TValue>) => void): this {\n fn(this.#colDef);\n return this;\n }\n\n // ============================================================\n // Build\n // ============================================================\n\n /** Build and return the AG Grid ColDef */\n build(): ColDef<TData, TValue> {\n return { ...this.#colDef };\n }\n}\n","import { CoarGridColumnBuilder } from './coar-grid-column-builder';\n\n/**\n * Factory for creating typed column builders.\n * Provides convenient methods for common column types.\n *\n * @example\n * ```ts\n * // In column definitions:\n * CoarGridBuilder.create<User>()\n * .columns([\n * col => col.field('name').header('Name').flex(1),\n * col => col.field('createdAt').header('Created').width(150),\n * ])\n * ```\n */\nexport class CoarGridColumnFactory<TData = unknown> {\n /**\n * Create a column builder for the given field\n */\n field<TValue = unknown>(fieldName: keyof TData | string): CoarGridColumnBuilder<TData, TValue> {\n return new CoarGridColumnBuilder<TData, TValue>(fieldName);\n }\n\n /**\n * Create a date column with standard formatting\n */\n date(\n fieldName: keyof TData | string,\n format = 'short'\n ): CoarGridColumnBuilder<TData, Date | string> {\n const builder = new CoarGridColumnBuilder<TData, Date | string>(fieldName);\n\n // Add basic date formatting\n builder.valueFormatter((params) => {\n const value = params.value;\n if (!value) return '';\n\n const date = value instanceof Date ? value : new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n // Use Intl for locale-aware formatting\n switch (format) {\n case 'short':\n return date.toLocaleDateString();\n case 'long':\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n case 'datetime':\n return date.toLocaleString();\n default:\n return date.toLocaleDateString();\n }\n });\n\n return builder;\n }\n\n /**\n * Create a number column with standard formatting\n */\n number(fieldName: keyof TData | string, decimals = 0): CoarGridColumnBuilder<TData, number> {\n const builder = new CoarGridColumnBuilder<TData, number>(fieldName);\n\n builder.valueFormatter((params) => {\n const value = params.value;\n if (value === null || value === undefined) return '';\n return value.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n });\n\n // Right-align numbers\n builder.cellClass('text-right');\n\n return builder;\n }\n\n /**\n * Create a currency column\n */\n currency(\n fieldName: keyof TData | string,\n currency = 'USD'\n ): CoarGridColumnBuilder<TData, number> {\n const builder = new CoarGridColumnBuilder<TData, number>(fieldName);\n\n builder.valueFormatter((params) => {\n const value = params.value;\n if (value === null || value === undefined) return '';\n return value.toLocaleString(undefined, {\n style: 'currency',\n currency,\n });\n });\n\n // Right-align currency\n builder.cellClass('text-right');\n\n return builder;\n }\n\n /**\n * Create a boolean column (displays Yes/No or custom values)\n */\n boolean(\n fieldName: keyof TData | string,\n options: { trueValue?: string; falseValue?: string } = {}\n ): CoarGridColumnBuilder<TData, boolean> {\n const { trueValue = 'Yes', falseValue = 'No' } = options;\n const builder = new CoarGridColumnBuilder<TData, boolean>(fieldName);\n\n builder.valueFormatter((params) => {\n if (params.value === null || params.value === undefined) return '';\n return params.value ? trueValue : falseValue;\n });\n\n return builder;\n }\n}\n","/**\n * Cocoar Theme for AG Grid\n *\n * Creates a customized AG Grid theme using the v33+ theming API.\n * Maps Cocoar design tokens to AG Grid parameters.\n */\nimport { themeQuartz, type Theme } from 'ag-grid-community';\n\n/**\n * Creates the Cocoar AG Grid theme\n *\n * @example\n * ```typescript\n * import { createCocoarTheme } from '@cocoar/data-grid';\n *\n * const gridOptions = {\n * theme: createCocoarTheme(),\n * // ...\n * };\n * ```\n */\nexport function createCocoarTheme(): Theme {\n return themeQuartz.withParams({\n // Typography - Use CSS variables from Cocoar tokens\n fontFamily: 'var(--coar-font-family-body, Poppins, sans-serif)',\n fontSize: 14,\n\n // Spacing\n spacing: 4,\n cellHorizontalPadding: 16,\n rowHeight: 40,\n headerHeight: 40,\n\n // Colors (use CSS vars for light/dark mode support)\n backgroundColor: 'var(--coar-color-surface, #ffffff)',\n foregroundColor: 'var(--coar-color-text-primary, #1a1a1a)',\n borderColor: 'var(--coar-color-border, #e5e7eb)',\n\n // Header\n headerBackgroundColor: 'var(--coar-color-surface-alt, #f9fafb)',\n headerTextColor: 'var(--coar-color-text-primary, #1a1a1a)',\n headerFontWeight: 600,\n\n // Rows\n oddRowBackgroundColor: 'var(--coar-color-surface, #ffffff)',\n rowHoverColor: 'var(--coar-color-surface-hover, #f3f4f6)',\n\n // Selection\n selectedRowBackgroundColor: 'var(--coar-color-primary-light, #e0e7ff)',\n rangeSelectionBackgroundColor: 'var(--coar-color-primary-light, #e0e7ff)',\n\n // Borders\n borderRadius: 6,\n wrapperBorder: false,\n columnBorder: true,\n rowBorder: true,\n });\n}\n\n/**\n * Pre-configured Cocoar theme instance\n *\n * @example\n * ```typescript\n * import { cocoarTheme } from '@cocoar/data-grid';\n *\n * <ag-grid-angular [theme]=\"cocoarTheme\" />\n * ```\n */\nexport const cocoarTheme = createCocoarTheme();\n","import { AgGridAngular } from 'ag-grid-angular';\nimport type {\n ColDef,\n GridApi,\n GridOptions,\n GridReadyEvent,\n RowClickedEvent,\n RowDoubleClickedEvent,\n CellClickedEvent,\n CellDoubleClickedEvent,\n GetRowIdFunc,\n RowClassParams,\n IRowNode,\n IsExternalFilterPresentParams,\n} from 'ag-grid-community';\nimport { Observable, Subject, takeUntil } from 'rxjs';\n\nimport { CoarGridColumnBuilder } from './coar-grid-column-builder';\nimport { CoarGridColumnFactory } from './coar-grid-column-factory';\nimport { cocoarTheme } from '../theme/cocoar-theme';\n\n/** Column definition input - either a builder or a factory function */\nexport type ColumnDefinition<TData> =\n | CoarGridColumnBuilder<TData>\n | ((factory: CoarGridColumnFactory<TData>) => CoarGridColumnBuilder<TData>);\n\n/**\n * Fluent builder for AG Grid configuration.\n *\n * @example\n * ```ts\n * const gridBuilder = CoarGridBuilder.create<User>()\n * .columns([\n * col => col.field('name').header('Name').flex(1),\n * col => col.field('email').header('Email').flex(1),\n * col => col.field('role').header('Role').width(100),\n * ])\n * .rowData(users)\n * .rowId(user => user.id)\n * .onRowClicked(event => console.log(event.data));\n * ```\n */\nexport class CoarGridBuilder<TData = unknown> {\n #grid?: AgGridAngular<TData>;\n #destroy$ = new Subject<void>();\n #gridReady$ = new Subject<GridReadyEvent<TData>>();\n\n #gridOptions: GridOptions<TData> = {};\n #columnDefs: ColDef<TData>[] = [];\n #rowData: TData[] | null = null;\n #rowData$?: Observable<TData[] | null | undefined>;\n\n /** Observable that emits when grid is ready */\n readonly gridReady$ = this.#gridReady$.asObservable();\n\n private constructor() {\n this.#gridOptions = this.#createDefaultOptions();\n }\n\n /** Create a new grid builder */\n static create<TData>(): CoarGridBuilder<TData> {\n return new CoarGridBuilder<TData>();\n }\n\n /** Get the AG Grid API (available after grid ready) */\n get api(): GridApi<TData> | undefined {\n return this.#grid?.api;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n #createDefaultOptions(): GridOptions<TData> {\n return {\n theme: cocoarTheme,\n suppressPropertyNamesCheck: true,\n animateRows: true,\n rowSelection: undefined,\n };\n }\n\n #mergeOptions(options: GridOptions<TData>): void {\n this.#gridOptions = { ...this.#gridOptions, ...options };\n }\n\n // ============================================================\n // Column Configuration\n // ============================================================\n\n /** Define columns using builders or factory functions */\n columns(definitions: ColumnDefinition<TData>[]): this {\n const factory = new CoarGridColumnFactory<TData>();\n this.#columnDefs = definitions.map((def) => {\n if (def instanceof CoarGridColumnBuilder) {\n return def.build();\n }\n return def(factory).build();\n });\n return this;\n }\n\n /** Set default column definition applied to all columns */\n defaultColDef(\n definition:\n | Partial<ColDef<TData>>\n | ((builder: CoarGridColumnBuilder<TData>) => CoarGridColumnBuilder<TData>)\n ): this {\n if (typeof definition === 'function') {\n const builder = new CoarGridColumnBuilder<TData>();\n this.#gridOptions.defaultColDef = definition(builder).build();\n } else {\n this.#gridOptions.defaultColDef = definition;\n }\n return this;\n }\n\n // ============================================================\n // Data Configuration\n // ============================================================\n\n /** Set row data (static array) */\n rowData(data: TData[] | null): this {\n this.#rowData = data;\n this.#rowData$ = undefined;\n return this;\n }\n\n /** Set row data (observable) */\n rowData$(data$: Observable<TData[] | null | undefined>): this {\n this.#rowData$ = data$;\n this.#rowData = null;\n return this;\n }\n\n /** Set row ID getter for immutable data updates */\n rowId(getRowId: GetRowIdFunc<TData>): this {\n this.#gridOptions.getRowId = getRowId;\n return this;\n }\n\n // ============================================================\n // Row Selection\n // ============================================================\n\n /** Enable row selection */\n rowSelection(mode: 'single' | 'multiple'): this {\n this.#mergeOptions({ rowSelection: mode });\n return this;\n }\n\n // ============================================================\n // Row Styling\n // ============================================================\n\n /** Set row class rules */\n rowClassRules(\n rules: Record<string, ((params: RowClassParams<TData>) => boolean) | string>\n ): this {\n this.#mergeOptions({ rowClassRules: rules });\n return this;\n }\n\n /** Set dynamic row class */\n rowClass(fn: (params: RowClassParams<TData>) => string | string[] | undefined): this {\n this.#mergeOptions({ getRowClass: fn });\n return this;\n }\n\n // ============================================================\n // Event Handlers\n // ============================================================\n\n /** Handle grid ready event */\n onGridReady(handler: (event: GridReadyEvent<TData>) => void): this {\n const existing = this.#gridOptions.onGridReady;\n this.#gridOptions.onGridReady = (event) => {\n existing?.(event);\n handler(event);\n };\n return this;\n }\n\n /** Handle row click */\n onRowClicked(handler: (event: RowClickedEvent<TData>) => void): this {\n this.#mergeOptions({ onRowClicked: handler });\n return this;\n }\n\n /** Handle row double-click */\n onRowDoubleClicked(handler: (event: RowDoubleClickedEvent<TData>) => void): this {\n this.#mergeOptions({ onRowDoubleClicked: handler });\n return this;\n }\n\n /** Handle cell click */\n onCellClicked(handler: (event: CellClickedEvent<TData>) => void): this {\n this.#mergeOptions({ onCellClicked: handler });\n return this;\n }\n\n /** Handle cell double-click */\n onCellDoubleClicked(handler: (event: CellDoubleClickedEvent<TData>) => void): this {\n this.#mergeOptions({ onCellDoubleClicked: handler });\n return this;\n }\n\n // ============================================================\n // External Filtering\n // ============================================================\n\n /** Set external filter */\n externalFilter(\n doesFilterPass: (node: IRowNode<TData>) => boolean,\n isFilterPresent?: (params: IsExternalFilterPresentParams<TData>) => boolean\n ): this {\n this.#mergeOptions({\n isExternalFilterPresent: isFilterPresent ?? (() => true),\n doesExternalFilterPass: doesFilterPass,\n });\n return this;\n }\n\n // ============================================================\n // Grid Options\n // ============================================================\n\n /** Enable row animation */\n animateRows(value = true): this {\n this.#mergeOptions({ animateRows: value });\n return this;\n }\n\n /** Set any AG Grid option directly */\n option<K extends keyof GridOptions<TData>>(key: K, value: GridOptions<TData>[K]): this {\n this.#gridOptions[key] = value;\n return this;\n }\n\n /** Merge additional grid options */\n options(options: GridOptions<TData>): this {\n this.#mergeOptions(options);\n return this;\n }\n\n // ============================================================\n // Internal - Used by directive\n // ============================================================\n\n /** @internal Called by the directive to bind to AG Grid */\n _bind(grid: AgGridAngular<TData>): void {\n this.#grid = grid;\n\n // Set grid options\n grid.gridOptions = this.#gridOptions;\n grid.columnDefs = this.#columnDefs;\n\n // Set static row data if provided\n if (this.#rowData !== null) {\n grid.rowData = this.#rowData;\n }\n\n // Subscribe to grid ready\n grid.gridReady.pipe(takeUntil(this.#destroy$)).subscribe((event) => {\n this.#gridReady$.next(event);\n\n // Subscribe to observable row data if provided\n if (this.#rowData$) {\n this.#rowData$.pipe(takeUntil(this.#destroy$)).subscribe((data) => {\n if (data === null || data === undefined) {\n event.api.setGridOption('rowData', []);\n event.api.setGridOption('loading', true);\n } else {\n event.api.setGridOption('rowData', data);\n event.api.setGridOption('loading', false);\n }\n });\n }\n });\n }\n\n /** @internal Called by the directive on destroy */\n _destroy(): void {\n this.#destroy$.next();\n this.#destroy$.complete();\n this.#gridReady$.complete();\n }\n\n /** Get column definitions (for directive) */\n _getColumnDefs(): ColDef<TData>[] {\n return this.#columnDefs;\n }\n\n /** Get grid options (for directive) */\n _getGridOptions(): GridOptions<TData> {\n return this.#gridOptions;\n }\n\n /** Get static row data (for directive) */\n _getRowData(): TData[] | null {\n return this.#rowData;\n }\n}\n","import { Directive, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { AgGridAngular } from 'ag-grid-angular';\n\nimport { CoarGridBuilder } from '../builders/coar-grid-builder';\n\n/**\n * Directive that binds a CoarGridBuilder to an AG Grid instance.\n *\n * @example\n * ```html\n * <ag-grid-angular\n * [coarDataGrid]=\"gridBuilder\"\n * class=\"ag-theme-cocoar\"\n * />\n * ```\n *\n * @example\n * ```ts\n * // In component:\n * readonly gridBuilder = CoarGridBuilder.create<User>()\n * .columns([\n * col => col.field('name').header('Name').flex(1),\n * col => col.field('email').header('Email').flex(1),\n * ])\n * .rowData(this.users);\n * ```\n */\n@Directive({\n selector: 'ag-grid-angular[coarDataGrid]',\n exportAs: 'coarDataGrid',\n standalone: true,\n host: {\n class: 'ag-theme-cocoar',\n style: 'display: flex; flex-direction: column; flex-grow: 1;',\n },\n})\nexport class CoarDataGridDirective<TData> implements OnInit, OnDestroy {\n readonly #agGrid = inject(AgGridAngular<TData>);\n\n #gridBuilder?: CoarGridBuilder<TData>;\n\n /**\n * The grid builder configuration\n */\n @Input()\n set coarDataGrid(value: CoarGridBuilder<TData>) {\n this.#gridBuilder = value;\n }\n\n ngOnInit(): void {\n if (!this.#gridBuilder) {\n console.warn('CoarDataGridDirective: No grid builder provided');\n return;\n }\n\n // Bind the builder to the AG Grid instance\n this.#gridBuilder._bind(this.#agGrid);\n }\n\n ngOnDestroy(): void {\n this.#gridBuilder?._destroy();\n }\n}\n","/**\n * Minimal type definitions for @cocoar/data-grid\n * Re-exports commonly used AG Grid types and adds Cocoar-specific extensions\n */\n\n// Re-export commonly used AG Grid types\nexport type {\n ColDef,\n GridOptions,\n GridApi,\n GridReadyEvent,\n RowClickedEvent,\n RowDoubleClickedEvent,\n CellClickedEvent,\n CellDoubleClickedEvent,\n ColumnState,\n GetRowIdFunc,\n RowClassParams,\n ValueFormatterParams,\n ValueGetterParams,\n CellClassParams,\n ICellRendererParams,\n IRowNode,\n} from 'ag-grid-community';\n\n/**\n * Extended column definition with Cocoar-specific properties\n */\nexport interface CoarColDef<TData = unknown> {\n /** AG Grid field name */\n field?: string;\n /** Column header text */\n headerName?: string;\n /** Fixed width in pixels */\n width?: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Maximum width in pixels */\n maxWidth?: number;\n /** Flex grow factor for fluid columns */\n flex?: number;\n /** Whether column is sortable */\n sortable?: boolean;\n /** Whether column is resizable */\n resizable?: boolean;\n /** Whether column is hidden */\n hide?: boolean;\n /** Pin column to left or right */\n pinned?: 'left' | 'right' | null;\n /** Custom cell renderer component */\n cellRenderer?: unknown;\n /** Parameters for cell renderer */\n cellRendererParams?: Record<string, unknown>;\n /** Value formatter function */\n valueFormatter?: (params: ValueFormatterParams<TData>) => string;\n /** Value getter function */\n valueGetter?: (params: ValueGetterParams<TData>) => unknown;\n /** CSS class for cells */\n cellClass?: string | string[] | ((params: CellClassParams<TData>) => string | string[]);\n /** CSS style for cells */\n cellStyle?:\n | Record<string, string>\n | ((params: CellClassParams<TData>) => Record<string, string> | null | undefined);\n /** Filter type */\n filter?: boolean | string;\n}\n\nimport type { ValueFormatterParams, ValueGetterParams, CellClassParams } from 'ag-grid-community';\n","// @cocoar/data-grid - AG Grid wrapper with Cocoar theme\n\n// Builders (fluent API for grid configuration)\nexport {\n CoarGridBuilder,\n CoarGridColumnBuilder,\n CoarGridColumnFactory,\n type ColumnDefinition,\n} from './lib/builders';\n\n// Directive (connects builder to AG Grid)\nexport { CoarDataGridDirective } from './lib/directive';\n\n// Theme (Cocoar-styled AG Grid theme)\nexport { cocoarTheme, createCocoarTheme } from './lib/theme/cocoar-theme';\n\n// Types (re-exports from AG Grid + Cocoar extensions)\nexport * from './lib/models';\n\n// Note: Theme CSS should be imported separately in your app's styles:\n// @import '@cocoar/data-grid/lib/theme/ag-theme-cocoar.css';\n// or include the path in angular.json styles array\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@cocoar/data-grid",
3
+ "version": "0.1.0-beta.148",
4
+ "peerDependencies": {
5
+ "@angular/common": "^21.0.0",
6
+ "@angular/core": "^21.0.0",
7
+ "ag-grid-community": "^33.0.0",
8
+ "ag-grid-angular": "^33.0.0"
9
+ },
10
+ "sideEffects": false,
11
+ "module": "fesm2022/cocoar-data-grid.mjs",
12
+ "typings": "types/cocoar-data-grid.d.ts",
13
+ "exports": {
14
+ "./package.json": {
15
+ "default": "./package.json"
16
+ },
17
+ ".": {
18
+ "types": "./types/cocoar-data-grid.d.ts",
19
+ "default": "./fesm2022/cocoar-data-grid.mjs"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "tslib": "^2.3.0"
24
+ }
25
+ }
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Cocoar Theme for AG Grid
3
+ *
4
+ * Maps AG Grid CSS variables to Cocoar design tokens.
5
+ * Supports light and dark mode via .light-mode/.dark-mode classes.
6
+ *
7
+ * Usage:
8
+ * 1. Import AG Grid base styles in your app
9
+ * 2. Import this theme CSS
10
+ * 3. Apply "ag-theme-cocoar" class to your grid
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <ag-grid-angular
15
+ * class="ag-theme-cocoar"
16
+ * [coarDataGrid]="gridBuilder"
17
+ * />
18
+ * ```
19
+ */
20
+
21
+ /* ============================================================================
22
+ AG GRID BASE STYLES - Import required AG Grid CSS
23
+ ============================================================================ */
24
+
25
+ /* Note: Consumers should import AG Grid styles in their app:
26
+ @import 'ag-grid-community/styles/ag-grid.css';
27
+ */
28
+
29
+ /* ============================================================================
30
+ COCOAR THEME - Maps AG Grid variables to Cocoar tokens
31
+ ============================================================================ */
32
+
33
+ .ag-theme-cocoar {
34
+ /* ==========================================================================
35
+ Typography
36
+ ========================================================================== */
37
+ --ag-font-family: var(--coar-font-family-body, Poppins, sans-serif);
38
+ --ag-font-size: var(--coar-font-size-xs, 14px);
39
+
40
+ /* ==========================================================================
41
+ Spacing & Sizing
42
+ ========================================================================== */
43
+ --ag-grid-size: 4px;
44
+ --ag-cell-horizontal-padding: var(--coar-spacing-m, 16px);
45
+ --ag-row-height: 40px;
46
+ --ag-header-height: 40px;
47
+ --ag-list-item-height: 36px;
48
+
49
+ /* ==========================================================================
50
+ Borders & Radius
51
+ ========================================================================== */
52
+ --ag-borders: solid 1px;
53
+ --ag-border-radius: var(--coar-radius-m, 8px);
54
+ --ag-wrapper-border-radius: var(--coar-radius-m, 8px);
55
+ --ag-row-border-style: solid;
56
+ --ag-row-border-width: 1px;
57
+
58
+ /* ==========================================================================
59
+ Colors - Light Mode (default)
60
+ ========================================================================== */
61
+
62
+ /* Background colors */
63
+ --ag-background-color: var(--coar-background-neutral-primary, #ffffff);
64
+ --ag-header-background-color: var(--coar-background-neutral-secondary, #f5f5f5);
65
+ --ag-odd-row-background-color: var(--coar-background-neutral-primary, #ffffff);
66
+ --ag-row-hover-color: var(--coar-background-neutral-tertiary, #e5e5e5);
67
+ --ag-selected-row-background-color: var(--coar-background-accent-tertiary, #e6f0ff);
68
+ --ag-modal-overlay-background-color: rgba(0, 0, 0, 0.5);
69
+
70
+ /* Border colors */
71
+ --ag-border-color: var(--coar-border-neutral-tertiary, #e5e5e5);
72
+ --ag-row-border-color: var(--coar-border-neutral-tertiary, #e5e5e5);
73
+ --ag-header-column-separator-color: var(--coar-border-neutral-tertiary, #e5e5e5);
74
+
75
+ /* Text colors */
76
+ --ag-foreground-color: var(--coar-text-neutral-primary, #171717);
77
+ --ag-header-foreground-color: var(--coar-text-neutral-secondary, #404040);
78
+ --ag-secondary-foreground-color: var(--coar-text-neutral-tertiary, #525252);
79
+ --ag-disabled-foreground-color: var(--coar-text-neutral-disabled, #a3a3a3);
80
+
81
+ /* Accent colors (selection, focus, etc.) */
82
+ --ag-range-selection-border-color: var(--coar-border-accent-primary, #0066cc);
83
+ --ag-range-selection-background-color: var(--coar-background-accent-tertiary, #e6f0ff);
84
+ --ag-range-selection-highlight-color: var(--coar-background-accent-secondary, #cce0ff);
85
+
86
+ /* Input colors */
87
+ --ag-input-focus-border-color: var(--coar-border-accent-primary, #0066cc);
88
+ --ag-input-disabled-background-color: var(--coar-background-neutral-disabled, #d4d4d4);
89
+
90
+ /* Icon colors */
91
+ --ag-icon-font-color: var(--coar-icon-neutral-secondary, #404040);
92
+
93
+ /* ==========================================================================
94
+ Subheader/Panel styles
95
+ ========================================================================== */
96
+ --ag-subheader-background-color: var(--coar-background-neutral-secondary, #f5f5f5);
97
+ --ag-control-panel-background-color: var(--coar-background-neutral-primary, #ffffff);
98
+ --ag-side-button-selected-background-color: var(--coar-background-accent-tertiary, #e6f0ff);
99
+
100
+ /* ==========================================================================
101
+ Filter & Menu
102
+ ========================================================================== */
103
+ --ag-menu-background-color: var(--coar-background-neutral-primary, #ffffff);
104
+ --ag-menu-border-color: var(--coar-border-neutral-tertiary, #e5e5e5);
105
+
106
+ /* ==========================================================================
107
+ Checkbox & Toggle
108
+ ========================================================================== */
109
+ --ag-checkbox-checked-color: var(--coar-background-accent-primary, #0066cc);
110
+ --ag-checkbox-unchecked-color: var(--coar-border-neutral-tertiary, #e5e5e5);
111
+ --ag-checkbox-indeterminate-color: var(--coar-background-accent-secondary, #cce0ff);
112
+
113
+ /* ==========================================================================
114
+ Chips/Tags
115
+ ========================================================================== */
116
+ --ag-chip-background-color: var(--coar-background-neutral-secondary, #f5f5f5);
117
+
118
+ /* ==========================================================================
119
+ Invalid state
120
+ ========================================================================== */
121
+ --ag-invalid-color: var(--coar-text-semantic-error-bold, #dc2626);
122
+ }
123
+
124
+ /* ============================================================================
125
+ DARK MODE OVERRIDES
126
+ ============================================================================ */
127
+
128
+ .dark-mode .ag-theme-cocoar,
129
+ .ag-theme-cocoar.dark-mode {
130
+ /* Background colors */
131
+ --ag-background-color: var(--coar-background-neutral-primary, #18181b);
132
+ --ag-header-background-color: var(--coar-background-neutral-secondary, #27272a);
133
+ --ag-odd-row-background-color: var(--coar-background-neutral-primary, #18181b);
134
+ --ag-row-hover-color: var(--coar-background-neutral-tertiary, #3f3f46);
135
+ --ag-selected-row-background-color: var(--coar-background-accent-tertiary, #1e3a5f);
136
+
137
+ /* Border colors */
138
+ --ag-border-color: var(--coar-border-neutral-tertiary, #3f3f46);
139
+ --ag-row-border-color: var(--coar-border-neutral-tertiary, #3f3f46);
140
+ --ag-header-column-separator-color: var(--coar-border-neutral-tertiary, #3f3f46);
141
+
142
+ /* Text colors */
143
+ --ag-foreground-color: var(--coar-text-neutral-primary, #fafafa);
144
+ --ag-header-foreground-color: var(--coar-text-neutral-secondary, #e4e4e7);
145
+ --ag-secondary-foreground-color: var(--coar-text-neutral-tertiary, #a1a1aa);
146
+ --ag-disabled-foreground-color: var(--coar-text-neutral-disabled, #71717a);
147
+
148
+ /* Icon colors */
149
+ --ag-icon-font-color: var(--coar-icon-neutral-secondary, #e4e4e7);
150
+
151
+ /* Subheader/Panel */
152
+ --ag-subheader-background-color: var(--coar-background-neutral-secondary, #27272a);
153
+ --ag-control-panel-background-color: var(--coar-background-neutral-primary, #18181b);
154
+
155
+ /* Menu */
156
+ --ag-menu-background-color: var(--coar-background-neutral-primary, #18181b);
157
+ --ag-menu-border-color: var(--coar-border-neutral-tertiary, #3f3f46);
158
+
159
+ /* Checkbox */
160
+ --ag-checkbox-unchecked-color: var(--coar-border-neutral-tertiary, #3f3f46);
161
+
162
+ /* Chips */
163
+ --ag-chip-background-color: var(--coar-background-neutral-secondary, #27272a);
164
+
165
+ /* Input */
166
+ --ag-input-disabled-background-color: var(--coar-background-neutral-disabled, #3f3f46);
167
+ }
168
+
169
+ /* ============================================================================
170
+ ADDITIONAL STYLING REFINEMENTS
171
+ ============================================================================ */
172
+
173
+ .ag-theme-cocoar {
174
+ /* Remove focus outline on rows (optional - for cleaner look) */
175
+ .ag-row-focus {
176
+ outline: none;
177
+ }
178
+
179
+ /* Header styling */
180
+ .ag-header {
181
+ font-weight: 600;
182
+ }
183
+
184
+ .ag-header-cell {
185
+ padding-left: var(--coar-spacing-m, 16px);
186
+ padding-right: var(--coar-spacing-m, 16px);
187
+ }
188
+
189
+ /* Cell styling */
190
+ .ag-cell {
191
+ display: flex;
192
+ align-items: center;
193
+ }
194
+
195
+ /* Remove cell focus border for cleaner look */
196
+ .ag-cell-focus:not(.ag-cell-range-selected) {
197
+ border-color: transparent !important;
198
+ }
199
+
200
+ /* Row hover transition */
201
+ .ag-row {
202
+ transition: background-color 0.15s ease;
203
+ }
204
+
205
+ /* Clickable cells styling */
206
+ .ag-cell.clickable {
207
+ cursor: pointer;
208
+ color: var(--coar-text-accent-primary, #0066cc);
209
+ }
210
+
211
+ .ag-cell.clickable:hover {
212
+ text-decoration: underline;
213
+ }
214
+
215
+ /* Text alignment utilities */
216
+ .ag-cell.text-right {
217
+ justify-content: flex-end;
218
+ text-align: right;
219
+ }
220
+
221
+ .ag-cell.text-center {
222
+ justify-content: center;
223
+ text-align: center;
224
+ }
225
+
226
+ /* Loading overlay */
227
+ .ag-overlay-loading-wrapper {
228
+ background-color: var(--ag-background-color);
229
+ }
230
+
231
+ /* Empty state */
232
+ .ag-overlay-no-rows-wrapper {
233
+ color: var(--ag-secondary-foreground-color);
234
+ }
235
+ }
package/src/styles.css ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @cocoar/data-grid styles
3
+ *
4
+ * Import this file in your app styles to get the Cocoar AG Grid theme.
5
+ * You do NOT need to import AG Grid's base CSS separately - it's included via AllCommunityModule.
6
+ *
7
+ * Example:
8
+ * @import '@cocoar/data-grid/styles.css';
9
+ */
10
+ @import './lib/theme/ag-theme-cocoar.css';
@@ -0,0 +1,305 @@
1
+ import { AgGridAngular } from 'ag-grid-angular';
2
+ import { ValueFormatterParams, ValueGetterFunc, CellClassParams, CellStyle, ITooltipParams, CellDoubleClickedEvent, ColDef, GridReadyEvent, GridApi, GetRowIdFunc, RowClassParams, RowClickedEvent, RowDoubleClickedEvent, CellClickedEvent, IRowNode, IsExternalFilterPresentParams, GridOptions, Theme, ValueGetterParams } from 'ag-grid-community';
3
+ export { CellClassParams, CellClickedEvent, CellDoubleClickedEvent, ColDef, ColumnState, GetRowIdFunc, GridApi, GridOptions, GridReadyEvent, ICellRendererParams, IRowNode, RowClassParams, RowClickedEvent, RowDoubleClickedEvent, ValueFormatterParams, ValueGetterParams } from 'ag-grid-community';
4
+ import { Observable } from 'rxjs';
5
+ import * as i0 from '@angular/core';
6
+ import { Type, OnInit, OnDestroy } from '@angular/core';
7
+
8
+ /**
9
+ * Fluent builder for AG Grid column definitions.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const column = new CoarGridColumnBuilder<User>('name')
14
+ * .header('Full Name')
15
+ * .sortable()
16
+ * .flex(1)
17
+ * .build();
18
+ * ```
19
+ */
20
+ declare class CoarGridColumnBuilder<TData = unknown, TValue = unknown> {
21
+ #private;
22
+ constructor(field?: keyof TData | string);
23
+ /** Set the field name (data property) */
24
+ field(value: keyof TData | string): this;
25
+ /** Set the column header text */
26
+ header(value: string): this;
27
+ /** Set header tooltip */
28
+ headerTooltip(value: string): this;
29
+ /** Set fixed width in pixels */
30
+ width(value: number, minWidth?: number, maxWidth?: number): this;
31
+ /** Set fixed width (min, max, and width all the same) */
32
+ fixedWidth(value: number): this;
33
+ /** Set minimum width */
34
+ minWidth(value: number): this;
35
+ /** Set maximum width */
36
+ maxWidth(value: number): this;
37
+ /** Set flex grow factor for fluid width */
38
+ flex(value?: number): this;
39
+ /** Enable/disable sorting */
40
+ sortable(value?: boolean): this;
41
+ /** Enable/disable resizing */
42
+ resizable(value?: boolean): this;
43
+ /** Hide/show column */
44
+ hidden(value?: boolean): this;
45
+ /** Pin column to left or right */
46
+ pinned(value: 'left' | 'right' | null): this;
47
+ /** Lock column position */
48
+ lockPosition(value?: boolean | 'left' | 'right'): this;
49
+ /** Set custom cell renderer component */
50
+ cellRenderer(component: Type<unknown>, params?: Record<string, unknown>): this;
51
+ /** Set cell renderer parameters */
52
+ cellRendererParams(params: Record<string, unknown>): this;
53
+ /** Set value formatter for display */
54
+ valueFormatter(fn: (params: ValueFormatterParams<TData, TValue>) => string): this;
55
+ /** Set value getter to transform data before display */
56
+ valueGetter(fn: ValueGetterFunc<TData, TValue>): this;
57
+ /** Set CSS class for cells */
58
+ cellClass(value: string | string[] | ((params: CellClassParams<TData, TValue>) => string | string[])): this;
59
+ /** Set CSS style for cells */
60
+ cellStyle(value: CellStyle | ((params: CellClassParams<TData, TValue>) => CellStyle | null | undefined)): this;
61
+ /** Add a conditional CSS class rule */
62
+ classRule(className: string, condition: string | ((params: CellClassParams<TData, TValue>) => boolean)): this;
63
+ /** Show tooltip with field value or custom function */
64
+ tooltip(value?: string | ((params: ITooltipParams<TData, TValue>) => string)): this;
65
+ /** Handle cell double-click */
66
+ onCellDoubleClicked(handler: (event: CellDoubleClickedEvent<TData, TValue>) => void): this;
67
+ /** Enable/disable filtering */
68
+ filter(value?: boolean | string): this;
69
+ /** Set filter parameters */
70
+ filterParams(params: Record<string, unknown>): this;
71
+ /** Set any AG Grid ColDef option directly */
72
+ option<K extends keyof ColDef<TData, TValue>>(key: K, value: ColDef<TData, TValue>[K]): this;
73
+ /** Apply custom modifications to the column definition */
74
+ customize(fn: (colDef: ColDef<TData, TValue>) => void): this;
75
+ /** Build and return the AG Grid ColDef */
76
+ build(): ColDef<TData, TValue>;
77
+ }
78
+
79
+ /**
80
+ * Factory for creating typed column builders.
81
+ * Provides convenient methods for common column types.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * // In column definitions:
86
+ * CoarGridBuilder.create<User>()
87
+ * .columns([
88
+ * col => col.field('name').header('Name').flex(1),
89
+ * col => col.field('createdAt').header('Created').width(150),
90
+ * ])
91
+ * ```
92
+ */
93
+ declare class CoarGridColumnFactory<TData = unknown> {
94
+ /**
95
+ * Create a column builder for the given field
96
+ */
97
+ field<TValue = unknown>(fieldName: keyof TData | string): CoarGridColumnBuilder<TData, TValue>;
98
+ /**
99
+ * Create a date column with standard formatting
100
+ */
101
+ date(fieldName: keyof TData | string, format?: string): CoarGridColumnBuilder<TData, Date | string>;
102
+ /**
103
+ * Create a number column with standard formatting
104
+ */
105
+ number(fieldName: keyof TData | string, decimals?: number): CoarGridColumnBuilder<TData, number>;
106
+ /**
107
+ * Create a currency column
108
+ */
109
+ currency(fieldName: keyof TData | string, currency?: string): CoarGridColumnBuilder<TData, number>;
110
+ /**
111
+ * Create a boolean column (displays Yes/No or custom values)
112
+ */
113
+ boolean(fieldName: keyof TData | string, options?: {
114
+ trueValue?: string;
115
+ falseValue?: string;
116
+ }): CoarGridColumnBuilder<TData, boolean>;
117
+ }
118
+
119
+ /** Column definition input - either a builder or a factory function */
120
+ type ColumnDefinition<TData> = CoarGridColumnBuilder<TData> | ((factory: CoarGridColumnFactory<TData>) => CoarGridColumnBuilder<TData>);
121
+ /**
122
+ * Fluent builder for AG Grid configuration.
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * const gridBuilder = CoarGridBuilder.create<User>()
127
+ * .columns([
128
+ * col => col.field('name').header('Name').flex(1),
129
+ * col => col.field('email').header('Email').flex(1),
130
+ * col => col.field('role').header('Role').width(100),
131
+ * ])
132
+ * .rowData(users)
133
+ * .rowId(user => user.id)
134
+ * .onRowClicked(event => console.log(event.data));
135
+ * ```
136
+ */
137
+ declare class CoarGridBuilder<TData = unknown> {
138
+ #private;
139
+ /** Observable that emits when grid is ready */
140
+ readonly gridReady$: Observable<GridReadyEvent<TData, any>>;
141
+ private constructor();
142
+ /** Create a new grid builder */
143
+ static create<TData>(): CoarGridBuilder<TData>;
144
+ /** Get the AG Grid API (available after grid ready) */
145
+ get api(): GridApi<TData> | undefined;
146
+ /** Define columns using builders or factory functions */
147
+ columns(definitions: ColumnDefinition<TData>[]): this;
148
+ /** Set default column definition applied to all columns */
149
+ defaultColDef(definition: Partial<ColDef<TData>> | ((builder: CoarGridColumnBuilder<TData>) => CoarGridColumnBuilder<TData>)): this;
150
+ /** Set row data (static array) */
151
+ rowData(data: TData[] | null): this;
152
+ /** Set row data (observable) */
153
+ rowData$(data$: Observable<TData[] | null | undefined>): this;
154
+ /** Set row ID getter for immutable data updates */
155
+ rowId(getRowId: GetRowIdFunc<TData>): this;
156
+ /** Enable row selection */
157
+ rowSelection(mode: 'single' | 'multiple'): this;
158
+ /** Set row class rules */
159
+ rowClassRules(rules: Record<string, ((params: RowClassParams<TData>) => boolean) | string>): this;
160
+ /** Set dynamic row class */
161
+ rowClass(fn: (params: RowClassParams<TData>) => string | string[] | undefined): this;
162
+ /** Handle grid ready event */
163
+ onGridReady(handler: (event: GridReadyEvent<TData>) => void): this;
164
+ /** Handle row click */
165
+ onRowClicked(handler: (event: RowClickedEvent<TData>) => void): this;
166
+ /** Handle row double-click */
167
+ onRowDoubleClicked(handler: (event: RowDoubleClickedEvent<TData>) => void): this;
168
+ /** Handle cell click */
169
+ onCellClicked(handler: (event: CellClickedEvent<TData>) => void): this;
170
+ /** Handle cell double-click */
171
+ onCellDoubleClicked(handler: (event: CellDoubleClickedEvent<TData>) => void): this;
172
+ /** Set external filter */
173
+ externalFilter(doesFilterPass: (node: IRowNode<TData>) => boolean, isFilterPresent?: (params: IsExternalFilterPresentParams<TData>) => boolean): this;
174
+ /** Enable row animation */
175
+ animateRows(value?: boolean): this;
176
+ /** Set any AG Grid option directly */
177
+ option<K extends keyof GridOptions<TData>>(key: K, value: GridOptions<TData>[K]): this;
178
+ /** Merge additional grid options */
179
+ options(options: GridOptions<TData>): this;
180
+ /** @internal Called by the directive to bind to AG Grid */
181
+ _bind(grid: AgGridAngular<TData>): void;
182
+ /** @internal Called by the directive on destroy */
183
+ _destroy(): void;
184
+ /** Get column definitions (for directive) */
185
+ _getColumnDefs(): ColDef<TData>[];
186
+ /** Get grid options (for directive) */
187
+ _getGridOptions(): GridOptions<TData>;
188
+ /** Get static row data (for directive) */
189
+ _getRowData(): TData[] | null;
190
+ }
191
+
192
+ /**
193
+ * Directive that binds a CoarGridBuilder to an AG Grid instance.
194
+ *
195
+ * @example
196
+ * ```html
197
+ * <ag-grid-angular
198
+ * [coarDataGrid]="gridBuilder"
199
+ * class="ag-theme-cocoar"
200
+ * />
201
+ * ```
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * // In component:
206
+ * readonly gridBuilder = CoarGridBuilder.create<User>()
207
+ * .columns([
208
+ * col => col.field('name').header('Name').flex(1),
209
+ * col => col.field('email').header('Email').flex(1),
210
+ * ])
211
+ * .rowData(this.users);
212
+ * ```
213
+ */
214
+ declare class CoarDataGridDirective<TData> implements OnInit, OnDestroy {
215
+ #private;
216
+ /**
217
+ * The grid builder configuration
218
+ */
219
+ set coarDataGrid(value: CoarGridBuilder<TData>);
220
+ ngOnInit(): void;
221
+ ngOnDestroy(): void;
222
+ static ɵfac: i0.ɵɵFactoryDeclaration<CoarDataGridDirective<any>, never>;
223
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CoarDataGridDirective<any>, "ag-grid-angular[coarDataGrid]", ["coarDataGrid"], { "coarDataGrid": { "alias": "coarDataGrid"; "required": false; }; }, {}, never, never, true, never>;
224
+ }
225
+
226
+ /**
227
+ * Cocoar Theme for AG Grid
228
+ *
229
+ * Creates a customized AG Grid theme using the v33+ theming API.
230
+ * Maps Cocoar design tokens to AG Grid parameters.
231
+ */
232
+
233
+ /**
234
+ * Creates the Cocoar AG Grid theme
235
+ *
236
+ * @example
237
+ * ```typescript
238
+ * import { createCocoarTheme } from '@cocoar/data-grid';
239
+ *
240
+ * const gridOptions = {
241
+ * theme: createCocoarTheme(),
242
+ * // ...
243
+ * };
244
+ * ```
245
+ */
246
+ declare function createCocoarTheme(): Theme;
247
+ /**
248
+ * Pre-configured Cocoar theme instance
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * import { cocoarTheme } from '@cocoar/data-grid';
253
+ *
254
+ * <ag-grid-angular [theme]="cocoarTheme" />
255
+ * ```
256
+ */
257
+ declare const cocoarTheme: Theme;
258
+
259
+ /**
260
+ * Minimal type definitions for @cocoar/data-grid
261
+ * Re-exports commonly used AG Grid types and adds Cocoar-specific extensions
262
+ */
263
+
264
+ /**
265
+ * Extended column definition with Cocoar-specific properties
266
+ */
267
+ interface CoarColDef<TData = unknown> {
268
+ /** AG Grid field name */
269
+ field?: string;
270
+ /** Column header text */
271
+ headerName?: string;
272
+ /** Fixed width in pixels */
273
+ width?: number;
274
+ /** Minimum width in pixels */
275
+ minWidth?: number;
276
+ /** Maximum width in pixels */
277
+ maxWidth?: number;
278
+ /** Flex grow factor for fluid columns */
279
+ flex?: number;
280
+ /** Whether column is sortable */
281
+ sortable?: boolean;
282
+ /** Whether column is resizable */
283
+ resizable?: boolean;
284
+ /** Whether column is hidden */
285
+ hide?: boolean;
286
+ /** Pin column to left or right */
287
+ pinned?: 'left' | 'right' | null;
288
+ /** Custom cell renderer component */
289
+ cellRenderer?: unknown;
290
+ /** Parameters for cell renderer */
291
+ cellRendererParams?: Record<string, unknown>;
292
+ /** Value formatter function */
293
+ valueFormatter?: (params: ValueFormatterParams<TData>) => string;
294
+ /** Value getter function */
295
+ valueGetter?: (params: ValueGetterParams<TData>) => unknown;
296
+ /** CSS class for cells */
297
+ cellClass?: string | string[] | ((params: CellClassParams<TData>) => string | string[]);
298
+ /** CSS style for cells */
299
+ cellStyle?: Record<string, string> | ((params: CellClassParams<TData>) => Record<string, string> | null | undefined);
300
+ /** Filter type */
301
+ filter?: boolean | string;
302
+ }
303
+
304
+ export { CoarDataGridDirective, CoarGridBuilder, CoarGridColumnBuilder, CoarGridColumnFactory, cocoarTheme, createCocoarTheme };
305
+ export type { CoarColDef, ColumnDefinition };