@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.
- package/dist/archbase-components-4.0.20.tgz +0 -0
- package/dist/datagrid/ag-grid/ag-grid-locale-ptbr.d.ts +7 -0
- package/dist/datagrid/ag-grid/ag-grid-mantine-theme.d.ts +24 -0
- package/dist/datagrid/ag-grid/archbase-data-grid-ag-formatters.d.ts +88 -0
- package/dist/datagrid/ag-grid/archbase-data-grid-ag-types.d.ts +329 -0
- package/dist/datagrid/ag-grid/archbase-data-grid-ag-utils.d.ts +71 -0
- package/dist/datagrid/ag-grid/archbase-data-grid-ag.d.ts +14 -0
- package/dist/datagrid/ag-grid/index.d.ts +14 -0
- package/dist/datagrid/index.d.ts +9 -1
- package/dist/index.js +11175 -10592
- package/package.json +6 -4
- package/src/datagrid/ag-grid/ag-grid-locale-ptbr.ts +432 -0
- package/src/datagrid/ag-grid/ag-grid-mantine-theme.ts +176 -0
- package/src/datagrid/ag-grid/archbase-data-grid-ag-formatters.tsx +470 -0
- package/src/datagrid/ag-grid/archbase-data-grid-ag-types.tsx +413 -0
- package/src/datagrid/ag-grid/archbase-data-grid-ag-utils.ts +394 -0
- package/src/datagrid/ag-grid/archbase-data-grid-ag.tsx +1241 -0
- package/src/datagrid/ag-grid/index.tsx +84 -0
- package/src/datagrid/index.tsx +59 -8
- package/src/datagrid/main/archbase-data-grid-pagination.tsx +1 -2
- package/src/datagrid/main/archbase-data-grid-toolbar.tsx +1 -2
- package/src/editors/ArchbaseAsyncMultiSelect.tsx +2 -1
- package/src/editors/ArchbaseAsyncSelect.tsx +2 -1
- package/src/editors/ArchbaseAvatarEdit.tsx +1 -0
- package/src/editors/ArchbaseCheckbox.tsx +1 -0
- package/src/editors/ArchbaseChip.tsx +1 -0
- package/src/editors/ArchbaseChipGroup.tsx +1 -0
- package/src/editors/ArchbaseColorGradientPicker.tsx +2 -1
- package/src/editors/ArchbaseDatePickerEdit.tsx +1 -0
- package/src/editors/ArchbaseDateTimePickerEdit.tsx +1 -0
- package/src/editors/ArchbaseDualListbox.tsx +1 -0
- package/src/editors/ArchbaseEdit.tsx +1 -0
- package/src/editors/ArchbaseImageEdit.tsx +1 -0
- package/src/editors/ArchbaseJsonEdit.tsx +1 -0
- package/src/editors/ArchbaseLookupEdit.tsx +2 -1
- package/src/editors/ArchbaseLookupNumber.tsx +2 -1
- package/src/editors/ArchbaseLookupSelect.tsx +2 -1
- package/src/editors/ArchbaseMarkdownEdit.tsx +1 -0
- package/src/editors/ArchbaseMaskEdit.tsx +1 -0
- package/src/editors/ArchbaseMentionInput.tsx +1 -0
- package/src/editors/ArchbaseMultiEmail.tsx +1 -0
- package/src/editors/ArchbaseMultiSelect.tsx +2 -1
- package/src/editors/ArchbaseNumberEdit.tsx +1 -0
- package/src/editors/ArchbaseNumberStepper.tsx +2 -1
- package/src/editors/ArchbasePasswordEdit.tsx +1 -0
- package/src/editors/ArchbaseRadioGroup.tsx +1 -0
- package/src/editors/ArchbaseRating.tsx +1 -0
- package/src/editors/ArchbaseRichTextEdit.tsx +1 -0
- package/src/editors/ArchbaseSelect.tsx +2 -1
- package/src/editors/ArchbaseSignaturePad.tsx +1 -0
- package/src/editors/ArchbaseSwitch.tsx +1 -0
- package/src/editors/ArchbaseTagInputEdit.tsx +1 -0
- package/src/editors/ArchbaseTextArea.tsx +1 -0
- package/src/editors/ArchbaseTimeEdit.tsx +1 -0
- 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
|
+
};
|