@solidxai/core-ui 0.1.5-beta.2 → 0.1.5-beta.4
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/components/core/chatter/SolidChatter.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatter.js +5 -2
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +5 -2
- package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts +5 -2
- package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.js +19 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +29 -5
- package/dist/components/core/common/SolidCreateButton.js +3 -3
- package/dist/components/core/common/SolidCreateButton.js.map +1 -1
- package/dist/components/core/common/SolidCreateButton.tsx +3 -3
- package/dist/components/core/dashboard/DashboardFilter.d.ts +13 -0
- package/dist/components/core/dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/components/core/dashboard/DashboardFilter.js +305 -0
- package/dist/components/core/dashboard/DashboardFilter.js.map +1 -0
- package/dist/components/core/dashboard/DashboardFilter.tsx +356 -0
- package/dist/components/core/dashboard/SolidDashboard.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.js +9 -4
- package/dist/components/core/dashboard/SolidDashboard.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.tsx +32 -2
- package/dist/components/core/kanban/SolidKanbanView.js +2 -2
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +2 -2
- package/dist/components/core/list/SolidListView.js +2 -2
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +2 -2
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +277 -43
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +436 -4
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +1 -1
- package/dist/helpers/routePaths.d.ts +1 -1
- package/dist/helpers/routePaths.d.ts.map +1 -1
- package/dist/helpers/routePaths.js +2 -2
- package/dist/helpers/routePaths.js.map +1 -1
- package/dist/helpers/routePaths.ts +2 -2
- package/dist/resources/globals.css +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import { Button } from "primereact/button";
|
|
3
|
+
import { Dialog } from "primereact/dialog";
|
|
4
|
+
import { Dropdown } from "primereact/dropdown";
|
|
5
|
+
import { Calendar } from "primereact/calendar";
|
|
6
|
+
import { AutoComplete, AutoCompleteCompleteEvent } from "primereact/autocomplete";
|
|
7
|
+
import { SqlExpression } from "../../../types/solid-core";
|
|
8
|
+
import { DashboardVariableRecord } from "./SolidDashboard";
|
|
9
|
+
import { useLazyGetDashboardVariableSelectionDynamicValuesQuery } from "../../../redux/api/dashboardApi";
|
|
10
|
+
import { Divider } from "primereact/divider";
|
|
11
|
+
import { Fieldset } from "primereact/fieldset";
|
|
12
|
+
|
|
13
|
+
interface DashboardFilterProps {
|
|
14
|
+
dashboardVariables: DashboardVariableRecord[];
|
|
15
|
+
initialFilters: SqlExpression[];
|
|
16
|
+
onApply: (filters: SqlExpression[]) => void;
|
|
17
|
+
visible: boolean;
|
|
18
|
+
onHide: () => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const getNumberOfInputs = (matchMode: any): number | null => {
|
|
22
|
+
switch (matchMode) {
|
|
23
|
+
case '$between': return 2;
|
|
24
|
+
case '$in': case '$notIn': return null;
|
|
25
|
+
case '$startsWith': case '$contains': case '$notContains': case '$endsWith': case '$equals': case '$notEquals': case '$lt': case '$lte': case '$gt': case '$gte': return 1;
|
|
26
|
+
case '$null': case '$notNull': return 0;
|
|
27
|
+
default: return 1;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const dateFilterMatchModeOptions = [
|
|
32
|
+
{ label: 'Equals', value: "$eq" },
|
|
33
|
+
{ label: 'Not Equals', value: "$nei" },
|
|
34
|
+
{ label: 'Less Than', value: "$lt" },
|
|
35
|
+
{ label: 'Less Than Or Equal', value: "$lte" },
|
|
36
|
+
{ label: 'Greater Than', value: "$gt" },
|
|
37
|
+
{ label: 'Greater Than Or Equal', value: "$gte" },
|
|
38
|
+
{ label: 'In', value: "$in" },
|
|
39
|
+
{ label: 'Not In', value: "$notIn" },
|
|
40
|
+
{ label: 'Between', value: "$between" }
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const selectionFilterMatchModeOptions = [
|
|
44
|
+
{ label: 'In', value: "$in" },
|
|
45
|
+
{ label: 'Not In', value: "$notIn" }
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const FilterValueInput = ({ rule, onChange }: any) => {
|
|
49
|
+
const numberOfInputs = getNumberOfInputs(rule.matchMode);
|
|
50
|
+
|
|
51
|
+
// Ensure values is an array properly sized immediately on render
|
|
52
|
+
let values = Array.isArray(rule.value) ? [...rule.value] : (rule.value ? [rule.value] : []);
|
|
53
|
+
|
|
54
|
+
if (numberOfInputs !== null && numberOfInputs > 0 && values.length !== numberOfInputs) {
|
|
55
|
+
if (values.length < numberOfInputs) {
|
|
56
|
+
values = [...values, ...Array(numberOfInputs - values.length).fill('')];
|
|
57
|
+
} else {
|
|
58
|
+
values = values.slice(0, numberOfInputs);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (values.length === 0 && (numberOfInputs === null || numberOfInputs > 0)) {
|
|
62
|
+
values = [''];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const updateValue = (index: number, val: any) => {
|
|
66
|
+
const newValues = [...values];
|
|
67
|
+
newValues[index] = val;
|
|
68
|
+
onChange(rule.id, 'value', numberOfInputs === 1 ? newValues[0] : newValues);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const addInput = () => {
|
|
72
|
+
const newValues = [...values, ''];
|
|
73
|
+
onChange(rule.id, 'value', newValues);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const deleteInput = (index: number) => {
|
|
77
|
+
if (values.length > 1) {
|
|
78
|
+
const newValues = values.filter((_: any, i: number) => i !== index);
|
|
79
|
+
onChange(rule.id, 'value', newValues);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Components for actual rendering
|
|
84
|
+
const renderDate = (val: any, index: number) => {
|
|
85
|
+
let dateVal = val ? new Date(val) : null;
|
|
86
|
+
if (isNaN(dateVal?.getTime() || 0)) dateVal = null;
|
|
87
|
+
return (
|
|
88
|
+
<Calendar
|
|
89
|
+
value={dateVal}
|
|
90
|
+
onChange={(e) => {
|
|
91
|
+
const dateStr = e.value ? (e.value as Date).toISOString().split('T')[0] : '';
|
|
92
|
+
updateValue(index, dateStr);
|
|
93
|
+
}}
|
|
94
|
+
dateFormat="mm/dd/yy"
|
|
95
|
+
placeholder="mm/dd/yyyy"
|
|
96
|
+
mask="99/99/9999"
|
|
97
|
+
className="w-full"
|
|
98
|
+
inputClassName="w-full p-inputtext-sm"
|
|
99
|
+
/>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const SelectionStaticInput = ({ val, index, updateValue, dv }: any) => {
|
|
104
|
+
const [filteredItems, setFilteredItems] = useState<{ label: string, value: string }[]>([]);
|
|
105
|
+
const staticValues = JSON.parse(dv.selectionStaticValues || '[]') || [];
|
|
106
|
+
const staticValueItems = staticValues.map((v: any) => ({ value: v.split(':')[0], label: v.split(':')[1] }));
|
|
107
|
+
|
|
108
|
+
const search = (event: AutoCompleteCompleteEvent) => {
|
|
109
|
+
const query = event.query.toLowerCase();
|
|
110
|
+
const filtered = staticValueItems.filter((item: any) =>
|
|
111
|
+
item.label.toLowerCase().includes(query)
|
|
112
|
+
);
|
|
113
|
+
setFilteredItems(filtered);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<AutoComplete
|
|
118
|
+
value={val}
|
|
119
|
+
suggestions={filteredItems}
|
|
120
|
+
completeMethod={search}
|
|
121
|
+
onChange={(e) => updateValue(index, e.value)}
|
|
122
|
+
field="label"
|
|
123
|
+
dropdown
|
|
124
|
+
className="w-full"
|
|
125
|
+
inputClassName="w-full p-inputtext-sm"
|
|
126
|
+
/>
|
|
127
|
+
);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const SelectionDynamicInput = ({ val, index, updateValue, dv }: any) => {
|
|
131
|
+
const [filteredItems, setFilteredItems] = useState<{ label: string, value: string }[]>([]);
|
|
132
|
+
const [trigger] = useLazyGetDashboardVariableSelectionDynamicValuesQuery();
|
|
133
|
+
|
|
134
|
+
const search = async (event: AutoCompleteCompleteEvent) => {
|
|
135
|
+
const queryString = `variableId=${dv.id}&q=${event.query}`;
|
|
136
|
+
try {
|
|
137
|
+
const res = await trigger(queryString).unwrap();
|
|
138
|
+
const filtered = res.filter((item: any) =>
|
|
139
|
+
item.label.toLowerCase().includes(event.query.toLowerCase())
|
|
140
|
+
);
|
|
141
|
+
setFilteredItems(filtered);
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error(error);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<AutoComplete
|
|
149
|
+
value={val}
|
|
150
|
+
suggestions={filteredItems}
|
|
151
|
+
completeMethod={search}
|
|
152
|
+
onChange={(e) => updateValue(index, e.value)}
|
|
153
|
+
field="label"
|
|
154
|
+
dropdown
|
|
155
|
+
className="w-full"
|
|
156
|
+
inputClassName="w-full p-inputtext-sm"
|
|
157
|
+
/>
|
|
158
|
+
);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
if (numberOfInputs === 0) return <></>;
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<div className="flex flex-column gap-2">
|
|
165
|
+
{values.map((val: any, index: number) => (
|
|
166
|
+
<div key={index} className="flex gap-2">
|
|
167
|
+
<div className="flex-grow-1">
|
|
168
|
+
{rule.variable.variableType === 'date' && renderDate(val, index)}
|
|
169
|
+
{rule.variable.variableType === 'selectionStatic' && <SelectionStaticInput val={val} index={index} updateValue={updateValue} dv={rule.variable} />}
|
|
170
|
+
{rule.variable.variableType === 'selectionDynamic' && <SelectionDynamicInput val={val} index={index} updateValue={updateValue} dv={rule.variable} />}
|
|
171
|
+
</div>
|
|
172
|
+
{numberOfInputs === null && (
|
|
173
|
+
<div className="flex align-items-center">
|
|
174
|
+
<Button type="button" text severity='secondary' icon="pi pi-plus" size='small' onClick={addInput} className='p-0 mr-2 target-btn' style={{ width: 30, minWidth: 30 }} />
|
|
175
|
+
<Button type="button" text severity='secondary' icon="pi pi-trash" size='small' onClick={() => deleteInput(index)} className='p-0 target-btn' style={{ width: 30, minWidth: 30 }} disabled={values.length <= 1} />
|
|
176
|
+
</div>
|
|
177
|
+
)}
|
|
178
|
+
</div>
|
|
179
|
+
))}
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export const DashboardFilter: React.FC<DashboardFilterProps> = ({
|
|
185
|
+
dashboardVariables,
|
|
186
|
+
initialFilters,
|
|
187
|
+
onApply,
|
|
188
|
+
visible,
|
|
189
|
+
onHide,
|
|
190
|
+
}) => {
|
|
191
|
+
const [rules, setRules] = useState<any[]>([]);
|
|
192
|
+
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
if (visible) {
|
|
195
|
+
// Initialize rules based on dashboardVariables
|
|
196
|
+
const newRules = dashboardVariables.map((dv, index) => {
|
|
197
|
+
const existingFilter = initialFilters.find((f: any) => f.variableName === dv.variableName);
|
|
198
|
+
|
|
199
|
+
const defaultOperator = dv.defaultOperator || (dv.variableType === 'date' ? '$between' : '$in');
|
|
200
|
+
|
|
201
|
+
let defaultValue = null;
|
|
202
|
+
if (existingFilter && existingFilter.value !== undefined) {
|
|
203
|
+
defaultValue = existingFilter.value;
|
|
204
|
+
} else if (dv.defaultValue) {
|
|
205
|
+
try {
|
|
206
|
+
defaultValue = JSON.parse(dv.defaultValue || '[]');
|
|
207
|
+
} catch (e) {
|
|
208
|
+
defaultValue = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
id: index + 1,
|
|
214
|
+
fieldName: dv.variableName,
|
|
215
|
+
matchMode: existingFilter ? existingFilter.operator : defaultOperator,
|
|
216
|
+
value: defaultValue,
|
|
217
|
+
variable: dv
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
setRules(newRules);
|
|
221
|
+
}
|
|
222
|
+
}, [visible, dashboardVariables, initialFilters]);
|
|
223
|
+
|
|
224
|
+
const handleChange = (id: number, key: string, value: any) => {
|
|
225
|
+
setRules((prev) =>
|
|
226
|
+
prev.map((rule) => {
|
|
227
|
+
if (rule.id === id) {
|
|
228
|
+
let newVal = rule.value;
|
|
229
|
+
// Immediate sync of values count when operator matches
|
|
230
|
+
if (key === 'matchMode') {
|
|
231
|
+
const newNum = getNumberOfInputs(value);
|
|
232
|
+
let currentValues = Array.isArray(rule.value) ? [...rule.value] : (rule.value ? [rule.value] : []);
|
|
233
|
+
if (newNum !== null && newNum > 0) {
|
|
234
|
+
if (currentValues.length < newNum) {
|
|
235
|
+
currentValues = [...currentValues, ...Array(newNum - currentValues.length).fill('')];
|
|
236
|
+
} else if (currentValues.length > newNum) {
|
|
237
|
+
currentValues = currentValues.slice(0, newNum);
|
|
238
|
+
}
|
|
239
|
+
} else if (newNum === null && currentValues.length === 0) {
|
|
240
|
+
currentValues = [''];
|
|
241
|
+
}
|
|
242
|
+
newVal = newNum === 1 && currentValues.length === 1 ? currentValues[0] : currentValues;
|
|
243
|
+
return { ...rule, [key]: value, value: newVal };
|
|
244
|
+
}
|
|
245
|
+
return { ...rule, [key]: value };
|
|
246
|
+
}
|
|
247
|
+
return rule;
|
|
248
|
+
})
|
|
249
|
+
);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const handleApply = () => {
|
|
253
|
+
const newFilters: SqlExpression[] = rules
|
|
254
|
+
.filter((rule) => {
|
|
255
|
+
if (['$null', '$notNull'].includes(rule.matchMode)) return true;
|
|
256
|
+
|
|
257
|
+
if (rule.value === null || rule.value === undefined) return false;
|
|
258
|
+
if (Array.isArray(rule.value)) {
|
|
259
|
+
const hasValidValue = rule.value.some((v: any) => v !== '' && v !== null);
|
|
260
|
+
if (!hasValidValue) return false;
|
|
261
|
+
} else {
|
|
262
|
+
if (rule.value === '') return false;
|
|
263
|
+
}
|
|
264
|
+
return true;
|
|
265
|
+
})
|
|
266
|
+
.map((rule) => {
|
|
267
|
+
let finalValue = rule.value;
|
|
268
|
+
const numberOfInputs = getNumberOfInputs(rule.matchMode);
|
|
269
|
+
// Clean array values or extract single values
|
|
270
|
+
if (Array.isArray(finalValue)) {
|
|
271
|
+
finalValue = finalValue.filter(v => v !== null && v !== '');
|
|
272
|
+
if (numberOfInputs === 1 && finalValue.length > 0) {
|
|
273
|
+
finalValue = finalValue[0];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// For selection static/dynamic, we might have selected an object {label, value} or string
|
|
278
|
+
// We need to extract the 'value' if it's an object from AutoComplete selection
|
|
279
|
+
if (Array.isArray(finalValue)) {
|
|
280
|
+
finalValue = finalValue.map(v => typeof v === 'object' && v !== null && 'value' in v ? v.value : v);
|
|
281
|
+
} else if (typeof finalValue === 'object' && finalValue !== null && 'value' in finalValue) {
|
|
282
|
+
finalValue = finalValue.value;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
variableName: rule.fieldName,
|
|
287
|
+
operator: rule.matchMode,
|
|
288
|
+
value: finalValue,
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
onApply(newFilters);
|
|
293
|
+
onHide();
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const handleClear = () => {
|
|
297
|
+
onApply([]);
|
|
298
|
+
onHide();
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
return (
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
<Dialog header={false} className="solid-global-search-filter" showHeader={false} visible={visible} style={{ width: '50vw' }} breakpoints={{ '1024px': '75vw', '991px': '90vw', '767px': '94w', '250px': '96vw' }} onHide={onHide}>
|
|
305
|
+
<div className="flex align-items-center justify-content-between px-3">
|
|
306
|
+
<h5 className="solid-custom-title m-0">Add Custom Filter</h5>
|
|
307
|
+
<Button icon="pi pi-times" rounded text aria-label="Cancel" type="reset" size="small" onClick={onHide} />
|
|
308
|
+
</div>
|
|
309
|
+
<Divider className="m-0" />
|
|
310
|
+
<div className="p-2 lg:p-2">
|
|
311
|
+
<Fieldset className='primary-filter-fieldset'>
|
|
312
|
+
<div className="flex flex-column gap-3 py-3">
|
|
313
|
+
|
|
314
|
+
{rules.map((rule) => (
|
|
315
|
+
<div key={rule.id} className="grid grid-nogutter align-items-start">
|
|
316
|
+
<div className="col-12 md:col-3 pr-2">
|
|
317
|
+
<div className="p-inputtext p-disabled w-full flex align-items-center mb-2 md:mb-0" style={{ minHeight: '38px' }}>
|
|
318
|
+
{rule.fieldName}
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
<div className="col-12 md:col-3 pr-2">
|
|
322
|
+
<Dropdown
|
|
323
|
+
value={rule.matchMode}
|
|
324
|
+
onChange={(e: any) => handleChange(rule.id, 'matchMode', e.value)}
|
|
325
|
+
options={rule.variable.variableType === 'date' ? dateFilterMatchModeOptions : selectionFilterMatchModeOptions}
|
|
326
|
+
optionLabel='label'
|
|
327
|
+
optionValue='value'
|
|
328
|
+
placeholder="Select Operator"
|
|
329
|
+
className="p-inputtext-sm w-full"
|
|
330
|
+
/>
|
|
331
|
+
</div>
|
|
332
|
+
<div className="col-12 md:col-6">
|
|
333
|
+
<FilterValueInput rule={rule} onChange={handleChange} />
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
))}
|
|
337
|
+
{rules.length === 0 && (
|
|
338
|
+
<div className="text-color-secondary italic">No variables available for this dashboard.</div>
|
|
339
|
+
)}
|
|
340
|
+
</div>
|
|
341
|
+
</Fieldset>
|
|
342
|
+
{/* <div className="flex justify-content-between align-items-center mt-4">
|
|
343
|
+
<Button label="Clear Filters" icon="pi pi-filter-slash" severity="danger" text onClick={handleClear} />
|
|
344
|
+
<div className="flex gap-2">
|
|
345
|
+
</div>
|
|
346
|
+
</div> */}
|
|
347
|
+
<div className='flex gap-3 mt-3'>
|
|
348
|
+
<Button label="Apply" icon="pi pi-check" onClick={handleApply} autoFocus />
|
|
349
|
+
<Button type='button' label='Cancel' outlined size='small' onClick={onHide} />
|
|
350
|
+
</div>
|
|
351
|
+
|
|
352
|
+
</div>
|
|
353
|
+
</Dialog>
|
|
354
|
+
|
|
355
|
+
);
|
|
356
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDashboard.d.ts","sourceRoot":"","sources":["../../../../src/components/core/dashboard/SolidDashboard.tsx"],"names":[],"mappings":"AAoBA,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,gBAAgB,oBAAoB;IACpC,iBAAiB,qBAAqB;CACvC;AAED,aAAK,WAAW;IACd,GAAG,QAAQ;IACX,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,qBAAqB,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,0BAA0B,CAAC,EAAE,WAAW,CAAC;IACzC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAwED,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,cAAc,WAAY,uBAAuB,
|
|
1
|
+
{"version":3,"file":"SolidDashboard.d.ts","sourceRoot":"","sources":["../../../../src/components/core/dashboard/SolidDashboard.tsx"],"names":[],"mappings":"AAoBA,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,gBAAgB,oBAAoB;IACpC,iBAAiB,qBAAqB;CACvC;AAED,aAAK,WAAW;IACd,GAAG,QAAQ;IACX,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,qBAAqB,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,0BAA0B,CAAC,EAAE,WAAW,CAAC;IACzC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAwED,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,cAAc,WAAY,uBAAuB,4CA+OtD,CAAA;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -54,7 +54,7 @@ import { useEffect, useState } from 'react';
|
|
|
54
54
|
import { SolidXAIIcon } from '../solid-ai/SolidXAIIcon';
|
|
55
55
|
import styles from './SolidDashboard.module.css';
|
|
56
56
|
import SolidDashboardBody from './SolidDashboardBody';
|
|
57
|
-
import
|
|
57
|
+
import { DashboardFilter } from './DashboardFilter';
|
|
58
58
|
import { SolidAiMainWrapper } from '../solid-ai/SolidAiMainWrapper';
|
|
59
59
|
import { SolidDashboardFilterRequired } from './SolidDashboardFilterRequired';
|
|
60
60
|
import { SolidDashboardLoading } from './SolidDashboardLoading';
|
|
@@ -151,6 +151,7 @@ var SolidDashboard = function (params) {
|
|
|
151
151
|
var _k = useState(false), isResizing = _k[0], setIsResizing = _k[1];
|
|
152
152
|
var _l = useState([]), questions = _l[0], setQuestions = _l[1];
|
|
153
153
|
var _m = useState([]), dashboardVariables = _m[0], setDashboardVariables = _m[1];
|
|
154
|
+
var _o = useState(false), isDashboardFilterVisible = _o[0], setIsDashboardFilterVisible = _o[1];
|
|
154
155
|
useEffect(function () {
|
|
155
156
|
// Invoke the dashboard api to fetch the dashboard data
|
|
156
157
|
// console.log('Dashboard Data testing:', isLoading, data, error);
|
|
@@ -207,9 +208,9 @@ var SolidDashboard = function (params) {
|
|
|
207
208
|
dispatch(showNavbar()); // open both
|
|
208
209
|
}
|
|
209
210
|
};
|
|
210
|
-
var
|
|
211
|
+
var _p = useState(null), mcpUrl = _p[0], setMcpUrl = _p[1];
|
|
211
212
|
var getMcpUrl = useLazyGetMcpUrlQuery()[0];
|
|
212
|
-
var
|
|
213
|
+
var _q = useLazyGetSolidSettingsQuery(), trigger = _q[0], solidSettingsData = _q[1].data;
|
|
213
214
|
useEffect(function () {
|
|
214
215
|
trigger(""); // Fetch settings on mount
|
|
215
216
|
}, []);
|
|
@@ -247,7 +248,11 @@ var SolidDashboard = function (params) {
|
|
|
247
248
|
});
|
|
248
249
|
}); };
|
|
249
250
|
return (_jsxs("div", { className: "h-screen surface-0 flex", children: [_jsxs("div", { className: "h-full flex-grow-1 ".concat(styles.SolidDashboardPageContentWrapper), children: [isLoading && _jsx(SolidDashboardLoading, {}), error && _jsx(SolidDashboardRenderError, {}), !isLoading && !error && data && data.records.length === 0 && (_jsx(SolidDashboardNotAvailable, {})), !isLoading && !error && data && data.records.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "page-header", style: { borderBottom: '1px solid var(--primary-light-color)' }, children: [_jsxs("div", { className: 'flex align-items-center gap-2', children: [_jsx("div", { className: "apps-icon block md:hidden cursor-pointer", onClick: toggleBothSidebars, children: _jsx("i", { className: "pi pi-th-large" }) }), _jsxs("p", { className: "view-title solid-text-wrapper flex align-items-center gap-1 ".concat(styles.SolidDashboardTitle), children: [((_a = data === null || data === void 0 ? void 0 : data.records[0]) === null || _a === void 0 ? void 0 : _a.displayName) ? (_b = data === null || data === void 0 ? void 0 : data.records[0]) === null || _b === void 0 ? void 0 : _b.displayName : (_c = data === null || data === void 0 ? void 0 : data.records[0]) === null || _c === void 0 ? void 0 : _c.name, ((_d = data === null || data === void 0 ? void 0 : data.records[0]) === null || _d === void 0 ? void 0 : _d.description) &&
|
|
250
|
-
_jsxs(_Fragment, { children: [_jsx(Tooltip, { className: 'solid-field-tooltip', target: ".solid-field-tooltip-icon" }), _jsx("i", { className: "pi pi-info-circle solid-field-tooltip-icon", "data-pr-tooltip": (_e = data === null || data === void 0 ? void 0 : data.records[0]) === null || _e === void 0 ? void 0 : _e.description, "data-pr-position": 'right' })] })] })] }), dashboardVariables && dashboardVariables.length > 0 &&
|
|
251
|
+
_jsxs(_Fragment, { children: [_jsx(Tooltip, { className: 'solid-field-tooltip', target: ".solid-field-tooltip-icon" }), _jsx("i", { className: "pi pi-info-circle solid-field-tooltip-icon", "data-pr-tooltip": (_e = data === null || data === void 0 ? void 0 : data.records[0]) === null || _e === void 0 ? void 0 : _e.description, "data-pr-position": 'right' })] })] })] }), dashboardVariables && dashboardVariables.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: 'flex gap-2', children: [_jsx(Button, { label: "Filter", icon: filters.length > 0 ? "pi pi-filter-fill" : "pi pi-filter", outlined: filters.length === 0, severity: filters.length > 0 ? "info" : "secondary", style: filters.length > 0 ? { background: "rgb(114, 46, 209)" } : {}, size: "small", onClick: function () { return setIsDashboardFilterVisible(true); } }), filters.length > 0 && (_jsx(Button
|
|
252
|
+
// label="Clear Filters"
|
|
253
|
+
, {
|
|
254
|
+
// label="Clear Filters"
|
|
255
|
+
icon: "pi pi-filter-slash", severity: "danger", onClick: function () { setFilters([]); setIsDashboardFilterVisible(false); } }))] }), _jsx(DashboardFilter, { dashboardVariables: dashboardVariables, initialFilters: filters, onApply: setFilters, visible: isDashboardFilterVisible, onHide: function () { return setIsDashboardFilterVisible(false); } })] }))] }), !isRenderDashboardBody(questions, dashboardVariables, filters) && _jsx(SolidDashboardFilterRequired, {}), isRenderDashboardBody(questions, dashboardVariables, filters) && _jsx(SolidDashboardBody, { questions: questions, filters: filters })] }))] }), mcpUrl && (_jsxs("div", { className: "chatter-section ".concat(isOpenSolidXAiPanel === false ? 'collapsed' : 'open'), style: { width: chatterWidth }, children: [isOpenSolidXAiPanel && (_jsx("div", { style: {
|
|
251
256
|
width: 5,
|
|
252
257
|
cursor: 'col-resize',
|
|
253
258
|
position: 'absolute',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDashboard.js","sourceRoot":"","sources":["../../../../src/components/core/dashboard/SolidDashboard.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport { DashboardResponse, useGetDashboardQuery } from '../../../redux/api/dashboardApi';\nimport { SqlExpression } from '../../../types/solid-core';\nimport { Button } from 'primereact/button';\nimport { Tooltip } from \"primereact/tooltip\";\nimport qs from 'qs';\nimport { Dispatch, SetStateAction, useEffect, useState } from 'react';\nimport { SolidXAIIcon } from '../solid-ai/SolidXAIIcon';\nimport styles from './SolidDashboard.module.css';\nimport SolidDashboardBody from './SolidDashboardBody';\nimport SolidDashboardVariable from './SolidDashboardVariable';\nimport { SolidAiMainWrapper } from '../solid-ai/SolidAiMainWrapper';\nimport { SolidDashboardFilterRequired } from './SolidDashboardFilterRequired';\nimport { SolidDashboardLoading } from './SolidDashboardLoading';\nimport { SolidDashboardRenderError } from './SolidDashboardRenderError';\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { showNavbar, toggleNavbar } from \"../../../redux/features/navbarSlice\";\nimport SolidDashboardNotAvailable from './SolidDashboardNotAvailable';\nimport { useLazyGetMcpUrlQuery, useLazyGetSolidSettingsQuery } from '../../../redux/api/solidSettingsApi';\n\nexport enum DashboardVariableType {\n DATE = 'date',\n SELECTION_STATIC = 'selectionStatic',\n SELECTION_DYNAMIC = 'selectionDynamic',\n}\n\nenum SOURCE_TYPE {\n SQL = 'sql',\n PROVIDER = 'provider',\n}\n\nexport interface DashboardVariableRecord {\n id: number;\n variableName: string;\n variableType: DashboardVariableType;\n selectionStaticValues?: string;\n selectionDynamicSourceType?: SOURCE_TYPE;\n selectionDynamicProviderName?: string;\n selectionDynamicSQL?: string;\n isMultiSelect?: boolean;\n defaultValue?: string;\n defaultOperator?: string;\n}\n\nfunction handleDashboardData(\n data: DashboardResponse,\n setDashboardVariables: Dispatch<SetStateAction<DashboardVariableRecord[]>>,\n setQuestions: Dispatch<SetStateAction<any[]>>,\n) {\n const { records, meta } = data;\n if (records && records.length > 0) {\n // Set the layout options for the dashboard body\n const dashboardData = records[0]; // Assuming we want the first dashboard\n\n // Set the dashboard variables\n setDashboardVariables(dashboardData.dashboardVariables || []);\n\n // Set the dashboard questions\n setQuestions(dashboardData.questions)\n\n }\n}\n\nfunction getQueryParams(moduleName: string, dashboardId?: number, dashboardName?: string) {\n const filters: any = {\n module: {\n name: {\n $eq: moduleName\n }\n }\n };\n\n if (dashboardId !== undefined) {\n filters.id = { $eq: dashboardId };\n } else if (dashboardName !== undefined) {\n filters.name = { $eq: dashboardName };\n }\n\n const query = {\n filters,\n populate: ['dashboardVariables', 'questions']\n };\n const urlQuery = qs.stringify(query, {\n encodeValuesOnly: true,\n });\n return urlQuery;\n}\n\n// Render the dashboard body only if:\n// 1. There are dashboard questions\n// AND\n// (\n// 1. There are dashboard variables and all dashboard variable filter rules have been applied i.e (all dashboard variables have been selected)\n//. OR\n// 2. There are no dashboard variables\n// )\n// \nfunction isRenderDashboardBody(questions: any[], dashboardVariables: DashboardVariableRecord[], filters: SqlExpression[]) {\n if (questions.length === 0) {\n return false;\n }\n\n if (dashboardVariables.length === 0) {\n return true;\n }\n\n // Check if all dashboard variables have corresponding filters applied\n const allVariablesFiltered = dashboardVariables.every(variable =>\n filters.some(filter => filter.variableName === variable.variableName)\n );\n\n return allVariablesFiltered;\n}\n\ntype SolidDashboardViewProps = {\n moduleName: string;\n dashboardId?: number;\n dashboardName?: string;\n};\n\nconst SolidDashboard = (params: SolidDashboardViewProps) => {\n const { data, isLoading, error } = useGetDashboardQuery(getQueryParams(params.moduleName, params.dashboardId, params.dashboardName)) // FIXME : error handling should be done properly\n // Define a state called layoutOption and pass it after destructing the widgetOptions and dashboardOptions from layoutOption\n // TODO [HP]: Shouldn't the type of this state variable be something different? Why are we muddling this with layout but calling it body props? \n // TODO [HP]: Body props should be clearly made up of Gridstack layout options, the questions that make up the body & the filter[] which is an array of SqlExpressions\n // TODO [HP]: This is fully CONFUSED\n // const [layoutOption, setLayoutOption] = useState<SolidDashboardBodyProps>({\n // filters: [],\n // questions: [],\n // });\n\n // TODO [HP]: replace dashboardVariableFilterRules with filters everywhere...\n // const [dashboardVariableFilterRules, setDashboardVariableFilterRules] = useState<ISolidDashboardVariableFilterRule[]>([]);\n const dispatch = useDispatch();\n const visibleNavbar = useSelector((state: any) => state.navbarState?.visibleNavbar);\n const [filters, setFilters] = useState<SqlExpression[]>([]);\n const [isOpenSolidXAiPanel, setIsOpenSolidXAiPanel] = useState(false);\n const [chatterWidth, setChatterWidth] = useState(380);\n const [isResizing, setIsResizing] = useState(false);\n const [questions, setQuestions] = useState<any[]>([]);\n const [dashboardVariables, setDashboardVariables] = useState<DashboardVariableRecord[]>([]);\n\n\n useEffect(() => {\n // Invoke the dashboard api to fetch the dashboard data\n // console.log('Dashboard Data testing:', isLoading, data, error);\n if (!isLoading && data) {\n // Assuming data contains the layout options\n handleDashboardData(data, setDashboardVariables, setQuestions);\n }\n }, [isLoading, data]);\n\n useEffect(() => {\n const storedOpen = localStorage.getItem('d_solidxai_open');\n const storedWidth = localStorage.getItem('d_solidxai_width');\n\n if (storedOpen !== null) {\n setIsOpenSolidXAiPanel(storedOpen === 'true');\n }\n\n if (storedWidth !== null) {\n const width = parseInt(storedWidth, 10);\n if (!isNaN(width)) {\n setChatterWidth(width);\n }\n }\n }, []);\n\n\n useEffect(() => {\n if (isResizing) {\n const handleMouseMove = (e: MouseEvent) => {\n const newWidth = window.innerWidth - e.clientX;\n const clampedWidth = Math.max(280, Math.min(newWidth, 700));\n setChatterWidth(clampedWidth);\n localStorage.setItem('d_solidxai_width', clampedWidth.toString());\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [isResizing]);\n\n\n const handleOpen = () => {\n setIsOpenSolidXAiPanel(true);\n localStorage.setItem('d_solidxai_open', 'true');\n };\n\n const handleClose = () => {\n setIsOpenSolidXAiPanel(false);\n localStorage.setItem('d_solidxai_open', 'false');\n };\n\n const toggleBothSidebars = () => {\n if (visibleNavbar) {\n dispatch(toggleNavbar()); // close both\n } else {\n dispatch(showNavbar()); // open both\n }\n };\n\n\n\n const [mcpUrl, setMcpUrl] = useState<string | null>(null);\n const [getMcpUrl] = useLazyGetMcpUrlQuery();\n\n const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();\n useEffect(() => {\n trigger(\"\") // Fetch settings on mount\n }, [])\n\n useEffect(() => {\n if (solidSettingsData?.data?.mcpEnabled && solidSettingsData?.data?.mcpServerUrl) {\n enableSolidXAiPanel();\n }\n }, [solidSettingsData]);\n\n const enableSolidXAiPanel = async () => {\n try {\n const queryData = {\n showHeader: \"true\",\n inListView: \"true\"\n };\n const queryString = qs.stringify({ ...queryData }, { encodeValuesOnly: true });\n const response = await getMcpUrl(queryString).unwrap();\n console.log(\"response\", response);\n if (response && response?.data?.mcpUrl) {\n setMcpUrl(response?.data?.mcpUrl);\n }\n } catch (error) {\n\n }\n }\n\n\n return (\n <div className={`h-screen surface-0 flex`}>\n <div className={`h-full flex-grow-1 ${styles.SolidDashboardPageContentWrapper}`}>\n {isLoading && <SolidDashboardLoading />}\n {error && <SolidDashboardRenderError />}\n {!isLoading && !error && data && data.records.length === 0 && (\n <SolidDashboardNotAvailable />\n )}\n {!isLoading && !error && data && data.records.length > 0 && (\n <>\n <div className=\"page-header\" style={{ borderBottom: '1px solid var(--primary-light-color)' }}>\n <div className='flex align-items-center gap-2'>\n <div className=\"apps-icon block md:hidden cursor-pointer\" onClick={toggleBothSidebars}>\n <i className=\"pi pi-th-large\"></i>\n </div>\n <p className={`view-title solid-text-wrapper flex align-items-center gap-1 ${styles.SolidDashboardTitle}`}>\n {data?.records[0]?.displayName ? data?.records[0]?.displayName : data?.records[0]?.name}\n {data?.records[0]?.description &&\n <>\n <Tooltip className='solid-field-tooltip' target=\".solid-field-tooltip-icon\" />\n <i className=\"pi pi-info-circle solid-field-tooltip-icon\"\n data-pr-tooltip={data?.records[0]?.description}\n data-pr-position={'right'}\n />\n </>\n }\n </p>\n </div>\n {dashboardVariables && dashboardVariables.length > 0 && <SolidDashboardVariable dashboardVariables={dashboardVariables} filters={filters} setFilters={setFilters} />}\n </div>\n {!isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardFilterRequired />}\n {isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardBody questions={questions} filters={filters} />}\n </>\n )}\n </div>\n {mcpUrl && (\n <div className={`chatter-section ${isOpenSolidXAiPanel === false ? 'collapsed' : 'open'}`} style={{ width: chatterWidth }}>\n {isOpenSolidXAiPanel && (\n <div\n style={{\n width: 5,\n cursor: 'col-resize',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n height: '100%',\n zIndex: 9,\n }}\n onMouseDown={() => setIsResizing(true)}\n />\n )}\n {isOpenSolidXAiPanel &&\n <Button\n icon=\"pi pi-angle-double-right\"\n size=\"small\"\n text\n className=\"chatter-collapse-btn\"\n style={{ width: 30, height: 30, aspectRatio: '1/1' }}\n onClick={handleClose}\n />\n }\n\n {isOpenSolidXAiPanel === false ?\n <div className=\"flex flex-column gap-2 justify-content-center p-2\">\n <div className=\"chatter-collapsed-content\" onClick={handleOpen}>\n <div className=\"flex gap-2\"> <SolidXAIIcon /> SolidX AI </div>\n </div>\n <Button\n icon=\"pi pi-chevron-left\"\n size=\"small\"\n className=\"px-0\"\n style={{ width: 30 }}\n onClick={handleOpen}\n />\n </div>\n :\n <SolidAiMainWrapper mcpUrl={mcpUrl} />\n }\n </div>\n )}\n\n </div>\n );\n}\n\nexport default SolidDashboard;\n"]}
|
|
1
|
+
{"version":3,"file":"SolidDashboard.js","sourceRoot":"","sources":["../../../../src/components/core/dashboard/SolidDashboard.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAqB,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE1F,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAA4B,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAE1G,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,sCAAa,CAAA;IACb,6DAAoC,CAAA;IACpC,+DAAsC,CAAA;AACxC,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AAED,IAAK,WAGJ;AAHD,WAAK,WAAW;IACd,0BAAW,CAAA;IACX,oCAAqB,CAAA;AACvB,CAAC,EAHI,WAAW,KAAX,WAAW,QAGf;AAeD,SAAS,mBAAmB,CAC1B,IAAuB,EACvB,qBAA0E,EAC1E,YAA6C;IAErC,IAAA,OAAO,GAAW,IAAI,QAAf,EAAE,IAAI,GAAK,IAAI,KAAT,CAAU;IAC/B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACjC,gDAAgD;QAChD,IAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,uCAAuC;QAEzE,8BAA8B;QAC9B,qBAAqB,CAAC,aAAa,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAE9D,8BAA8B;QAC9B,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;KAEtC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,WAAoB,EAAE,aAAsB;IACtF,IAAM,OAAO,GAAQ;QACnB,MAAM,EAAE;YACN,IAAI,EAAE;gBACJ,GAAG,EAAE,UAAU;aAChB;SACF;KACF,CAAC;IAEF,IAAI,WAAW,KAAK,SAAS,EAAE;QAC7B,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;KACnC;SAAM,IAAI,aAAa,KAAK,SAAS,EAAE;QACtC,OAAO,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;KACvC;IAED,IAAM,KAAK,GAAG;QACZ,OAAO,SAAA;QACP,QAAQ,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC;KAC9C,CAAC;IACF,IAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;QACnC,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qCAAqC;AACrC,mCAAmC;AACnC,MAAM;AACN,IAAI;AACJ,8IAA8I;AAC9I,MAAM;AACN,sCAAsC;AACtC,IAAI;AACJ,GAAG;AACH,SAAS,qBAAqB,CAAC,SAAgB,EAAE,kBAA6C,EAAE,OAAwB;IACtH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,OAAO,KAAK,CAAC;KACd;IAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;QACnC,OAAO,IAAI,CAAC;KACb;IAED,sEAAsE;IACtE,IAAM,oBAAoB,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAA,QAAQ;QAC5D,OAAA,OAAO,CAAC,IAAI,CAAC,UAAA,MAAM,IAAI,OAAA,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,EAA7C,CAA6C,CAAC;IAArE,CAAqE,CACtE,CAAC;IAEF,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAQD,IAAM,cAAc,GAAG,UAAC,MAA+B;;IAC/C,IAAA,KAA6B,oBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,EAA5H,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAsG,CAAA,CAAC,iDAAiD;IACtL,4HAA4H;IAC5H,gJAAgJ;IAChJ,sKAAsK;IACtK,oCAAoC;IACpC,8EAA8E;IAC9E,iBAAiB;IACjB,mBAAmB;IACnB,MAAM;IAEN,6EAA6E;IAC7E,6HAA6H;IAC7H,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,aAAa,GAAG,WAAW,CAAC,UAAC,KAAU,YAAK,OAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,aAAa,CAAA,EAAA,CAAC,CAAC;IAC9E,IAAA,KAAwB,QAAQ,CAAkB,EAAE,CAAC,EAApD,OAAO,QAAA,EAAE,UAAU,QAAiC,CAAC;IACtD,IAAA,KAAgD,QAAQ,CAAC,KAAK,CAAC,EAA9D,mBAAmB,QAAA,EAAE,sBAAsB,QAAmB,CAAC;IAChE,IAAA,KAAkC,QAAQ,CAAC,GAAG,CAAC,EAA9C,YAAY,QAAA,EAAE,eAAe,QAAiB,CAAC;IAChD,IAAA,KAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,QAAA,EAAE,aAAa,QAAmB,CAAC;IAC9C,IAAA,KAA4B,QAAQ,CAAQ,EAAE,CAAC,EAA9C,SAAS,QAAA,EAAE,YAAY,QAAuB,CAAC;IAChD,IAAA,KAA8C,QAAQ,CAA4B,EAAE,CAAC,EAApF,kBAAkB,QAAA,EAAE,qBAAqB,QAA2C,CAAC;IACtF,IAAA,KAA0D,QAAQ,CAAC,KAAK,CAAC,EAAxE,wBAAwB,QAAA,EAAE,2BAA2B,QAAmB,CAAC;IAGhF,SAAS,CAAC;QACR,uDAAuD;QACvD,kEAAkE;QAClE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;YACtB,4CAA4C;YAC5C,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAC;SAChE;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC;QACR,IAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAE7D,IAAI,UAAU,KAAK,IAAI,EAAE;YACvB,sBAAsB,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;SAC/C;QAED,IAAI,WAAW,KAAK,IAAI,EAAE;YACxB,IAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACjB,eAAe,CAAC,KAAK,CAAC,CAAC;aACxB;SACF;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,SAAS,CAAC;QACR,IAAI,UAAU,EAAE;YACd,IAAM,iBAAe,GAAG,UAAC,CAAa;gBACpC,IAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC/C,IAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC9B,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC;YAEF,IAAM,eAAa,GAAG;gBACpB,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,iBAAe,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAa,CAAC,CAAC;YAElD,OAAO;gBACL,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,iBAAe,CAAC,CAAC;gBACzD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAa,CAAC,CAAC;YACvD,CAAC,CAAC;SACH;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAGjB,IAAM,UAAU,GAAG;QACjB,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,IAAM,WAAW,GAAG;QAClB,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9B,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,IAAM,kBAAkB,GAAG;QACzB,IAAI,aAAa,EAAE;YACjB,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAG,aAAa;SAC1C;aAAM;YACL,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAK,YAAY;SACzC;IACH,CAAC,CAAC;IAII,IAAA,KAAsB,QAAQ,CAAgB,IAAI,CAAC,EAAlD,MAAM,QAAA,EAAE,SAAS,QAAiC,CAAC;IACnD,IAAA,SAAS,GAAI,qBAAqB,EAAE,GAA3B,CAA4B;IAEtC,IAAA,KAAyC,4BAA4B,EAAE,EAAtE,OAAO,QAAA,EAAU,iBAAiB,aAAoC,CAAC;IAC9E,SAAS,CAAC;QACR,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC,0BAA0B;IACxC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,SAAS,CAAC;;QACR,IAAI,CAAA,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,IAAI,0CAAE,UAAU,MAAI,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,IAAI,0CAAE,YAAY,CAAA,EAAE;YAChF,mBAAmB,EAAE,CAAC;SACvB;IACH,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,IAAM,mBAAmB,GAAG;;;;;;;oBAElB,SAAS,GAAG;wBAChB,UAAU,EAAE,MAAM;wBAClB,UAAU,EAAE,MAAM;qBACnB,CAAC;oBACI,WAAW,GAAG,EAAE,CAAC,SAAS,cAAM,SAAS,GAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9D,qBAAM,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAA;;oBAAhD,QAAQ,GAAG,SAAqC;oBACtD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBAClC,IAAI,QAAQ,KAAI,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,0CAAE,MAAM,CAAA,EAAE;wBACtC,SAAS,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,0CAAE,MAAM,CAAC,CAAC;qBACnC;;;;;;;;SAIJ,CAAA;IAGD,OAAO,CACL,eAAK,SAAS,EAAE,yBAAyB,aACvC,eAAK,SAAS,EAAE,6BAAsB,MAAM,CAAC,gCAAgC,CAAE,aAC5E,SAAS,IAAI,KAAC,qBAAqB,KAAG,EACtC,KAAK,IAAI,KAAC,yBAAyB,KAAG,EACtC,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAC5D,KAAC,0BAA0B,KAAG,CAC/B,EACA,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1D,8BACE,eAAK,SAAS,EAAC,aAAa,EAAC,KAAK,EAAE,EAAE,YAAY,EAAE,sCAAsC,EAAE,aAC1F,eAAK,SAAS,EAAC,+BAA+B,aAC5C,cAAK,SAAS,EAAC,0CAA0C,EAAC,OAAO,EAAE,kBAAkB,YACnF,YAAG,SAAS,EAAC,gBAAgB,GAAK,GAC9B,EACN,aAAG,SAAS,EAAE,sEAA+D,MAAM,CAAC,mBAAmB,CAAE,aACtG,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,0CAAE,WAAW,EAAC,CAAC,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,0CAAE,WAAW,CAAC,CAAC,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,0CAAE,IAAI,EACtF,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,0CAAE,WAAW;wDAC5B,8BACE,KAAC,OAAO,IAAC,SAAS,EAAC,qBAAqB,EAAC,MAAM,EAAC,2BAA2B,GAAG,EAC9E,YAAG,SAAS,EAAC,4CAA4C,qBACtC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,0CAAE,WAAW,sBAC5B,OAAO,GACzB,IACD,IAEH,IACA,EACL,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,CACtD,8BACE,eAAK,SAAS,EAAC,YAAY,aACzB,KAAC,MAAM,IACL,KAAK,EAAC,QAAQ,EACd,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,EAC/D,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAC9B,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EACnD,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,EACpE,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,cAAM,OAAA,2BAA2B,CAAC,IAAI,CAAC,EAAjC,CAAiC,GAChD,EACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,KAAC,MAAM;oDACL,wBAAwB;;wDAAxB,wBAAwB;wDACxB,IAAI,EAAC,oBAAoB,EACzB,QAAQ,EAAC,QAAQ,EACjB,OAAO,EAAE,cAAQ,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACtE,CACH,IACG,EACN,KAAC,eAAe,IACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,cAAM,OAAA,2BAA2B,CAAC,KAAK,CAAC,EAAlC,CAAkC,GAChD,IACD,CACJ,IACG,EACL,CAAC,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,CAAC,IAAI,KAAC,4BAA4B,KAAG,EAClG,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,CAAC,IAAI,KAAC,kBAAkB,IAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAI,IAC/H,CACJ,IACG,EACL,MAAM,IAAI,CACT,eAAK,SAAS,EAAE,0BAAmB,mBAAmB,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,aACtH,mBAAmB,IAAI,CACtB,cACE,KAAK,EAAE;4BACL,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,YAAY;4BACpB,QAAQ,EAAE,UAAU;4BACpB,IAAI,EAAE,CAAC;4BACP,GAAG,EAAE,CAAC;4BACN,MAAM,EAAE,CAAC;4BACT,MAAM,EAAE,MAAM;4BACd,MAAM,EAAE,CAAC;yBACV,EACD,WAAW,EAAE,cAAM,OAAA,aAAa,CAAC,IAAI,CAAC,EAAnB,CAAmB,GACtC,CACH,EACA,mBAAmB;wBAClB,KAAC,MAAM,IACL,IAAI,EAAC,0BAA0B,EAC/B,IAAI,EAAC,OAAO,EACZ,IAAI,QACJ,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EACpD,OAAO,EAAE,WAAW,GACpB,EAGH,mBAAmB,KAAK,KAAK,CAAC,CAAC;wBAC9B,eAAK,SAAS,EAAC,mDAAmD,aAChE,cAAK,SAAS,EAAC,2BAA2B,EAAC,OAAO,EAAE,UAAU,YAC5D,eAAK,SAAS,EAAC,YAAY,kBAAE,KAAC,YAAY,KAAG,mBAAiB,GAC1D,EACN,KAAC,MAAM,IACL,IAAI,EAAC,oBAAoB,EACzB,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,MAAM,EAChB,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EACpB,OAAO,EAAE,UAAU,GACnB,IACE;wBACN,CAAC;4BACD,KAAC,kBAAkB,IAAC,MAAM,EAAE,MAAM,GAAI,IAEpC,CACP,IAEG,CACP,CAAC;AACJ,CAAC,CAAA;AAED,eAAe,cAAc,CAAC","sourcesContent":["\nimport { DashboardResponse, useGetDashboardQuery } from '../../../redux/api/dashboardApi';\nimport { SqlExpression } from '../../../types/solid-core';\nimport { Button } from 'primereact/button';\nimport { Tooltip } from \"primereact/tooltip\";\nimport qs from 'qs';\nimport { Dispatch, SetStateAction, useEffect, useState } from 'react';\nimport { SolidXAIIcon } from '../solid-ai/SolidXAIIcon';\nimport styles from './SolidDashboard.module.css';\nimport SolidDashboardBody from './SolidDashboardBody';\nimport { DashboardFilter } from './DashboardFilter';\nimport { SolidAiMainWrapper } from '../solid-ai/SolidAiMainWrapper';\nimport { SolidDashboardFilterRequired } from './SolidDashboardFilterRequired';\nimport { SolidDashboardLoading } from './SolidDashboardLoading';\nimport { SolidDashboardRenderError } from './SolidDashboardRenderError';\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { showNavbar, toggleNavbar } from \"../../../redux/features/navbarSlice\";\nimport SolidDashboardNotAvailable from './SolidDashboardNotAvailable';\nimport { useLazyGetMcpUrlQuery, useLazyGetSolidSettingsQuery } from '../../../redux/api/solidSettingsApi';\n\nexport enum DashboardVariableType {\n DATE = 'date',\n SELECTION_STATIC = 'selectionStatic',\n SELECTION_DYNAMIC = 'selectionDynamic',\n}\n\nenum SOURCE_TYPE {\n SQL = 'sql',\n PROVIDER = 'provider',\n}\n\nexport interface DashboardVariableRecord {\n id: number;\n variableName: string;\n variableType: DashboardVariableType;\n selectionStaticValues?: string;\n selectionDynamicSourceType?: SOURCE_TYPE;\n selectionDynamicProviderName?: string;\n selectionDynamicSQL?: string;\n isMultiSelect?: boolean;\n defaultValue?: string;\n defaultOperator?: string;\n}\n\nfunction handleDashboardData(\n data: DashboardResponse,\n setDashboardVariables: Dispatch<SetStateAction<DashboardVariableRecord[]>>,\n setQuestions: Dispatch<SetStateAction<any[]>>,\n) {\n const { records, meta } = data;\n if (records && records.length > 0) {\n // Set the layout options for the dashboard body\n const dashboardData = records[0]; // Assuming we want the first dashboard\n\n // Set the dashboard variables\n setDashboardVariables(dashboardData.dashboardVariables || []);\n\n // Set the dashboard questions\n setQuestions(dashboardData.questions)\n\n }\n}\n\nfunction getQueryParams(moduleName: string, dashboardId?: number, dashboardName?: string) {\n const filters: any = {\n module: {\n name: {\n $eq: moduleName\n }\n }\n };\n\n if (dashboardId !== undefined) {\n filters.id = { $eq: dashboardId };\n } else if (dashboardName !== undefined) {\n filters.name = { $eq: dashboardName };\n }\n\n const query = {\n filters,\n populate: ['dashboardVariables', 'questions']\n };\n const urlQuery = qs.stringify(query, {\n encodeValuesOnly: true,\n });\n return urlQuery;\n}\n\n// Render the dashboard body only if:\n// 1. There are dashboard questions\n// AND\n// (\n// 1. There are dashboard variables and all dashboard variable filter rules have been applied i.e (all dashboard variables have been selected)\n//. OR\n// 2. There are no dashboard variables\n// )\n// \nfunction isRenderDashboardBody(questions: any[], dashboardVariables: DashboardVariableRecord[], filters: SqlExpression[]) {\n if (questions.length === 0) {\n return false;\n }\n\n if (dashboardVariables.length === 0) {\n return true;\n }\n\n // Check if all dashboard variables have corresponding filters applied\n const allVariablesFiltered = dashboardVariables.every(variable =>\n filters.some(filter => filter.variableName === variable.variableName)\n );\n\n return allVariablesFiltered;\n}\n\ntype SolidDashboardViewProps = {\n moduleName: string;\n dashboardId?: number;\n dashboardName?: string;\n};\n\nconst SolidDashboard = (params: SolidDashboardViewProps) => {\n const { data, isLoading, error } = useGetDashboardQuery(getQueryParams(params.moduleName, params.dashboardId, params.dashboardName)) // FIXME : error handling should be done properly\n // Define a state called layoutOption and pass it after destructing the widgetOptions and dashboardOptions from layoutOption\n // TODO [HP]: Shouldn't the type of this state variable be something different? Why are we muddling this with layout but calling it body props? \n // TODO [HP]: Body props should be clearly made up of Gridstack layout options, the questions that make up the body & the filter[] which is an array of SqlExpressions\n // TODO [HP]: This is fully CONFUSED\n // const [layoutOption, setLayoutOption] = useState<SolidDashboardBodyProps>({\n // filters: [],\n // questions: [],\n // });\n\n // TODO [HP]: replace dashboardVariableFilterRules with filters everywhere...\n // const [dashboardVariableFilterRules, setDashboardVariableFilterRules] = useState<ISolidDashboardVariableFilterRule[]>([]);\n const dispatch = useDispatch();\n const visibleNavbar = useSelector((state: any) => state.navbarState?.visibleNavbar);\n const [filters, setFilters] = useState<SqlExpression[]>([]);\n const [isOpenSolidXAiPanel, setIsOpenSolidXAiPanel] = useState(false);\n const [chatterWidth, setChatterWidth] = useState(380);\n const [isResizing, setIsResizing] = useState(false);\n const [questions, setQuestions] = useState<any[]>([]);\n const [dashboardVariables, setDashboardVariables] = useState<DashboardVariableRecord[]>([]);\n const [isDashboardFilterVisible, setIsDashboardFilterVisible] = useState(false);\n\n\n useEffect(() => {\n // Invoke the dashboard api to fetch the dashboard data\n // console.log('Dashboard Data testing:', isLoading, data, error);\n if (!isLoading && data) {\n // Assuming data contains the layout options\n handleDashboardData(data, setDashboardVariables, setQuestions);\n }\n }, [isLoading, data]);\n\n useEffect(() => {\n const storedOpen = localStorage.getItem('d_solidxai_open');\n const storedWidth = localStorage.getItem('d_solidxai_width');\n\n if (storedOpen !== null) {\n setIsOpenSolidXAiPanel(storedOpen === 'true');\n }\n\n if (storedWidth !== null) {\n const width = parseInt(storedWidth, 10);\n if (!isNaN(width)) {\n setChatterWidth(width);\n }\n }\n }, []);\n\n\n useEffect(() => {\n if (isResizing) {\n const handleMouseMove = (e: MouseEvent) => {\n const newWidth = window.innerWidth - e.clientX;\n const clampedWidth = Math.max(280, Math.min(newWidth, 700));\n setChatterWidth(clampedWidth);\n localStorage.setItem('d_solidxai_width', clampedWidth.toString());\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [isResizing]);\n\n\n const handleOpen = () => {\n setIsOpenSolidXAiPanel(true);\n localStorage.setItem('d_solidxai_open', 'true');\n };\n\n const handleClose = () => {\n setIsOpenSolidXAiPanel(false);\n localStorage.setItem('d_solidxai_open', 'false');\n };\n\n const toggleBothSidebars = () => {\n if (visibleNavbar) {\n dispatch(toggleNavbar()); // close both\n } else {\n dispatch(showNavbar()); // open both\n }\n };\n\n\n\n const [mcpUrl, setMcpUrl] = useState<string | null>(null);\n const [getMcpUrl] = useLazyGetMcpUrlQuery();\n\n const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();\n useEffect(() => {\n trigger(\"\") // Fetch settings on mount\n }, [])\n\n useEffect(() => {\n if (solidSettingsData?.data?.mcpEnabled && solidSettingsData?.data?.mcpServerUrl) {\n enableSolidXAiPanel();\n }\n }, [solidSettingsData]);\n\n const enableSolidXAiPanel = async () => {\n try {\n const queryData = {\n showHeader: \"true\",\n inListView: \"true\"\n };\n const queryString = qs.stringify({ ...queryData }, { encodeValuesOnly: true });\n const response = await getMcpUrl(queryString).unwrap();\n console.log(\"response\", response);\n if (response && response?.data?.mcpUrl) {\n setMcpUrl(response?.data?.mcpUrl);\n }\n } catch (error) {\n\n }\n }\n\n\n return (\n <div className={`h-screen surface-0 flex`}>\n <div className={`h-full flex-grow-1 ${styles.SolidDashboardPageContentWrapper}`}>\n {isLoading && <SolidDashboardLoading />}\n {error && <SolidDashboardRenderError />}\n {!isLoading && !error && data && data.records.length === 0 && (\n <SolidDashboardNotAvailable />\n )}\n {!isLoading && !error && data && data.records.length > 0 && (\n <>\n <div className=\"page-header\" style={{ borderBottom: '1px solid var(--primary-light-color)' }}>\n <div className='flex align-items-center gap-2'>\n <div className=\"apps-icon block md:hidden cursor-pointer\" onClick={toggleBothSidebars}>\n <i className=\"pi pi-th-large\"></i>\n </div>\n <p className={`view-title solid-text-wrapper flex align-items-center gap-1 ${styles.SolidDashboardTitle}`}>\n {data?.records[0]?.displayName ? data?.records[0]?.displayName : data?.records[0]?.name}\n {data?.records[0]?.description &&\n <>\n <Tooltip className='solid-field-tooltip' target=\".solid-field-tooltip-icon\" />\n <i className=\"pi pi-info-circle solid-field-tooltip-icon\"\n data-pr-tooltip={data?.records[0]?.description}\n data-pr-position={'right'}\n />\n </>\n }\n </p>\n </div>\n {dashboardVariables && dashboardVariables.length > 0 && (\n <>\n <div className='flex gap-2'>\n <Button\n label=\"Filter\"\n icon={filters.length > 0 ? \"pi pi-filter-fill\" : \"pi pi-filter\"}\n outlined={filters.length === 0}\n severity={filters.length > 0 ? \"info\" : \"secondary\"}\n style={filters.length > 0 ? { background: \"rgb(114, 46, 209)\" } : {}}\n size=\"small\"\n onClick={() => setIsDashboardFilterVisible(true)}\n />\n {filters.length > 0 && (\n <Button\n // label=\"Clear Filters\"\n icon=\"pi pi-filter-slash\"\n severity=\"danger\"\n onClick={() => { setFilters([]); setIsDashboardFilterVisible(false); }}\n />\n )}\n </div>\n <DashboardFilter\n dashboardVariables={dashboardVariables}\n initialFilters={filters}\n onApply={setFilters}\n visible={isDashboardFilterVisible}\n onHide={() => setIsDashboardFilterVisible(false)}\n />\n </>\n )}\n </div>\n {!isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardFilterRequired />}\n {isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardBody questions={questions} filters={filters} />}\n </>\n )}\n </div>\n {mcpUrl && (\n <div className={`chatter-section ${isOpenSolidXAiPanel === false ? 'collapsed' : 'open'}`} style={{ width: chatterWidth }}>\n {isOpenSolidXAiPanel && (\n <div\n style={{\n width: 5,\n cursor: 'col-resize',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n height: '100%',\n zIndex: 9,\n }}\n onMouseDown={() => setIsResizing(true)}\n />\n )}\n {isOpenSolidXAiPanel &&\n <Button\n icon=\"pi pi-angle-double-right\"\n size=\"small\"\n text\n className=\"chatter-collapse-btn\"\n style={{ width: 30, height: 30, aspectRatio: '1/1' }}\n onClick={handleClose}\n />\n }\n\n {isOpenSolidXAiPanel === false ?\n <div className=\"flex flex-column gap-2 justify-content-center p-2\">\n <div className=\"chatter-collapsed-content\" onClick={handleOpen}>\n <div className=\"flex gap-2\"> <SolidXAIIcon /> SolidX AI </div>\n </div>\n <Button\n icon=\"pi pi-chevron-left\"\n size=\"small\"\n className=\"px-0\"\n style={{ width: 30 }}\n onClick={handleOpen}\n />\n </div>\n :\n <SolidAiMainWrapper mcpUrl={mcpUrl} />\n }\n </div>\n )}\n\n </div>\n );\n}\n\nexport default SolidDashboard;\n"]}
|
|
@@ -8,7 +8,7 @@ import { Dispatch, SetStateAction, useEffect, useState } from 'react';
|
|
|
8
8
|
import { SolidXAIIcon } from '../solid-ai/SolidXAIIcon';
|
|
9
9
|
import styles from './SolidDashboard.module.css';
|
|
10
10
|
import SolidDashboardBody from './SolidDashboardBody';
|
|
11
|
-
import
|
|
11
|
+
import { DashboardFilter } from './DashboardFilter';
|
|
12
12
|
import { SolidAiMainWrapper } from '../solid-ai/SolidAiMainWrapper';
|
|
13
13
|
import { SolidDashboardFilterRequired } from './SolidDashboardFilterRequired';
|
|
14
14
|
import { SolidDashboardLoading } from './SolidDashboardLoading';
|
|
@@ -139,6 +139,7 @@ const SolidDashboard = (params: SolidDashboardViewProps) => {
|
|
|
139
139
|
const [isResizing, setIsResizing] = useState(false);
|
|
140
140
|
const [questions, setQuestions] = useState<any[]>([]);
|
|
141
141
|
const [dashboardVariables, setDashboardVariables] = useState<DashboardVariableRecord[]>([]);
|
|
142
|
+
const [isDashboardFilterVisible, setIsDashboardFilterVisible] = useState(false);
|
|
142
143
|
|
|
143
144
|
|
|
144
145
|
useEffect(() => {
|
|
@@ -271,7 +272,36 @@ const SolidDashboard = (params: SolidDashboardViewProps) => {
|
|
|
271
272
|
}
|
|
272
273
|
</p>
|
|
273
274
|
</div>
|
|
274
|
-
{dashboardVariables && dashboardVariables.length > 0 &&
|
|
275
|
+
{dashboardVariables && dashboardVariables.length > 0 && (
|
|
276
|
+
<>
|
|
277
|
+
<div className='flex gap-2'>
|
|
278
|
+
<Button
|
|
279
|
+
label="Filter"
|
|
280
|
+
icon={filters.length > 0 ? "pi pi-filter-fill" : "pi pi-filter"}
|
|
281
|
+
outlined={filters.length === 0}
|
|
282
|
+
severity={filters.length > 0 ? "info" : "secondary"}
|
|
283
|
+
style={filters.length > 0 ? { background: "rgb(114, 46, 209)" } : {}}
|
|
284
|
+
size="small"
|
|
285
|
+
onClick={() => setIsDashboardFilterVisible(true)}
|
|
286
|
+
/>
|
|
287
|
+
{filters.length > 0 && (
|
|
288
|
+
<Button
|
|
289
|
+
// label="Clear Filters"
|
|
290
|
+
icon="pi pi-filter-slash"
|
|
291
|
+
severity="danger"
|
|
292
|
+
onClick={() => { setFilters([]); setIsDashboardFilterVisible(false); }}
|
|
293
|
+
/>
|
|
294
|
+
)}
|
|
295
|
+
</div>
|
|
296
|
+
<DashboardFilter
|
|
297
|
+
dashboardVariables={dashboardVariables}
|
|
298
|
+
initialFilters={filters}
|
|
299
|
+
onApply={setFilters}
|
|
300
|
+
visible={isDashboardFilterVisible}
|
|
301
|
+
onHide={() => setIsDashboardFilterVisible(false)}
|
|
302
|
+
/>
|
|
303
|
+
</>
|
|
304
|
+
)}
|
|
275
305
|
</div>
|
|
276
306
|
{!isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardFilterRequired />}
|
|
277
307
|
{isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardBody questions={questions} filters={filters} />}
|
|
@@ -84,7 +84,7 @@ import { setFilterObjectToLocalStorage, getFilterObjectFromLocalStorage } from "
|
|
|
84
84
|
import { Toast } from "primereact/toast";
|
|
85
85
|
import { ERROR_MESSAGES } from "../../../constants/error-messages";
|
|
86
86
|
import { showNavbar, toggleNavbar } from "../../../redux/features/navbarSlice";
|
|
87
|
-
import {
|
|
87
|
+
import { normalizeSolidListTreeKanbanActionPath } from "../../../helpers/routePaths";
|
|
88
88
|
import showToast from "../../../helpers/showToast";
|
|
89
89
|
export var SolidKanbanView = function (params) {
|
|
90
90
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
@@ -254,7 +254,7 @@ export var SolidKanbanView = function (params) {
|
|
|
254
254
|
var _21 = useState(false), showSaveFilterPopup = _21[0], setShowSaveFilterPopup = _21[1];
|
|
255
255
|
var _22 = useState(0), maxSwimLanesCount = _22[0], setMaxSwimLanesCount = _22[1];
|
|
256
256
|
// @ts-ignore
|
|
257
|
-
var editBaseUrl =
|
|
257
|
+
var editBaseUrl = normalizeSolidListTreeKanbanActionPath(pathname, editButtonUrl || "form");
|
|
258
258
|
// Get the kanban view data.
|
|
259
259
|
// const [triggerGetSolidEntitiesForKanban, { data: solidEntityKanbanViewData, isLoading, error }] = useLazyGetSolidKanbanEntitiesQuery();
|
|
260
260
|
var _23 = useLazyGetSolidEntitiesQuery(), triggerGetSolidEntities = _23[0], solidEntityKanbanViewData = _23[1].data;
|