@quillsql/react 2.12.52 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +5 -3
  3. package/dist/cjs/ChartBuilder.d.ts +10 -3
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +62 -26
  6. package/dist/cjs/ChartEditor.d.ts +3 -1
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +74 -16
  9. package/dist/cjs/Context.d.ts +17 -6
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +138 -73
  12. package/dist/cjs/Dashboard.d.ts +8 -4
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +146 -367
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  16. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +20 -14
  17. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
  18. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  19. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
  20. package/dist/cjs/QuillProvider.js +1 -1
  21. package/dist/cjs/ReportBuilder.d.ts +8 -12
  22. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  23. package/dist/cjs/ReportBuilder.js +163 -83
  24. package/dist/cjs/SQLEditor.d.ts +8 -1
  25. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  26. package/dist/cjs/SQLEditor.js +81 -28
  27. package/dist/cjs/Table.d.ts.map +1 -1
  28. package/dist/cjs/Table.js +6 -3
  29. package/dist/cjs/assets/AdjustmentsIcon.d.ts +5 -0
  30. package/dist/cjs/assets/AdjustmentsIcon.d.ts.map +1 -0
  31. package/dist/cjs/assets/AdjustmentsIcon.js +5 -0
  32. package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/ChartError.js +2 -2
  34. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +4 -3
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.js +12 -12
  37. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts +2 -2
  38. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.d.ts +11 -5
  40. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/DataLoader.js +91 -32
  42. package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
  43. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  44. package/dist/cjs/components/Dashboard/TableComponent.js +10 -3
  45. package/dist/cjs/components/Dashboard/util.d.ts +2 -2
  46. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  47. package/dist/cjs/components/Dashboard/util.js +2 -2
  48. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  49. package/dist/cjs/components/QuillMultiSelect.js +18 -13
  50. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  51. package/dist/cjs/components/QuillMultiSelectWithCombo.js +67 -45
  52. package/dist/cjs/components/QuillSelect.d.ts +1 -1
  53. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  54. package/dist/cjs/components/QuillSelect.js +29 -7
  55. package/dist/cjs/components/QuillSelectWithCombo.d.ts +1 -1
  56. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
  57. package/dist/cjs/components/QuillSelectWithCombo.js +47 -26
  58. package/dist/cjs/components/QuillTable.d.ts +3 -2
  59. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  60. package/dist/cjs/components/QuillTable.js +32 -19
  61. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -1
  62. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  63. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +2 -2
  64. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +2 -1
  65. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  66. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +2 -2
  67. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +2 -1
  68. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  69. package/dist/cjs/components/ReportBuilder/FilterModal.js +17 -4
  70. package/dist/cjs/components/ReportBuilder/ui.d.ts +13 -8
  71. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  72. package/dist/cjs/components/ReportBuilder/ui.js +15 -24
  73. package/dist/cjs/components/UiComponents.d.ts +17 -9
  74. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  75. package/dist/cjs/components/UiComponents.js +30 -24
  76. package/dist/cjs/hooks/useAstToFilterTree.d.ts +2 -2
  77. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
  78. package/dist/cjs/hooks/useDashboard.d.ts +13 -5
  79. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  80. package/dist/cjs/hooks/useDashboard.js +158 -70
  81. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  82. package/dist/cjs/hooks/useExport.js +9 -3
  83. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  84. package/dist/cjs/hooks/useQuill.js +15 -15
  85. package/dist/cjs/hooks/useVirtualTables.d.ts +12 -3
  86. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  87. package/dist/cjs/hooks/useVirtualTables.js +105 -1
  88. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +3 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  90. package/dist/cjs/internals/ReportBuilder/PivotForm.js +9 -9
  91. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  92. package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -15
  93. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +3 -2
  94. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  95. package/dist/cjs/internals/ReportBuilder/PivotModal.js +9 -9
  96. package/dist/cjs/models/Client.d.ts +16 -2
  97. package/dist/cjs/models/Client.d.ts.map +1 -1
  98. package/dist/cjs/models/Dashboard.d.ts +1 -1
  99. package/dist/cjs/models/Dashboard.d.ts.map +1 -1
  100. package/dist/cjs/models/Filter.d.ts +4 -3
  101. package/dist/cjs/models/Filter.d.ts.map +1 -1
  102. package/dist/cjs/models/Filter.js +38 -1
  103. package/dist/cjs/utils/astProcessing.d.ts +3 -3
  104. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  105. package/dist/cjs/utils/client.d.ts.map +1 -1
  106. package/dist/cjs/utils/client.js +2 -7
  107. package/dist/cjs/utils/dashboard.d.ts +5 -5
  108. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  109. package/dist/cjs/utils/dashboard.js +90 -9
  110. package/dist/cjs/utils/dataFetcher.d.ts +4 -4
  111. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  112. package/dist/cjs/utils/dataFetcher.js +1 -1
  113. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  114. package/dist/cjs/utils/filterProcessing.js +2 -8
  115. package/dist/cjs/utils/paginationProcessing.js +1 -1
  116. package/dist/cjs/utils/pivotConstructor.d.ts +2 -2
  117. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  118. package/dist/cjs/utils/pivotConstructor.js +1 -1
  119. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  120. package/dist/cjs/utils/pivotProcessing.js +6 -2
  121. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  122. package/dist/cjs/utils/queryConstructor.js +12 -9
  123. package/dist/cjs/utils/report.d.ts +6 -5
  124. package/dist/cjs/utils/report.d.ts.map +1 -1
  125. package/dist/cjs/utils/report.js +71 -25
  126. package/dist/cjs/utils/schema.d.ts +3 -3
  127. package/dist/cjs/utils/schema.d.ts.map +1 -1
  128. package/dist/cjs/utils/schema.js +39 -35
  129. package/dist/cjs/utils/tableProcessing.d.ts +18 -11
  130. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  131. package/dist/cjs/utils/tableProcessing.js +44 -23
  132. package/dist/esm/Chart.d.ts.map +1 -1
  133. package/dist/esm/Chart.js +6 -4
  134. package/dist/esm/ChartBuilder.d.ts +10 -3
  135. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  136. package/dist/esm/ChartBuilder.js +59 -26
  137. package/dist/esm/ChartEditor.d.ts +3 -1
  138. package/dist/esm/ChartEditor.d.ts.map +1 -1
  139. package/dist/esm/ChartEditor.js +76 -18
  140. package/dist/esm/Context.d.ts +17 -6
  141. package/dist/esm/Context.d.ts.map +1 -1
  142. package/dist/esm/Context.js +139 -74
  143. package/dist/esm/Dashboard.d.ts +8 -4
  144. package/dist/esm/Dashboard.d.ts.map +1 -1
  145. package/dist/esm/Dashboard.js +146 -367
  146. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  147. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +21 -15
  148. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
  149. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  150. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
  151. package/dist/esm/QuillProvider.js +1 -1
  152. package/dist/esm/ReportBuilder.d.ts +8 -12
  153. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  154. package/dist/esm/ReportBuilder.js +167 -87
  155. package/dist/esm/SQLEditor.d.ts +8 -1
  156. package/dist/esm/SQLEditor.d.ts.map +1 -1
  157. package/dist/esm/SQLEditor.js +84 -31
  158. package/dist/esm/Table.d.ts.map +1 -1
  159. package/dist/esm/Table.js +7 -4
  160. package/dist/esm/assets/AdjustmentsIcon.d.ts +5 -0
  161. package/dist/esm/assets/AdjustmentsIcon.d.ts.map +1 -0
  162. package/dist/esm/assets/AdjustmentsIcon.js +3 -0
  163. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  164. package/dist/esm/components/Chart/ChartError.js +2 -2
  165. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +4 -3
  166. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  167. package/dist/esm/components/Dashboard/DashboardFilter.js +12 -12
  168. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts +2 -2
  169. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  170. package/dist/esm/components/Dashboard/DataLoader.d.ts +11 -5
  171. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  172. package/dist/esm/components/Dashboard/DataLoader.js +94 -35
  173. package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
  174. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  175. package/dist/esm/components/Dashboard/TableComponent.js +10 -3
  176. package/dist/esm/components/Dashboard/util.d.ts +2 -2
  177. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  178. package/dist/esm/components/Dashboard/util.js +2 -2
  179. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  180. package/dist/esm/components/QuillMultiSelect.js +19 -14
  181. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  182. package/dist/esm/components/QuillMultiSelectWithCombo.js +68 -46
  183. package/dist/esm/components/QuillSelect.d.ts +1 -1
  184. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  185. package/dist/esm/components/QuillSelect.js +30 -8
  186. package/dist/esm/components/QuillSelectWithCombo.d.ts +1 -1
  187. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  188. package/dist/esm/components/QuillSelectWithCombo.js +48 -27
  189. package/dist/esm/components/QuillTable.d.ts +3 -2
  190. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  191. package/dist/esm/components/QuillTable.js +32 -19
  192. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -1
  193. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  194. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -2
  195. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +2 -1
  196. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  197. package/dist/esm/components/ReportBuilder/AddSortPopover.js +2 -2
  198. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +2 -1
  199. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  200. package/dist/esm/components/ReportBuilder/FilterModal.js +17 -4
  201. package/dist/esm/components/ReportBuilder/ui.d.ts +13 -8
  202. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  203. package/dist/esm/components/ReportBuilder/ui.js +14 -19
  204. package/dist/esm/components/UiComponents.d.ts +17 -9
  205. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  206. package/dist/esm/components/UiComponents.js +30 -24
  207. package/dist/esm/hooks/useAstToFilterTree.d.ts +2 -2
  208. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
  209. package/dist/esm/hooks/useDashboard.d.ts +13 -5
  210. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  211. package/dist/esm/hooks/useDashboard.js +158 -73
  212. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  213. package/dist/esm/hooks/useExport.js +10 -4
  214. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  215. package/dist/esm/hooks/useQuill.js +17 -17
  216. package/dist/esm/hooks/useVirtualTables.d.ts +12 -3
  217. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  218. package/dist/esm/hooks/useVirtualTables.js +106 -2
  219. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +3 -1
  220. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  221. package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -9
  222. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  223. package/dist/esm/internals/ReportBuilder/PivotList.js +21 -15
  224. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +3 -2
  225. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  226. package/dist/esm/internals/ReportBuilder/PivotModal.js +9 -9
  227. package/dist/esm/models/Client.d.ts +16 -2
  228. package/dist/esm/models/Client.d.ts.map +1 -1
  229. package/dist/esm/models/Dashboard.d.ts +1 -1
  230. package/dist/esm/models/Dashboard.d.ts.map +1 -1
  231. package/dist/esm/models/Filter.d.ts +4 -3
  232. package/dist/esm/models/Filter.d.ts.map +1 -1
  233. package/dist/esm/models/Filter.js +36 -0
  234. package/dist/esm/utils/astProcessing.d.ts +3 -3
  235. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  236. package/dist/esm/utils/client.d.ts.map +1 -1
  237. package/dist/esm/utils/client.js +2 -7
  238. package/dist/esm/utils/dashboard.d.ts +5 -5
  239. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  240. package/dist/esm/utils/dashboard.js +90 -9
  241. package/dist/esm/utils/dataFetcher.d.ts +4 -4
  242. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  243. package/dist/esm/utils/dataFetcher.js +1 -1
  244. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  245. package/dist/esm/utils/filterProcessing.js +2 -8
  246. package/dist/esm/utils/paginationProcessing.js +1 -1
  247. package/dist/esm/utils/pivotConstructor.d.ts +2 -2
  248. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  249. package/dist/esm/utils/pivotConstructor.js +1 -1
  250. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  251. package/dist/esm/utils/pivotProcessing.js +6 -2
  252. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  253. package/dist/esm/utils/queryConstructor.js +12 -9
  254. package/dist/esm/utils/report.d.ts +6 -5
  255. package/dist/esm/utils/report.d.ts.map +1 -1
  256. package/dist/esm/utils/report.js +70 -25
  257. package/dist/esm/utils/schema.d.ts +3 -3
  258. package/dist/esm/utils/schema.d.ts.map +1 -1
  259. package/dist/esm/utils/schema.js +39 -35
  260. package/dist/esm/utils/tableProcessing.d.ts +18 -11
  261. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  262. package/dist/esm/utils/tableProcessing.js +41 -20
  263. package/package.json +1 -1
@@ -27,7 +27,7 @@ import QuillTemplateMetricComponent from './components/Dashboard/TemplateMetricC
27
27
  import QuillTemplateTableComponent from './components/Dashboard/TemplateTableComponent';
28
28
  import QuillDashboardTemplate from './components/Dashboard/DashboardTemplate';
29
29
  import { DashboardFilterType, } from './models/Filter';
30
- import equal from 'fast-deep-equal';
30
+ import { DEFAULT_PAGINATION } from './utils/paginationProcessing';
31
31
  const defaultChartContainerStyles = {
32
32
  display: 'flex',
33
33
  width: '100%',
@@ -43,6 +43,15 @@ const charts = (sections, section, sortByOrdering) => sections[section]
43
43
  const tables = (sections, section, sortByOrdering) => sections[section]
44
44
  .filter(({ chartType }) => chartType === 'table')
45
45
  .sort(sortByOrdering);
46
+ const sortByOrdering = (a, b) => {
47
+ if (a.order === undefined && b.order === undefined)
48
+ return 0;
49
+ if (a.order === undefined)
50
+ return 1;
51
+ if (b.order === undefined)
52
+ return -1;
53
+ return a.order - b.order;
54
+ };
46
55
  /**
47
56
  * ### Quill Dashboard
48
57
  *
@@ -74,35 +83,52 @@ const tables = (sections, section, sortByOrdering) => sections[section]
74
83
  * ### API Reference
75
84
  * @see https://docs.quillsql.com/components/dashboard
76
85
  */
77
- export default function Dashboard({ name, hidden = false, SelectComponent = QuillSelectComponentWithCombo, MultiSelectComponent = QuillMultiSelectComponentWithCombo, ModalComponent = QuillModalComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, FilterTagComponent = QuillFilterPopover, PopoverComponent = MemoizedPopover, TextInputComponent = QuillTextInput, EmptyDashboardComponent = QuillEmptyDashboardComponent, DateRangePickerComponent = QuillDateRangePicker, MetricComponent = QuillMetricComponent, ChartComponent = QuillChartComponent, TableComponent = QuillTableComponent, TemplateMetricComponent = QuillTemplateMetricComponent, TemplateChartComponent = QuillTemplateChartComponent, TemplateTableComponent = QuillTemplateTableComponent, DashboardSectionComponent = DashboardSection, DashboardSectionContainerComponent = DashboardSectionContainer, FilterContainerComponent = QuillFilterContainerComponent, DashboardLoadingComponent = QuillLoadingDashboardComponent, ErrorComponent = QuillChartErrorWithAction, onClickReport, hoverActions, onChangeLoading, hideFilters, hideXAxis = false, hideYAxis = false, hideCartesianGrid = false, comparisonLineStyle = 'solid', containerStyle, className, chartContainerStyle = defaultChartContainerStyles, filters, onClickChartElement, dateBucket, additionalProcessing, hideAdminErrors = true, templateDashboardName, }) {
78
- const { isLoading, data, reload, isDashboardFiltersLoading, dashboardFilters: populatedDashboardFilters, } = useDashboard(name);
79
- const [isDashboardOptionsLoading, setisDashboardOptionsLoading] = useState(isDashboardFiltersLoading);
80
- const [presetFilters, setPresetFilters] = useState(null);
86
+ export default function Dashboard({ name, hidden = false, SelectComponent = QuillSelectComponentWithCombo, MultiSelectComponent = QuillMultiSelectComponentWithCombo, ModalComponent = QuillModalComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, FilterTagComponent = QuillFilterPopover, PopoverComponent = MemoizedPopover, TextInputComponent = QuillTextInput, EmptyDashboardComponent = QuillEmptyDashboardComponent, DateRangePickerComponent = QuillDateRangePicker, MetricComponent = QuillMetricComponent, ChartComponent = QuillChartComponent, TableComponent = QuillTableComponent, TemplateMetricComponent = QuillTemplateMetricComponent, TemplateChartComponent = QuillTemplateChartComponent, TemplateTableComponent = QuillTemplateTableComponent, DashboardSectionComponent = DashboardSection, DashboardSectionContainerComponent = DashboardSectionContainer, FilterContainerComponent = QuillFilterContainerComponent, DashboardLoadingComponent = QuillLoadingDashboardComponent, ErrorComponent = QuillChartErrorWithAction, onClickReport, hoverActions, onChangeLoading, hideFilters, hideXAxis = false, hideYAxis = false, hideCartesianGrid = false, comparisonLineStyle = 'solid', containerStyle, className, chartContainerStyle = defaultChartContainerStyles,
87
+ // TODO: do something with these custom filters
88
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
89
+ filters, onClickChartElement, dateBucket, additionalProcessing, hideAdminErrors = true, templateDashboardName, pagination = { rowsPerPage: 10, rowsPerRequest: 50 }, }) {
90
+ const { isLoading, data, isDashboardFilterLoading, dashboardFilters: populatedDashboardFilters, reload, } = useDashboard(name);
81
91
  const [client, isClientLoading] = useContext(ClientContext);
82
92
  const [theme] = useContext(ThemeContext);
83
- const [initialLoad, setInitialLoad] = useState(true);
84
- const [appliedFilters, setAppliedFilters] = useState(null);
85
- const { dashboardFilters, dashboardFiltersDispatch } = useContext(DashboardFiltersContext);
93
+ const { dispatch: dashboardFiltersDispatch } = useContext(DashboardFiltersContext);
86
94
  const [schemaData] = useContext(SchemaDataContext);
87
- const [filterSchemaIsLoaded, setFilterSchemaIsLoaded] = useState(false);
88
- const [filterSchema, setFilterSchema] = useState({ columns: [] }); // Schema to be passed into FilterModal
89
95
  const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
90
96
  const [referencedTables, setReferencedTables] = useState([]); // Intersection of tables referenced in the dashboard
91
97
  const [fieldValuesIsLoaded, setFieldValuesIsLoaded] = useState(false);
92
98
  const [addFilterPopoverIsOpen, setAddFilterPopoverIsOpen] = useState(false);
93
99
  const [filterListIsOpen, setFilterListIsOpen] = useState(false);
94
100
  const [filterListAddFilterPopoverIsOpen, setFilterListAddFilterPopoverIsOpen,] = useState(false);
95
- const [uniqueCounter, setUniqueCounter] = useState(0);
96
- const userFilters = useMemo(() => {
97
- return (appliedFilters
98
- ?.map((filter, index) => {
99
- return { filter, index };
100
- })
101
- .filter((filter) => filter.filter.isUserFilter) ?? []);
102
- }, [appliedFilters]);
103
- const adminFilters = useMemo(() => {
104
- return appliedFilters?.filter((filter) => !filter.isUserFilter) ?? [];
105
- }, [appliedFilters]);
101
+ const presetOptions = useMemo(() => {
102
+ return populatedDashboardFilters?.[0]?.filterType === 'date_range'
103
+ ? populatedDashboardFilters[0].presetRanges?.map((elem) => {
104
+ if (!elem.isStatic) {
105
+ return {
106
+ label: elem.label,
107
+ value: elem.value,
108
+ startDate: PRIMARY_RANGE[elem.value].start,
109
+ endDate: PRIMARY_RANGE[elem.value].end,
110
+ };
111
+ }
112
+ return {
113
+ label: elem.label,
114
+ value: elem.value,
115
+ startDate: new Date(elem.startDate),
116
+ endDate: new Date(elem.endDate),
117
+ };
118
+ }) ?? defaultOptionsV2
119
+ : defaultOptionsV2;
120
+ }, [populatedDashboardFilters]);
121
+ const [userFilters, setUserFilters] = useState({});
122
+ // A filter value can either be a string, an array of strings for a multiselect, or a date range (that could have a comparison range)
123
+ const [filterValues, setFilterValues] = useState({});
124
+ useEffect(() => {
125
+ setFilterValues({});
126
+ reload(name, true);
127
+ }, [client?.organizationId]);
128
+ useEffect(() => {
129
+ setFilterValues({});
130
+ reload(name, false);
131
+ }, [name]);
106
132
  const customOperatorOptions = {
107
133
  [FieldTypes.Number]: [
108
134
  NumberOperator.EqualTo,
@@ -130,32 +156,6 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
130
156
  NullOperator.IsNull,
131
157
  ],
132
158
  };
133
- useEffect(() => {
134
- if (!data)
135
- return;
136
- onDashboardDataChange(data, schemaData.schema);
137
- }, [data, filters, schemaData.schema]);
138
- useEffect(() => {
139
- if (isDashboardFiltersLoading)
140
- return;
141
- if (populatedDashboardFilters) {
142
- const newApplied = appliedFilters?.map((filter) => {
143
- if ((filter.options && filter.options.length) ||
144
- filter.isUserFilter) {
145
- return filter;
146
- }
147
- const equivalent = populatedDashboardFilters.find((populatedFilter) => populatedFilter._id === filter._id);
148
- return { ...filter, options: equivalent?.options ?? filter.options };
149
- }) ?? populatedDashboardFilters;
150
- if (!equal(appliedFilters, newApplied)) {
151
- setAppliedFilters(newApplied);
152
- }
153
- }
154
- setisDashboardOptionsLoading(false);
155
- }, [isDashboardFiltersLoading, populatedDashboardFilters]);
156
- useEffect(() => {
157
- reload(name);
158
- }, [name, client]);
159
159
  // Go through all columns in the referenced tables and get the unique values to use in fieldValuesMap
160
160
  useEffect(() => {
161
161
  const fetchData = async () => {
@@ -176,24 +176,22 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
176
176
  setFieldValuesMap(newFieldValues);
177
177
  setFieldValuesIsLoaded(true);
178
178
  };
179
- fetchData();
179
+ if (data?.customFiltersEnabled) {
180
+ fetchData();
181
+ }
180
182
  }, [referencedTables]);
181
- // Get the relevant information from the dashboard and schema to pass to FilterModal
182
- const updateFilterSchema = (sections, schema) => {
183
- if (!sections || !schema || schema.length === 0) {
184
- return;
183
+ const filterSchema = useMemo(() => {
184
+ if (!data?.sections ||
185
+ !schemaData.schema ||
186
+ schemaData.schema.length === 0) {
187
+ return { columns: [] };
185
188
  }
186
- setFilterSchemaIsLoaded(false);
189
+ const sections = data?.sections;
190
+ const schema = schemaData.schema;
187
191
  // find intersection of all referenced tables
188
- const tables = Object.keys(sections)
189
- .map((section) => {
190
- return sections[section].map((chart) => {
191
- return chart.referencedTables;
192
- });
193
- })
194
- .reduce((accumulator, currentArray) => {
195
- return accumulator.concat(currentArray);
196
- }, []);
192
+ const tables = Object.values(sections)
193
+ .flatMap((section) => section.map((chart) => chart.referencedTables))
194
+ .flat();
197
195
  if (tables && tables.length > 0) {
198
196
  let intersection = new Set(tables[0]);
199
197
  for (let i = 1; i < tables.length; ++i) {
@@ -217,289 +215,94 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
217
215
  .reduce((accumulator, currentArray) => {
218
216
  return accumulator.concat(currentArray);
219
217
  }, []);
220
- setFilterSchema({ columns });
221
- }
222
- else {
223
- setFilterSchema({ columns: [] });
224
- }
225
- setFilterSchemaIsLoaded(true);
226
- };
227
- const onDashboardDataChange = (resp, schema) => {
228
- // setDashboardSections(resp.sections ?? {});
229
- updateFilterSchema(resp.sections, schema);
230
- const filterArray = [];
231
- if (resp.dateFilter && Object.keys(resp.dateFilter).length) {
232
- let presetsOptions = defaultOptionsV2;
233
- if (resp.dateFilter.presetRanges) {
234
- presetsOptions = resp.dateFilter.presetRanges.map((elem) => {
235
- if (!elem.isStatic) {
236
- return {
237
- label: elem.label,
238
- value: elem.value,
239
- startDate: PRIMARY_RANGE[elem.value].start,
240
- endDate: PRIMARY_RANGE[elem.value].end,
241
- };
242
- }
243
- return {
244
- label: elem.label,
245
- value: elem.value,
246
- startDate: new Date(elem.startDate),
247
- endDate: new Date(elem.endDate),
248
- };
249
- });
250
- }
251
- setPresetFilters(presetsOptions);
252
- const key = resp.dateFilter?.primaryRange?.value || 'LAST_6_MONTHS';
253
- const primaryPreset = presetsOptions.find((option) => {
254
- return option.value === key;
255
- });
256
- const filter = {
257
- startDate: primaryPreset.startDate,
258
- endDate: primaryPreset.endDate,
259
- filterType: 'date_range',
260
- options: presetsOptions.map((elem) => {
261
- return {
262
- label: elem.label,
263
- value: elem.value,
264
- };
265
- }),
266
- field: 'date_range',
267
- label: resp.dateFilter.label,
268
- preset: {
269
- label: primaryPreset.label,
270
- },
271
- dashboardName: name,
272
- };
273
- if (resp.dateFilter.comparison) {
274
- filter.comparison = true;
275
- const compKey = resp.dateFilter.defaultComparisonRange ?? 'PREV_PERIOD';
276
- const range = { start: filter.startDate, end: filter.endDate };
277
- filter.comparisonRange = {
278
- startDate: COMPARISON_RANGE[compKey](range)?.start,
279
- endDate: COMPARISON_RANGE[compKey](range)?.end,
280
- value: compKey,
281
- };
282
- }
283
- else {
284
- filter.comparison = false;
285
- }
286
- filterArray.push(filter);
287
- }
288
- // Add string filters to filterArray
289
- if (resp.filters && resp.filters.length) {
290
- Object.values(resp.filters)
291
- .filter((filter) => filter.filterType !== 'date_range')
292
- .forEach((filter) => {
293
- let processedFilter = processFilter(filter);
294
- if (populatedDashboardFilters) {
295
- const equivalent = populatedDashboardFilters.find((populatedFilter) => populatedFilter._id === filter._id);
296
- processedFilter = {
297
- ...processedFilter,
298
- options: equivalent?.options ?? filter.options,
299
- };
300
- }
301
- filterArray.push(processedFilter);
302
- });
303
- }
304
- // Add custom filter to filterArray
305
- if (filters) {
306
- filters.forEach((filter) => {
307
- filterArray.push({
308
- ...filter,
309
- dashboardName: name,
310
- isUserFilter: true,
311
- });
312
- });
313
- }
314
- // remove all that are already present in dashboardSpecificFilters
315
- const dashboardSpecificFilters = dashboardFilters.filter((f) => f.dashboardName === name);
316
- if (!equal(dashboardSpecificFilters, filterArray)) {
317
- dashboardFiltersDispatch({
318
- type: 'CLEAR_AND_ADD_DASHBOARD_FILTERS',
319
- data: filterArray,
320
- dashboardName: name,
321
- });
322
- }
323
- if (!equal(appliedFilters, filterArray)) {
324
- setAppliedFilters(filterArray);
325
- }
326
- setInitialLoad(false);
327
- };
328
- const handleOnClickDashboardItem = (elem) => {
329
- if (onClickReport) {
330
- onClickReport({ ...elem, _id: elem.id });
331
- }
332
- };
333
- function removeQuotes(str) {
334
- if (str.startsWith('"') && str.endsWith('"')) {
335
- return str.slice(1, -1);
218
+ return { columns };
336
219
  }
337
220
  else {
338
- return str;
221
+ return { columns: [] };
339
222
  }
340
- }
341
- const processFilter = (filter, value = null) => {
342
- //for dateObjects only, since values are arrays for dateObjects
343
- const { ...filterWithoutSelectedValue } = filter; // _ is a throwaway variable
344
- let selectedValue;
345
- let selectedElem;
346
- if (filter.filterType === 'string') {
347
- if (filter.options) {
348
- selectedElem = filter.options.find((elem) => elem[removeQuotes(filter.field)] === value);
349
- }
350
- if (selectedElem) {
351
- selectedValue = selectedElem[removeQuotes(filter.field)];
352
- }
353
- return {
354
- ...filterWithoutSelectedValue,
355
- ...(selectedValue ? { selectedValue } : {}),
356
- dashboardName: name,
357
- };
358
- }
359
- if (filter.filterType === 'date' || filter.filterType === 'date_range') {
360
- return {
361
- startDate: value ? value[0] : filter.startDate,
362
- endDate: value ? value[1] : filter.endDate,
363
- filterType: 'date_range',
364
- label: 'Date',
365
- field: 'date_range',
366
- options: filter.options,
367
- dashboardName: name,
368
- };
369
- }
370
- };
223
+ }, [data?.sections, schemaData.schema]);
224
+ const handleOnClickDashboardItem = (elem) => onClickReport && onClickReport({ ...elem, _id: elem.id });
371
225
  const updateFilter = (filter, value = null, comparison = null) => {
372
- if (!appliedFilters) {
226
+ if (!populatedDashboardFilters)
373
227
  return;
374
- }
375
- //for dateObjects only, since values are arrays for dateObjects
376
- const { ...filterWithoutSelectedValue } = filter; // _ is a throwaway variable
228
+ let filterValue = {};
377
229
  if (filter.filterType === 'string') {
378
- let selectedValue = {};
379
- if (value || value === '') {
380
- if (filter.stringFilterType === 'multiselect') {
381
- if (value.length === 0) {
382
- selectedValue = { values: [] };
383
- }
384
- else {
385
- selectedValue = { values: value, operator: 'IN' };
386
- }
230
+ if (filter.stringFilterType === 'multiselect') {
231
+ if ((value?.length ?? 0) === 0) {
232
+ filterValue = { values: undefined, operator: undefined };
387
233
  }
388
234
  else {
389
- selectedValue = { selectedValue: value };
235
+ filterValue = { values: value, operator: 'IN' };
390
236
  }
391
237
  }
392
- const newFilter = {
393
- ...filterWithoutSelectedValue,
394
- ...selectedValue,
395
- dashboardName: name,
396
- stringFilterType: filter.stringFilterType,
397
- table: filter.table,
398
- labelField: filter.labelField,
399
- label: filter.label,
400
- field: filter.field,
401
- filterType: DashboardFilterType.String,
402
- };
403
- dashboardFiltersDispatch({
404
- type: 'UPDATE_DASHBOARD_FILTER',
405
- id: filter.field,
406
- data: newFilter,
407
- });
408
- const index = appliedFilters.findIndex((filter) => filter.field === newFilter.field &&
409
- filter.dashboardName === newFilter.dashboardName);
410
- if (index !== -1) {
411
- setAppliedFilters([
412
- ...appliedFilters.slice(0, index),
413
- newFilter,
414
- ...appliedFilters.slice(index + 1),
415
- ]);
238
+ else {
239
+ filterValue = { selectedValue: value };
416
240
  }
417
- return;
241
+ setFilterValues((filterValues) => ({
242
+ ...filterValues,
243
+ [filter.label]: filterValue,
244
+ }));
418
245
  }
419
- if (filter.filterType === DashboardFilterType.Date) {
246
+ else if (filter.filterType === DashboardFilterType.Date) {
420
247
  if (comparison ||
421
- (filter.comparison && filter.comparisonRange.value !== 'NO_COMPARISON')) {
248
+ (filter.comparison &&
249
+ (filter.comparisonRange?.value ?? 'NO_COMPARISON') !==
250
+ 'NO_COMPARISON')) {
422
251
  let preset = '';
423
252
  if (comparison) {
424
- preset = filter.preset.label;
253
+ preset = filter.preset.value;
425
254
  }
426
- const key = comparison?.value || filter.comparisonRange.value;
255
+ const key = comparison?.value ||
256
+ (filter.comparisonRange?.value ?? 'NO_COMPARISON');
427
257
  let primaryRange = {
428
258
  start: value ? value.startDate : filter.startDate,
429
259
  end: value ? value.endDate : filter.endDate,
430
260
  };
431
261
  if (value && value.preset) {
432
262
  preset = value.preset;
433
- primaryRange = getRangeFromPresetOptions(value.preset, presetFilters);
263
+ primaryRange = getRangeFromPresetOptions(value.preset, presetOptions);
434
264
  }
435
- const newFilter = {
265
+ filterValue = {
436
266
  startDate: primaryRange.start,
437
267
  endDate: primaryRange.end,
438
- filterType: DashboardFilterType.Date,
439
- label: filter.label,
440
- field: 'date_range',
441
- preset: { label: preset, value: preset },
442
- options: filter.options,
443
- comparison: true,
268
+ preset: {
269
+ label: presetOptions.find((o) => o.value === preset)?.label ?? preset,
270
+ value: preset,
271
+ },
444
272
  comparisonRange: {
445
273
  startDate: COMPARISON_RANGE[key](primaryRange)?.start,
446
274
  endDate: COMPARISON_RANGE[key](primaryRange)?.end,
447
275
  value: key,
448
276
  },
449
- defaultComparisonRange: filter.defaultComparisonRange,
450
- primaryRange: filter.primaryRange,
451
- dashboardName: name,
452
277
  };
453
- dashboardFiltersDispatch({
454
- type: 'UPDATE_DASHBOARD_FILTER',
455
- id: 'date_range',
456
- data: newFilter,
457
- });
458
- const index = appliedFilters.findIndex((filter) => filter.field === newFilter.field &&
459
- filter.dashboardName === newFilter.dashboardName);
460
- if (index !== -1) {
461
- setAppliedFilters([
462
- ...appliedFilters.slice(0, index),
463
- newFilter,
464
- ...appliedFilters.slice(index + 1),
465
- ]);
466
- }
278
+ setFilterValues((filterValues) => ({
279
+ ...filterValues,
280
+ [filter.label]: filterValue,
281
+ }));
467
282
  }
468
283
  else {
469
284
  const primaryRange = value && value.preset
470
- ? getRangeFromPresetOptions(value.preset, presetFilters)
285
+ ? getRangeFromPresetOptions(value.preset, presetOptions)
471
286
  : {
472
287
  start: value?.startDate || filter.startDate,
473
288
  end: value?.endDate || filter.endDate,
474
289
  };
475
290
  const preset = value?.preset ? value.preset : '';
476
- const newFilter = {
477
- ...filter,
478
- preset: { label: preset, value: preset },
291
+ filterValue = {
479
292
  startDate: primaryRange.start,
480
293
  endDate: primaryRange.end,
481
- filterType: DashboardFilterType.Date,
482
- field: 'date_range',
483
- options: filter.options,
484
- label: 'Date',
485
- dashboardName: name,
294
+ preset: { label: preset, value: preset },
486
295
  };
487
- dashboardFiltersDispatch({
488
- type: 'UPDATE_DASHBOARD_FILTER',
489
- id: 'date_range',
490
- data: newFilter,
491
- });
492
- const index = appliedFilters.findIndex((filter) => filter.field === newFilter.field &&
493
- filter.dashboardName === newFilter.dashboardName);
494
- if (index !== -1) {
495
- setAppliedFilters([
496
- ...appliedFilters.slice(0, index),
497
- newFilter,
498
- ...appliedFilters.slice(index + 1),
499
- ]);
500
- }
296
+ setFilterValues((filterValues) => ({
297
+ ...filterValues,
298
+ [filter.label]: filterValue,
299
+ }));
501
300
  }
502
301
  }
302
+ reload(name, false, undefined, {
303
+ filters: populatedDashboardFilters.map((f) => filter.label === f.label ? { ...f, ...filterValue } : f),
304
+ editedFilterLabel: filter.label,
305
+ });
503
306
  };
504
307
  // generate the correct filter structure
505
308
  const getUserFilter = (filter, id, existingFilter) => {
@@ -524,43 +327,20 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
524
327
  return userFilter;
525
328
  };
526
329
  // new update filter function for user added filters
527
- const updateUserFilter = (filter, id) => {
528
- if (!appliedFilters) {
529
- return;
530
- }
531
- const newFilter = getUserFilter(filter, id);
532
- dashboardFiltersDispatch({
533
- type: 'ADD_DASHBOARD_FILTER',
534
- data: newFilter,
535
- });
536
- setAppliedFilters([...appliedFilters, newFilter]);
330
+ const updateUserFilter = (filter) => {
331
+ setUserFilters((userFilters) => ({
332
+ ...userFilters,
333
+ [filter.field]: filter,
334
+ }));
537
335
  };
538
- // useEffect(() => {
539
- // if (dashboardSections && dashboard) {
540
- // const totalNumberOfItems = Object.values(dashboardSections).reduce(
541
- // (count: number, arr: any) => count + arr.length,
542
- // 0,
543
- // );
544
- // const itemsLoaded = Object.keys(dashboard).length;
545
- // }
546
- // }, [dashboard, dashboardSections]);
547
336
  useEffect(() => {
548
- if (onChangeLoading) {
549
- onChangeLoading(isLoading || initialLoad);
337
+ if (onChangeLoading && isLoading) {
338
+ onChangeLoading(isLoading);
550
339
  }
551
- }, [isLoading, initialLoad, onChangeLoading]);
552
- const sortByOrdering = (a, b) => {
553
- if (a.order === undefined && b.order === undefined)
554
- return 0;
555
- if (a.order === undefined)
556
- return 1;
557
- if (b.order === undefined)
558
- return -1;
559
- return a.order - b.order;
560
- };
340
+ }, [isLoading, onChangeLoading]);
561
341
  if (!isLoading &&
562
342
  (Object.keys(data?.sections ?? {}).length === 0 ||
563
- data?.sections?.['']?.length === 0)) {
343
+ Object.values(data?.sections ?? {})[0]?.length === 0)) {
564
344
  return _jsx(EmptyDashboardComponent, {});
565
345
  }
566
346
  if (hidden || isLoading || isClientLoading || !data?.sections) {
@@ -568,13 +348,18 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
568
348
  }
569
349
  return (_jsxs("div", { className: className, ...styleToProps(containerStyle), children: [data &&
570
350
  data.customFiltersEnabled &&
571
- filterSchemaIsLoaded &&
572
351
  !hideAdminErrors &&
573
352
  !hideFilters &&
574
353
  data &&
575
354
  data.customFiltersEnabled &&
576
355
  filterSchema &&
577
- filterSchema.columns.length === 0 && (_jsx("div", { style: { marginBottom: 10 }, children: _jsx(QuillErrorMessageComponent, { errorMessage: "Warning: No custom filter options because there are no common views among the charts in the dashboard" }) })), _jsxs("div", { style: { display: 'flex', flexDirection: 'row', alignItems: 'center' }, children: [!hideFilters && (_jsxs(FilterContainerComponent, { children: [adminFilters.map((filter, index) => (_jsx(DashboardFilter, { filter: filter, onChangeFilter: updateFilter, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent, isLoading: isDashboardOptionsLoading }, filter._id ?? index))), _jsxs("div", { style: {
356
+ filterSchema.columns.length === 0 && (_jsx("div", { style: { marginBottom: 10 }, children: _jsx(QuillErrorMessageComponent, { errorMessage: "Warning: No custom filter options because there are no common views among the charts in the dashboard" }) })), _jsxs("div", { style: { display: 'flex', flexDirection: 'row', alignItems: 'center' }, children: [!hideFilters && (_jsxs(FilterContainerComponent, { children: [(populatedDashboardFilters ?? []).map((filter) => (_jsx(DashboardFilter, { filter: {
357
+ ...filter,
358
+ ...(filter.filterType === 'date_range' && {
359
+ options: presetOptions,
360
+ }),
361
+ ...filterValues[filter.label],
362
+ }, onChangeFilter: updateFilter, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent, isLoading: isDashboardFilterLoading(filter.label) }, filter.label + name))), _jsxs("div", { style: {
578
363
  display: 'flex',
579
364
  flexDirection: 'column',
580
365
  }, children: [data && data.customFiltersEnabled && (_jsx(SecondaryButtonComponent, { onClick: () => {
@@ -584,14 +369,12 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
584
369
  }
585
370
  }, label: `Add Filter` })), _jsx(PopoverComponent, { isOpen: addFilterPopoverIsOpen, setIsOpen: setAddFilterPopoverIsOpen, popoverTitle: "Add Filter", popoverChildren: _jsx(FilterModal, { schema: filterSchema, fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
586
371
  setAddFilterPopoverIsOpen(false);
587
- if (appliedFilters) {
588
- updateUserFilter(filter, appliedFilters.length);
589
- }
590
- }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, TextInputComponent: TextInputComponent }), containerStyle: { position: 'relative', top: 10 } })] }), userFilters.length > 0 && (_jsx(ModalComponent, { triggerLabel: `Filters${userFilters.length > 0 ? ` (${userFilters.length})` : ''}`, isOpen: filterListIsOpen, setIsOpen: setFilterListIsOpen, title: "Filters", children: _jsxs("div", { style: {
372
+ updateUserFilter(filter);
373
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, TextInputComponent: TextInputComponent }), containerStyle: { position: 'relative', top: 10 } })] }), Object.values(userFilters).length > 0 && (_jsx(ModalComponent, { triggerLabel: `Filters${Object.values(userFilters).length > 0 ? ` (${Object.values(userFilters).length})` : ''}`, isOpen: filterListIsOpen, setIsOpen: setFilterListIsOpen, title: "Filters", children: _jsxs("div", { style: {
591
374
  display: 'flex',
592
375
  flexDirection: 'column',
593
376
  alignItems: 'start',
594
- }, children: [userFilters.map(({ filter, index }) => (_jsx(FilterPopoverWrapper, { schema: filterSchema, filter: {
377
+ }, children: [Object.values(userFilters).map((filter, index) => (_jsx(FilterPopoverWrapper, { schema: filterSchema, filter: {
595
378
  filterType: filter.filterType,
596
379
  fieldType: filter.fieldType,
597
380
  field: filter.field,
@@ -599,31 +382,17 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
599
382
  value: filter.value,
600
383
  }, filterLabel: filter ? filterSentence(filter) : '', index: index, fieldValuesMap: fieldValuesMap, customOperatorOptions: customOperatorOptions, FilterTagComponent: FilterTagComponent, FilterModal: FilterModal, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (newFilter) => {
601
384
  const updatedFilter = getUserFilter(newFilter, filter._id, filter);
602
- if (!appliedFilters) {
603
- return;
604
- }
605
385
  dashboardFiltersDispatch({
606
386
  type: 'UPDATE_DASHBOARD_FILTER',
607
387
  id: updatedFilter._id,
608
388
  data: updateFilter,
609
389
  });
610
- setAppliedFilters([
611
- ...appliedFilters.slice(0, index),
612
- updatedFilter,
613
- ...appliedFilters.slice(index + 1),
614
- ]);
615
390
  }, handleFilterDelete: () => {
616
- if (!appliedFilters) {
617
- return;
618
- }
619
- dashboardFiltersDispatch({
620
- type: 'DELETE_DASHBOARD_FILTER',
621
- id: appliedFilters[index]._id,
391
+ setUserFilters((userFilters) => {
392
+ const updatedFilters = { ...userFilters };
393
+ delete updatedFilters[filter.field];
394
+ return updatedFilters;
622
395
  });
623
- setAppliedFilters([
624
- ...appliedFilters.slice(0, index),
625
- ...appliedFilters.slice(index + 1),
626
- ]);
627
396
  }, containerStyle: { width: 300, marginBottom: 10 } }, `userFilter_${index}_${filter ? filterSentence(filter) : ''}`))), _jsxs("div", { style: {
628
397
  display: 'flex',
629
398
  flexDirection: 'column',
@@ -634,10 +403,8 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
634
403
  }, label: `Add Filter` }), _jsx(PopoverComponent, { isOpen: filterListAddFilterPopoverIsOpen, setIsOpen: setFilterListAddFilterPopoverIsOpen, popoverTitle: "Add Filter", popoverChildren: _jsx(FilterModal, { schema: filterSchema, fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
635
404
  setFilterListAddFilterPopoverIsOpen(false);
636
405
  setFilterListIsOpen(false);
637
- const id = uniqueCounter;
638
- setUniqueCounter(uniqueCounter + 1);
639
- updateUserFilter(filter, id);
640
- }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, TextInputComponent: TextInputComponent }), containerStyle: { position: 'relative', top: 10 } })] })] }) }))] })), templateDashboardName && (_jsx(QuillDashboardTemplate, { name: templateDashboardName, originDashboard: name, client: client, appliedFilters: appliedFilters, ModalComponent: ModalComponent, TemplateChartComponent: TemplateChartComponent, TemplateMetricComponent: TemplateMetricComponent, TemplateTableComponent: TemplateTableComponent, ButtonComponent: SecondaryButtonComponent }))] }), Object.keys(data.sections)
406
+ updateUserFilter(filter);
407
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, TextInputComponent: TextInputComponent }), containerStyle: { position: 'relative', top: 10 } })] })] }) }))] })), templateDashboardName && (_jsx(QuillDashboardTemplate, { name: templateDashboardName, originDashboard: name, client: client, appliedFilters: populatedDashboardFilters, ModalComponent: ModalComponent, TemplateChartComponent: TemplateChartComponent, TemplateMetricComponent: TemplateMetricComponent, TemplateTableComponent: TemplateTableComponent, ButtonComponent: SecondaryButtonComponent }))] }), Object.keys(data.sections)
641
408
  .sort(function (a, b) {
642
409
  return a.length - b.length;
643
410
  })
@@ -651,13 +418,19 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
651
418
  textAlign: 'left',
652
419
  marginTop: 12,
653
420
  }, children: section })] })), metrics(data.sections, section, sortByOrdering).length > 0 && (_jsx(DashboardSectionComponent, { section: "metrics", children: metrics(data.sections, section, sortByOrdering).map((item, index) => {
654
- return (_jsx(DataLoader, { item: item, filters: appliedFilters, children: ({ isLoading, error, data, }) => (_jsx(MetricComponent, { error: error, isLoading: isLoading, report: data, onClick: !isLoading && onClickReport
421
+ return (_jsx(DataLoader, { item: item, filters: populatedDashboardFilters, additionalProcessing: {
422
+ page: DEFAULT_PAGINATION,
423
+ last: additionalProcessing?.last,
424
+ }, children: ({ isLoading, error, data, }) => (_jsx(MetricComponent, { error: error, isLoading: isLoading, report: data, onClick: !isLoading && onClickReport
655
425
  ? () => handleOnClickDashboardItem({
656
426
  ...item,
657
427
  ...data,
658
428
  })
659
- : () => { }, hoverActions: hoverActions }, item.name + '' + index)) }, `${item._id}${index}`));
660
- }) })), charts(data.sections, section, sortByOrdering).length > 0 && (_jsx(DashboardSectionComponent, { section: "charts", children: charts(data.sections, section, sortByOrdering).map((item, index) => (_jsx(ChartDataLoader, { item: item, dateBucket: dateBucket, additionalProcessing: additionalProcessing, filters: appliedFilters, children: ({ isLoading, data, error, dateBucket, }) => (_jsx(ChartComponent, { report: data, error: error, onClick: () => {
429
+ : () => { }, hoverActions: hoverActions }, item.name + '' + index)) }, `metric${index}`));
430
+ }) })), charts(data.sections, section, sortByOrdering).length > 0 && (_jsx(DashboardSectionComponent, { section: "charts", children: charts(data.sections, section, sortByOrdering).map((item, index) => (_jsx(ChartDataLoader, { item: item, dateBucket: dateBucket, additionalProcessing: {
431
+ page: pagination,
432
+ last: additionalProcessing?.last,
433
+ }, filters: populatedDashboardFilters, children: ({ isLoading, data, error, dateBucket, }) => (_jsx(ChartComponent, { report: data, error: error, onClick: () => {
661
434
  if (!isLoading && onClickReport) {
662
435
  handleOnClickDashboardItem({
663
436
  ...item,
@@ -669,11 +442,17 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
669
442
  height: 300,
670
443
  } })) : (_jsx(ChartDisplay, { reportId: data.id, config: data, loading: isLoading, containerStyle: chartContainerStyle, colors: theme.chartColors?.length
671
444
  ? theme.chartColors
672
- : undefined, scrollable: false, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, onClickChartElement: onClickChartElement })) }, item.name + '' + index)) }, `${item._id}${index}`))) })), tables(data.sections, section, sortByOrdering).length > 0 && (_jsx(DashboardSectionComponent, { section: "tables", children: tables(data.sections, section, sortByOrdering).map((item, index) => (_jsx(DataLoader, { item: item, filters: appliedFilters, children: ({ isLoading, error, onPageChange, onSortChange, data, }) => (_jsx(TableComponent, { report: data, isLoading: isLoading, error: error, onClick: !isLoading && onClickReport
445
+ : undefined, scrollable: false, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, onClickChartElement: onClickChartElement })) }, item.name + '' + index)) }, `chart${index}`))) })), tables(data.sections, section, sortByOrdering).length > 0 && (_jsx(DashboardSectionComponent, { section: "tables", children: tables(data.sections, section, sortByOrdering).map((item, index) => (_jsx(DataLoader, { item: item, filters: populatedDashboardFilters, additionalProcessing: {
446
+ page: pagination,
447
+ last: additionalProcessing?.last,
448
+ }, children: ({ isLoading, error, onPageChange, onSortChange, data, rowCount, rowCountIsLoading, }) => (_jsx(TableComponent, { report: data, isLoading: isLoading, error: error, onClick: !isLoading && onClickReport
673
449
  ? () => handleOnClickDashboardItem({
674
450
  ...item,
675
451
  ...data,
676
452
  })
677
- : undefined, hoverActions: hoverActions, rowCount: data?.rowCount ?? data?.rows?.length ?? 0, onPageChange: (page) => onPageChange(page), onSortChange: (sort) => onSortChange(sort) })) }, `${item._id}${index}`))) }))] }, section + '' + sectionIndex));
453
+ : undefined, hoverActions: hoverActions, rowCount: rowCount ??
454
+ data?.rowCount ??
455
+ data?.rows?.length ??
456
+ 0, rowCountIsLoading: rowCountIsLoading, onPageChange: (page) => onPageChange(page), onSortChange: (sort) => onSortChange(sort) })) }, `${name}${index}`))) }))] }, section + '' + sectionIndex));
678
457
  })] }));
679
458
  }