@solidxai/core-ui 0.1.5-beta.1 → 0.1.5-beta.11
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/chatter/SolidChatterDateDivider.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.js +4 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.tsx +5 -1
- 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/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +1 -0
- 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/PrimeDataTableWrapper.d.ts +3 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.d.ts.map +1 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.js +21 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.js.map +1 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.tsx +40 -0
- package/dist/components/core/dashboard/SolidDashboard.d.ts +0 -1
- package/dist/components/core/dashboard/SolidDashboard.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.js +51 -22
- package/dist/components/core/dashboard/SolidDashboard.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.module.css +6 -2
- package/dist/components/core/dashboard/SolidDashboard.tsx +133 -56
- package/dist/components/core/dashboard/SolidDashboardBody.d.ts +13 -1
- package/dist/components/core/dashboard/SolidDashboardBody.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboardBody.js +134 -48
- package/dist/components/core/dashboard/SolidDashboardBody.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboardBody.tsx +143 -91
- package/dist/components/core/dashboard/SolidQuestionRenderer.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.js +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.js.map +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.tsx +12 -10
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.d.ts.map +1 -1
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js +29 -2
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js.map +1 -1
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.tsx +33 -3
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts +10 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js +16 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.ts +19 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts +8 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js +64 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.ts +30 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts +8 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js +62 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.ts +29 -0
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +2 -2
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +2 -2
- package/dist/components/core/form/SolidFormView.js +1 -1
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.js +22 -15
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +14 -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.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +14 -11
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +8 -7
- package/dist/components/core/list/columns/SolidDateColumn.d.ts +2 -0
- package/dist/components/core/list/columns/SolidDateColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.js +9 -1
- package/dist/components/core/list/columns/SolidDateColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.tsx +13 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.js +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +1 -1
- 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/constants/error-messages.d.ts +3 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +3 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/constants/error-messages.ts +24 -20
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +10 -0
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +12 -0
- 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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.ts +8 -0
- package/dist/redux/api/dashboardLayoutApi.d.ts +24 -0
- package/dist/redux/api/dashboardLayoutApi.d.ts.map +1 -0
- package/dist/redux/api/dashboardLayoutApi.js +34 -0
- package/dist/redux/api/dashboardLayoutApi.js.map +1 -0
- package/dist/redux/api/dashboardLayoutApi.ts +55 -0
- package/dist/redux/store/defaultStoreConfig.d.ts +4 -0
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +3 -2
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +4 -2
- package/dist/resources/globals.css +8 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +3 -7
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -5
- package/dist/routes/pages/admin/core/FormPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/FormPage.js +6 -1
- package/dist/routes/pages/admin/core/FormPage.js.map +1 -1
- package/dist/routes/pages/admin/core/FormPage.tsx +7 -1
- package/dist/routes/solidRoutes.js +1 -1
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +1 -1
- package/package.json +13 -11
|
@@ -846,6 +846,7 @@ export const SolidGlobalSearchElement = forwardRef(({ viewData, viewType, handle
|
|
|
846
846
|
setPredefinedSearchBaseFilter(null);
|
|
847
847
|
setInputValue("");
|
|
848
848
|
|
|
849
|
+
|
|
849
850
|
let fieldsData = viewData?.data?.solidFieldsMetadata;
|
|
850
851
|
// console.log(`fiels data while rendering solid global search element: `);
|
|
851
852
|
// console.log(fieldsData);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { SqlExpression } from "../../../types/solid-core";
|
|
3
|
+
import { DashboardVariableRecord } from "./SolidDashboard";
|
|
4
|
+
interface DashboardFilterProps {
|
|
5
|
+
dashboardVariables: DashboardVariableRecord[];
|
|
6
|
+
initialFilters: SqlExpression[];
|
|
7
|
+
onApply: (filters: SqlExpression[]) => void;
|
|
8
|
+
visible: boolean;
|
|
9
|
+
onHide: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const DashboardFilter: React.FC<DashboardFilterProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=DashboardFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/core/dashboard/DashboardFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAK3D,UAAU,oBAAoB;IAC1B,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;IAC9C,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAqKD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA4K1D,CAAC"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
49
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
50
|
+
if (ar || !(i in from)) {
|
|
51
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
52
|
+
ar[i] = from[i];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
56
|
+
};
|
|
57
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
58
|
+
import { useState, useEffect } from "react";
|
|
59
|
+
import { Button } from "primereact/button";
|
|
60
|
+
import { Dialog } from "primereact/dialog";
|
|
61
|
+
import { Dropdown } from "primereact/dropdown";
|
|
62
|
+
import { Calendar } from "primereact/calendar";
|
|
63
|
+
import { AutoComplete } from "primereact/autocomplete";
|
|
64
|
+
import { useLazyGetDashboardVariableSelectionDynamicValuesQuery } from "../../../redux/api/dashboardApi";
|
|
65
|
+
import { Divider } from "primereact/divider";
|
|
66
|
+
import { Fieldset } from "primereact/fieldset";
|
|
67
|
+
var getNumberOfInputs = function (matchMode) {
|
|
68
|
+
switch (matchMode) {
|
|
69
|
+
case '$between': return 2;
|
|
70
|
+
case '$in':
|
|
71
|
+
case '$notIn': return null;
|
|
72
|
+
case '$startsWith':
|
|
73
|
+
case '$contains':
|
|
74
|
+
case '$notContains':
|
|
75
|
+
case '$endsWith':
|
|
76
|
+
case '$equals':
|
|
77
|
+
case '$notEquals':
|
|
78
|
+
case '$lt':
|
|
79
|
+
case '$lte':
|
|
80
|
+
case '$gt':
|
|
81
|
+
case '$gte': return 1;
|
|
82
|
+
case '$null':
|
|
83
|
+
case '$notNull': return 0;
|
|
84
|
+
default: return 1;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
var dateFilterMatchModeOptions = [
|
|
88
|
+
{ label: 'Equals', value: "$eq" },
|
|
89
|
+
{ label: 'Not Equals', value: "$nei" },
|
|
90
|
+
{ label: 'Less Than', value: "$lt" },
|
|
91
|
+
{ label: 'Less Than Or Equal', value: "$lte" },
|
|
92
|
+
{ label: 'Greater Than', value: "$gt" },
|
|
93
|
+
{ label: 'Greater Than Or Equal', value: "$gte" },
|
|
94
|
+
{ label: 'In', value: "$in" },
|
|
95
|
+
{ label: 'Not In', value: "$notIn" },
|
|
96
|
+
{ label: 'Between', value: "$between" }
|
|
97
|
+
];
|
|
98
|
+
var selectionFilterMatchModeOptions = [
|
|
99
|
+
{ label: 'In', value: "$in" },
|
|
100
|
+
{ label: 'Not In', value: "$notIn" }
|
|
101
|
+
];
|
|
102
|
+
var FilterValueInput = function (_a) {
|
|
103
|
+
var rule = _a.rule, onChange = _a.onChange;
|
|
104
|
+
var numberOfInputs = getNumberOfInputs(rule.matchMode);
|
|
105
|
+
// Ensure values is an array properly sized immediately on render
|
|
106
|
+
var values = Array.isArray(rule.value) ? __spreadArray([], rule.value, true) : (rule.value ? [rule.value] : []);
|
|
107
|
+
if (numberOfInputs !== null && numberOfInputs > 0 && values.length !== numberOfInputs) {
|
|
108
|
+
if (values.length < numberOfInputs) {
|
|
109
|
+
values = __spreadArray(__spreadArray([], values, true), Array(numberOfInputs - values.length).fill(''), true);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
values = values.slice(0, numberOfInputs);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (values.length === 0 && (numberOfInputs === null || numberOfInputs > 0)) {
|
|
116
|
+
values = [''];
|
|
117
|
+
}
|
|
118
|
+
var updateValue = function (index, val) {
|
|
119
|
+
var newValues = __spreadArray([], values, true);
|
|
120
|
+
newValues[index] = val;
|
|
121
|
+
onChange(rule.id, 'value', numberOfInputs === 1 ? newValues[0] : newValues);
|
|
122
|
+
};
|
|
123
|
+
var addInput = function () {
|
|
124
|
+
var newValues = __spreadArray(__spreadArray([], values, true), [''], false);
|
|
125
|
+
onChange(rule.id, 'value', newValues);
|
|
126
|
+
};
|
|
127
|
+
var deleteInput = function (index) {
|
|
128
|
+
if (values.length > 1) {
|
|
129
|
+
var newValues = values.filter(function (_, i) { return i !== index; });
|
|
130
|
+
onChange(rule.id, 'value', newValues);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
// Components for actual rendering
|
|
134
|
+
var renderDate = function (val, index) {
|
|
135
|
+
var dateVal = val ? new Date(val) : null;
|
|
136
|
+
if (isNaN((dateVal === null || dateVal === void 0 ? void 0 : dateVal.getTime()) || 0))
|
|
137
|
+
dateVal = null;
|
|
138
|
+
return (_jsx(Calendar, { value: dateVal, onChange: function (e) {
|
|
139
|
+
var dateStr = e.value ? e.value.toISOString().split('T')[0] : '';
|
|
140
|
+
updateValue(index, dateStr);
|
|
141
|
+
}, dateFormat: "mm/dd/yy", placeholder: "mm/dd/yyyy", mask: "99/99/9999", className: "w-full", inputClassName: "w-full p-inputtext-sm" }));
|
|
142
|
+
};
|
|
143
|
+
var SelectionStaticInput = function (_a) {
|
|
144
|
+
var val = _a.val, index = _a.index, updateValue = _a.updateValue, dv = _a.dv;
|
|
145
|
+
var _b = useState([]), filteredItems = _b[0], setFilteredItems = _b[1];
|
|
146
|
+
var staticValues = JSON.parse(dv.selectionStaticValues || '[]') || [];
|
|
147
|
+
var staticValueItems = staticValues.map(function (v) { return ({ value: v.split(':')[0], label: v.split(':')[1] }); });
|
|
148
|
+
var search = function (event) {
|
|
149
|
+
var query = event.query.toLowerCase();
|
|
150
|
+
var filtered = staticValueItems.filter(function (item) {
|
|
151
|
+
return item.label.toLowerCase().includes(query);
|
|
152
|
+
});
|
|
153
|
+
setFilteredItems(filtered);
|
|
154
|
+
};
|
|
155
|
+
return (_jsx(AutoComplete, { value: val, suggestions: filteredItems, completeMethod: search, onChange: function (e) { return updateValue(index, e.value); }, field: "label", dropdown: true, className: "w-full", inputClassName: "w-full p-inputtext-sm" }));
|
|
156
|
+
};
|
|
157
|
+
var SelectionDynamicInput = function (_a) {
|
|
158
|
+
var val = _a.val, index = _a.index, updateValue = _a.updateValue, dv = _a.dv;
|
|
159
|
+
var _b = useState([]), filteredItems = _b[0], setFilteredItems = _b[1];
|
|
160
|
+
var trigger = useLazyGetDashboardVariableSelectionDynamicValuesQuery()[0];
|
|
161
|
+
var search = function (event) { return __awaiter(void 0, void 0, void 0, function () {
|
|
162
|
+
var queryString, res, filtered, error_1;
|
|
163
|
+
return __generator(this, function (_a) {
|
|
164
|
+
switch (_a.label) {
|
|
165
|
+
case 0:
|
|
166
|
+
queryString = "variableId=".concat(dv.id, "&q=").concat(event.query);
|
|
167
|
+
_a.label = 1;
|
|
168
|
+
case 1:
|
|
169
|
+
_a.trys.push([1, 3, , 4]);
|
|
170
|
+
return [4 /*yield*/, trigger(queryString).unwrap()];
|
|
171
|
+
case 2:
|
|
172
|
+
res = _a.sent();
|
|
173
|
+
filtered = res.filter(function (item) {
|
|
174
|
+
return item.label.toLowerCase().includes(event.query.toLowerCase());
|
|
175
|
+
});
|
|
176
|
+
setFilteredItems(filtered);
|
|
177
|
+
return [3 /*break*/, 4];
|
|
178
|
+
case 3:
|
|
179
|
+
error_1 = _a.sent();
|
|
180
|
+
console.error(error_1);
|
|
181
|
+
return [3 /*break*/, 4];
|
|
182
|
+
case 4: return [2 /*return*/];
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}); };
|
|
186
|
+
return (_jsx(AutoComplete, { value: val, suggestions: filteredItems, completeMethod: search, onChange: function (e) { return updateValue(index, e.value); }, field: "label", dropdown: true, className: "w-full", inputClassName: "w-full p-inputtext-sm" }));
|
|
187
|
+
};
|
|
188
|
+
if (numberOfInputs === 0)
|
|
189
|
+
return _jsx(_Fragment, {});
|
|
190
|
+
return (_jsx("div", { className: "flex flex-column gap-2", children: values.map(function (val, index) { return (_jsxs("div", { className: "flex gap-2", children: [_jsxs("div", { className: "flex-grow-1", children: [rule.variable.variableType === 'date' && renderDate(val, index), rule.variable.variableType === 'selectionStatic' && _jsx(SelectionStaticInput, { val: val, index: index, updateValue: updateValue, dv: rule.variable }), rule.variable.variableType === 'selectionDynamic' && _jsx(SelectionDynamicInput, { val: val, index: index, updateValue: updateValue, dv: rule.variable })] }), numberOfInputs === null && (_jsxs("div", { className: "flex align-items-center", children: [_jsx(Button, { type: "button", text: true, severity: 'secondary', icon: "pi pi-plus", size: 'small', onClick: addInput, className: 'p-0 mr-2 target-btn', style: { width: 30, minWidth: 30 } }), _jsx(Button, { type: "button", text: true, severity: 'secondary', icon: "pi pi-trash", size: 'small', onClick: function () { return deleteInput(index); }, className: 'p-0 target-btn', style: { width: 30, minWidth: 30 }, disabled: values.length <= 1 })] }))] }, index)); }) }));
|
|
191
|
+
};
|
|
192
|
+
export var DashboardFilter = function (_a) {
|
|
193
|
+
var dashboardVariables = _a.dashboardVariables, initialFilters = _a.initialFilters, onApply = _a.onApply, visible = _a.visible, onHide = _a.onHide;
|
|
194
|
+
var _b = useState([]), rules = _b[0], setRules = _b[1];
|
|
195
|
+
useEffect(function () {
|
|
196
|
+
if (visible) {
|
|
197
|
+
// Initialize rules based on dashboardVariables
|
|
198
|
+
var newRules = dashboardVariables.map(function (dv, index) {
|
|
199
|
+
var existingFilter = initialFilters.find(function (f) { return f.variableName === dv.variableName; });
|
|
200
|
+
var defaultOperator = dv.defaultOperator || (dv.variableType === 'date' ? '$between' : '$in');
|
|
201
|
+
var defaultValue = null;
|
|
202
|
+
if (existingFilter && existingFilter.value !== undefined) {
|
|
203
|
+
defaultValue = existingFilter.value;
|
|
204
|
+
}
|
|
205
|
+
else if (dv.defaultValue) {
|
|
206
|
+
try {
|
|
207
|
+
defaultValue = JSON.parse(dv.defaultValue || '[]');
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
defaultValue = null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
id: index + 1,
|
|
215
|
+
fieldName: dv.variableName,
|
|
216
|
+
matchMode: existingFilter ? existingFilter.operator : defaultOperator,
|
|
217
|
+
value: defaultValue,
|
|
218
|
+
variable: dv
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
setRules(newRules);
|
|
222
|
+
}
|
|
223
|
+
}, [visible, dashboardVariables, initialFilters]);
|
|
224
|
+
var handleChange = function (id, key, value) {
|
|
225
|
+
setRules(function (prev) {
|
|
226
|
+
return prev.map(function (rule) {
|
|
227
|
+
var _a, _b;
|
|
228
|
+
if (rule.id === id) {
|
|
229
|
+
var newVal = rule.value;
|
|
230
|
+
// Immediate sync of values count when operator matches
|
|
231
|
+
if (key === 'matchMode') {
|
|
232
|
+
var newNum = getNumberOfInputs(value);
|
|
233
|
+
var currentValues = Array.isArray(rule.value) ? __spreadArray([], rule.value, true) : (rule.value ? [rule.value] : []);
|
|
234
|
+
if (newNum !== null && newNum > 0) {
|
|
235
|
+
if (currentValues.length < newNum) {
|
|
236
|
+
currentValues = __spreadArray(__spreadArray([], currentValues, true), Array(newNum - currentValues.length).fill(''), true);
|
|
237
|
+
}
|
|
238
|
+
else if (currentValues.length > newNum) {
|
|
239
|
+
currentValues = currentValues.slice(0, newNum);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else if (newNum === null && currentValues.length === 0) {
|
|
243
|
+
currentValues = [''];
|
|
244
|
+
}
|
|
245
|
+
newVal = newNum === 1 && currentValues.length === 1 ? currentValues[0] : currentValues;
|
|
246
|
+
return __assign(__assign({}, rule), (_a = {}, _a[key] = value, _a.value = newVal, _a));
|
|
247
|
+
}
|
|
248
|
+
return __assign(__assign({}, rule), (_b = {}, _b[key] = value, _b));
|
|
249
|
+
}
|
|
250
|
+
return rule;
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
var handleApply = function () {
|
|
255
|
+
var newFilters = rules
|
|
256
|
+
.filter(function (rule) {
|
|
257
|
+
if (['$null', '$notNull'].includes(rule.matchMode))
|
|
258
|
+
return true;
|
|
259
|
+
if (rule.value === null || rule.value === undefined)
|
|
260
|
+
return false;
|
|
261
|
+
if (Array.isArray(rule.value)) {
|
|
262
|
+
var hasValidValue = rule.value.some(function (v) { return v !== '' && v !== null; });
|
|
263
|
+
if (!hasValidValue)
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
if (rule.value === '')
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
return true;
|
|
271
|
+
})
|
|
272
|
+
.map(function (rule) {
|
|
273
|
+
var finalValue = rule.value;
|
|
274
|
+
var numberOfInputs = getNumberOfInputs(rule.matchMode);
|
|
275
|
+
// Clean array values or extract single values
|
|
276
|
+
if (Array.isArray(finalValue)) {
|
|
277
|
+
finalValue = finalValue.filter(function (v) { return v !== null && v !== ''; });
|
|
278
|
+
if (numberOfInputs === 1 && finalValue.length > 0) {
|
|
279
|
+
finalValue = finalValue[0];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// For selection static/dynamic, we might have selected an object {label, value} or string
|
|
283
|
+
// We need to extract the 'value' if it's an object from AutoComplete selection
|
|
284
|
+
if (Array.isArray(finalValue)) {
|
|
285
|
+
finalValue = finalValue.map(function (v) { return typeof v === 'object' && v !== null && 'value' in v ? v.value : v; });
|
|
286
|
+
}
|
|
287
|
+
else if (typeof finalValue === 'object' && finalValue !== null && 'value' in finalValue) {
|
|
288
|
+
finalValue = finalValue.value;
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
variableName: rule.fieldName,
|
|
292
|
+
operator: rule.matchMode,
|
|
293
|
+
value: finalValue,
|
|
294
|
+
};
|
|
295
|
+
});
|
|
296
|
+
onApply(newFilters);
|
|
297
|
+
onHide();
|
|
298
|
+
};
|
|
299
|
+
var handleClear = function () {
|
|
300
|
+
onApply([]);
|
|
301
|
+
onHide();
|
|
302
|
+
};
|
|
303
|
+
return (_jsxs(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, children: [_jsxs("div", { className: "flex align-items-center justify-content-between px-3", children: [_jsx("h5", { className: "solid-custom-title m-0", children: "Add Dashboard Filter" }), _jsx(Button, { icon: "pi pi-times", rounded: true, text: true, "aria-label": "Cancel", type: "reset", size: "small", onClick: onHide })] }), _jsx(Divider, { className: "m-0" }), _jsxs("div", { className: "p-2 lg:p-2", children: [_jsx(Fieldset, { className: 'primary-filter-fieldset', children: _jsxs("div", { className: "flex flex-column gap-3 py-3", children: [rules.map(function (rule) { return (_jsxs("div", { className: "grid grid-nogutter align-items-start", children: [_jsx("div", { className: "col-12 md:col-4 pr-2", children: _jsx("div", { className: "p-inputtext p-disabled w-full flex align-items-center mb-2 md:mb-0", style: { minHeight: '38px' }, children: rule.fieldName }) }), _jsx("div", { className: "col-12 md:col-4 pr-2", children: _jsx(Dropdown, { value: rule.matchMode, onChange: function (e) { return handleChange(rule.id, 'matchMode', e.value); }, options: rule.variable.variableType === 'date' ? dateFilterMatchModeOptions : selectionFilterMatchModeOptions, optionLabel: 'label', optionValue: 'value', placeholder: "Select Operator", className: "p-inputtext-sm w-full" }) }), _jsx("div", { className: "col-12 md:col-4", children: _jsx(FilterValueInput, { rule: rule, onChange: handleChange }) })] }, rule.id)); }), rules.length === 0 && (_jsx("div", { className: "text-color-secondary italic", children: "No variables available for this dashboard." }))] }) }), _jsxs("div", { className: 'flex gap-3 mt-3', children: [_jsx(Button, { label: "Apply", size: "small", onClick: handleApply, autoFocus: true }), _jsx(Button, { type: 'button', label: 'Cancel', outlined: true, size: 'small', onClick: onHide })] })] })] }));
|
|
304
|
+
};
|
|
305
|
+
//# sourceMappingURL=DashboardFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilter.js","sourceRoot":"","sources":["../../../../src/components/core/dashboard/DashboardFilter.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Button } from \"primereact/button\";\nimport { Dialog } from \"primereact/dialog\";\nimport { Dropdown } from \"primereact/dropdown\";\nimport { Calendar } from \"primereact/calendar\";\nimport { AutoComplete, AutoCompleteCompleteEvent } from \"primereact/autocomplete\";\nimport { SqlExpression } from \"../../../types/solid-core\";\nimport { DashboardVariableRecord } from \"./SolidDashboard\";\nimport { useLazyGetDashboardVariableSelectionDynamicValuesQuery } from \"../../../redux/api/dashboardApi\";\nimport { Divider } from \"primereact/divider\";\nimport { Fieldset } from \"primereact/fieldset\";\n\ninterface DashboardFilterProps {\n dashboardVariables: DashboardVariableRecord[];\n initialFilters: SqlExpression[];\n onApply: (filters: SqlExpression[]) => void;\n visible: boolean;\n onHide: () => void;\n}\n\nconst getNumberOfInputs = (matchMode: any): number | null => {\n switch (matchMode) {\n case '$between': return 2;\n case '$in': case '$notIn': return null;\n case '$startsWith': case '$contains': case '$notContains': case '$endsWith': case '$equals': case '$notEquals': case '$lt': case '$lte': case '$gt': case '$gte': return 1;\n case '$null': case '$notNull': return 0;\n default: return 1;\n }\n}\n\nconst dateFilterMatchModeOptions = [\n { label: 'Equals', value: \"$eq\" },\n { label: 'Not Equals', value: \"$nei\" },\n { label: 'Less Than', value: \"$lt\" },\n { label: 'Less Than Or Equal', value: \"$lte\" },\n { label: 'Greater Than', value: \"$gt\" },\n { label: 'Greater Than Or Equal', value: \"$gte\" },\n { label: 'In', value: \"$in\" },\n { label: 'Not In', value: \"$notIn\" },\n { label: 'Between', value: \"$between\" }\n];\n\nconst selectionFilterMatchModeOptions = [\n { label: 'In', value: \"$in\" },\n { label: 'Not In', value: \"$notIn\" }\n];\n\nconst FilterValueInput = ({ rule, onChange }: any) => {\n const numberOfInputs = getNumberOfInputs(rule.matchMode);\n\n // Ensure values is an array properly sized immediately on render\n let values = Array.isArray(rule.value) ? [...rule.value] : (rule.value ? [rule.value] : []);\n\n if (numberOfInputs !== null && numberOfInputs > 0 && values.length !== numberOfInputs) {\n if (values.length < numberOfInputs) {\n values = [...values, ...Array(numberOfInputs - values.length).fill('')];\n } else {\n values = values.slice(0, numberOfInputs);\n }\n }\n if (values.length === 0 && (numberOfInputs === null || numberOfInputs > 0)) {\n values = [''];\n }\n\n const updateValue = (index: number, val: any) => {\n const newValues = [...values];\n newValues[index] = val;\n onChange(rule.id, 'value', numberOfInputs === 1 ? newValues[0] : newValues);\n };\n\n const addInput = () => {\n const newValues = [...values, ''];\n onChange(rule.id, 'value', newValues);\n };\n\n const deleteInput = (index: number) => {\n if (values.length > 1) {\n const newValues = values.filter((_: any, i: number) => i !== index);\n onChange(rule.id, 'value', newValues);\n }\n };\n\n // Components for actual rendering\n const renderDate = (val: any, index: number) => {\n let dateVal = val ? new Date(val) : null;\n if (isNaN(dateVal?.getTime() || 0)) dateVal = null;\n return (\n <Calendar\n value={dateVal}\n onChange={(e) => {\n const dateStr = e.value ? (e.value as Date).toISOString().split('T')[0] : '';\n updateValue(index, dateStr);\n }}\n dateFormat=\"mm/dd/yy\"\n placeholder=\"mm/dd/yyyy\"\n mask=\"99/99/9999\"\n className=\"w-full\"\n inputClassName=\"w-full p-inputtext-sm\"\n />\n );\n };\n\n const SelectionStaticInput = ({ val, index, updateValue, dv }: any) => {\n const [filteredItems, setFilteredItems] = useState<{ label: string, value: string }[]>([]);\n const staticValues = JSON.parse(dv.selectionStaticValues || '[]') || [];\n const staticValueItems = staticValues.map((v: any) => ({ value: v.split(':')[0], label: v.split(':')[1] }));\n\n const search = (event: AutoCompleteCompleteEvent) => {\n const query = event.query.toLowerCase();\n const filtered = staticValueItems.filter((item: any) =>\n item.label.toLowerCase().includes(query)\n );\n setFilteredItems(filtered);\n };\n\n return (\n <AutoComplete\n value={val}\n suggestions={filteredItems}\n completeMethod={search}\n onChange={(e) => updateValue(index, e.value)}\n field=\"label\"\n dropdown\n className=\"w-full\"\n inputClassName=\"w-full p-inputtext-sm\"\n />\n );\n };\n\n const SelectionDynamicInput = ({ val, index, updateValue, dv }: any) => {\n const [filteredItems, setFilteredItems] = useState<{ label: string, value: string }[]>([]);\n const [trigger] = useLazyGetDashboardVariableSelectionDynamicValuesQuery();\n\n const search = async (event: AutoCompleteCompleteEvent) => {\n const queryString = `variableId=${dv.id}&q=${event.query}`;\n try {\n const res = await trigger(queryString).unwrap();\n const filtered = res.filter((item: any) =>\n item.label.toLowerCase().includes(event.query.toLowerCase())\n );\n setFilteredItems(filtered);\n } catch (error) {\n console.error(error);\n }\n };\n\n return (\n <AutoComplete\n value={val}\n suggestions={filteredItems}\n completeMethod={search}\n onChange={(e) => updateValue(index, e.value)}\n field=\"label\"\n dropdown\n className=\"w-full\"\n inputClassName=\"w-full p-inputtext-sm\"\n />\n );\n };\n\n if (numberOfInputs === 0) return <></>;\n\n return (\n <div className=\"flex flex-column gap-2\">\n {values.map((val: any, index: number) => (\n <div key={index} className=\"flex gap-2\">\n <div className=\"flex-grow-1\">\n {rule.variable.variableType === 'date' && renderDate(val, index)}\n {rule.variable.variableType === 'selectionStatic' && <SelectionStaticInput val={val} index={index} updateValue={updateValue} dv={rule.variable} />}\n {rule.variable.variableType === 'selectionDynamic' && <SelectionDynamicInput val={val} index={index} updateValue={updateValue} dv={rule.variable} />}\n </div>\n {numberOfInputs === null && (\n <div className=\"flex align-items-center\">\n <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 }} />\n <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} />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n\nexport const DashboardFilter: React.FC<DashboardFilterProps> = ({\n dashboardVariables,\n initialFilters,\n onApply,\n visible,\n onHide,\n}) => {\n const [rules, setRules] = useState<any[]>([]);\n\n useEffect(() => {\n if (visible) {\n // Initialize rules based on dashboardVariables\n const newRules = dashboardVariables.map((dv, index) => {\n const existingFilter = initialFilters.find((f: any) => f.variableName === dv.variableName);\n\n const defaultOperator = dv.defaultOperator || (dv.variableType === 'date' ? '$between' : '$in');\n\n let defaultValue = null;\n if (existingFilter && existingFilter.value !== undefined) {\n defaultValue = existingFilter.value;\n } else if (dv.defaultValue) {\n try {\n defaultValue = JSON.parse(dv.defaultValue || '[]');\n } catch (e) {\n defaultValue = null;\n }\n }\n\n return {\n id: index + 1,\n fieldName: dv.variableName,\n matchMode: existingFilter ? existingFilter.operator : defaultOperator,\n value: defaultValue,\n variable: dv\n };\n });\n setRules(newRules);\n }\n }, [visible, dashboardVariables, initialFilters]);\n\n const handleChange = (id: number, key: string, value: any) => {\n setRules((prev) =>\n prev.map((rule) => {\n if (rule.id === id) {\n let newVal = rule.value;\n // Immediate sync of values count when operator matches\n if (key === 'matchMode') {\n const newNum = getNumberOfInputs(value);\n let currentValues = Array.isArray(rule.value) ? [...rule.value] : (rule.value ? [rule.value] : []);\n if (newNum !== null && newNum > 0) {\n if (currentValues.length < newNum) {\n currentValues = [...currentValues, ...Array(newNum - currentValues.length).fill('')];\n } else if (currentValues.length > newNum) {\n currentValues = currentValues.slice(0, newNum);\n }\n } else if (newNum === null && currentValues.length === 0) {\n currentValues = [''];\n }\n newVal = newNum === 1 && currentValues.length === 1 ? currentValues[0] : currentValues;\n return { ...rule, [key]: value, value: newVal };\n }\n return { ...rule, [key]: value };\n }\n return rule;\n })\n );\n };\n\n const handleApply = () => {\n const newFilters: SqlExpression[] = rules\n .filter((rule) => {\n if (['$null', '$notNull'].includes(rule.matchMode)) return true;\n\n if (rule.value === null || rule.value === undefined) return false;\n if (Array.isArray(rule.value)) {\n const hasValidValue = rule.value.some((v: any) => v !== '' && v !== null);\n if (!hasValidValue) return false;\n } else {\n if (rule.value === '') return false;\n }\n return true;\n })\n .map((rule) => {\n let finalValue = rule.value;\n const numberOfInputs = getNumberOfInputs(rule.matchMode);\n // Clean array values or extract single values\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.filter(v => v !== null && v !== '');\n if (numberOfInputs === 1 && finalValue.length > 0) {\n finalValue = finalValue[0];\n }\n }\n\n // For selection static/dynamic, we might have selected an object {label, value} or string\n // We need to extract the 'value' if it's an object from AutoComplete selection\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.map(v => typeof v === 'object' && v !== null && 'value' in v ? v.value : v);\n } else if (typeof finalValue === 'object' && finalValue !== null && 'value' in finalValue) {\n finalValue = finalValue.value;\n }\n\n return {\n variableName: rule.fieldName,\n operator: rule.matchMode,\n value: finalValue,\n }\n });\n\n onApply(newFilters);\n onHide();\n };\n\n const handleClear = () => {\n onApply([]);\n onHide();\n };\n\n return (\n\n\n <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}>\n <div className=\"flex align-items-center justify-content-between px-3\">\n <h5 className=\"solid-custom-title m-0\">Add Dashboard Filter</h5>\n <Button icon=\"pi pi-times\" rounded text aria-label=\"Cancel\" type=\"reset\" size=\"small\" onClick={onHide} />\n </div>\n <Divider className=\"m-0\" />\n <div className=\"p-2 lg:p-2\">\n <Fieldset className='primary-filter-fieldset'>\n <div className=\"flex flex-column gap-3 py-3\">\n\n {rules.map((rule) => (\n <div key={rule.id} className=\"grid grid-nogutter align-items-start\">\n <div className=\"col-12 md:col-4 pr-2\">\n <div className=\"p-inputtext p-disabled w-full flex align-items-center mb-2 md:mb-0\" style={{ minHeight: '38px' }}>\n {rule.fieldName}\n </div>\n </div>\n <div className=\"col-12 md:col-4 pr-2\">\n <Dropdown\n value={rule.matchMode}\n onChange={(e: any) => handleChange(rule.id, 'matchMode', e.value)}\n options={rule.variable.variableType === 'date' ? dateFilterMatchModeOptions : selectionFilterMatchModeOptions}\n optionLabel='label'\n optionValue='value'\n placeholder=\"Select Operator\"\n className=\"p-inputtext-sm w-full\"\n />\n </div>\n <div className=\"col-12 md:col-4\">\n <FilterValueInput rule={rule} onChange={handleChange} />\n </div>\n </div>\n ))}\n {rules.length === 0 && (\n <div className=\"text-color-secondary italic\">No variables available for this dashboard.</div>\n )}\n </div>\n </Fieldset>\n {/* <div className=\"flex justify-content-between align-items-center mt-4\">\n <Button label=\"Clear Filters\" icon=\"pi pi-filter-slash\" severity=\"danger\" text onClick={handleClear} />\n <div className=\"flex gap-2\">\n </div>\n </div> */}\n <div className='flex gap-3 mt-3'>\n <Button label=\"Apply\" size=\"small\" onClick={handleApply} autoFocus />\n <Button type='button' label='Cancel' outlined size='small' onClick={onHide} />\n </div>\n\n </div>\n </Dialog>\n\n );\n};\n"]}
|