@solidxai/core-ui 0.1.2 → 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 (149) 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 +197 -74
  23. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  24. package/dist/components/core/common/SolidGlobalSearchElement.tsx +276 -40
  25. package/dist/components/core/common/SolidImageViewer.d.ts +10 -0
  26. package/dist/components/core/common/SolidImageViewer.d.ts.map +1 -0
  27. package/dist/components/core/common/SolidImageViewer.js +59 -0
  28. package/dist/components/core/common/SolidImageViewer.js.map +1 -0
  29. package/dist/components/core/common/SolidImageViewer.tsx +84 -0
  30. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts +19 -0
  31. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts.map +1 -0
  32. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js +90 -0
  33. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js.map +1 -0
  34. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.tsx +59 -0
  35. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
  36. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +7 -3
  37. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
  38. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +45 -40
  39. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts +2 -0
  40. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts.map +1 -0
  41. package/dist/components/core/filter/SolidOneToManyFilterElement.js +86 -0
  42. package/dist/components/core/filter/SolidOneToManyFilterElement.js.map +1 -0
  43. package/dist/components/core/filter/SolidOneToManyFilterElement.tsx +62 -0
  44. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts +1 -0
  45. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
  46. package/dist/components/core/filter/SolidVarInputsFilterElement.js +4 -1
  47. package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
  48. package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +10 -0
  49. package/dist/components/core/filter/fields/SolidRelationField.d.ts.map +1 -1
  50. package/dist/components/core/filter/fields/SolidRelationField.js +4 -2
  51. package/dist/components/core/filter/fields/SolidRelationField.js.map +1 -1
  52. package/dist/components/core/filter/fields/SolidRelationField.tsx +4 -2
  53. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts +4 -0
  54. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -0
  55. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js +25 -0
  56. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js.map +1 -0
  57. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.tsx +60 -0
  58. package/dist/components/core/form/SolidFormFooter.js +4 -4
  59. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  60. package/dist/components/core/form/SolidFormFooter.tsx +4 -4
  61. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  62. package/dist/components/core/form/fields/SolidBooleanField.js +11 -8
  63. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  64. package/dist/components/core/form/fields/SolidBooleanField.tsx +20 -8
  65. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  66. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +26 -21
  67. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  68. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +27 -17
  69. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts +1 -0
  70. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map +1 -1
  71. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js +51 -0
  72. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map +1 -1
  73. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +51 -0
  74. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.d.ts.map +1 -1
  75. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js +80 -79
  76. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js.map +1 -1
  77. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx +92 -85
  78. package/dist/components/core/kanban/SolidKanbanView.js +5 -5
  79. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  80. package/dist/components/core/kanban/SolidKanbanView.tsx +5 -5
  81. package/dist/components/core/list/SolidListView.d.ts +12 -7
  82. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  83. package/dist/components/core/list/SolidListView.js +143 -153
  84. package/dist/components/core/list/SolidListView.js.map +1 -1
  85. package/dist/components/core/list/SolidListView.tsx +89 -94
  86. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  87. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +16 -17
  88. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  89. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +46 -44
  90. package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
  91. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +6 -4
  92. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  93. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +7 -5
  94. package/dist/components/core/list/listViewRegistry.js.map +1 -1
  95. package/dist/components/core/list/listViewRegistry.ts +1 -2
  96. package/dist/components/core/tree/SolidTreeView.d.ts +38 -0
  97. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -0
  98. package/dist/components/core/tree/SolidTreeView.js +1170 -0
  99. package/dist/components/core/tree/SolidTreeView.js.map +1 -0
  100. package/dist/components/core/tree/SolidTreeView.tsx +1603 -0
  101. package/dist/components/core/tree/treeViewRegistry.d.ts +7 -0
  102. package/dist/components/core/tree/treeViewRegistry.d.ts.map +1 -0
  103. package/dist/components/core/tree/treeViewRegistry.js +17 -0
  104. package/dist/components/core/tree/treeViewRegistry.js.map +1 -0
  105. package/dist/components/core/tree/treeViewRegistry.ts +23 -0
  106. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  107. package/dist/components/core/users/CreateUser.js +19 -6
  108. package/dist/components/core/users/CreateUser.js.map +1 -1
  109. package/dist/components/core/users/CreateUser.tsx +39 -0
  110. package/dist/helpers/fetchS3Url.d.ts +19 -0
  111. package/dist/helpers/fetchS3Url.d.ts.map +1 -0
  112. package/dist/helpers/fetchS3Url.js +60 -0
  113. package/dist/helpers/fetchS3Url.js.map +1 -0
  114. package/dist/helpers/fetchS3Url.ts +33 -0
  115. package/dist/helpers/helpers.d.ts +2 -0
  116. package/dist/helpers/helpers.d.ts.map +1 -1
  117. package/dist/helpers/helpers.js +3 -1
  118. package/dist/helpers/helpers.js.map +1 -1
  119. package/dist/helpers/helpers.ts +4 -1
  120. package/dist/helpers/registry.d.ts.map +1 -1
  121. package/dist/helpers/registry.js +2 -0
  122. package/dist/helpers/registry.js.map +1 -1
  123. package/dist/helpers/registry.ts +3 -1
  124. package/dist/index.d.ts +9 -2
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +6 -1
  127. package/dist/index.js.map +1 -1
  128. package/dist/index.ts +14 -2
  129. package/dist/resources/globals.css +18 -4
  130. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  131. package/dist/routes/pages/admin/core/ListPage.js +8 -3
  132. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  133. package/dist/routes/pages/admin/core/ListPage.tsx +11 -3
  134. package/dist/routes/pages/admin/core/TreePage.d.ts +2 -0
  135. package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -0
  136. package/dist/routes/pages/admin/core/TreePage.js +37 -0
  137. package/dist/routes/pages/admin/core/TreePage.js.map +1 -0
  138. package/dist/routes/pages/admin/core/TreePage.tsx +30 -0
  139. package/dist/routes/solidRoutes.d.ts.map +1 -1
  140. package/dist/routes/solidRoutes.js +2 -0
  141. package/dist/routes/solidRoutes.js.map +1 -1
  142. package/dist/routes/solidRoutes.tsx +3 -1
  143. package/dist/routes/types.d.ts +1 -1
  144. package/dist/routes/types.d.ts.map +1 -1
  145. package/dist/routes/types.js.map +1 -1
  146. package/dist/routes/types.ts +1 -0
  147. package/dist/types/index.d.ts +8 -2
  148. package/dist/types/solid-core.d.ts +40 -0
  149. 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;AAsDD,eAAO,MAAM,wBAAwB,kFA2jCnC,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"}