@solidxai/core-ui 0.1.5-beta.1 → 0.1.5-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/dist/components/auth/AuthTabs.d.ts +14 -0
  2. package/dist/components/auth/AuthTabs.d.ts.map +1 -0
  3. package/dist/components/auth/AuthTabs.js +19 -0
  4. package/dist/components/auth/AuthTabs.js.map +1 -0
  5. package/dist/components/auth/AuthTabs.tsx +38 -0
  6. package/dist/components/common/AuthBanner.js.map +1 -1
  7. package/dist/components/common/SolidErrorStatePage.d.ts +12 -0
  8. package/dist/components/common/SolidErrorStatePage.d.ts.map +1 -0
  9. package/dist/components/common/SolidErrorStatePage.js +16 -0
  10. package/dist/components/common/SolidErrorStatePage.js.map +1 -0
  11. package/dist/components/common/SolidErrorStatePage.tsx +55 -0
  12. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  13. package/dist/components/core/chatter/SolidChatter.js +5 -2
  14. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  15. package/dist/components/core/chatter/SolidChatter.tsx +5 -2
  16. package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts +5 -2
  17. package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts.map +1 -1
  18. package/dist/components/core/chatter/SolidChatterAuditMessage.js +19 -1
  19. package/dist/components/core/chatter/SolidChatterAuditMessage.js.map +1 -1
  20. package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +29 -5
  21. package/dist/components/core/chatter/SolidChatterDateDivider.d.ts.map +1 -1
  22. package/dist/components/core/chatter/SolidChatterDateDivider.js +4 -1
  23. package/dist/components/core/chatter/SolidChatterDateDivider.js.map +1 -1
  24. package/dist/components/core/chatter/SolidChatterDateDivider.tsx +5 -1
  25. package/dist/components/core/common/SolidCreateButton.js +3 -3
  26. package/dist/components/core/common/SolidCreateButton.js.map +1 -1
  27. package/dist/components/core/common/SolidCreateButton.tsx +3 -3
  28. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  29. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  30. package/dist/components/core/common/SolidGlobalSearchElement.tsx +1 -0
  31. package/dist/components/core/dashboard/DashboardFilter.d.ts +13 -0
  32. package/dist/components/core/dashboard/DashboardFilter.d.ts.map +1 -0
  33. package/dist/components/core/dashboard/DashboardFilter.js +305 -0
  34. package/dist/components/core/dashboard/DashboardFilter.js.map +1 -0
  35. package/dist/components/core/dashboard/DashboardFilter.tsx +356 -0
  36. package/dist/components/core/dashboard/PrimeDataTableWrapper.d.ts +3 -0
  37. package/dist/components/core/dashboard/PrimeDataTableWrapper.d.ts.map +1 -0
  38. package/dist/components/core/dashboard/PrimeDataTableWrapper.js +21 -0
  39. package/dist/components/core/dashboard/PrimeDataTableWrapper.js.map +1 -0
  40. package/dist/components/core/dashboard/PrimeDataTableWrapper.tsx +40 -0
  41. package/dist/components/core/dashboard/SolidDashboard.d.ts +0 -1
  42. package/dist/components/core/dashboard/SolidDashboard.d.ts.map +1 -1
  43. package/dist/components/core/dashboard/SolidDashboard.js +51 -22
  44. package/dist/components/core/dashboard/SolidDashboard.js.map +1 -1
  45. package/dist/components/core/dashboard/SolidDashboard.module.css +6 -2
  46. package/dist/components/core/dashboard/SolidDashboard.tsx +133 -56
  47. package/dist/components/core/dashboard/SolidDashboardBody.d.ts +13 -1
  48. package/dist/components/core/dashboard/SolidDashboardBody.d.ts.map +1 -1
  49. package/dist/components/core/dashboard/SolidDashboardBody.js +134 -48
  50. package/dist/components/core/dashboard/SolidDashboardBody.js.map +1 -1
  51. package/dist/components/core/dashboard/SolidDashboardBody.tsx +143 -91
  52. package/dist/components/core/dashboard/SolidQuestionRenderer.d.ts.map +1 -1
  53. package/dist/components/core/dashboard/SolidQuestionRenderer.js +1 -1
  54. package/dist/components/core/dashboard/SolidQuestionRenderer.js.map +1 -1
  55. package/dist/components/core/dashboard/SolidQuestionRenderer.tsx +12 -10
  56. package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.d.ts.map +1 -1
  57. package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js +29 -2
  58. package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js.map +1 -1
  59. package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.tsx +33 -3
  60. package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts +10 -0
  61. package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts.map +1 -0
  62. package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js +16 -0
  63. package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js.map +1 -0
  64. package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.ts +19 -0
  65. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts +8 -0
  66. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts.map +1 -0
  67. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js +64 -0
  68. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js.map +1 -0
  69. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.ts +30 -0
  70. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts +8 -0
  71. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts.map +1 -0
  72. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js +62 -0
  73. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js.map +1 -0
  74. package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.ts +29 -0
  75. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +2 -2
  76. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
  77. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +2 -2
  78. package/dist/components/core/form/SolidFormView.js +1 -1
  79. package/dist/components/core/form/SolidFormView.js.map +1 -1
  80. package/dist/components/core/form/SolidFormView.tsx +1 -1
  81. package/dist/components/core/kanban/SolidKanbanView.js +2 -2
  82. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  83. package/dist/components/core/kanban/SolidKanbanView.tsx +2 -2
  84. package/dist/components/core/list/PLAN.md +92 -0
  85. package/dist/components/core/list/SolidDataTable.d.ts +58 -0
  86. package/dist/components/core/list/SolidDataTable.d.ts.map +1 -0
  87. package/dist/components/core/list/SolidDataTable.js +141 -0
  88. package/dist/components/core/list/SolidDataTable.js.map +1 -0
  89. package/dist/components/core/list/SolidDataTable.tsx +314 -0
  90. package/dist/components/core/list/SolidDataTablePagination.d.ts +15 -0
  91. package/dist/components/core/list/SolidDataTablePagination.d.ts.map +1 -0
  92. package/dist/components/core/list/SolidDataTablePagination.js +22 -0
  93. package/dist/components/core/list/SolidDataTablePagination.js.map +1 -0
  94. package/dist/components/core/list/SolidDataTablePagination.tsx +71 -0
  95. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  96. package/dist/components/core/list/SolidListView.js +14 -11
  97. package/dist/components/core/list/SolidListView.js.map +1 -1
  98. package/dist/components/core/list/SolidListView.tsx +8 -7
  99. package/dist/components/core/list/columns/SolidDateColumn.d.ts +2 -0
  100. package/dist/components/core/list/columns/SolidDateColumn.d.ts.map +1 -1
  101. package/dist/components/core/list/columns/SolidDateColumn.js +9 -1
  102. package/dist/components/core/list/columns/SolidDateColumn.js.map +1 -1
  103. package/dist/components/core/list/columns/SolidDateColumn.tsx +13 -1
  104. package/dist/components/core/list/columns/SolidDatetimeColumn.js +1 -1
  105. package/dist/components/core/list/columns/SolidDatetimeColumn.js.map +1 -1
  106. package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +1 -1
  107. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  108. package/dist/components/core/tree/SolidTreeView.js +277 -43
  109. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  110. package/dist/components/core/tree/SolidTreeView.tsx +436 -4
  111. package/dist/components/layout/AdminTopHeader.d.ts +2 -0
  112. package/dist/components/layout/AdminTopHeader.d.ts.map +1 -0
  113. package/dist/components/layout/AdminTopHeader.js +68 -0
  114. package/dist/components/layout/AdminTopHeader.js.map +1 -0
  115. package/dist/components/layout/AdminTopHeader.tsx +135 -0
  116. package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +24 -0
  117. package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -0
  118. package/dist/components/shad-cn-ui/SolidAutocomplete.js +224 -0
  119. package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -0
  120. package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +339 -0
  121. package/dist/components/shad-cn-ui/SolidButton.d.ts +14 -0
  122. package/dist/components/shad-cn-ui/SolidButton.d.ts.map +1 -0
  123. package/dist/components/shad-cn-ui/SolidButton.js +36 -0
  124. package/dist/components/shad-cn-ui/SolidButton.js.map +1 -0
  125. package/dist/components/shad-cn-ui/SolidButton.tsx +54 -0
  126. package/dist/components/shad-cn-ui/SolidInput.d.ts +5 -0
  127. package/dist/components/shad-cn-ui/SolidInput.d.ts.map +1 -0
  128. package/dist/components/shad-cn-ui/SolidInput.js +35 -0
  129. package/dist/components/shad-cn-ui/SolidInput.js.map +1 -0
  130. package/dist/components/shad-cn-ui/SolidInput.tsx +12 -0
  131. package/dist/components/shad-cn-ui/SolidNumberInput.d.ts +10 -0
  132. package/dist/components/shad-cn-ui/SolidNumberInput.d.ts.map +1 -0
  133. package/dist/components/shad-cn-ui/SolidNumberInput.js +33 -0
  134. package/dist/components/shad-cn-ui/SolidNumberInput.js.map +1 -0
  135. package/dist/components/shad-cn-ui/SolidNumberInput.tsx +24 -0
  136. package/dist/components/shad-cn-ui/SolidSelect.d.ts +16 -0
  137. package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +1 -0
  138. package/dist/components/shad-cn-ui/SolidSelect.js +26 -0
  139. package/dist/components/shad-cn-ui/SolidSelect.js.map +1 -0
  140. package/dist/components/shad-cn-ui/SolidSelect.tsx +65 -0
  141. package/dist/components/shad-cn-ui/SolidTabs.d.ts +18 -0
  142. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -0
  143. package/dist/components/shad-cn-ui/SolidTabs.js +22 -0
  144. package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -0
  145. package/dist/components/shad-cn-ui/SolidTabs.tsx +73 -0
  146. package/dist/components/shad-cn-ui/index.d.ts +7 -0
  147. package/dist/components/shad-cn-ui/index.d.ts.map +1 -0
  148. package/dist/components/shad-cn-ui/index.js +7 -0
  149. package/dist/components/shad-cn-ui/index.js.map +1 -0
  150. package/dist/components/shad-cn-ui/index.ts +6 -0
  151. package/dist/components/solid-ui/SolidButton.d.ts +14 -0
  152. package/dist/components/solid-ui/SolidButton.d.ts.map +1 -0
  153. package/dist/components/solid-ui/SolidButton.js +36 -0
  154. package/dist/components/solid-ui/SolidButton.js.map +1 -0
  155. package/dist/components/solid-ui/SolidButton.tsx +54 -0
  156. package/dist/components/solid-ui/SolidTabs.d.ts +18 -0
  157. package/dist/components/solid-ui/SolidTabs.d.ts.map +1 -0
  158. package/dist/components/solid-ui/SolidTabs.js +22 -0
  159. package/dist/components/solid-ui/SolidTabs.js.map +1 -0
  160. package/dist/components/solid-ui/SolidTabs.tsx +73 -0
  161. package/dist/components/solid-ui/index.d.ts +3 -0
  162. package/dist/components/solid-ui/index.d.ts.map +1 -0
  163. package/dist/components/solid-ui/index.js +3 -0
  164. package/dist/components/solid-ui/index.js.map +1 -0
  165. package/dist/components/solid-ui/index.ts +2 -0
  166. package/dist/constants/error-messages.d.ts +3 -0
  167. package/dist/constants/error-messages.d.ts.map +1 -1
  168. package/dist/constants/error-messages.js +3 -0
  169. package/dist/constants/error-messages.js.map +1 -1
  170. package/dist/constants/error-messages.ts +24 -20
  171. package/dist/helpers/registry.d.ts.map +1 -1
  172. package/dist/helpers/registry.js +10 -0
  173. package/dist/helpers/registry.js.map +1 -1
  174. package/dist/helpers/registry.ts +12 -0
  175. package/dist/helpers/routePaths.d.ts +1 -1
  176. package/dist/helpers/routePaths.d.ts.map +1 -1
  177. package/dist/helpers/routePaths.js +2 -2
  178. package/dist/helpers/routePaths.js.map +1 -1
  179. package/dist/helpers/routePaths.ts +2 -2
  180. package/dist/index.d.ts +2 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +2 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/index.ts +8 -0
  185. package/dist/redux/api/dashboardLayoutApi.d.ts +24 -0
  186. package/dist/redux/api/dashboardLayoutApi.d.ts.map +1 -0
  187. package/dist/redux/api/dashboardLayoutApi.js +34 -0
  188. package/dist/redux/api/dashboardLayoutApi.js.map +1 -0
  189. package/dist/redux/api/dashboardLayoutApi.ts +55 -0
  190. package/dist/redux/store/defaultStoreConfig.d.ts +4 -0
  191. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  192. package/dist/redux/store/defaultStoreConfig.js +3 -2
  193. package/dist/redux/store/defaultStoreConfig.js.map +1 -1
  194. package/dist/redux/store/defaultStoreConfig.ts +4 -2
  195. package/dist/resources/globals.css +8 -0
  196. package/dist/resources/images/errors/error-astronaut-404.png +0 -0
  197. package/dist/resources/shadcn-base.css +3200 -0
  198. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  199. package/dist/routes/pages/admin/core/DashboardPage.js +3 -7
  200. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  201. package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -5
  202. package/dist/routes/pages/admin/core/FormPage.d.ts.map +1 -1
  203. package/dist/routes/pages/admin/core/FormPage.js +6 -1
  204. package/dist/routes/pages/admin/core/FormPage.js.map +1 -1
  205. package/dist/routes/pages/admin/core/FormPage.tsx +7 -1
  206. package/dist/routes/solidRoutes.js +1 -1
  207. package/dist/routes/solidRoutes.js.map +1 -1
  208. package/dist/routes/solidRoutes.tsx +1 -1
  209. package/package.json +13 -11
  210. package/dist/components/auth/SolidOTPVerify.d.ts +0 -3
  211. package/dist/components/auth/SolidOTPVerify.d.ts.map +0 -1
  212. package/dist/components/auth/SolidOTPVerify.js +0 -67
  213. package/dist/components/auth/SolidOTPVerify.js.map +0 -1
  214. package/dist/components/auth/SolidOTPVerify.tsx +0 -133
  215. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +0 -2
  216. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +0 -1
  217. package/dist/components/core/common/LoadDynamicJsxComponent.js +0 -50
  218. package/dist/components/core/common/LoadDynamicJsxComponent.js.map +0 -1
  219. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +0 -70
  220. package/dist/nextAuth/authProviders.d.ts +0 -4
  221. package/dist/nextAuth/authProviders.d.ts.map +0 -1
  222. package/dist/nextAuth/authProviders.js +0 -198
  223. package/dist/nextAuth/authProviders.js.map +0 -1
  224. package/dist/nextAuth/authProviders.tsx +0 -232
  225. package/dist/nextAuth/handleLogout.d.ts +0 -2
  226. package/dist/nextAuth/handleLogout.d.ts.map +0 -1
  227. package/dist/nextAuth/handleLogout.js +0 -36
  228. package/dist/nextAuth/handleLogout.js.map +0 -1
  229. package/dist/nextAuth/handleLogout.tsx +0 -39
  230. package/dist/nextAuth/refreshAccessToken.d.ts +0 -2
  231. package/dist/nextAuth/refreshAccessToken.d.ts.map +0 -1
  232. package/dist/nextAuth/refreshAccessToken.js +0 -24
  233. package/dist/nextAuth/refreshAccessToken.js.map +0 -1
  234. package/dist/nextAuth/refreshAccessToken.tsx +0 -28
  235. package/dist/redux/features/settingsSlice.d.ts +0 -20
  236. package/dist/redux/features/settingsSlice.d.ts.map +0 -1
  237. package/dist/redux/features/settingsSlice.js +0 -39
  238. package/dist/redux/features/settingsSlice.js.map +0 -1
  239. package/dist/redux/features/settingsSlice.ts +0 -60
@@ -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 Dashboard 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-4 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-4 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-4">
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" size="small" onClick={handleApply} autoFocus />
349
+ <Button type='button' label='Cancel' outlined size='small' onClick={onHide} />
350
+ </div>
351
+
352
+ </div>
353
+ </Dialog>
354
+
355
+ );
356
+ };
@@ -0,0 +1,3 @@
1
+ declare const PrimeDataTableWrapper: ({ question, filters }: any) => import("react/jsx-runtime").JSX.Element;
2
+ export default PrimeDataTableWrapper;
3
+ //# sourceMappingURL=PrimeDataTableWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimeDataTableWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/core/dashboard/PrimeDataTableWrapper.tsx"],"names":[],"mappings":"AAMA,QAAA,MAAM,qBAAqB,0BAA2B,GAAG,4CA+BxD,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useGetDashboardQuestionDataByIdQuery } from '../../../redux/api/dashboardQuestionApi';
3
+ import PrimeReactDatatableRenderer from "./chart-renderers/PrimeReactDatatableRenderer";
4
+ import { ProgressSpinner } from "primereact/progressspinner";
5
+ import styles from './SolidDashboard.module.css';
6
+ import qs from 'qs';
7
+ var PrimeDataTableWrapper = function (_a) {
8
+ var _b, _c, _d;
9
+ var question = _a.question, filters = _a.filters;
10
+ var queryParams = qs.stringify({ isPreview: false, filters: filters }, { arrayFormat: 'brackets' });
11
+ var _e = useGetDashboardQuestionDataByIdQuery({
12
+ id: question.id,
13
+ qs: queryParams,
14
+ }), data = _e.data, isLoading = _e.isLoading;
15
+ if (isLoading)
16
+ return _jsx(ProgressSpinner, {});
17
+ var textAlign = (_b = question === null || question === void 0 ? void 0 : question.textAlign) !== null && _b !== void 0 ? _b : 'start';
18
+ return (_jsxs("div", { className: "".concat(styles.SolidChartCardWrapper, " p-4"), style: { maxHeight: '40vh', overflowY: 'auto' }, children: [_jsx("div", { className: "font-medium text-".concat(textAlign), children: question.name }), _jsx("div", { className: "mt-2 font-bold text-3xl text-".concat(textAlign), children: (_c = data === null || data === void 0 ? void 0 : data.data) === null || _c === void 0 ? void 0 : _c.kpi }), _jsx(PrimeReactDatatableRenderer, { options: JSON.parse(question === null || question === void 0 ? void 0 : question.chartOptions), visualizationData: (_d = data === null || data === void 0 ? void 0 : data.data) === null || _d === void 0 ? void 0 : _d.visualizationData })] }));
19
+ };
20
+ export default PrimeDataTableWrapper;
21
+ //# sourceMappingURL=PrimeDataTableWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimeDataTableWrapper.js","sourceRoot":"","sources":["../../../../src/components/core/dashboard/PrimeDataTableWrapper.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oCAAoC,EAAE,MAAM,yCAAyC,CAAC;AAC/F,OAAO,2BAA2B,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,MAAM,MAAM,6BAA6B,CAAA;AAChD,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,IAAM,qBAAqB,GAAG,UAAC,EAA0B;;QAAxB,QAAQ,cAAA,EAAE,OAAO,aAAA;IAC9C,IAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAC5B,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,SAAA,EAAE,EAC7B,EAAE,WAAW,EAAE,UAAU,EAAE,CAC9B,CAAC;IAEI,IAAA,KAAsB,oCAAoC,CAAC;QAC7D,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,EAAE,EAAE,WAAW;KAClB,CAAC,EAHM,IAAI,UAAA,EAAE,SAAS,eAGrB,CAAC;IAEH,IAAI,SAAS;QAAE,OAAO,KAAC,eAAe,KAAG,CAAC;IAE1C,IAAM,SAAS,GAAG,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,mCAAI,OAAO,CAAC;IAEjD,OAAO,CACH,eAAK,SAAS,EAAE,UAAG,MAAM,CAAC,qBAAqB,SAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAClG,cAAK,SAAS,EAAE,2BAAoB,SAAS,CAAE,YAC1C,QAAQ,CAAC,IAAI,GACZ,EAEN,cAAK,SAAS,EAAE,uCAAgC,SAAS,CAAE,YACtD,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,GAAG,GACd,EAEN,KAAC,2BAA2B,IACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,YAAY,CAAC,EAC3C,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,iBAAiB,GAClD,IACA,CACT,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { useGetDashboardQuestionDataByIdQuery } from '../../../redux/api/dashboardQuestionApi';\nimport PrimeReactDatatableRenderer from \"./chart-renderers/PrimeReactDatatableRenderer\";\nimport { ProgressSpinner } from \"primereact/progressspinner\";\nimport styles from './SolidDashboard.module.css'\nimport qs from 'qs';\n\nconst PrimeDataTableWrapper = ({ question, filters }: any) => {\n const queryParams = qs.stringify(\n { isPreview: false, filters },\n { arrayFormat: 'brackets' }\n );\n\n const { data, isLoading } = useGetDashboardQuestionDataByIdQuery({\n id: question.id,\n qs: queryParams,\n });\n\n if (isLoading) return <ProgressSpinner />;\n\n const textAlign = question?.textAlign ?? 'start';\n\n return (\n <div className={`${styles.SolidChartCardWrapper} p-4`} style={{ maxHeight: '40vh', overflowY: 'auto' }}>\n <div className={`font-medium text-${textAlign}`}>\n {question.name}\n </div>\n\n <div className={`mt-2 font-bold text-3xl text-${textAlign}`}>\n {data?.data?.kpi}\n </div>\n\n <PrimeReactDatatableRenderer\n options={JSON.parse(question?.chartOptions)}\n visualizationData={data?.data?.visualizationData}\n />\n </div>\n );\n};\n\nexport default PrimeDataTableWrapper;"]}
@@ -0,0 +1,40 @@
1
+ import { useGetDashboardQuestionDataByIdQuery } from '../../../redux/api/dashboardQuestionApi';
2
+ import PrimeReactDatatableRenderer from "./chart-renderers/PrimeReactDatatableRenderer";
3
+ import { ProgressSpinner } from "primereact/progressspinner";
4
+ import styles from './SolidDashboard.module.css'
5
+ import qs from 'qs';
6
+
7
+ const PrimeDataTableWrapper = ({ question, filters }: any) => {
8
+ const queryParams = qs.stringify(
9
+ { isPreview: false, filters },
10
+ { arrayFormat: 'brackets' }
11
+ );
12
+
13
+ const { data, isLoading } = useGetDashboardQuestionDataByIdQuery({
14
+ id: question.id,
15
+ qs: queryParams,
16
+ });
17
+
18
+ if (isLoading) return <ProgressSpinner />;
19
+
20
+ const textAlign = question?.textAlign ?? 'start';
21
+
22
+ return (
23
+ <div className={`${styles.SolidChartCardWrapper} p-4`} style={{ maxHeight: '40vh', overflowY: 'auto' }}>
24
+ <div className={`font-medium text-${textAlign}`}>
25
+ {question.name}
26
+ </div>
27
+
28
+ <div className={`mt-2 font-bold text-3xl text-${textAlign}`}>
29
+ {data?.data?.kpi}
30
+ </div>
31
+
32
+ <PrimeReactDatatableRenderer
33
+ options={JSON.parse(question?.chartOptions)}
34
+ visualizationData={data?.data?.visualizationData}
35
+ />
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export default PrimeDataTableWrapper;
@@ -21,7 +21,6 @@ export interface DashboardVariableRecord {
21
21
  }
22
22
  type SolidDashboardViewProps = {
23
23
  moduleName: string;
24
- dashboardId?: number;
25
24
  dashboardName?: string;
26
25
  };
27
26
  declare const SolidDashboard: (params: SolidDashboardViewProps) => import("react/jsx-runtime").JSX.Element;
@@ -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,4CAiNtD,CAAA;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"SolidDashboard.d.ts","sourceRoot":"","sources":["../../../../src/components/core/dashboard/SolidDashboard.tsx"],"names":[],"mappings":"AAwBA,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;AAsED,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,cAAc,WAAY,uBAAuB,4CA6RtD,CAAA;AAED,eAAe,cAAc,CAAC"}
@@ -50,11 +50,11 @@ import { useGetDashboardQuery } from '../../../redux/api/dashboardApi';
50
50
  import { Button } from 'primereact/button';
51
51
  import { Tooltip } from "primereact/tooltip";
52
52
  import qs from 'qs';
53
- import { useEffect, useState } from 'react';
53
+ import { useEffect, useRef, 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 SolidDashboardVariable from './SolidDashboardVariable';
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';
@@ -63,6 +63,10 @@ import { useDispatch, useSelector } from "react-redux";
63
63
  import { showNavbar, toggleNavbar } from "../../../redux/features/navbarSlice";
64
64
  import SolidDashboardNotAvailable from './SolidDashboardNotAvailable';
65
65
  import { useLazyGetMcpUrlQuery, useLazyGetSolidSettingsQuery } from '../../../redux/api/solidSettingsApi';
66
+ import showToast from '../../../helpers/showToast';
67
+ import { Toast } from "primereact/toast";
68
+ import { ERROR_MESSAGES } from '../../../constants/error-messages';
69
+ import { useUpsertUserDashboardLayoutMutation } from '../../../redux/api/dashboardLayoutApi';
66
70
  export var DashboardVariableType;
67
71
  (function (DashboardVariableType) {
68
72
  DashboardVariableType["DATE"] = "date";
@@ -85,7 +89,7 @@ function handleDashboardData(data, setDashboardVariables, setQuestions) {
85
89
  setQuestions(dashboardData.questions);
86
90
  }
87
91
  }
88
- function getQueryParams(moduleName, dashboardId, dashboardName) {
92
+ function getQueryParams(moduleName, dashboardName) {
89
93
  var filters = {
90
94
  module: {
91
95
  name: {
@@ -93,11 +97,8 @@ function getQueryParams(moduleName, dashboardId, dashboardName) {
93
97
  }
94
98
  }
95
99
  };
96
- if (dashboardId !== undefined) {
97
- filters.id = { $eq: dashboardId };
98
- }
99
- else if (dashboardName !== undefined) {
100
- filters.name = { $eq: dashboardName };
100
+ if (dashboardName !== undefined) {
101
+ filters.name = { $eqi: dashboardName };
101
102
  }
102
103
  var query = {
103
104
  filters: filters,
@@ -131,8 +132,8 @@ function isRenderDashboardBody(questions, dashboardVariables, filters) {
131
132
  return allVariablesFiltered;
132
133
  }
133
134
  var SolidDashboard = function (params) {
134
- var _a, _b, _c, _d, _e;
135
- var _f = useGetDashboardQuery(getQueryParams(params.moduleName, params.dashboardId, params.dashboardName)), data = _f.data, isLoading = _f.isLoading, error = _f.error; // FIXME : error handling should be done properly
135
+ var _a, _b, _c, _d, _e, _f;
136
+ var _g = useGetDashboardQuery(getQueryParams(params.moduleName, params.dashboardName)), data = _g.data, isLoading = _g.isLoading, error = _g.error; // FIXME : error handling should be done properly
136
137
  // Define a state called layoutOption and pass it after destructing the widgetOptions and dashboardOptions from layoutOption
137
138
  // 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?
138
139
  // 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
@@ -144,13 +145,41 @@ var SolidDashboard = function (params) {
144
145
  // TODO [HP]: replace dashboardVariableFilterRules with filters everywhere...
145
146
  // const [dashboardVariableFilterRules, setDashboardVariableFilterRules] = useState<ISolidDashboardVariableFilterRule[]>([]);
146
147
  var dispatch = useDispatch();
148
+ var toast = useRef(null);
147
149
  var visibleNavbar = useSelector(function (state) { var _a; return (_a = state.navbarState) === null || _a === void 0 ? void 0 : _a.visibleNavbar; });
148
- var _g = useState([]), filters = _g[0], setFilters = _g[1];
149
- var _h = useState(false), isOpenSolidXAiPanel = _h[0], setIsOpenSolidXAiPanel = _h[1];
150
- var _j = useState(380), chatterWidth = _j[0], setChatterWidth = _j[1];
151
- var _k = useState(false), isResizing = _k[0], setIsResizing = _k[1];
152
- var _l = useState([]), questions = _l[0], setQuestions = _l[1];
153
- var _m = useState([]), dashboardVariables = _m[0], setDashboardVariables = _m[1];
150
+ var _h = useState([]), filters = _h[0], setFilters = _h[1];
151
+ var _j = useState(false), isOpenSolidXAiPanel = _j[0], setIsOpenSolidXAiPanel = _j[1];
152
+ var _k = useState(380), chatterWidth = _k[0], setChatterWidth = _k[1];
153
+ var _l = useState(false), isResizing = _l[0], setIsResizing = _l[1];
154
+ var _m = useState([]), questions = _m[0], setQuestions = _m[1];
155
+ var _o = useState([]), dashboardVariables = _o[0], setDashboardVariables = _o[1];
156
+ var _p = useState(false), isDashboardFilterVisible = _p[0], setIsDashboardFilterVisible = _p[1];
157
+ var _q = useUpsertUserDashboardLayoutMutation(), upsertDashboardLayout = _q[0], _r = _q[1], isDashboardLayoutLoading = _r.isLoading, dashboardLayoutError = _r.error, isDashboardLayoutSuccess = _r.isSuccess, dashboardLayoutData = _r.data;
158
+ var _s = useState([]), dashboardLayout = _s[0], setDashboardLayout = _s[1];
159
+ var updateUserDashboardLayout = function () { return __awaiter(void 0, void 0, void 0, function () {
160
+ var response, error_1;
161
+ return __generator(this, function (_a) {
162
+ switch (_a.label) {
163
+ case 0:
164
+ _a.trys.push([0, 2, , 3]);
165
+ return [4 /*yield*/, upsertDashboardLayout({
166
+ dashboardId: data === null || data === void 0 ? void 0 : data.records[0].id,
167
+ layout: JSON.stringify(dashboardLayout),
168
+ }).unwrap()];
169
+ case 1:
170
+ response = _a.sent();
171
+ if (response.statusCode === 200) {
172
+ showToast(toast, "success", ERROR_MESSAGES.LAYOUT, ERROR_MESSAGES.DASHBOARD_LAYOUT_UPDATE_SUCCESSFULLY);
173
+ }
174
+ return [3 /*break*/, 3];
175
+ case 2:
176
+ error_1 = _a.sent();
177
+ showToast(toast, "error", ERROR_MESSAGES.LAYOUT, ERROR_MESSAGES.DASHBOARD_LAYOUT_UPDATE_FAILED);
178
+ return [3 /*break*/, 3];
179
+ case 3: return [2 /*return*/];
180
+ }
181
+ });
182
+ }); };
154
183
  useEffect(function () {
155
184
  // Invoke the dashboard api to fetch the dashboard data
156
185
  // console.log('Dashboard Data testing:', isLoading, data, error);
@@ -207,9 +236,9 @@ var SolidDashboard = function (params) {
207
236
  dispatch(showNavbar()); // open both
208
237
  }
209
238
  };
210
- var _o = useState(null), mcpUrl = _o[0], setMcpUrl = _o[1];
239
+ var _t = useState(null), mcpUrl = _t[0], setMcpUrl = _t[1];
211
240
  var getMcpUrl = useLazyGetMcpUrlQuery()[0];
212
- var _p = useLazyGetSolidSettingsQuery(), trigger = _p[0], solidSettingsData = _p[1].data;
241
+ var _u = useLazyGetSolidSettingsQuery(), trigger = _u[0], solidSettingsData = _u[1].data;
213
242
  useEffect(function () {
214
243
  trigger(""); // Fetch settings on mount
215
244
  }, []);
@@ -220,7 +249,7 @@ var SolidDashboard = function (params) {
220
249
  }
221
250
  }, [solidSettingsData]);
222
251
  var enableSolidXAiPanel = function () { return __awaiter(void 0, void 0, void 0, function () {
223
- var queryData, queryString, response, error_1;
252
+ var queryData, queryString, response, error_2;
224
253
  var _a, _b;
225
254
  return __generator(this, function (_c) {
226
255
  switch (_c.label) {
@@ -240,14 +269,14 @@ var SolidDashboard = function (params) {
240
269
  }
241
270
  return [3 /*break*/, 3];
242
271
  case 2:
243
- error_1 = _c.sent();
272
+ error_2 = _c.sent();
244
273
  return [3 /*break*/, 3];
245
274
  case 3: return [2 /*return*/];
246
275
  }
247
276
  });
248
277
  }); };
249
- 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 && _jsx(SolidDashboardVariable, { dashboardVariables: dashboardVariables, filters: filters, setFilters: setFilters })] }), !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: {
278
+ return (_jsxs("div", { className: "h-screen surface-0 flex", children: [_jsx(Toast, { ref: toast }), _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) &&
279
+ _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("a", { onClick: function () { return setIsDashboardFilterVisible(true); }, children: _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", icon: filters.length > 0 ? "pi pi-filter-fill" : "pi pi-filter", className: "p-button-sm lg:hidden solid-icon-button ", size: 'small' }), _jsx(Button, { type: "button", icon: filters.length > 0 ? "pi pi-filter-fill" : "pi pi-filter", label: "Filter", className: "hidden lg:inline-flex", size: 'small' })] }) }), filters.length > 0 && (_jsx(Button, { type: "button", size: "small", icon: "pi pi-filter-slash", severity: "secondary", className: "solid-icon-button ", outlined: true, onClick: function () { setFilters([]); setIsDashboardFilterVisible(false); } })), _jsx(Button, { type: "button", size: "small", icon: "pi pi-save", severity: "secondary", className: "solid-icon-button ", outlined: true, onClick: function () { return updateUserDashboardLayout(); } })] }), _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, { dashboardId: (_f = data === null || data === void 0 ? void 0 : data.records[0]) === null || _f === void 0 ? void 0 : _f.id, questions: questions, filters: filters, dashboardLayout: dashboardLayout, setDashboardLayout: setDashboardLayout })] }))] }), mcpUrl && (_jsxs("div", { className: "chatter-section ".concat(isOpenSolidXAiPanel === false ? 'collapsed' : 'open'), style: { width: chatterWidth }, children: [isOpenSolidXAiPanel && (_jsx("div", { style: {
251
280
  width: 5,
252
281
  cursor: 'col-resize',
253
282
  position: 'absolute',