@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 +7 -0
- package/fesm2022/cocoar-data-grid.mjs +686 -0
- package/fesm2022/cocoar-data-grid.mjs.map +1 -0
- package/package.json +25 -0
- package/src/lib/theme/ag-theme-cocoar.css +235 -0
- package/src/styles.css +10 -0
- package/types/cocoar-data-grid.d.ts +305 -0
package/README.md
ADDED
|
@@ -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 };
|