@archbase/components 4.0.19 → 4.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/archbase-components-4.0.20.tgz +0 -0
  2. package/dist/datagrid/ag-grid/ag-grid-locale-ptbr.d.ts +7 -0
  3. package/dist/datagrid/ag-grid/ag-grid-mantine-theme.d.ts +24 -0
  4. package/dist/datagrid/ag-grid/archbase-data-grid-ag-formatters.d.ts +88 -0
  5. package/dist/datagrid/ag-grid/archbase-data-grid-ag-types.d.ts +329 -0
  6. package/dist/datagrid/ag-grid/archbase-data-grid-ag-utils.d.ts +71 -0
  7. package/dist/datagrid/ag-grid/archbase-data-grid-ag.d.ts +14 -0
  8. package/dist/datagrid/ag-grid/index.d.ts +14 -0
  9. package/dist/datagrid/index.d.ts +9 -1
  10. package/dist/index.js +11175 -10592
  11. package/package.json +6 -4
  12. package/src/datagrid/ag-grid/ag-grid-locale-ptbr.ts +432 -0
  13. package/src/datagrid/ag-grid/ag-grid-mantine-theme.ts +176 -0
  14. package/src/datagrid/ag-grid/archbase-data-grid-ag-formatters.tsx +470 -0
  15. package/src/datagrid/ag-grid/archbase-data-grid-ag-types.tsx +413 -0
  16. package/src/datagrid/ag-grid/archbase-data-grid-ag-utils.ts +394 -0
  17. package/src/datagrid/ag-grid/archbase-data-grid-ag.tsx +1241 -0
  18. package/src/datagrid/ag-grid/index.tsx +84 -0
  19. package/src/datagrid/index.tsx +59 -8
  20. package/src/datagrid/main/archbase-data-grid-pagination.tsx +1 -2
  21. package/src/datagrid/main/archbase-data-grid-toolbar.tsx +1 -2
  22. package/src/editors/ArchbaseAsyncMultiSelect.tsx +2 -1
  23. package/src/editors/ArchbaseAsyncSelect.tsx +2 -1
  24. package/src/editors/ArchbaseAvatarEdit.tsx +1 -0
  25. package/src/editors/ArchbaseCheckbox.tsx +1 -0
  26. package/src/editors/ArchbaseChip.tsx +1 -0
  27. package/src/editors/ArchbaseChipGroup.tsx +1 -0
  28. package/src/editors/ArchbaseColorGradientPicker.tsx +2 -1
  29. package/src/editors/ArchbaseDatePickerEdit.tsx +1 -0
  30. package/src/editors/ArchbaseDateTimePickerEdit.tsx +1 -0
  31. package/src/editors/ArchbaseDualListbox.tsx +1 -0
  32. package/src/editors/ArchbaseEdit.tsx +1 -0
  33. package/src/editors/ArchbaseImageEdit.tsx +1 -0
  34. package/src/editors/ArchbaseJsonEdit.tsx +1 -0
  35. package/src/editors/ArchbaseLookupEdit.tsx +2 -1
  36. package/src/editors/ArchbaseLookupNumber.tsx +2 -1
  37. package/src/editors/ArchbaseLookupSelect.tsx +2 -1
  38. package/src/editors/ArchbaseMarkdownEdit.tsx +1 -0
  39. package/src/editors/ArchbaseMaskEdit.tsx +1 -0
  40. package/src/editors/ArchbaseMentionInput.tsx +1 -0
  41. package/src/editors/ArchbaseMultiEmail.tsx +1 -0
  42. package/src/editors/ArchbaseMultiSelect.tsx +2 -1
  43. package/src/editors/ArchbaseNumberEdit.tsx +1 -0
  44. package/src/editors/ArchbaseNumberStepper.tsx +2 -1
  45. package/src/editors/ArchbasePasswordEdit.tsx +1 -0
  46. package/src/editors/ArchbaseRadioGroup.tsx +1 -0
  47. package/src/editors/ArchbaseRating.tsx +1 -0
  48. package/src/editors/ArchbaseRichTextEdit.tsx +1 -0
  49. package/src/editors/ArchbaseSelect.tsx +2 -1
  50. package/src/editors/ArchbaseSignaturePad.tsx +1 -0
  51. package/src/editors/ArchbaseSwitch.tsx +1 -0
  52. package/src/editors/ArchbaseTagInputEdit.tsx +1 -0
  53. package/src/editors/ArchbaseTextArea.tsx +1 -0
  54. package/src/editors/ArchbaseTimeEdit.tsx +1 -0
  55. package/dist/archbase-components-4.0.19.tgz +0 -0
@@ -0,0 +1,394 @@
1
+ /**
2
+ * ArchbaseDataGridAG Utilities
3
+ *
4
+ * Helper functions for AG Grid implementation.
5
+ */
6
+ import type { ColDef, SortModelItem } from 'ag-grid-community';
7
+ import type { IArchbaseDataSourceBase } from '@archbase/data';
8
+ import type {
9
+ ArchbaseFilterDefinition,
10
+ ArchbaseActiveFilter,
11
+ ArchbaseFieldDataType,
12
+ ArchbaseFilterOperator,
13
+ } from '../../filters/ArchbaseCompositeFilters.types';
14
+
15
+ /**
16
+ * Maximum page size for MIT license compatibility
17
+ */
18
+ export const MAX_PAGE_SIZE = 100;
19
+
20
+ /**
21
+ * Safely get row ID from row data
22
+ */
23
+ export const safeGetRowId = <T extends object>(
24
+ row: T,
25
+ getRowId?: (row: T) => any
26
+ ): string | number | undefined => {
27
+ if (!row) return undefined;
28
+
29
+ try {
30
+ if (getRowId) {
31
+ const id = getRowId(row);
32
+ return id !== undefined ? id : undefined;
33
+ }
34
+ return (row as any).id;
35
+ } catch (error) {
36
+ console.error('Error in safeGetRowId:', error);
37
+ return undefined;
38
+ }
39
+ };
40
+
41
+ /**
42
+ * Check if DataSource is V2
43
+ */
44
+ export const isDataSourceV2 = (ds: any): boolean => {
45
+ return ds && ('appendToFieldArray' in ds || 'updateFieldArrayItem' in ds || 'getRecords' in ds);
46
+ };
47
+
48
+ /**
49
+ * Get records from DataSource (V1/V2 compatible)
50
+ */
51
+ export const getRecordsFromDataSource = <T>(ds: IArchbaseDataSourceBase<T>): T[] => {
52
+ if (isDataSourceV2(ds)) {
53
+ return (ds as any).getRecords?.() || [];
54
+ }
55
+ return (ds as any).browseRecords?.() || [];
56
+ };
57
+
58
+ /**
59
+ * Get options from DataSource (V1 only)
60
+ */
61
+ export const getDataSourceOptions = (ds: any): any => {
62
+ if (isDataSourceV2(ds)) {
63
+ return {};
64
+ }
65
+ return ds.getOptions?.() || {};
66
+ };
67
+
68
+ /**
69
+ * Get current page from DataSource
70
+ */
71
+ export const getCurrentPageFromDataSource = (ds: any): number => {
72
+ const page = ds.getCurrentPage?.() ?? 0;
73
+ return page;
74
+ };
75
+
76
+ /**
77
+ * Convert hex color to RGB string
78
+ */
79
+ export const hexToRgb = (hex: string): string => {
80
+ try {
81
+ const cleanHex = hex.replace('#', '');
82
+ const r = parseInt(cleanHex.substring(0, 2), 16);
83
+ const g = parseInt(cleanHex.substring(2, 4), 16);
84
+ const b = parseInt(cleanHex.substring(4, 6), 16);
85
+
86
+ if (isNaN(r) || isNaN(g) || isNaN(b)) {
87
+ return '0, 0, 0';
88
+ }
89
+
90
+ return `${r}, ${g}, ${b}`;
91
+ } catch {
92
+ return '0, 0, 0';
93
+ }
94
+ };
95
+
96
+ /**
97
+ * Build global filter RSQL expression
98
+ */
99
+ export const buildGlobalFilterExpression = (
100
+ filterValue: string,
101
+ columns: ColDef[]
102
+ ): string | undefined => {
103
+ if (!filterValue || !columns || columns.length === 0) {
104
+ return undefined;
105
+ }
106
+
107
+ try {
108
+ const filterableColumns = columns.filter((col) => {
109
+ return col.field && col.field !== 'actions' && (col as any).enableGlobalFilter !== false;
110
+ });
111
+
112
+ if (filterableColumns.length === 0) {
113
+ return undefined;
114
+ }
115
+
116
+ const filterExpressions = filterableColumns.map((col) => `${col.field}==^*${filterValue}*`);
117
+ return filterExpressions.join(',');
118
+ } catch (error) {
119
+ console.error('Error building global filter expression:', error);
120
+ return undefined;
121
+ }
122
+ };
123
+
124
+ /**
125
+ * Build filter RSQL expression from AG Grid filter model
126
+ */
127
+ export const buildFilterExpression = (
128
+ filterModel: Record<string, any>,
129
+ columns: ColDef[],
130
+ quickFilterValue?: string
131
+ ): string | undefined => {
132
+ const filterParts: string[] = [];
133
+
134
+ // Process column filters
135
+ if (filterModel && Object.keys(filterModel).length > 0) {
136
+ Object.entries(filterModel).forEach(([field, filter]) => {
137
+ if (!filter) return;
138
+
139
+ const { type, filter: value, filterTo, values } = filter;
140
+
141
+ if (value === undefined && !values) return;
142
+
143
+ let filterExpr = '';
144
+ switch (type) {
145
+ case 'contains':
146
+ filterExpr = `${field}==*${value}*`;
147
+ break;
148
+ case 'equals':
149
+ filterExpr = `${field}==${value}`;
150
+ break;
151
+ case 'notEqual':
152
+ filterExpr = `${field}!=${value}`;
153
+ break;
154
+ case 'startsWith':
155
+ filterExpr = `${field}==${value}*`;
156
+ break;
157
+ case 'endsWith':
158
+ filterExpr = `${field}==*${value}`;
159
+ break;
160
+ case 'blank':
161
+ filterExpr = `${field}==null`;
162
+ break;
163
+ case 'notBlank':
164
+ filterExpr = `${field}!=null`;
165
+ break;
166
+ case 'greaterThan':
167
+ filterExpr = `${field}>${value}`;
168
+ break;
169
+ case 'greaterThanOrEqual':
170
+ filterExpr = `${field}>=${value}`;
171
+ break;
172
+ case 'lessThan':
173
+ filterExpr = `${field}<${value}`;
174
+ break;
175
+ case 'lessThanOrEqual':
176
+ filterExpr = `${field}<=${value}`;
177
+ break;
178
+ case 'inRange':
179
+ filterExpr = `${field}>=${value};${field}<=${filterTo}`;
180
+ break;
181
+ default:
182
+ if (value) {
183
+ filterExpr = `${field}==${value}`;
184
+ }
185
+ }
186
+
187
+ if (filterExpr) {
188
+ filterParts.push(filterExpr);
189
+ }
190
+ });
191
+ }
192
+
193
+ // Add global filter if present
194
+ if (quickFilterValue) {
195
+ const globalFilter = buildGlobalFilterExpression(quickFilterValue, columns);
196
+ if (globalFilter) {
197
+ filterParts.push(`(${globalFilter})`);
198
+ }
199
+ }
200
+
201
+ if (filterParts.length === 0) {
202
+ return undefined;
203
+ }
204
+
205
+ return filterParts.join(';');
206
+ };
207
+
208
+ /**
209
+ * Convert AG Grid sort model to DataSource format
210
+ */
211
+ export const convertSortModelToDataSource = (sortModel: SortModelItem[]): string[] => {
212
+ return sortModel.map((sort) => `${sort.colId}:${sort.sort}`);
213
+ };
214
+
215
+ /**
216
+ * Get initial sort model from DataSource
217
+ */
218
+ export const getInitialSortModel = (dataSource: any): SortModelItem[] => {
219
+ const options = dataSource && typeof dataSource.getOptions === 'function' ? dataSource.getOptions() : {};
220
+
221
+ if (options && options.originSort) {
222
+ return options.originSort.map((s: any) => ({
223
+ colId: s.field,
224
+ sort: s.sort,
225
+ }));
226
+ }
227
+
228
+ if (options && options.sort) {
229
+ return options.sort.map((sort: string) => {
230
+ const [field, order] = sort.split(':');
231
+ return {
232
+ colId: field,
233
+ sort: order === 'desc' ? ('desc' as const) : ('asc' as const),
234
+ };
235
+ });
236
+ }
237
+
238
+ return [];
239
+ };
240
+
241
+ /**
242
+ * Convert ArchbaseActiveFilter[] to AG Grid filter model
243
+ */
244
+ export const convertActiveFiltersToAgGridModel = (
245
+ activeFilters: ArchbaseActiveFilter[]
246
+ ): Record<string, any> => {
247
+ if (!activeFilters || activeFilters.length === 0) {
248
+ return {};
249
+ }
250
+
251
+ const filterModel: Record<string, any> = {};
252
+
253
+ for (const filter of activeFilters) {
254
+ const operatorMap: Record<ArchbaseFilterOperator, string> = {
255
+ contains: 'contains',
256
+ starts_with: 'startsWith',
257
+ ends_with: 'endsWith',
258
+ '=': 'equals',
259
+ '!=': 'notEqual',
260
+ '>': 'greaterThan',
261
+ '<': 'lessThan',
262
+ '>=': 'greaterThanOrEqual',
263
+ '<=': 'lessThanOrEqual',
264
+ is_null: 'blank',
265
+ is_not_null: 'notBlank',
266
+ between: 'inRange',
267
+ date_before: 'lessThan',
268
+ date_after: 'greaterThan',
269
+ date_between: 'inRange',
270
+ in: 'inSet',
271
+ not_in: 'notInSet',
272
+ };
273
+
274
+ const agType = operatorMap[filter.operator] || 'equals';
275
+
276
+ filterModel[filter.key] = {
277
+ type: agType,
278
+ filter: filter.value,
279
+ };
280
+ }
281
+
282
+ return filterModel;
283
+ };
284
+
285
+ /**
286
+ * Convert columns to ArchbaseFilterDefinition[]
287
+ */
288
+ export const convertColumnsToFilterDefinitions = (
289
+ columns: ColDef[],
290
+ options?: {
291
+ includeColumns?: string[];
292
+ excludeColumns?: string[];
293
+ onlyFilterable?: boolean;
294
+ }
295
+ ): ArchbaseFilterDefinition[] => {
296
+ const { includeColumns, excludeColumns = ['actions', 'id'], onlyFilterable = true } = options || {};
297
+
298
+ const definitions: ArchbaseFilterDefinition[] = [];
299
+
300
+ for (const col of columns) {
301
+ if (!col.field || col.field === 'actions') continue;
302
+
303
+ if (includeColumns && includeColumns.length > 0 && !includeColumns.includes(col.field)) {
304
+ continue;
305
+ }
306
+
307
+ if (excludeColumns && excludeColumns.includes(col.field)) {
308
+ continue;
309
+ }
310
+
311
+ if (onlyFilterable && col.filter === false) {
312
+ continue;
313
+ }
314
+
315
+ let dataType: ArchbaseFieldDataType = 'text';
316
+ const colDataType = (col as any).dataType;
317
+ if (colDataType) {
318
+ const typeMap: Record<string, ArchbaseFieldDataType> = {
319
+ text: 'text',
320
+ integer: 'integer',
321
+ float: 'float',
322
+ currency: 'currency',
323
+ boolean: 'boolean',
324
+ date: 'date',
325
+ datetime: 'datetime',
326
+ time: 'datetime',
327
+ enum: 'text',
328
+ };
329
+ dataType = typeMap[colDataType] || 'text';
330
+ }
331
+
332
+ const definition: ArchbaseFilterDefinition = {
333
+ key: col.field,
334
+ label: String(col.headerName || col.field),
335
+ type: dataType,
336
+ };
337
+
338
+ definitions.push(definition);
339
+ }
340
+
341
+ return definitions;
342
+ };
343
+
344
+ /**
345
+ * Get AG Grid filter type from data type
346
+ */
347
+ export const getAgGridFilterType = (dataType: string): string => {
348
+ switch (dataType) {
349
+ case 'integer':
350
+ case 'float':
351
+ case 'currency':
352
+ return 'agNumberColumnFilter';
353
+ case 'date':
354
+ case 'datetime':
355
+ return 'agDateColumnFilter';
356
+ case 'boolean':
357
+ return 'agSetColumnFilter';
358
+ default:
359
+ return 'agTextColumnFilter';
360
+ }
361
+ };
362
+
363
+ /**
364
+ * Get alignment class for AG Grid
365
+ */
366
+ export const getAlignmentClass = (align?: 'left' | 'center' | 'right'): string => {
367
+ switch (align) {
368
+ case 'right':
369
+ return 'ag-right-aligned-cell';
370
+ case 'center':
371
+ return 'ag-center-aligned-cell';
372
+ default:
373
+ return '';
374
+ }
375
+ };
376
+
377
+ /**
378
+ * Get default alignment by data type
379
+ */
380
+ export const getDefaultAlignment = (dataType: string): 'left' | 'center' | 'right' => {
381
+ switch (dataType) {
382
+ case 'integer':
383
+ case 'float':
384
+ case 'currency':
385
+ return 'right';
386
+ case 'boolean':
387
+ case 'date':
388
+ case 'datetime':
389
+ case 'time':
390
+ return 'center';
391
+ default:
392
+ return 'left';
393
+ }
394
+ };