@solidxai/core-ui 0.1.3 → 0.1.4-beta.0

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 (127) hide show
  1. package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
  2. package/dist/components/auth/SolidInitialLoginOtp.js +0 -5
  3. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  4. package/dist/components/auth/SolidInitialLoginOtp.tsx +0 -5
  5. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  6. package/dist/components/auth/SolidLogin.js +7 -5
  7. package/dist/components/auth/SolidLogin.js.map +1 -1
  8. package/dist/components/auth/SolidLogin.tsx +10 -8
  9. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  10. package/dist/components/common/GeneralSettings.js +48 -47
  11. package/dist/components/common/GeneralSettings.js.map +1 -1
  12. package/dist/components/common/GeneralSettings.tsx +41 -10
  13. package/dist/components/core/common/FilterComponent.js.map +1 -1
  14. package/dist/components/core/common/FilterComponent.tsx +1 -1
  15. package/dist/components/core/common/GroupingComponent.d.ts +54 -0
  16. package/dist/components/core/common/GroupingComponent.d.ts.map +1 -0
  17. package/dist/components/core/common/GroupingComponent.js +196 -0
  18. package/dist/components/core/common/GroupingComponent.js.map +1 -0
  19. package/dist/components/core/common/GroupingComponent.tsx +452 -0
  20. package/dist/components/core/common/SolidGlobalSearchElement.d.ts +18 -1
  21. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  22. package/dist/components/core/common/SolidGlobalSearchElement.js +146 -47
  23. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  24. package/dist/components/core/common/SolidGlobalSearchElement.tsx +191 -18
  25. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts +19 -0
  26. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts.map +1 -0
  27. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js +90 -0
  28. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js.map +1 -0
  29. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.tsx +59 -0
  30. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
  31. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +7 -3
  32. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
  33. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +45 -40
  34. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts +2 -0
  35. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts.map +1 -0
  36. package/dist/components/core/filter/SolidOneToManyFilterElement.js +86 -0
  37. package/dist/components/core/filter/SolidOneToManyFilterElement.js.map +1 -0
  38. package/dist/components/core/filter/SolidOneToManyFilterElement.tsx +62 -0
  39. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts +1 -0
  40. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
  41. package/dist/components/core/filter/SolidVarInputsFilterElement.js +4 -1
  42. package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
  43. package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +10 -0
  44. package/dist/components/core/filter/fields/SolidRelationField.d.ts.map +1 -1
  45. package/dist/components/core/filter/fields/SolidRelationField.js +4 -2
  46. package/dist/components/core/filter/fields/SolidRelationField.js.map +1 -1
  47. package/dist/components/core/filter/fields/SolidRelationField.tsx +4 -2
  48. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts +4 -0
  49. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -0
  50. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js +25 -0
  51. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js.map +1 -0
  52. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.tsx +60 -0
  53. package/dist/components/core/form/SolidFormFooter.js +4 -4
  54. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  55. package/dist/components/core/form/SolidFormFooter.tsx +4 -4
  56. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  57. package/dist/components/core/form/fields/SolidBooleanField.js +11 -8
  58. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  59. package/dist/components/core/form/fields/SolidBooleanField.tsx +20 -8
  60. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  61. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +26 -21
  62. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  63. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +27 -17
  64. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts +1 -0
  65. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map +1 -1
  66. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js +51 -0
  67. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map +1 -1
  68. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +51 -0
  69. package/dist/components/core/kanban/SolidKanbanView.js +5 -5
  70. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  71. package/dist/components/core/kanban/SolidKanbanView.tsx +5 -5
  72. package/dist/components/core/list/SolidListView.d.ts +12 -7
  73. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  74. package/dist/components/core/list/SolidListView.js +138 -150
  75. package/dist/components/core/list/SolidListView.js.map +1 -1
  76. package/dist/components/core/list/SolidListView.tsx +84 -91
  77. package/dist/components/core/list/listViewRegistry.js.map +1 -1
  78. package/dist/components/core/list/listViewRegistry.ts +1 -2
  79. package/dist/components/core/tree/SolidTreeView.d.ts +38 -0
  80. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -0
  81. package/dist/components/core/tree/SolidTreeView.js +1170 -0
  82. package/dist/components/core/tree/SolidTreeView.js.map +1 -0
  83. package/dist/components/core/tree/SolidTreeView.tsx +1603 -0
  84. package/dist/components/core/tree/treeViewRegistry.d.ts +7 -0
  85. package/dist/components/core/tree/treeViewRegistry.d.ts.map +1 -0
  86. package/dist/components/core/tree/treeViewRegistry.js +17 -0
  87. package/dist/components/core/tree/treeViewRegistry.js.map +1 -0
  88. package/dist/components/core/tree/treeViewRegistry.ts +23 -0
  89. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  90. package/dist/components/core/users/CreateUser.js +19 -6
  91. package/dist/components/core/users/CreateUser.js.map +1 -1
  92. package/dist/components/core/users/CreateUser.tsx +39 -0
  93. package/dist/helpers/helpers.d.ts +2 -0
  94. package/dist/helpers/helpers.d.ts.map +1 -1
  95. package/dist/helpers/helpers.js +3 -1
  96. package/dist/helpers/helpers.js.map +1 -1
  97. package/dist/helpers/helpers.ts +4 -1
  98. package/dist/helpers/registry.d.ts.map +1 -1
  99. package/dist/helpers/registry.js +2 -0
  100. package/dist/helpers/registry.js.map +1 -1
  101. package/dist/helpers/registry.ts +3 -1
  102. package/dist/index.d.ts +3 -1
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +2 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/index.ts +6 -1
  107. package/dist/resources/globals.css +18 -4
  108. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  109. package/dist/routes/pages/admin/core/ListPage.js +1 -1
  110. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  111. package/dist/routes/pages/admin/core/ListPage.tsx +2 -1
  112. package/dist/routes/pages/admin/core/TreePage.d.ts +2 -0
  113. package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -0
  114. package/dist/routes/pages/admin/core/TreePage.js +37 -0
  115. package/dist/routes/pages/admin/core/TreePage.js.map +1 -0
  116. package/dist/routes/pages/admin/core/TreePage.tsx +30 -0
  117. package/dist/routes/solidRoutes.d.ts.map +1 -1
  118. package/dist/routes/solidRoutes.js +2 -0
  119. package/dist/routes/solidRoutes.js.map +1 -1
  120. package/dist/routes/solidRoutes.tsx +3 -1
  121. package/dist/routes/types.d.ts +1 -1
  122. package/dist/routes/types.d.ts.map +1 -1
  123. package/dist/routes/types.js.map +1 -1
  124. package/dist/routes/types.ts +1 -0
  125. package/dist/types/index.d.ts +8 -2
  126. package/dist/types/solid-core.d.ts +40 -0
  127. package/package.json +1 -1
@@ -0,0 +1,452 @@
1
+ import React, { useMemo } from "react";
2
+ import { Dropdown } from "primereact/dropdown";
3
+ import { Button } from "primereact/button";
4
+ import { GroupableField } from "./SolidGlobalSearchElement";
5
+ import { AutoComplete } from "primereact/autocomplete";
6
+
7
+ const groupedDateOptions = [
8
+ {
9
+ label: "Year",
10
+ items: [
11
+ { label: "Year (YYYY)", value: "YYYY" }
12
+ ]
13
+ },
14
+ {
15
+ label: "Month",
16
+ items: [
17
+ { label: "Month (MMM)", value: "MMM" },
18
+ { label: "Year-Month (YYYY-MM)", value: "YYYY-MM" }
19
+ ]
20
+ },
21
+ {
22
+ label: "Day",
23
+ items: [
24
+ { label: "Full Date (YYYY-MM-DD)", value: "YYYY-MM-DD" }
25
+ ]
26
+ }
27
+ ];
28
+
29
+
30
+
31
+ const aggregateOperators = [
32
+ { label: "Count", value: "count" },
33
+ { label: "Sum", value: "sum" },
34
+ { label: "Avg", value: "avg" },
35
+ { label: "Min", value: "min" },
36
+ { label: "Max", value: "max" }
37
+ ];
38
+
39
+ const allowedGroupTypes = [
40
+ "shortText",
41
+ "selectionStatic",
42
+ "selectionDynamic",
43
+ "computed",
44
+ "int",
45
+ "float",
46
+ "boolean",
47
+ "date",
48
+ "datetime",
49
+ "relation"
50
+ ];
51
+
52
+ const numericTypes = ["int", "float"];
53
+
54
+ export type AggregationOperator =
55
+ | "count"
56
+ | "sum"
57
+ | "avg"
58
+ | "min"
59
+ | "max";
60
+
61
+ export interface AggregationRule {
62
+ id: number;
63
+
64
+ /**
65
+ * Aggregate operator
66
+ */
67
+ operator: AggregationOperator;
68
+
69
+ /**
70
+ * Field on which aggregation applies
71
+ * Example:
72
+ * "id"
73
+ * "amount"
74
+ * "price"
75
+ */
76
+ fieldName: string | null;
77
+
78
+ /**
79
+ * If true:
80
+ * - Cannot be edited
81
+ * - Cannot be removed
82
+ * Used for default: count-of-id
83
+ */
84
+ locked?: boolean;
85
+ }
86
+
87
+ export type DateGroupingFormat =
88
+ | "YYYY"
89
+ | "MMM"
90
+ | "YYYY-MM"
91
+ | "YYYY-MM-DD";
92
+
93
+ export interface GroupingRule {
94
+ id: number;
95
+
96
+ /**
97
+ * Actual field selected by user.
98
+ * Example:
99
+ * "state"
100
+ * "city"
101
+ * "createdAt"
102
+ * "author.name" // many-to-one resolved key
103
+ */
104
+ fieldName: string | null;
105
+
106
+ /**
107
+ * Only used when field type is date or datetime.
108
+ * Null for non-date fields.
109
+ */
110
+ dateGrouping?: DateGroupingFormat | null;
111
+ }
112
+
113
+
114
+ const GroupingComponent = ({
115
+ viewData,
116
+ fields,
117
+ groupingRules,
118
+ setGroupingRules,
119
+ aggregationRules,
120
+ setAggregationRules,
121
+ applyGrouping,
122
+ closeDialog
123
+ }: { viewData: any, fields: GroupableField[], groupingRules: GroupingRule[], setGroupingRules: any, aggregationRules: AggregationRule[], setAggregationRules: any, applyGrouping: any, closeDialog: any }) => {
124
+
125
+
126
+ const [groupSearchValue, setGroupSearchValue] = React.useState<any>(null);
127
+ const [aggSearchValue, setAggSearchValue] = React.useState<any>(null);
128
+
129
+ const [filteredGroupingFields, setFilteredGroupingFields] = React.useState<GroupableField[]>([]);
130
+
131
+ const searchGroupingFields = (event: any) => {
132
+ const query = event.query.toLowerCase();
133
+ const selectedFields = groupingRules.map(r => r.fieldName);
134
+
135
+ const filtered = groupableFields.filter((field) =>
136
+ field.displayName.toLowerCase().includes(query) && !selectedFields.includes(field.fieldName)
137
+ );
138
+
139
+ setFilteredGroupingFields(filtered);
140
+ };
141
+
142
+ const [filteredAggregationFields, setFilteredAggregationFields] = React.useState<GroupableField[]>([]);
143
+
144
+ const searchAggregationFields = (event: any) => {
145
+ const query = event.query.toLowerCase();
146
+
147
+ const filtered = numericFields.filter((field) =>
148
+ field.displayName.toLowerCase().includes(query)
149
+ );
150
+ setFilteredAggregationFields(query ? filtered : numericFields);
151
+ };
152
+
153
+ // -------------------------------
154
+ // FILTER GROUPABLE FIELDS
155
+ // -------------------------------
156
+ const groupableFields: GroupableField[] = useMemo(() => {
157
+ return fields.filter(f =>
158
+ allowedGroupTypes.includes(f.type)
159
+ );
160
+ }, [fields]);
161
+
162
+ const numericFields: GroupableField[] = useMemo(() => {
163
+ return fields.filter((f: any) =>
164
+ numericTypes.includes(f.type) ||
165
+ (f.type === "computed" && f.computedFieldValueType === "int") ||
166
+ (f.type === "computed" && f.computedFieldValueType === "float")
167
+ );
168
+ }, [fields]);
169
+
170
+ // -------------------------------
171
+ // GROUPING HANDLERS
172
+ // -------------------------------
173
+
174
+ const addGroup = () => {
175
+ setGroupingRules((prev: any) => [
176
+ ...prev,
177
+ { id: Date.now(), fieldName: null, dateGrouping: null }
178
+ ]);
179
+ };
180
+
181
+ const removeGroup = (id: any) => {
182
+ setGroupingRules((prev: any) => prev.filter((r: any) => r.id !== id));
183
+ };
184
+
185
+ const updateGroup = (id: any, key: any, value: any) => {
186
+ setGroupingRules((prev: any) =>
187
+ prev.map((r: any) => r.id === id ? { ...r, [key]: value } : r)
188
+ );
189
+ };
190
+
191
+ // -------------------------------
192
+ // AGGREGATION HANDLERS
193
+ // -------------------------------
194
+
195
+ const addAggregation = () => {
196
+ setAggregationRules((prev: any) => [
197
+ ...prev,
198
+ { id: Date.now(), operator: "sum", fieldName: null }
199
+ ]);
200
+ };
201
+
202
+ const removeAggregation = (id: any) => {
203
+ setAggregationRules((prev: any) =>
204
+ prev.filter((a: any) => a.id !== id || a.locked)
205
+ );
206
+ };
207
+
208
+ const updateAggregation = (id: any, key: any, value: any) => {
209
+ setAggregationRules((prev: any) =>
210
+ prev.map((a: any) => a.id === id ? { ...a, [key]: value } : a)
211
+ );
212
+ };
213
+
214
+ // -------------------------------
215
+ // READONLY GROUP ORDER DISPLAY
216
+ // -------------------------------
217
+
218
+ const groupingSummary = groupingRules
219
+ .filter((g: GroupingRule) => g.fieldName)
220
+ .map((g: GroupingRule) => {
221
+ const fieldMeta = fields.find((f: GroupableField) => f.fieldName === g.fieldName);
222
+ if (!fieldMeta) return null;
223
+
224
+ if (["date", "datetime"].includes(fieldMeta.type) && g.dateGrouping) {
225
+ return `${fieldMeta.displayName} (${g.dateGrouping})`;
226
+ }
227
+
228
+ return fieldMeta.displayName;
229
+ })
230
+ .filter(Boolean)
231
+ .join(" > ");
232
+
233
+
234
+ const groupedDateItemTemplate = (option: any) => {
235
+ return (
236
+ <div className="flex align-items-center gap-2">
237
+ <i className={`pi ${option.label === "Year" ? "pi-calendar" :
238
+ option.label === "Month" ? "pi-calendar-minus" :
239
+ "pi-calendar-plus"
240
+ }`} />
241
+ <div>
242
+ {option.label}
243
+ </div>
244
+ </div>
245
+ );
246
+ };
247
+
248
+ const groupedDateValueTemplate = (option: any) => {
249
+ return (
250
+ <div className="pl-3">
251
+ {option.label}
252
+ </div>
253
+ );
254
+ };
255
+
256
+ return (
257
+ <div className="primary-filter-fieldset p-2">
258
+ <style>{`
259
+ .solid-mini-dropdown {
260
+ border: none !important;
261
+ background: transparent !important;
262
+ border-radius: 4px !important;
263
+ transition: background 0.2s !important;
264
+ }
265
+ .solid-mini-dropdown:hover {
266
+ background: rgba(0, 0, 0, 0.1) !important;
267
+ }
268
+ .solid-mini-dropdown .p-dropdown-label {
269
+ padding: 0 0.5rem !important;
270
+ line-height: 1.5rem !important;
271
+ font-size: 0.75rem !important;
272
+ font-weight: 600 !important;
273
+ color: var(--text-color-secondary) !important;
274
+ }
275
+ .solid-mini-dropdown .p-dropdown-trigger {
276
+ width: 1.5rem !important;
277
+ }
278
+ .solid-chip {
279
+ border: 1px solid var(--surface-300) !important;
280
+ background: var(--surface-100) !important;
281
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important;
282
+ transition: all 0.2s ease-in-out;
283
+ border-radius: 100px !important; /* Made more rounded */
284
+ }
285
+ .solid-chip:hover {
286
+ background: var(--surface-200) !important;
287
+ transform: translateY(-1px);
288
+ }
289
+ .solid-chip .pi-times {
290
+ border: none !important; /* Ensure no border on the x */
291
+ background: transparent !important;
292
+ }
293
+ `}</style>
294
+
295
+ {/* ========================================================= */}
296
+ {/* A. APPLY GROUPS */}
297
+ {/* ========================================================= */}
298
+ <p className="mb-2 font-bold">Apply Groups</p>
299
+
300
+ <div className="mb-3">
301
+ <AutoComplete
302
+ value={groupSearchValue}
303
+ suggestions={filteredGroupingFields}
304
+ completeMethod={searchGroupingFields}
305
+ field="displayName"
306
+ placeholder="Search Field to Group By"
307
+ className="w-full"
308
+ dropdown
309
+ onChange={(e) => setGroupSearchValue(e.value)}
310
+ onSelect={(e) => {
311
+ if (typeof e.value === "object" && e.value.fieldName) {
312
+ const isDate = ["date", "datetime"].includes(e.value.type);
313
+ setGroupingRules((prev: any) => [
314
+ ...prev,
315
+ { id: Date.now(), fieldName: e.value.fieldName, dateGrouping: isDate ? "YYYY-MM-DD" : null }
316
+ ]);
317
+ }
318
+ setGroupSearchValue(null);
319
+ }}
320
+ />
321
+ </div>
322
+
323
+ <div className="flex align-items-center gap-2 flex-wrap mb-4" style={{ minHeight: '2rem' }}>
324
+ {groupingRules.length == 1 && groupingRules[0].fieldName === null && (
325
+ <span className="text-sm text-400 italic">No grouping rules applied.</span>
326
+ )}
327
+ {groupingRules.map((rule, index) => {
328
+ const fieldMeta = fields.find((f) => f.fieldName === rule.fieldName);
329
+ if (!fieldMeta) return null;
330
+
331
+ const isDate = ["date", "datetime"].includes(fieldMeta.type);
332
+
333
+ return (
334
+ <React.Fragment key={rule.id}>
335
+ <div
336
+ className="flex align-items-center gap-2 px-2 py-1 solid-chip text-sm font-medium text-700"
337
+ >
338
+ <span>{fieldMeta.displayName}</span>
339
+
340
+ {isDate && (
341
+ <Dropdown
342
+ value={rule.dateGrouping || "YYYY-MM-DD"}
343
+ options={groupedDateOptions}
344
+ optionLabel="label"
345
+ optionGroupLabel="label"
346
+ optionGroupChildren="items"
347
+ optionGroupTemplate={groupedDateItemTemplate}
348
+ itemTemplate={groupedDateValueTemplate}
349
+ placeholder="Format"
350
+ className="solid-mini-dropdown"
351
+ style={{ height: '1.5rem', fontSize: '0.75rem', padding: '0 0.25rem' }}
352
+ onChange={(e) => updateGroup(rule.id, "dateGrouping", e.value)}
353
+ />
354
+ )}
355
+
356
+ <i
357
+ className="pi pi-times cursor-pointer text-400 hover:text-red-500 transition-colors"
358
+ onClick={() => removeGroup(rule.id)}
359
+ />
360
+ </div>
361
+ {index < groupingRules.length - 1 && (
362
+ <i className="pi pi-angle-double-right text-400 text-xs" />
363
+ )}
364
+ </React.Fragment>
365
+ );
366
+ })}
367
+ </div>
368
+
369
+ {/* ========================================================= */}
370
+ {/* B. APPLY AGGREGATIONS */}
371
+ {/* ========================================================= */}
372
+ <p className="mt-4 mb-2 font-bold">Apply Aggregations</p>
373
+
374
+ <div className="mb-3">
375
+ <AutoComplete
376
+ value={aggSearchValue}
377
+ suggestions={filteredAggregationFields}
378
+ completeMethod={searchAggregationFields}
379
+ field="displayName"
380
+ placeholder="Search Field to Aggregate"
381
+ className="w-full"
382
+ dropdown
383
+ onChange={(e) => setAggSearchValue(e.value)}
384
+ onSelect={(e) => {
385
+ if (typeof e.value === "object" && e.value.fieldName) {
386
+ setAggregationRules((prev: any) => [
387
+ ...prev,
388
+ { id: Date.now(), operator: "count", fieldName: e.value.fieldName }
389
+ ]);
390
+ }
391
+ setAggSearchValue(null);
392
+ }}
393
+ />
394
+ </div>
395
+
396
+ <div className="flex align-items-center gap-2 flex-wrap mb-4" style={{ minHeight: '3rem' }}>
397
+ {aggregationRules.length === 0 && (
398
+ <span className="text-sm text-400 italic">No aggregations applied.</span>
399
+ )}
400
+ {aggregationRules.map((rule) => {
401
+ const fieldMeta = fields.find((f) => f.fieldName === rule.fieldName);
402
+ if (!fieldMeta) return null;
403
+
404
+ return (
405
+ <div
406
+ key={rule.id}
407
+ className="flex align-items-center gap-2 px-2 py-1 solid-chip text-sm font-medium text-700"
408
+ >
409
+ <span>{fieldMeta.displayName}</span>
410
+
411
+ <Dropdown
412
+ value={rule.operator}
413
+ options={aggregateOperators}
414
+ disabled={rule.locked}
415
+ placeholder="Op"
416
+ className="solid-mini-dropdown"
417
+ style={{ height: '1.5rem', fontSize: '0.75rem', padding: '0 0.25rem' }}
418
+ onChange={(e) => updateAggregation(rule.id, "operator", e.value)}
419
+ />
420
+
421
+ {!rule.locked && (
422
+ <i
423
+ className="pi pi-times cursor-pointer text-400 hover:text-red-500 transition-colors"
424
+ onClick={() => removeAggregation(rule.id)}
425
+ />
426
+ )}
427
+ </div>
428
+ );
429
+ })}
430
+ </div>
431
+
432
+ {/* FOOTER */}
433
+ <div className="flex justify-content-center gap-2 mt-4 pt-3 surface-border">
434
+ <Button
435
+ label="Apply"
436
+ icon="pi pi-check"
437
+ size="small"
438
+ onClick={() => applyGrouping(groupingRules, aggregationRules)}
439
+ />
440
+ <Button
441
+ label="Cancel"
442
+ icon="pi pi-times"
443
+ size="small"
444
+ outlined
445
+ onClick={closeDialog}
446
+ />
447
+ </div>
448
+ </div>
449
+ );
450
+ };
451
+
452
+ export default GroupingComponent;
@@ -1,5 +1,22 @@
1
1
  import React from "react";
2
+ import { AggregationRule, GroupingRule } from "./GroupingComponent";
3
+ export type SearchableField = {
4
+ fieldName: string;
5
+ displayName: string;
6
+ searchField: string;
7
+ matchMode: string;
8
+ };
9
+ export type GroupableField = {
10
+ fieldName: string;
11
+ displayName: string;
12
+ searchField: string;
13
+ matchMode: string;
14
+ type: string;
15
+ ormType: string;
16
+ relationType: string;
17
+ computedFieldValueType: string;
18
+ };
2
19
  export declare const mergeSearchAndCustomFilters: (transformedFilter: any, newFilter: any, transformedFilterName: string, newFilterName: string) => any;
3
- export declare const mergeAllDiffFilters: (customFilter: any, searchFilter: any, savedFilter: any, preDefinedFilter?: any) => any;
20
+ export declare const mergeAllDiffFilters: (customFilter: any, searchFilter: any, savedFilter: any, preDefinedFilter?: any, groupingRules?: GroupingRule[], aggregationRules?: AggregationRule[]) => any;
4
21
  export declare const SolidGlobalSearchElement: React.ForwardRefExoticComponent<Omit<any, "ref"> & React.RefAttributes<unknown>>;
5
22
  //# sourceMappingURL=SolidGlobalSearchElement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuE,MAAM,OAAO,CAAC;AAoV5F,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,QAkBjH,CAAA;AA+GD,eAAO,MAAM,wBAAwB,kFAikCnC,CAAC"}
1
+ {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuE,MAAM,OAAO,CAAC;AAgB5F,OAA0B,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAa3G,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAClC,CAAA;AA2TD,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,YAAY,EAAE,qBAAqB,eAAe,EAAE,QAwBvL,CAAA;AAiHD,eAAO,MAAM,wBAAwB,kFAktCnC,CAAC"}