@quillsql/react 2.13.48 → 2.13.49

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 (279) hide show
  1. package/dist/cjs/Chart.d.ts +2 -2
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +28 -41
  4. package/dist/cjs/ChartBuilder.d.ts +2 -2
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +157 -134
  7. package/dist/cjs/ChartEditor.d.ts +2 -2
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +3 -1
  10. package/dist/cjs/Context.d.ts +10 -3
  11. package/dist/cjs/Context.d.ts.map +1 -1
  12. package/dist/cjs/Context.js +324 -249
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +10 -23
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +0 -3
  16. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +24 -10
  17. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  18. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +472 -96
  19. package/dist/cjs/QuillProvider.d.ts +3 -1
  20. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  21. package/dist/cjs/QuillProvider.js +2 -2
  22. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  23. package/dist/cjs/ReportBuilder.js +19 -10
  24. package/dist/cjs/SQLEditor.d.ts +1 -1
  25. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  26. package/dist/cjs/SQLEditor.js +50 -16
  27. package/dist/cjs/Table.d.ts.map +1 -1
  28. package/dist/cjs/Table.js +20 -7
  29. package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  31. package/dist/cjs/components/Chart/BarChart.js +2 -1
  32. package/dist/cjs/components/Chart/CustomReferenceLine.d.ts +1 -1
  33. package/dist/cjs/components/Chart/CustomReferenceLine.d.ts.map +1 -1
  34. package/dist/cjs/components/Chart/CustomReferenceLine.js +7 -6
  35. package/dist/cjs/components/Chart/GaugeChart.d.ts +1 -1
  36. package/dist/cjs/components/Chart/GaugeChart.d.ts.map +1 -1
  37. package/dist/cjs/components/Chart/GaugeChart.js +62 -35
  38. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  39. package/dist/cjs/components/Chart/InternalChart.js +30 -33
  40. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  41. package/dist/cjs/components/Chart/LineChart.js +3 -1
  42. package/dist/cjs/components/Chart/MapChart.d.ts +3 -3
  43. package/dist/cjs/components/Chart/MapChart.d.ts.map +1 -1
  44. package/dist/cjs/components/Chart/MapChart.js +62 -34
  45. package/dist/cjs/components/Chart/PieChart.d.ts +3 -1
  46. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  47. package/dist/cjs/components/Chart/PieChart.js +80 -39
  48. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  49. package/dist/cjs/components/Dashboard/DashboardFilter.js +4 -20
  50. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  51. package/dist/cjs/components/Dashboard/DashboardTemplate.js +2 -1
  52. package/dist/cjs/components/Dashboard/DataLoader.d.ts +4 -4
  53. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  54. package/dist/cjs/components/Dashboard/DataLoader.js +31 -14
  55. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  56. package/dist/cjs/components/Dashboard/MetricComponent.js +2 -2
  57. package/dist/cjs/components/Dashboard/util.d.ts +1 -1
  58. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  59. package/dist/cjs/components/Dashboard/util.js +7 -6
  60. package/dist/cjs/components/QuillMultiSelectSectionList.d.ts.map +1 -1
  61. package/dist/cjs/components/QuillMultiSelectSectionList.js +32 -22
  62. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  63. package/dist/cjs/components/QuillMultiSelectWithCombo.js +186 -159
  64. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  65. package/dist/cjs/components/QuillSelect.js +83 -75
  66. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
  67. package/dist/cjs/components/QuillSelectWithCombo.js +18 -11
  68. package/dist/cjs/components/ReportBuilder/FilterStack.d.ts +2 -1
  69. package/dist/cjs/components/ReportBuilder/FilterStack.d.ts.map +1 -1
  70. package/dist/cjs/components/ReportBuilder/FilterStack.js +3 -4
  71. package/dist/cjs/components/ReportBuilder/ui.d.ts +2 -2
  72. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  73. package/dist/cjs/components/ReportBuilder/ui.js +4 -7
  74. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  75. package/dist/cjs/hooks/useAskQuill.js +5 -1
  76. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  77. package/dist/cjs/hooks/useDashboard.js +96 -58
  78. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  79. package/dist/cjs/hooks/useExport.js +23 -13
  80. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
  81. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  82. package/dist/cjs/hooks/useQuill.js +8 -10
  83. package/dist/cjs/hooks/useReport.d.ts.map +1 -1
  84. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  85. package/dist/cjs/hooks/useVirtualTables.js +16 -22
  86. package/dist/cjs/index.d.ts +2 -2
  87. package/dist/cjs/index.d.ts.map +1 -1
  88. package/dist/cjs/index.js +2 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +2 -1
  90. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  91. package/dist/cjs/internals/ReportBuilder/PivotModal.js +19 -7
  92. package/dist/cjs/models/Client.d.ts +0 -1
  93. package/dist/cjs/models/Client.d.ts.map +1 -1
  94. package/dist/cjs/models/Data.d.ts +20 -0
  95. package/dist/cjs/models/Data.d.ts.map +1 -0
  96. package/dist/cjs/models/Data.js +2 -0
  97. package/dist/cjs/models/Filter.d.ts +42 -4
  98. package/dist/cjs/models/Filter.d.ts.map +1 -1
  99. package/dist/cjs/models/Pivot.d.ts.map +1 -1
  100. package/dist/cjs/utils/astProcessing.d.ts +3 -2
  101. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  102. package/dist/cjs/utils/astProcessing.js +28 -37
  103. package/dist/cjs/utils/client.d.ts +3 -2
  104. package/dist/cjs/utils/client.d.ts.map +1 -1
  105. package/dist/cjs/utils/client.js +38 -39
  106. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  107. package/dist/cjs/utils/columnProcessing.js +14 -3
  108. package/dist/cjs/utils/constants.d.ts +1 -0
  109. package/dist/cjs/utils/constants.d.ts.map +1 -1
  110. package/dist/cjs/utils/constants.js +2 -1
  111. package/dist/cjs/utils/dashboard.d.ts +3 -2
  112. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  113. package/dist/cjs/utils/dashboard.js +30 -12
  114. package/dist/cjs/utils/dataFetcher.d.ts +8 -5
  115. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  116. package/dist/cjs/utils/dataFetcher.js +189 -65
  117. package/dist/cjs/utils/filterProcessing.d.ts +2 -1
  118. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  119. package/dist/cjs/utils/filterProcessing.js +24 -38
  120. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  121. package/dist/cjs/utils/pivotConstructor.d.ts +2 -1
  122. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  123. package/dist/cjs/utils/pivotConstructor.js +15 -11
  124. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  125. package/dist/cjs/utils/pivotProcessing.js +3 -5
  126. package/dist/cjs/utils/queryConstructor.js +1 -1
  127. package/dist/cjs/utils/report.d.ts +10 -7
  128. package/dist/cjs/utils/report.d.ts.map +1 -1
  129. package/dist/cjs/utils/report.js +52 -60
  130. package/dist/cjs/utils/schema.d.ts +4 -3
  131. package/dist/cjs/utils/schema.d.ts.map +1 -1
  132. package/dist/cjs/utils/schema.js +30 -44
  133. package/dist/cjs/utils/tableProcessing.d.ts +16 -10
  134. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  135. package/dist/cjs/utils/tableProcessing.js +91 -90
  136. package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
  137. package/dist/cjs/utils/textProcessing.js +2 -1
  138. package/dist/cjs/utils/ui.d.ts.map +1 -1
  139. package/dist/esm/Chart.d.ts +2 -2
  140. package/dist/esm/Chart.d.ts.map +1 -1
  141. package/dist/esm/Chart.js +30 -43
  142. package/dist/esm/ChartBuilder.d.ts +2 -2
  143. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  144. package/dist/esm/ChartBuilder.js +158 -135
  145. package/dist/esm/ChartEditor.d.ts +2 -2
  146. package/dist/esm/ChartEditor.d.ts.map +1 -1
  147. package/dist/esm/ChartEditor.js +4 -2
  148. package/dist/esm/Context.d.ts +10 -3
  149. package/dist/esm/Context.d.ts.map +1 -1
  150. package/dist/esm/Context.js +326 -251
  151. package/dist/esm/Dashboard.d.ts.map +1 -1
  152. package/dist/esm/Dashboard.js +12 -25
  153. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +0 -3
  154. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +24 -10
  155. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  156. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +471 -95
  157. package/dist/esm/QuillProvider.d.ts +3 -1
  158. package/dist/esm/QuillProvider.d.ts.map +1 -1
  159. package/dist/esm/QuillProvider.js +2 -2
  160. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  161. package/dist/esm/ReportBuilder.js +21 -12
  162. package/dist/esm/SQLEditor.d.ts +1 -1
  163. package/dist/esm/SQLEditor.d.ts.map +1 -1
  164. package/dist/esm/SQLEditor.js +53 -19
  165. package/dist/esm/Table.d.ts.map +1 -1
  166. package/dist/esm/Table.js +21 -8
  167. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
  168. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  169. package/dist/esm/components/Chart/BarChart.js +2 -1
  170. package/dist/esm/components/Chart/CustomReferenceLine.d.ts +1 -1
  171. package/dist/esm/components/Chart/CustomReferenceLine.d.ts.map +1 -1
  172. package/dist/esm/components/Chart/CustomReferenceLine.js +8 -7
  173. package/dist/esm/components/Chart/GaugeChart.d.ts +1 -1
  174. package/dist/esm/components/Chart/GaugeChart.d.ts.map +1 -1
  175. package/dist/esm/components/Chart/GaugeChart.js +64 -37
  176. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  177. package/dist/esm/components/Chart/InternalChart.js +32 -35
  178. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  179. package/dist/esm/components/Chart/LineChart.js +3 -1
  180. package/dist/esm/components/Chart/MapChart.d.ts +3 -3
  181. package/dist/esm/components/Chart/MapChart.d.ts.map +1 -1
  182. package/dist/esm/components/Chart/MapChart.js +67 -39
  183. package/dist/esm/components/Chart/PieChart.d.ts +3 -1
  184. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  185. package/dist/esm/components/Chart/PieChart.js +80 -39
  186. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  187. package/dist/esm/components/Dashboard/DashboardFilter.js +5 -21
  188. package/dist/esm/components/Dashboard/DashboardSection.js +2 -2
  189. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  190. package/dist/esm/components/Dashboard/DashboardTemplate.js +3 -2
  191. package/dist/esm/components/Dashboard/DataLoader.d.ts +4 -4
  192. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  193. package/dist/esm/components/Dashboard/DataLoader.js +32 -15
  194. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  195. package/dist/esm/components/Dashboard/MetricComponent.js +2 -2
  196. package/dist/esm/components/Dashboard/util.d.ts +1 -1
  197. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  198. package/dist/esm/components/Dashboard/util.js +8 -7
  199. package/dist/esm/components/QuillMultiSelectSectionList.d.ts.map +1 -1
  200. package/dist/esm/components/QuillMultiSelectSectionList.js +32 -22
  201. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  202. package/dist/esm/components/QuillMultiSelectWithCombo.js +187 -160
  203. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  204. package/dist/esm/components/QuillSelect.js +85 -77
  205. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  206. package/dist/esm/components/QuillSelectWithCombo.js +18 -11
  207. package/dist/esm/components/ReportBuilder/FilterStack.d.ts +2 -1
  208. package/dist/esm/components/ReportBuilder/FilterStack.d.ts.map +1 -1
  209. package/dist/esm/components/ReportBuilder/FilterStack.js +3 -4
  210. package/dist/esm/components/ReportBuilder/ui.d.ts +2 -2
  211. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  212. package/dist/esm/components/ReportBuilder/ui.js +4 -7
  213. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  214. package/dist/esm/hooks/useAskQuill.js +6 -2
  215. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  216. package/dist/esm/hooks/useDashboard.js +98 -60
  217. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  218. package/dist/esm/hooks/useExport.js +25 -15
  219. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
  220. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  221. package/dist/esm/hooks/useQuill.js +9 -11
  222. package/dist/esm/hooks/useReport.d.ts.map +1 -1
  223. package/dist/esm/hooks/useReport.js +1 -1
  224. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  225. package/dist/esm/hooks/useVirtualTables.js +17 -23
  226. package/dist/esm/index.d.ts +2 -2
  227. package/dist/esm/index.d.ts.map +1 -1
  228. package/dist/esm/index.js +1 -1
  229. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +2 -1
  230. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  231. package/dist/esm/internals/ReportBuilder/PivotModal.js +20 -8
  232. package/dist/esm/models/Client.d.ts +0 -1
  233. package/dist/esm/models/Client.d.ts.map +1 -1
  234. package/dist/esm/models/Data.d.ts +20 -0
  235. package/dist/esm/models/Data.d.ts.map +1 -0
  236. package/dist/esm/models/Data.js +1 -0
  237. package/dist/esm/models/Filter.d.ts +42 -4
  238. package/dist/esm/models/Filter.d.ts.map +1 -1
  239. package/dist/esm/models/Pivot.d.ts.map +1 -1
  240. package/dist/esm/utils/astProcessing.d.ts +3 -2
  241. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  242. package/dist/esm/utils/astProcessing.js +28 -37
  243. package/dist/esm/utils/client.d.ts +3 -2
  244. package/dist/esm/utils/client.d.ts.map +1 -1
  245. package/dist/esm/utils/client.js +38 -39
  246. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  247. package/dist/esm/utils/columnProcessing.js +14 -3
  248. package/dist/esm/utils/constants.d.ts +1 -0
  249. package/dist/esm/utils/constants.d.ts.map +1 -1
  250. package/dist/esm/utils/constants.js +1 -0
  251. package/dist/esm/utils/dashboard.d.ts +3 -2
  252. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  253. package/dist/esm/utils/dashboard.js +31 -13
  254. package/dist/esm/utils/dataFetcher.d.ts +8 -5
  255. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  256. package/dist/esm/utils/dataFetcher.js +187 -65
  257. package/dist/esm/utils/filterProcessing.d.ts +2 -1
  258. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  259. package/dist/esm/utils/filterProcessing.js +25 -39
  260. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  261. package/dist/esm/utils/pivotConstructor.d.ts +2 -1
  262. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  263. package/dist/esm/utils/pivotConstructor.js +16 -12
  264. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  265. package/dist/esm/utils/pivotProcessing.js +5 -7
  266. package/dist/esm/utils/queryConstructor.js +1 -1
  267. package/dist/esm/utils/report.d.ts +10 -7
  268. package/dist/esm/utils/report.d.ts.map +1 -1
  269. package/dist/esm/utils/report.js +53 -61
  270. package/dist/esm/utils/schema.d.ts +4 -3
  271. package/dist/esm/utils/schema.d.ts.map +1 -1
  272. package/dist/esm/utils/schema.js +30 -44
  273. package/dist/esm/utils/tableProcessing.d.ts +16 -10
  274. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  275. package/dist/esm/utils/tableProcessing.js +93 -92
  276. package/dist/esm/utils/textProcessing.d.ts.map +1 -1
  277. package/dist/esm/utils/textProcessing.js +2 -1
  278. package/dist/esm/utils/ui.d.ts.map +1 -1
  279. package/package.json +2 -1
@@ -1,11 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import equal from 'fast-deep-equal';
3
3
  import { createContext, useEffect, useMemo, useReducer, useRef, useState, } from 'react';
4
- import { defaultOptionsV2, PRIMARY_RANGE, } from './DateRangePicker/dateRangePickerUtils';
4
+ import { convertPresetOptionsToSelectableList, defaultOptionsV2, } from './DateRangePicker/dateRangePickerUtils';
5
5
  import { InternalFilterType, } from './models/Filter';
6
6
  import { fetchClient } from './utils/client';
7
7
  import { getDashboard as requestGetDashboard } from './utils/dashboard';
8
- import { getData } from './utils/dataFetcher';
8
+ import { quillFetch, parseFetchResponse } from './utils/dataFetcher';
9
9
  import { createDefaultDateFilter, mergeCustomFilters, } from './utils/filterProcessing';
10
10
  import { processReportResponse } from './utils/report';
11
11
  import { getSchemaInfo } from './utils/schema';
@@ -313,8 +313,12 @@ export const DashboardFiltersContext = createContext({
313
313
  loadFiltersForDashboard: async () => { },
314
314
  });
315
315
  export const TenantContext = createContext({});
316
+ export const FetchContext = createContext({
317
+ getToken: async () => '',
318
+ quillFetchWithToken: async () => ({ data: null }),
319
+ });
316
320
  // TODO: track errors per dashboard in the same way as loading state
317
- export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoint, queryHeaders, withCredentials, tenants, flags, }) => {
321
+ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoint, queryHeaders, withCredentials, tenants, flags, isAdmin, getAuthorizationToken = async () => '', }) => {
318
322
  // get client from session storage
319
323
  const [client, setClient] = useState(typeof window !== 'undefined' && sessionStorage
320
324
  ? JSON.parse(sessionStorage.getItem('quill-client') ?? 'null')
@@ -365,6 +369,8 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
365
369
  const reportsAbortControllers = useRef({});
366
370
  const fetchSchemaAbortController = useRef(null);
367
371
  const fetchSchemaProcessId = useRef(0);
372
+ const currentTenant = useRef(null);
373
+ const currentPublicKey = useRef(null);
368
374
  // SETS INITIAL THEME
369
375
  useEffect(() => {
370
376
  if (!theme) {
@@ -437,56 +443,54 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
437
443
  const filterOptionsAbortController = new AbortController();
438
444
  reportFilterOptionsAbortControllers.current[reportId]?.requests.add(filterOptionsAbortController);
439
445
  try {
440
- const response = await fetch(`${queryEndpoint}?filterOptions`, {
441
- method: 'POST',
442
- headers: {
443
- ...queryHeaders,
444
- 'Content-Type': 'application/json',
446
+ const result = await quillFetch({
447
+ client: {
448
+ clientId: publicKey,
449
+ queryEndpoint,
450
+ queryHeaders,
451
+ withCredentials: !!withCredentials,
452
+ },
453
+ task: 'filter-options',
454
+ metadata: {
455
+ clientId: publicKey,
456
+ publicKey: publicKey,
457
+ reportId: dashboardName ? undefined : reportId,
458
+ name: dashboardName,
459
+ useNewNodeSql: true,
460
+ filter: {
461
+ ...filter,
462
+ query: undefined,
463
+ options: undefined,
464
+ },
465
+ appliedFilters: filters
466
+ .filter((f) => f.label !== filter.label)
467
+ .map((f) => ({
468
+ ...f,
469
+ query: undefined,
470
+ options: undefined,
471
+ })),
472
+ customFilters: customFilters?.filter((f) => f.filterType !== InternalFilterType.DateCustomFilter &&
473
+ f.filterType !== InternalFilterType.DateFilter &&
474
+ f.filterType !== InternalFilterType.DateComparisonFilter),
475
+ tenants,
445
476
  },
446
- body: JSON.stringify({
447
- metadata: {
448
- clientId: populatedClient?.publicKey,
449
- publicKey: populatedClient?.publicKey,
450
- reportId: dashboardName ? undefined : reportId,
451
- name: dashboardName,
452
- task: 'filter-options',
453
- useNewNodeSql: true,
477
+ abortSignal: filterOptionsAbortController?.signal,
478
+ getToken: getAuthorizationToken,
479
+ });
480
+ const filterOptions = result.data?.filters[0]?.options ?? [];
481
+ if (!filterOptionsAbortController.signal.aborted) {
482
+ reportFiltersDispatch({
483
+ type: 'UPDATE_REPORT_FILTER',
484
+ id: reportId,
485
+ data: {
454
486
  filter: {
455
487
  ...filter,
456
- options: undefined,
488
+ options: filterOptions,
457
489
  },
458
- appliedFilters: filters
459
- .filter((f) => f.label !== filter.label)
460
- .map((f) => ({
461
- ...f,
462
- query: undefined,
463
- options: undefined,
464
- })),
465
- customFilters: customFilters?.filter((f) => f.filterType !== InternalFilterType.DateCustomFilter &&
466
- f.filterType !== InternalFilterType.DateFilter &&
467
- f.filterType !== InternalFilterType.DateComparisonFilter),
468
- tenants,
490
+ loading: false,
469
491
  },
470
- }),
471
- signal: filterOptionsAbortController?.signal,
472
- credentials: withCredentials ? 'include' : 'omit',
473
- });
474
- return response.json().then((result) => {
475
- const filterOptions = result.data?.filters[0]?.options ?? [];
476
- if (!filterOptionsAbortController.signal.aborted) {
477
- reportFiltersDispatch({
478
- type: 'UPDATE_REPORT_FILTER',
479
- id: reportId,
480
- data: {
481
- filter: {
482
- ...filter,
483
- options: filterOptions,
484
- },
485
- loading: false,
486
- },
487
- });
488
- }
489
- });
492
+ });
493
+ }
490
494
  }
491
495
  catch (error) {
492
496
  if (error instanceof Error && error.name === 'AbortError') {
@@ -509,7 +513,7 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
509
513
  delete reportFilterOptionsAbortControllers.current[reportId];
510
514
  }
511
515
  }
512
- async function fetchIndividualReport({ reportId, initiator, fetchRows = true, dashboardFilters, customFilters, additionalProcessing, dateBucket, reportAbortController, customFields, propogateChanges, }) {
516
+ async function fetchIndividualReport({ reportId, initiator, fetchRows = true, dashboardFilters, customFilters, additionalProcessing, dateBucket, reportAbortController, customFields, propagateChanges, }) {
513
517
  if (!populatedClient) {
514
518
  return;
515
519
  }
@@ -531,55 +535,33 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
531
535
  request: abortController,
532
536
  };
533
537
  try {
534
- const hostedBody = {
538
+ const resp = await quillFetch({
539
+ client: {
540
+ clientId: publicKey,
541
+ queryEndpoint,
542
+ queryHeaders,
543
+ withCredentials: !!withCredentials,
544
+ },
545
+ task: fetchRows ? 'report' : 'report-info',
535
546
  metadata: {
536
547
  reportId,
537
- dashboardItemId: reportId,
538
548
  clientId: populatedClient.publicKey,
539
- task: 'report',
540
- databaseType: populatedClient.databaseType,
541
- filters: filters.map((filter) => ({ ...filter, options: undefined })),
542
- additionalProcessing,
543
549
  useNewNodeSql: true,
544
- getDefaultDashboardFilters: !filters.length,
550
+ filters: filters?.map((f) => ({ ...f, options: undefined })),
551
+ additionalProcessing,
552
+ dateBucket,
553
+ databaseType: populatedClient.databaseType,
545
554
  tenants,
546
555
  flags,
547
556
  customFields,
548
557
  },
549
- };
550
- const cloudBody = {
551
- id: reportId,
552
- filters: filters,
553
- useNewNodeSql: true,
554
- };
555
- const resp = fetchRows
556
- ? await getData(populatedClient, 'itempost', 'omit', hostedBody, cloudBody, 'POST', 'fetch-data', abortController.signal)
557
- : await fetch(`${queryEndpoint}`, {
558
- method: 'POST',
559
- headers: {
560
- 'Content-Type': 'application/json',
561
- ...queryHeaders,
562
- },
563
- body: JSON.stringify({
564
- metadata: {
565
- task: fetchRows ? 'report' : 'report-info',
566
- reportId,
567
- clientId: populatedClient.publicKey,
568
- useNewNodeSql: true,
569
- filters: filters?.map((f) => ({ ...f, options: undefined })),
570
- getDefaultDashboardFilters: !filters.length,
571
- additionalProcessing,
572
- dateBucket,
573
- databaseType: populatedClient.databaseType,
574
- tenants,
575
- flags,
576
- customFields,
577
- },
578
- }),
579
- signal: abortController.signal,
580
- credentials: withCredentials ? 'include' : 'omit',
581
- });
582
- const results = fetchRows ? resp : await resp.json();
558
+ abortSignal: abortController.signal,
559
+ getToken: getAuthorizationToken,
560
+ urlParameters: `caller=fetchReport&task=report`,
561
+ });
562
+ const results = fetchRows
563
+ ? await parseFetchResponse(populatedClient, 'report', resp, getAuthorizationToken)
564
+ : resp;
583
565
  if (results.error) {
584
566
  console.error('Error fetching report:', results.error);
585
567
  return;
@@ -593,6 +575,7 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
593
575
  dateBucket,
594
576
  additionalProcessing,
595
577
  customFields,
578
+ getToken: getAuthorizationToken,
596
579
  });
597
580
  reportsDispatch({
598
581
  type: 'ADD_REPORT',
@@ -604,7 +587,7 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
604
587
  },
605
588
  });
606
589
  // If the report matches the active dashboard, update the dashboard state
607
- if (propogateChanges) {
590
+ if (propagateChanges) {
608
591
  if (dashboard[report.dashboardName]) {
609
592
  dispatch({
610
593
  type: 'UPDATE_DASHBOARD_ITEM',
@@ -622,7 +605,26 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
622
605
  const returnedFilters = !fetchRows
623
606
  ? results.data.filters
624
607
  : results.filters;
625
- const dateFilterTemplate = returnedFilters.find((f) => f.filterType === 'date_range');
608
+ let dateFilterTemplate = returnedFilters.find((f) => f.filterType === 'date_range');
609
+ if (dateFilterTemplate) {
610
+ dateFilterTemplate = {
611
+ ...dateFilterTemplate,
612
+ presetOptions: dateFilterTemplate?.presetOptions?.map((preset) => ({
613
+ ...preset,
614
+ loopStart: preset.loopStart
615
+ ? new Date(preset.loopStart)
616
+ : undefined,
617
+ loopEnd: preset.loopEnd ? new Date(preset.loopEnd) : undefined,
618
+ })),
619
+ defaultPresetRanges: dateFilterTemplate?.defaultPresetRanges?.map((preset) => ({
620
+ ...preset,
621
+ loopStart: preset.loopStart
622
+ ? new Date(preset.loopStart)
623
+ : undefined,
624
+ loopEnd: preset.loopEnd ? new Date(preset.loopEnd) : undefined,
625
+ })),
626
+ };
627
+ }
626
628
  const dateFilter = dateFilterTemplate
627
629
  ? createDefaultDateFilter(dateFilterTemplate, [report], report.dashboardName)
628
630
  : undefined;
@@ -690,64 +692,63 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
690
692
  const filterOptionsAbortController = new AbortController();
691
693
  filterOptionsAbortControllers.current.add(filterOptionsAbortController);
692
694
  try {
693
- const response = await fetch(`${queryEndpoint}?filterOptions`, {
694
- method: 'POST',
695
- headers: {
696
- ...queryHeaders,
697
- 'Content-Type': 'application/json',
695
+ const result = await quillFetch({
696
+ client: {
697
+ clientId: publicKey,
698
+ queryEndpoint,
699
+ queryHeaders,
700
+ withCredentials: !!withCredentials,
698
701
  },
699
- body: JSON.stringify({
700
- metadata: {
701
- clientId: populatedClient?.publicKey,
702
- publicKey: populatedClient?.publicKey,
703
- name: dashboardName,
704
- task: 'filter-options',
705
- useNewNodeSql: true,
706
- filter: {
707
- ...filter,
708
- options: undefined,
709
- },
710
- appliedFilters: filters
711
- .filter((f) => f.label !== filter.label)
712
- .map((f) => ({
713
- ...f,
714
- query: undefined,
715
- options: undefined,
716
- })),
717
- customFilters,
718
- tenants: tenants,
702
+ task: 'filter-options',
703
+ metadata: {
704
+ clientId: publicKey,
705
+ publicKey,
706
+ name: dashboardName,
707
+ useNewNodeSql: true,
708
+ filter: {
709
+ ...filter,
710
+ query: undefined,
711
+ options: undefined,
719
712
  },
720
- }),
721
- signal: filterOptionsAbortController?.signal,
722
- credentials: withCredentials ? 'include' : 'omit',
713
+ appliedFilters: filters
714
+ .filter((f) => f.label !== filter.label)
715
+ .map((f) => ({
716
+ ...f,
717
+ query: undefined,
718
+ options: undefined,
719
+ })),
720
+ customFilters,
721
+ tenants,
722
+ },
723
+ abortSignal: filterOptionsAbortController?.signal,
724
+ getToken: getAuthorizationToken,
723
725
  });
724
- return response.json().then((result) => {
725
- const filterOptions = result.data?.filters[0]?.options ?? [];
726
- dashboardFiltersDispatch({
727
- type: 'UPDATE_DASHBOARD_FILTER',
728
- dashboardName,
729
- filterName: filter.label,
730
- data: {
731
- filter: {
732
- ...filter,
733
- options: filterOptions,
734
- },
735
- loading: false,
726
+ const filterOptions = result.data?.filters[0]?.options ?? [];
727
+ dashboardFiltersDispatch({
728
+ type: 'UPDATE_DASHBOARD_FILTER',
729
+ dashboardName,
730
+ filterName: filter.label,
731
+ data: {
732
+ filter: {
733
+ ...filter,
734
+ options: filterOptions,
736
735
  },
737
- });
738
- // Should we be updating the filters for all attached reports when the dashboard filters change?
739
- reportFiltersDispatch({
740
- type: 'UPDATE_REPORT_FILTER',
741
- id: filter.label,
742
- data: {
743
- filter: {
744
- ...filter,
745
- options: filterOptions,
746
- },
747
- loading: false,
736
+ loading: false,
737
+ },
738
+ });
739
+ // Should we be updating the filters for all attached reports when the dashboard filters change?
740
+ reportFiltersDispatch({
741
+ type: 'UPDATE_REPORT_FILTER',
742
+ id: filter.label,
743
+ data: {
744
+ filter: {
745
+ ...filter,
746
+ options: filterOptions,
748
747
  },
749
- });
748
+ loading: false,
749
+ },
750
750
  });
751
+ return null;
751
752
  }
752
753
  catch (error) {
753
754
  if (error instanceof Error && error.name === 'AbortError') {
@@ -854,15 +855,12 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
854
855
  sectionOrder: newSectionOrder,
855
856
  };
856
857
  try {
857
- await fetch(client.queryEndpoint, {
858
- method: 'POST',
859
- headers: {
860
- ...client.queryHeaders,
861
- 'Content-Type': 'application/json',
862
- },
863
- body: JSON.stringify({ metadata: body }),
864
- credentials: client.withCredentials ? 'include' : 'omit',
865
- }).then((res) => res.json());
858
+ await quillFetch({
859
+ client,
860
+ task: 'set-section-order',
861
+ metadata: body,
862
+ getToken: getAuthorizationToken,
863
+ });
866
864
  }
867
865
  catch (e) {
868
866
  console.error(e);
@@ -900,7 +898,7 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
900
898
  id: dashboardName,
901
899
  data: true,
902
900
  });
903
- const resp = await requestGetDashboard(dashboardName, populatedClient, tenants, flags);
901
+ const resp = await requestGetDashboard(dashboardName, populatedClient, getAuthorizationToken, tenants, flags);
904
902
  // if dashboard has changed
905
903
  if (!equal(resp, curDashboardConfig)) {
906
904
  dashboardConfigDispatch({
@@ -948,6 +946,7 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
948
946
  tenants,
949
947
  caller,
950
948
  abortSignal: fetchSchemaAbortController.current.signal,
949
+ getToken: getAuthorizationToken,
951
950
  });
952
951
  if (currentProcessId === fetchSchemaProcessId.current) {
953
952
  setSchemaData({
@@ -981,62 +980,100 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
981
980
  fetchDashboardsAbortController.current = new AbortController();
982
981
  dashboardConfigDispatch({ type: 'CLEAR_DASHBOARDS' });
983
982
  try {
984
- const response = await fetch(`${queryEndpoint}?dashboards`, {
985
- method: 'POST',
986
- headers: {
987
- ...queryHeaders,
988
- 'Content-Type': 'application/json',
983
+ const result = await quillFetch({
984
+ client: {
985
+ clientId: publicKey,
986
+ queryEndpoint,
987
+ queryHeaders,
988
+ withCredentials: !!withCredentials,
989
989
  },
990
- body: JSON.stringify({
991
- metadata: {
992
- clientId: publicKey,
993
- publicKey: publicKey,
994
- task: 'dashboards',
995
- getSections: true,
996
- },
997
- }),
998
- credentials: withCredentials ? 'include' : 'omit',
999
- signal: fetchDashboardsAbortController.current.signal,
990
+ task: 'dashboards',
991
+ metadata: {
992
+ clientId: publicKey,
993
+ // getSections: true, // skip fetching reports since 'dashboard' always does anyway
994
+ },
995
+ abortSignal: fetchDashboardsAbortController.current.signal,
996
+ getToken: getAuthorizationToken,
1000
997
  });
1001
- const result = await response.json();
1002
998
  dashboardConfigDispatch({
1003
999
  type: 'SET_DASHBOARD_DATA',
1004
1000
  data: result.data.dashboards.map((dashboard) => ({
1005
1001
  ...dashboard,
1002
+ dateFilter: dashboard.dateFilter
1003
+ ? {
1004
+ ...dashboard.dateFilter,
1005
+ presetOptions: dashboard.dateFilter.presetOptions?.map((preset) => ({
1006
+ ...preset,
1007
+ loopStart: preset.loopStart
1008
+ ? new Date(preset.loopStart)
1009
+ : undefined,
1010
+ loopEnd: preset.loopEnd
1011
+ ? new Date(preset.loopEnd)
1012
+ : undefined,
1013
+ })),
1014
+ defaultPresetRanges: dashboard.dateFilter.defaultPresetRanges?.map((preset) => ({
1015
+ ...preset,
1016
+ loopStart: preset.loopStart
1017
+ ? new Date(preset.loopStart)
1018
+ : undefined,
1019
+ loopEnd: preset.loopEnd
1020
+ ? new Date(preset.loopEnd)
1021
+ : undefined,
1022
+ })),
1023
+ }
1024
+ : undefined,
1006
1025
  createdAt: new Date(dashboard.createdAt),
1007
1026
  })),
1008
1027
  });
1009
1028
  dashboardFiltersDispatch({
1010
1029
  type: 'SET_INITIAL_DASHBOARD_FILTERS',
1011
1030
  data: result.data.dashboards.reduce((acc, dashboard) => {
1012
- let presetsOptions = defaultOptionsV2;
1013
- if (dashboard.dateFilter?.presetRanges) {
1014
- presetsOptions = dashboard.dateFilter.presetRanges.map((elem) => {
1015
- if (!elem.isStatic) {
1016
- return {
1017
- label: elem.label,
1018
- value: elem.value,
1019
- startDate: (PRIMARY_RANGE[elem.value] ??
1020
- PRIMARY_RANGE['LAST_30_DAYS']).startDate,
1021
- endDate: (PRIMARY_RANGE[elem.value] ??
1022
- PRIMARY_RANGE['LAST_30_DAYS']).endDate,
1023
- };
1024
- }
1025
- return {
1026
- label: elem.label,
1027
- value: elem.value,
1028
- startDate: new Date(elem.startDate),
1029
- endDate: new Date(elem.endDate),
1030
- };
1031
- });
1031
+ let presetOptions = defaultOptionsV2;
1032
+ if (dashboard.dateFilter?.presetOptions ||
1033
+ dashboard.dateFilter?.defaultPresetRanges) {
1034
+ presetOptions = convertPresetOptionsToSelectableList((dashboard.dateFilter.presetOptions ?? []).map((preset) => ({
1035
+ ...preset,
1036
+ loopStart: preset.loopStart
1037
+ ? new Date(preset.loopStart)
1038
+ : undefined,
1039
+ loopEnd: preset.loopEnd
1040
+ ? new Date(preset.loopEnd)
1041
+ : undefined,
1042
+ })), (dashboard.dateFilter.defaultPresetRanges ?? []).map((preset) => ({
1043
+ ...preset,
1044
+ loopStart: preset.loopStart
1045
+ ? new Date(preset.loopStart)
1046
+ : undefined,
1047
+ loopEnd: preset.loopEnd
1048
+ ? new Date(preset.loopEnd)
1049
+ : undefined,
1050
+ })));
1032
1051
  }
1033
1052
  acc[dashboard.name] = {};
1034
1053
  if (dashboard.dateFilter) {
1035
1054
  dashboard.dateFilter = {
1036
1055
  ...dashboard.dateFilter,
1037
- startDate: presetsOptions.find((elem) => elem.value === dashboard.dateFilter.primaryRange?.value)?.startDate,
1038
- endDate: presetsOptions.find((elem) => elem.value === dashboard.dateFilter.primaryRange?.value)?.endDate,
1056
+ startDate: presetOptions.find((elem) => elem.value === dashboard.dateFilter.primaryRange?.value)?.startDate,
1057
+ endDate: presetOptions.find((elem) => elem.value === dashboard.dateFilter.primaryRange?.value)?.endDate,
1039
1058
  filterType: 'date_range',
1059
+ presetOptions: dashboard.dateFilter.presetOptions?.map((preset) => ({
1060
+ ...preset,
1061
+ loopStart: preset.loopStart
1062
+ ? new Date(preset.loopStart)
1063
+ : undefined,
1064
+ loopEnd: preset.loopEnd
1065
+ ? new Date(preset.loopEnd)
1066
+ : undefined,
1067
+ })),
1068
+ defaultPresetRanges: dashboard.dateFilter.defaultPresetRanges?.map((preset) => ({
1069
+ ...preset,
1070
+ loopStart: preset.loopStart
1071
+ ? new Date(preset.loopStart)
1072
+ : undefined,
1073
+ loopEnd: preset.loopEnd
1074
+ ? new Date(preset.loopEnd)
1075
+ : undefined,
1076
+ })),
1040
1077
  };
1041
1078
  acc[dashboard.name][dashboard.dateFilter.label] = {
1042
1079
  filter: dashboard.dateFilter,
@@ -1067,6 +1104,33 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
1067
1104
  }
1068
1105
  }
1069
1106
  }
1107
+ async function quillFetchWithToken({ client, task, method = 'POST', metadata, abortSignal, credentials = 'omit', urlParameters, includeFlags = false, includeTenants = false, adminMode, }) {
1108
+ try {
1109
+ const result = await quillFetch({
1110
+ client,
1111
+ task,
1112
+ method,
1113
+ metadata: {
1114
+ flags: includeFlags ? flags : undefined,
1115
+ tenants: includeTenants ? tenants : undefined,
1116
+ adminMode,
1117
+ ...metadata,
1118
+ },
1119
+ abortSignal,
1120
+ credentials,
1121
+ urlParameters,
1122
+ getToken: getAuthorizationToken,
1123
+ });
1124
+ return result;
1125
+ }
1126
+ catch (e) {
1127
+ if (e instanceof Error && e.name === 'AbortError') {
1128
+ throw e;
1129
+ }
1130
+ console.error('Failed to fetch:', e);
1131
+ return { error: 'Failed to fetch data' };
1132
+ }
1133
+ }
1070
1134
  useEffect(() => {
1071
1135
  async function updateClientAndSchema(publicKey) {
1072
1136
  if (populatedClient?.clientId === publicKey &&
@@ -1074,8 +1138,8 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
1074
1138
  return;
1075
1139
  setIsClientLoading(true);
1076
1140
  setSchemaData({ ...schemaData, isSchemaLoading: true });
1077
- const newClient = await fetchClient(publicKey, queryEndpoint, withCredentials, queryHeaders);
1078
- if (!newClient.allTenantTypes?.every((t) => t.defaultId)) {
1141
+ const newClient = await fetchClient(publicKey, queryEndpoint, withCredentials, getAuthorizationToken, queryHeaders, isAdmin);
1142
+ if (!newClient.allTenantTypes?.every((t) => t.defaultId || t.scope === 'database')) {
1079
1143
  console.error('Default organization not found. Please select a default organization for ', newClient.allTenantTypes?.find((t) => !t.defaultId));
1080
1144
  }
1081
1145
  setClient({
@@ -1090,78 +1154,89 @@ export const ContextProvider = ({ children, initialTheme, publicKey, queryEndpoi
1090
1154
  featureFlags: newClient.featureFlags,
1091
1155
  domainName: newClient.domainName,
1092
1156
  allTenantTypes: newClient.allTenantTypes,
1093
- // @ts-ignore
1094
- maintenanceMode: newClient?.maintenanceMode || false,
1095
1157
  });
1096
1158
  setIsClientLoading(false);
1097
1159
  }
1098
1160
  updateClientAndSchema(publicKey);
1099
1161
  }, [publicKey]);
1100
1162
  useEffect(() => {
1101
- // CLEAR ALL DASHBOARD DATA AND REPORTS AND THEIR FILTERS
1102
- dispatch({ type: 'CLEAR_DASHBOARDS' });
1103
- dashboardFiltersDispatch({ type: 'CLEAR_DASHBOARD_FILTERS' });
1104
- reportFiltersDispatch({ type: 'CLEAR_REPORT_FILTERS' });
1105
- reportsDispatch({ type: 'CLEAR_REPORTS' });
1106
- if (populatedClient) {
1107
- fetchSchema({ client: populatedClient, tenants, caller: 'context' });
1108
- }
1109
- if (typeof window !== 'undefined' && sessionStorage) {
1110
- sessionStorage.setItem('quill-client', JSON.stringify({
1111
- ...populatedClient,
1112
- allTenantTypes: undefined,
1113
- }));
1163
+ if (populatedClient?.publicKey &&
1164
+ currentPublicKey.current !== populatedClient?.publicKey) {
1165
+ // CLEAR ALL DASHBOARD DATA AND REPORTS AND THEIR FILTERS
1166
+ dispatch({ type: 'CLEAR_DASHBOARDS' });
1167
+ dashboardFiltersDispatch({ type: 'CLEAR_DASHBOARD_FILTERS' });
1168
+ reportFiltersDispatch({ type: 'CLEAR_REPORT_FILTERS' });
1169
+ reportsDispatch({ type: 'CLEAR_REPORTS' });
1170
+ // TODO: this is yet another unfortunate hack where the answer is to unify the admin and react state
1171
+ // currently, we fetch the dashboards twice if both the client and default org change
1172
+ // because if we didn't, we would fetch 0 times if the client changed but the org didn't
1173
+ if (isAdmin) {
1174
+ setIsDashboardsLoading(true);
1175
+ fetchDashboards(populatedClient?.publicKey);
1176
+ }
1177
+ else {
1178
+ setIsDashboardsLoading(false);
1179
+ }
1180
+ if (typeof window !== 'undefined' && sessionStorage) {
1181
+ sessionStorage.setItem('quill-client', JSON.stringify({
1182
+ ...populatedClient,
1183
+ allTenantTypes: undefined,
1184
+ }));
1185
+ }
1186
+ currentPublicKey.current = publicKey;
1114
1187
  }
1115
- }, [populatedClient?.publicKey, tenants]);
1116
- // FIXME: fetchDashboards needs to rerun every time the tenant changes so that we filter reports on their flags
1188
+ }, [populatedClient?.publicKey]);
1117
1189
  useEffect(() => {
1118
- // Clear context
1119
- setIsDashboardsLoading(true);
1120
- // TODO: this is yet another unfortunate hack where the answer is to unify the admin and react state
1121
- // currently, we fetch the dashboards twice if both the client and default org change
1122
- // because if we didn't, we would fetch 0 times if the client changed but the org didn't
1123
- fetchDashboards(publicKey);
1124
- dashboardFiltersDispatch({ type: 'CLEAR_DASHBOARD_FILTERS' });
1125
- reportFiltersDispatch({ type: 'CLEAR_REPORT_FILTERS' });
1126
- dispatch({ type: 'CLEAR_DASHBOARDS' });
1127
- }, [publicKey]);
1190
+ if (populatedClient?.currentTenants &&
1191
+ !equal(currentTenant.current, populatedClient?.currentTenants)) {
1192
+ dispatch({ type: 'CLEAR_DASHBOARDS' });
1193
+ dashboardFiltersDispatch({ type: 'CLEAR_DASHBOARD_FILTERS' });
1194
+ reportFiltersDispatch({ type: 'CLEAR_REPORT_FILTERS' });
1195
+ reportsDispatch({ type: 'CLEAR_REPORTS' });
1196
+ if (populatedClient) {
1197
+ fetchSchema({
1198
+ client: populatedClient,
1199
+ tenants: populatedClient.currentTenants,
1200
+ caller: 'context',
1201
+ });
1202
+ }
1203
+ currentTenant.current = populatedClient?.currentTenants ?? null;
1204
+ }
1205
+ }, [populatedClient?.currentTenants]);
1128
1206
  if (!theme) {
1129
1207
  return null;
1130
1208
  }
1131
1209
  if (!tenants) {
1132
1210
  throw new Error('Quill Error: QuillProvider prop organizationId is deprecated. Please use QuillProvider tenants prop instead');
1133
1211
  }
1134
- if (populatedClient?.maintenanceMode) {
1135
- return (_jsxs("div", { children: [_jsx("h1", { children: "Dashboard is currently in maintenance mode" }), _jsx("p", { children: "Please check back later or contact your administrator for more information." })] }));
1136
- }
1137
1212
  return (_jsx(ClientContext.Provider, { value: [
1138
1213
  isClientLoading || !populatedClient ? null : populatedClient,
1139
1214
  isClientLoading,
1140
1215
  setClient,
1141
- ], children: _jsx(ThemeContext.Provider, { value: [theme, setTheme], children: _jsx(SchemaDataContext.Provider, { value: [schemaData, setSchemaData], children: _jsx(DashboardContext.Provider, { value: [dashboard, dispatch], children: _jsx(DashboardConfigContext.Provider, { value: {
1142
- dashboardConfig: isDashboardsLoading ? {} : dashboardConfig,
1143
- isLoading: isDashboardsLoading,
1144
- dashboardConfigDispatch,
1145
- loadDashboard,
1146
- }, children: _jsx(DashboardFiltersContext.Provider, { value: {
1147
- dashboardFilters,
1148
- dashboardCustomFilters,
1149
- customFilterDispatch,
1150
- dispatch: dashboardFiltersDispatch,
1151
- loadFiltersForDashboard,
1152
- }, children: _jsx(ReportFiltersContext.Provider, { value: {
1153
- reportFilters,
1154
- customReportFilters,
1155
- reportFiltersDispatch,
1156
- customReportFiltersDispatch,
1157
- loadFiltersForReport,
1158
- abortLoadingFilters,
1159
- }, children: _jsx(ReportsContext.Provider, { value: {
1160
- reports,
1161
- reportsDispatch,
1162
- fetchIndividualReport,
1163
- }, children: _jsx(TenantContext.Provider, { value: {
1164
- tenants: populatedClient?.currentFlags ?? tenants,
1165
- flags: populatedClient?.currentFlags ?? flags,
1166
- }, children: children }) }) }) }) }) }) }) }) }));
1216
+ ], children: _jsx(ThemeContext.Provider, { value: [theme, setTheme], children: _jsx(FetchContext.Provider, { value: { getToken: getAuthorizationToken, quillFetchWithToken }, children: _jsx(SchemaDataContext.Provider, { value: [schemaData, setSchemaData], children: _jsx(DashboardContext.Provider, { value: [dashboard, dispatch], children: _jsx(DashboardConfigContext.Provider, { value: {
1217
+ dashboardConfig: isDashboardsLoading ? {} : dashboardConfig,
1218
+ isLoading: isDashboardsLoading,
1219
+ dashboardConfigDispatch,
1220
+ loadDashboard,
1221
+ }, children: _jsx(DashboardFiltersContext.Provider, { value: {
1222
+ dashboardFilters,
1223
+ dashboardCustomFilters,
1224
+ customFilterDispatch,
1225
+ dispatch: dashboardFiltersDispatch,
1226
+ loadFiltersForDashboard,
1227
+ }, children: _jsx(ReportFiltersContext.Provider, { value: {
1228
+ reportFilters,
1229
+ customReportFilters,
1230
+ reportFiltersDispatch,
1231
+ customReportFiltersDispatch,
1232
+ loadFiltersForReport,
1233
+ abortLoadingFilters,
1234
+ }, children: _jsx(ReportsContext.Provider, { value: {
1235
+ reports,
1236
+ reportsDispatch,
1237
+ fetchIndividualReport,
1238
+ }, children: _jsx(TenantContext.Provider, { value: {
1239
+ tenants: populatedClient?.currentTenants ?? tenants,
1240
+ flags: populatedClient?.currentFlags ?? flags,
1241
+ }, children: children }) }) }) }) }) }) }) }) }) }));
1167
1242
  };