@quillsql/react 2.13.24 → 2.13.26

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 (189) hide show
  1. package/dist/cjs/Chart.d.ts +0 -1
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +28 -16
  4. package/dist/cjs/ChartBuilder.d.ts +8 -37
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +402 -189
  7. package/dist/cjs/ChartEditor.d.ts +1 -1
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +31 -167
  10. package/dist/cjs/Context.d.ts +13 -2
  11. package/dist/cjs/Context.d.ts.map +1 -1
  12. package/dist/cjs/Context.js +32 -12
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +3 -6
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  16. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  17. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +7 -3
  18. package/dist/cjs/ReportBuilder.d.ts +1 -3
  19. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  20. package/dist/cjs/ReportBuilder.js +120 -137
  21. package/dist/cjs/SQLEditor.d.ts +2 -2
  22. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  23. package/dist/cjs/SQLEditor.js +47 -24
  24. package/dist/cjs/components/Chart/BarChart.js +1 -1
  25. package/dist/cjs/components/Chart/InternalChart.d.ts +25 -0
  26. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -0
  27. package/dist/cjs/components/Chart/InternalChart.js +385 -0
  28. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  29. package/dist/cjs/components/Chart/LineChart.js +3 -1
  30. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +7 -4
  31. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  32. package/dist/cjs/components/Dashboard/DashboardFilter.js +8 -5
  33. package/dist/cjs/components/Dashboard/DataLoader.d.ts +3 -3
  34. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  35. package/dist/cjs/components/Dashboard/DataLoader.js +23 -9
  36. package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
  37. package/dist/cjs/components/QuillMultiSelectWithCombo.js +1 -1
  38. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  39. package/dist/cjs/components/ReportBuilder/convert.js +54 -8
  40. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
  41. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  42. package/dist/cjs/components/ReportBuilder/util.js +48 -0
  43. package/dist/cjs/components/UiComponents.d.ts +3 -1
  44. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  45. package/dist/cjs/components/UiComponents.js +4 -4
  46. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  47. package/dist/cjs/hooks/useDashboard.js +13 -0
  48. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  49. package/dist/cjs/hooks/useExport.js +6 -1
  50. package/dist/cjs/hooks/useQuill.js +9 -9
  51. package/dist/cjs/internals/ReportBuilder/PivotList.js +1 -1
  52. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +3 -2
  53. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  54. package/dist/cjs/internals/ReportBuilder/PivotModal.js +3 -8
  55. package/dist/cjs/models/Report.d.ts +9 -2
  56. package/dist/cjs/models/Report.d.ts.map +1 -1
  57. package/dist/cjs/models/Report.js +2 -0
  58. package/dist/cjs/models/Tables.d.ts +5 -6
  59. package/dist/cjs/models/Tables.d.ts.map +1 -1
  60. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  61. package/dist/cjs/utils/astProcessing.js +1 -0
  62. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  63. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  64. package/dist/cjs/utils/columnProcessing.js +4 -0
  65. package/dist/cjs/utils/constants.d.ts.map +1 -1
  66. package/dist/cjs/utils/constants.js +6 -2
  67. package/dist/cjs/utils/dashboard.d.ts +1 -1
  68. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  69. package/dist/cjs/utils/dashboard.js +13 -18
  70. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  71. package/dist/cjs/utils/dataFetcher.js +2 -2
  72. package/dist/cjs/utils/filterProcessing.d.ts +5 -2
  73. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  74. package/dist/cjs/utils/filterProcessing.js +5 -2
  75. package/dist/cjs/utils/merge.d.ts.map +1 -1
  76. package/dist/cjs/utils/merge.js +0 -4
  77. package/dist/cjs/utils/paginationProcessing.d.ts +1 -1
  78. package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -1
  79. package/dist/cjs/utils/paginationProcessing.js +1 -4
  80. package/dist/cjs/utils/pivotConstructor.d.ts +3 -2
  81. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  82. package/dist/cjs/utils/pivotConstructor.js +20 -8
  83. package/dist/cjs/utils/pivotProcessing.d.ts +5 -2
  84. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  85. package/dist/cjs/utils/queryConstructor.d.ts +1 -1
  86. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  87. package/dist/cjs/utils/queryConstructor.js +4 -4
  88. package/dist/cjs/utils/report.d.ts +2 -1
  89. package/dist/cjs/utils/report.d.ts.map +1 -1
  90. package/dist/cjs/utils/report.js +23 -24
  91. package/dist/cjs/utils/tableProcessing.d.ts +18 -5
  92. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  93. package/dist/cjs/utils/tableProcessing.js +14 -7
  94. package/dist/cjs/utils/validation.js +1 -1
  95. package/dist/esm/Chart.d.ts +0 -1
  96. package/dist/esm/Chart.d.ts.map +1 -1
  97. package/dist/esm/Chart.js +28 -16
  98. package/dist/esm/ChartBuilder.d.ts +8 -37
  99. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  100. package/dist/esm/ChartBuilder.js +408 -192
  101. package/dist/esm/ChartEditor.d.ts +1 -1
  102. package/dist/esm/ChartEditor.d.ts.map +1 -1
  103. package/dist/esm/ChartEditor.js +33 -169
  104. package/dist/esm/Context.d.ts +13 -2
  105. package/dist/esm/Context.d.ts.map +1 -1
  106. package/dist/esm/Context.js +32 -12
  107. package/dist/esm/Dashboard.d.ts.map +1 -1
  108. package/dist/esm/Dashboard.js +5 -8
  109. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  110. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  111. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +7 -3
  112. package/dist/esm/ReportBuilder.d.ts +1 -3
  113. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  114. package/dist/esm/ReportBuilder.js +120 -137
  115. package/dist/esm/SQLEditor.d.ts +2 -2
  116. package/dist/esm/SQLEditor.d.ts.map +1 -1
  117. package/dist/esm/SQLEditor.js +48 -25
  118. package/dist/esm/components/Chart/BarChart.js +1 -1
  119. package/dist/esm/components/Chart/InternalChart.d.ts +25 -0
  120. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -0
  121. package/dist/esm/components/Chart/InternalChart.js +379 -0
  122. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/LineChart.js +4 -2
  124. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +7 -4
  125. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  126. package/dist/esm/components/Dashboard/DashboardFilter.js +8 -5
  127. package/dist/esm/components/Dashboard/DataLoader.d.ts +3 -3
  128. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  129. package/dist/esm/components/Dashboard/DataLoader.js +23 -9
  130. package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
  131. package/dist/esm/components/QuillMultiSelectWithCombo.js +1 -1
  132. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  133. package/dist/esm/components/ReportBuilder/convert.js +54 -8
  134. package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
  135. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  136. package/dist/esm/components/ReportBuilder/util.js +47 -0
  137. package/dist/esm/components/UiComponents.d.ts +3 -1
  138. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  139. package/dist/esm/components/UiComponents.js +4 -4
  140. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  141. package/dist/esm/hooks/useDashboard.js +14 -1
  142. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  143. package/dist/esm/hooks/useExport.js +6 -1
  144. package/dist/esm/hooks/useQuill.js +9 -9
  145. package/dist/esm/internals/ReportBuilder/PivotList.js +1 -1
  146. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +3 -2
  147. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  148. package/dist/esm/internals/ReportBuilder/PivotModal.js +3 -8
  149. package/dist/esm/models/Report.d.ts +9 -2
  150. package/dist/esm/models/Report.d.ts.map +1 -1
  151. package/dist/esm/models/Report.js +1 -1
  152. package/dist/esm/models/Tables.d.ts +5 -6
  153. package/dist/esm/models/Tables.d.ts.map +1 -1
  154. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  155. package/dist/esm/utils/astProcessing.js +2 -1
  156. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  157. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  158. package/dist/esm/utils/columnProcessing.js +3 -0
  159. package/dist/esm/utils/constants.d.ts.map +1 -1
  160. package/dist/esm/utils/constants.js +6 -2
  161. package/dist/esm/utils/dashboard.d.ts +1 -1
  162. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  163. package/dist/esm/utils/dashboard.js +13 -18
  164. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  165. package/dist/esm/utils/dataFetcher.js +2 -2
  166. package/dist/esm/utils/filterProcessing.d.ts +5 -2
  167. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  168. package/dist/esm/utils/filterProcessing.js +5 -2
  169. package/dist/esm/utils/merge.d.ts.map +1 -1
  170. package/dist/esm/utils/merge.js +0 -4
  171. package/dist/esm/utils/paginationProcessing.d.ts +1 -1
  172. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -1
  173. package/dist/esm/utils/paginationProcessing.js +1 -4
  174. package/dist/esm/utils/pivotConstructor.d.ts +3 -2
  175. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  176. package/dist/esm/utils/pivotConstructor.js +20 -8
  177. package/dist/esm/utils/pivotProcessing.d.ts +5 -2
  178. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  179. package/dist/esm/utils/queryConstructor.d.ts +1 -1
  180. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  181. package/dist/esm/utils/queryConstructor.js +3 -3
  182. package/dist/esm/utils/report.d.ts +2 -1
  183. package/dist/esm/utils/report.d.ts.map +1 -1
  184. package/dist/esm/utils/report.js +24 -25
  185. package/dist/esm/utils/tableProcessing.d.ts +18 -5
  186. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  187. package/dist/esm/utils/tableProcessing.js +15 -8
  188. package/dist/esm/utils/validation.js +1 -1
  189. package/package.json +1 -1
@@ -1,23 +1,29 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
3
- import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
3
+ import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, ReportFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
4
4
  import { getDataFromCloud } from './utils/dataFetcher';
5
5
  import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
6
6
  import { PivotCard } from './internals/ReportBuilder/PivotList';
7
- import { ChartDisplay } from './Chart';
8
7
  import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, } from './components/UiComponents';
9
8
  import { removeDoubleQuotes, snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
10
9
  import { QuillSelectComponent } from './components/QuillSelect';
10
+ import { TEMP_REPORT_ID, } from './models/Report';
11
11
  import { QuillCard } from './components/QuillCard';
12
12
  import { quillFormat } from './utils/valueFormatter';
13
- import { convertFieldTypeToJSType } from './utils/columnProcessing';
13
+ import { convertFieldTypeToJSType, isStringType, } from './utils/columnProcessing';
14
14
  import { getSelectFromAST, getTablesHelper } from './utils/astProcessing';
15
- import { getDateBucketFromRange } from './utils/dates';
16
15
  import { validateReport } from './utils/validation';
17
16
  import { QuillChartErrorWithAction } from './components/Chart/ChartError';
18
- import { convertInternalReportToReport, saveReport } from './utils/report';
19
- import AdjustmentsIcon from './assets/AdjustmentsIcon';
17
+ import { convertInternalReportToReport,
18
+ // fetchReport,
19
+ // fetchReportRowCount,
20
+ saveReport, } from './utils/report';
20
21
  import { mergeComparisonRange } from './utils/merge';
22
+ import { ExclamationFilledIcon } from './assets';
23
+ import InternalChart from './components/Chart/InternalChart';
24
+ import { shouldFetchMore, shouldSortInMemory, } from './utils/paginationProcessing';
25
+ import { fetchResultsByQuery, getUniqueValuesByColumns, } from './utils/tableProcessing';
26
+ import { getDateBucketFromRange } from './utils/dates';
21
27
  const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
22
28
  const CHART_TO_LABELS = {
23
29
  column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
@@ -64,7 +70,6 @@ export function createInitialFormData(columns) {
64
70
  xAxisLabel: '',
65
71
  chartType: firstNumberColumn ? 'line' : 'table',
66
72
  pivot: null,
67
- dateField: { table: '', field: '' },
68
73
  template: true,
69
74
  };
70
75
  return formEmptyState;
@@ -107,9 +112,9 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
107
112
  ...formData,
108
113
  dashboardName: formData.dashboardName || '',
109
114
  pivot: formData.pivot,
110
- id: '',
115
+ id: report?.id ?? TEMP_REPORT_ID,
111
116
  order: -1,
112
- compareRows: report?.compareRows || [],
117
+ compareRows: report?.compareRows,
113
118
  filtersApplied: report?.filtersApplied || [],
114
119
  queryString: '',
115
120
  rows: rows,
@@ -191,6 +196,7 @@ export function ChartBuilderWithModal(props) {
191
196
  const [modalHeight, setModalHeight] = useState(200);
192
197
  const { isOpen, setIsOpen, title, isHorizontalView } = props;
193
198
  const Modal = props.ModalComponent ?? MemoizedModal;
199
+ const [dashboard] = useContext(DashboardContext);
194
200
  useEffect(() => {
195
201
  function handleResize() {
196
202
  const screenSize = window.innerWidth;
@@ -211,7 +217,7 @@ export function ChartBuilderWithModal(props) {
211
217
  return (_jsx("div", { style: { height: '100%' }, ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
212
218
  // For isHorizontalView, use full viewport size minus 80px for padding,
213
219
  // otherwise use the default layout method of the modal (contents).
214
- width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
220
+ width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: dashboard[props.reportId ?? TEMP_REPORT_ID] ? (_jsx(ChartBuilder, { ...props })) : (_jsx("div", { style: { padding: 20 }, children: _jsx(QuillLoadingComponent, {}) })) }) }));
215
221
  }
216
222
  /**
217
223
  * ### Quill Chart Builder
@@ -237,45 +243,32 @@ export function ChartBuilderWithModal(props) {
237
243
  * ### Chart Builder API
238
244
  * @see https://docs.quillsql.com/components/chart-builder
239
245
  */
240
- export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true, pivot, setIsOpen, rows = [], columns = [], query, queryNoDateColumn, dateRange, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, report = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, onFilterPreviewChange, onSortChange, onPageChange, rowCount, rowCountIsLoading, isLoading, onClickChartElement, isEditingMode = false, disableSort = true, }) {
246
+ export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, queryNoDateColumn, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
247
+ // isLoading,
248
+ onClickChartElement, isEditingMode = false, disableSort = true, }) {
241
249
  const [client] = useContext(ClientContext);
242
250
  const [theme] = useContext(ThemeContext);
243
251
  const [schemaData] = useContext(SchemaDataContext);
252
+ const [dashboard, dispatch] = useContext(DashboardContext);
253
+ const { dashboardConfig } = useContext(DashboardConfigContext);
254
+ const report = useMemo(() => {
255
+ return dashboard[TEMP_REPORT_ID] ?? dashboard[reportId ?? TEMP_REPORT_ID];
256
+ }, [reportId]);
244
257
  const [windowWidth, setWindowWidth] = useState(1200);
258
+ const [rows, setRows] = useState(report?.rows ?? []);
259
+ const [itemQuery, setItemQuery] = useState(report?.itemQuery);
260
+ const [rowCount, setRowCount] = useState(report?.rowCount ?? 0);
261
+ const [maxPage, setMaxPage] = useState(0);
262
+ const [isLoading, setIsLoading] = useState(false);
263
+ const [rowCountIsLoading, setRowCountIsLoading] = useState(false);
245
264
  const [isSubmitting, setIsSubmitting] = useState(false);
246
265
  const [pivotCardWidth, setPivotCardWidth] = useState(665);
247
266
  const [formWidth, setFormWidth] = useState(665);
248
267
  const inputRef = useRef(null);
249
268
  const selectRef = useRef(null);
250
- const [, dispatch] = useContext(DashboardContext);
251
- const [processedColumns, setProcessedColumns] = useState(columns);
252
- const [currentPage, setCurrentPage] = useState(0);
253
- const parentRef = useRef(null);
254
- const deleteRef = useRef(null);
255
- const modalPadding = 20;
256
- const deleteButtonMargin = -12;
257
- // Note: Commenting out for now because it was auto-focusing on table page changes
258
- // If the TextInputComponent is a forwardRef it will have a $$typeof property
259
- // So we only want to pass the ref if the TextInputComponent is a forwardRef
260
- // const autofocusRefProp =
261
- // '$$typeof' in TextInputComponent
262
- // ? {
263
- // ref: (input: HTMLInputElement) =>
264
- // formData.name === '' && !showPivotPopover && input?.focus(),
265
- // }
266
- // : {};
267
- const validationHelper = (formData, dashboard, dateField, tables) => {
268
- const issues = validateReport(formData, dashboard, dateField || defaultDateField, tables || allTables);
269
- if (issues.length > 0) {
270
- setFilterIssues(issues);
271
- }
272
- else {
273
- setFilterIssues([]);
274
- }
275
- };
276
- useEffect(() => {
269
+ const processColumns = (columns) => {
277
270
  if (schemaData.schema) {
278
- const newProcessedColumns = columns.map((col) => {
271
+ const newProcessedColumns = columns?.map((col) => {
279
272
  if (col.jsType) {
280
273
  return col;
281
274
  }
@@ -296,47 +289,39 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
296
289
  newCol.jsType = convertFieldTypeToJSType(foundColumn.fieldType);
297
290
  return newCol;
298
291
  });
299
- setProcessedColumns(newProcessedColumns);
292
+ return newProcessedColumns;
300
293
  }
301
- }, [schemaData.schema]);
302
- useEffect(() => {
303
- const handleResize = () => setWindowWidth(window.innerWidth);
304
- handleResize();
305
- window.addEventListener('resize', handleResize);
306
- return () => {
307
- window.removeEventListener('resize', handleResize);
308
- };
309
- }, []);
310
- useEffect(() => {
311
- const handleResize = () => {
312
- // The pivot card should be the same width as the row of inputs
313
- // above it (an input, two selects, plus the gaps between them).
314
- if (inputRef.current && selectRef.current) {
315
- const inputSize = inputRef.current?.getBoundingClientRect();
316
- const selectSize = selectRef.current?.getBoundingClientRect();
317
- const selectWidth = selectSize.width;
318
- const showDash = showDashboardDropdown && !destinationDashboard;
319
- const spaceBetween = selectSize.left - inputSize.right;
320
- const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
321
- const width = inputSize.width + 2 * gap + 2 * selectWidth;
322
- setPivotCardWidth(width);
323
- // Calculate the form width by adding the width of the delete button
324
- const deleteSize = deleteRef.current?.getBoundingClientRect();
325
- const deleteWidth = deleteSize?.width ?? 0;
326
- setFormWidth(width + deleteWidth);
327
- }
328
- };
329
- handleResize();
330
- }, [isOpen]);
294
+ return columns;
295
+ };
296
+ const [processedColumns, setProcessedColumns] = useState(processColumns(report?.columnInternal ?? []));
297
+ const [currentPage, setCurrentPage] = useState(0);
298
+ const parentRef = useRef(null);
299
+ const deleteRef = useRef(null);
300
+ const modalPadding = 20;
301
+ const deleteButtonMargin = -12;
302
+ const { dashboardFilters } = useContext(DashboardFiltersContext);
303
+ const specificDashboardFilters = useMemo(() => {
304
+ return Object.values(dashboardFilters[report?.dashboardName ?? ''] ?? {}).map((f) => f.filter);
305
+ }, [dashboard.filters, report?.dashboardName]);
306
+ const validationHelper = (formData, dashboard, dateField, tables) => {
307
+ const issues = validateReport(formData, dashboard, dateField || defaultDateField, tables || allTables);
308
+ if (issues.length > 0) {
309
+ setFilterIssues(issues);
310
+ }
311
+ else {
312
+ setFilterIssues([]);
313
+ }
314
+ };
331
315
  useEffect(() => {
332
316
  const handleResize = () => {
317
+ setWindowWidth(window.innerWidth);
333
318
  // The pivot card should be the same width as the row of inputs
334
319
  // above it (an input, two selects, plus the gaps between them).
335
320
  if (inputRef.current && selectRef.current) {
336
321
  const inputSize = inputRef.current?.getBoundingClientRect();
337
322
  const selectSize = selectRef.current?.getBoundingClientRect();
338
323
  const selectWidth = selectSize.width;
339
- const showDash = showDashboardDropdown && !destinationDashboard;
324
+ const showDash = showDashboardDropdown && !report?.dashboardName;
340
325
  const spaceBetween = selectSize.left - inputSize.right;
341
326
  const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
342
327
  const width = inputSize.width + 2 * gap + 2 * selectWidth;
@@ -352,15 +337,35 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
352
337
  return () => {
353
338
  window.removeEventListener('resize', handleResize);
354
339
  };
355
- }, []);
340
+ }, [isOpen]);
356
341
  const [dashboardOptions, setDashboardOptions] = useState([]);
357
- const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || report?.dashboardName || '');
358
- const { dashboardFilters } = useContext(DashboardFiltersContext);
359
- const { dashboardConfig } = useContext(DashboardConfigContext);
360
- const [filtersActive, setFiltersActive] = useState(true);
361
- const specificDashboardFilters = useMemo(() => {
362
- return Object.values(dashboardFilters[defaultDashboardName] ?? {}).map((f) => f.filter);
363
- }, [dashboardFilters, filtersActive]);
342
+ const { reportFilters, reportFiltersDispatch, loadFiltersForReport } = useContext(ReportFiltersContext);
343
+ useEffect(() => {
344
+ loadFiltersForReport(report?.id ?? TEMP_REPORT_ID, 'ChartBuilder', specificDashboardFilters, undefined, undefined, canonicalFilterMap, report?.dashboardName);
345
+ return () => {
346
+ reportFiltersDispatch({
347
+ type: 'CLEAR_REPORT_FILTERS',
348
+ id: report?.id ?? TEMP_REPORT_ID,
349
+ });
350
+ // TODO: Currently the behavior of Chart Builder is dependent on whether there is a TEMP_REPORT_ID in context or not
351
+ /* The Chart Builder can essentially be in three states
352
+ 1. Creating a new report, all we have is an ephemeral temp report
353
+ 2. Editing an existing report, we have a report id and the report is in the dashboard context
354
+ 3. Editing the query of an existing report, we have a report id and the new-query report is in context under TEMP_REPORT_ID
355
+ One can imagine this going wrong: somehow the temp report gets set by SQLEditor or ReportBuilder but never cleared
356
+ and now its going to start popping up during state 2 rather than the real report.
357
+ For now we're going on faith that unmounting will always clear the temp report
358
+ but we may want to fiddle with the props to make this more robust
359
+ */
360
+ dispatch({
361
+ type: 'REMOVE_DASHBOARD_ITEM',
362
+ id: TEMP_REPORT_ID,
363
+ });
364
+ };
365
+ }, []);
366
+ const currentDashboardFilters = useMemo(() => {
367
+ return Object.values(reportFilters[report?.id ?? TEMP_REPORT_ID] ?? {}).map((f) => f.filter);
368
+ }, [reportFilters, report?.id]);
364
369
  const [showFilterModal, setShowFilterModal] = useState(false);
365
370
  const [filterIssues, setFilterIssues] = useState([]);
366
371
  const [showPivotPopover, setShowPivotPopover] = useState(false);
@@ -371,38 +376,72 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
371
376
  const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
372
377
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
373
378
  const [pivotError, setPivotError] = useState(undefined);
379
+ const pivotData = report?.pivotRows && report?.pivotColumns
380
+ ? { rows: report.pivotRows, columns: report.pivotColumns }
381
+ : undefined;
382
+ const columns = report?.columnInternal ?? [];
383
+ const destinationDashboard = report?.dashboardName;
384
+ const query = report?.queryString;
374
385
  const [loadingFormData, setLoadingFormData] = useState(false);
375
386
  const [triggeredEditChart, setTriggeredEditChart] = useState(false);
376
- const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : report?.pivot ? [report.pivot] : cp);
387
+ const [createdPivots, setCreatedPivots] = useState(report?.pivot ? [report.pivot] : cp);
377
388
  const [recommendedPivots, setRecommendedPivots] = useState(rp);
378
- const [pivotRowField, setPivotRowField] = useState(pivot?.rowField);
379
- const [pivotColumnField, setPivotColumnField] = useState(pivot?.columnField);
380
- const [pivotValueField, setPivotValueField] = useState(pivot?.valueField);
381
- const [pivotValueField2, setPivotValueField2] = useState(pivot?.valueField2);
382
- const [pivotAggregation, setPivotAggregation] = useState(pivot?.aggregationType);
389
+ const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
390
+ const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
391
+ const [pivotValueField, setPivotValueField] = useState(report?.pivot?.valueField);
392
+ const [pivotValueField2, setPivotValueField2] = useState(report?.pivot?.valueField2);
393
+ const [pivotAggregation, setPivotAggregation] = useState(report?.pivot?.aggregationType);
394
+ const baseProcessing = {
395
+ page: report?.pagination ?? {
396
+ page: 0,
397
+ rowsPerPage: 10,
398
+ rowsPerRequest: report?.chartType === 'table' ? 50 : 500,
399
+ },
400
+ };
401
+ const [currentProcessing, setCurrentProcessing] = useState(baseProcessing);
383
402
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
384
403
  const [dateFieldOptions, setDateFieldOptions] = useState([]);
385
404
  const [allTables, setAllTables] = useState([]);
386
405
  const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
387
406
  const [referencedColumns, setReferencedColumns] = useState({});
407
+ const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
408
+ const canonicalFilterMap = useMemo(() => {
409
+ return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
410
+ }, [filterMap]);
411
+ const validFilter = useMemo(() => {
412
+ return currentDashboardFilters.reduce((acc, filter) => {
413
+ if (filter.filterType === 'date_range') {
414
+ acc[filter.label] = true;
415
+ return acc;
416
+ }
417
+ acc[filter.label] =
418
+ !!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
419
+ !!schemaData.schema
420
+ ?.find((table) => {
421
+ return (table.displayName === (filterMap[filter.label] ?? filter).table);
422
+ })
423
+ ?.columns.find((col) => col.field === (filterMap[filter.label] ?? filter).field);
424
+ return acc;
425
+ }, {});
426
+ }, [currentDashboardFilters, filterMap, allTables]);
388
427
  const [defaultDateField, setDefaultDateField] = useState({
389
428
  table: dateFieldOptions[0]?.name || '',
390
429
  field: dateFieldOptions[0]?.columns[0]?.field || '',
391
430
  });
392
- const firstNumberColumn = columns?.find((col) => numberFormatOptions.includes(col.format));
431
+ const firstNumberColumn = report?.columnInternal?.find((col) => numberFormatOptions.includes(col.format));
393
432
  const formEmptyState = {
394
433
  name: report?.name ?? '',
395
- dashboardName: dashboardOptions[0]?.label || '',
396
- columns: columns.map((col) => {
434
+ dashboardName: dashboardOptions[0]?.label ?? '',
435
+ columns: report?.columns.map((col) => {
397
436
  return { ...col, label: snakeAndCamelCaseToTitleCase(col.label) };
398
- }),
399
- xAxisField: columns?.[0]?.field || '',
400
- xAxisFormat: columns?.[0]?.format || 'string',
437
+ }) ?? [],
438
+ xAxisField: report?.columns?.[0]?.field ?? '',
439
+ xAxisFormat: report?.columns?.[0]?.format ?? 'string',
401
440
  yAxisFields: [
402
441
  {
403
- field: firstNumberColumn?.field || columns?.[0]?.field || '',
442
+ field: firstNumberColumn?.field ?? report?.columns?.[0]?.field ?? '',
404
443
  label: '',
405
- format: firstNumberColumn?.format || columns?.[0]?.format || 'string',
444
+ format: firstNumberColumn?.format ?? report?.columns?.[0]?.format ?? 'string',
406
445
  },
407
446
  ],
408
447
  xAxisLabel: '',
@@ -461,7 +500,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
461
500
  xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
462
501
  xAxisFormat: isDateField(pivot.rowFieldType || '')
463
502
  ? 'string'
464
- : columns.find((col) => col.field === pivot.rowField)?.format ||
503
+ : report?.columns.find((col) => col.field === pivot.rowField)?.format ||
465
504
  report?.xAxisFormat ||
466
505
  'whole_number',
467
506
  xAxisLabel: report?.xAxisLabel || pivot.rowField,
@@ -474,8 +513,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
474
513
  : report?.yAxisFields && report?.yAxisFields?.length > 0
475
514
  ? // @ts-ignore
476
515
  report?.yAxisFields[0].format
477
- : columns.find((col) => col.field === pivot.valueField)?.format ||
478
- 'whole_number',
516
+ : report?.columns.find((col) => col.field === pivot.valueField)
517
+ ?.format || 'whole_number',
479
518
  },
480
519
  ],
481
520
  };
@@ -483,8 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
483
522
  const formFormDataFromReport = (report) => {
484
523
  let pivotData = {};
485
524
  let dateField = defaultDateField;
486
- if (pivot) {
487
- pivotData = pivotFormData(pivot);
525
+ if (report?.pivot) {
526
+ pivotData = pivotFormData(report.pivot);
488
527
  }
489
528
  if (report) {
490
529
  dateField = report.dateField || defaultDateField;
@@ -493,7 +532,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
493
532
  ...formEmptyState,
494
533
  ...report,
495
534
  ...pivotData,
496
- ...(destinationDashboard && { dashboardName: destinationDashboard }),
535
+ ...(report?.dashboardName && { dashboardName: report?.dashboardName }),
497
536
  dateField: dateField,
498
537
  };
499
538
  };
@@ -502,7 +541,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
502
541
  if (!rows || !rows.length) {
503
542
  return [];
504
543
  }
505
- if (pivot || pivotData) {
544
+ if (report?.pivot || pivotData) {
506
545
  return [];
507
546
  }
508
547
  const columnsObservedInRows = rows[0] ? Object.keys(rows[0]) : [];
@@ -551,8 +590,6 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
551
590
  const curDashboard = await updateDashboardFilters(dashboardName);
552
591
  setDashboardOptions(dashboardOptions);
553
592
  curFormData.dashboardName = dashboardName;
554
- setDefaultDashboardName(dashboardName ??
555
- (report ? report?.dashboardName : dashboardOptions[0]?.label));
556
593
  const curSchemaData = schemaData.schema;
557
594
  if (!query) {
558
595
  setLoadingFormData(false);
@@ -613,34 +650,49 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
613
650
  }
614
651
  getFormData();
615
652
  }, []);
616
- const [selectedPivotTable, setSelectedPivotTable] = useState(pivotData || undefined);
653
+ const [selectedPivotTable, setSelectedPivotTable] = useState(pivotData);
654
+ const pivotCardTable = useMemo(() => {
655
+ return {
656
+ pivot: formData.pivot,
657
+ rows: selectedPivotTable?.rows ?? [],
658
+ columns: selectedPivotTable?.columns ?? [],
659
+ };
660
+ }, [selectedPivotTable, formData.pivot]);
617
661
  const chartData = useMemo(() => {
618
- const data = createReportFromForm(formData, report, selectedPivotTable, rows, specificDashboardFilters);
619
- return data;
662
+ const data = createReportFromForm(formData, report, selectedPivotTable, rows, currentDashboardFilters);
663
+ return {
664
+ ...data,
665
+ filterMap: canonicalFilterMap,
666
+ };
620
667
  }, [formData, selectedPivotTable, report, rows]);
621
- const fetchPivotData = async (pivot, uniqueValues, overrideDateRange) => {
668
+ const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
669
+ const dashboardFilters = filtersEnabled
670
+ ? (overrideFilters ?? currentDashboardFilters)
671
+ : undefined;
622
672
  if (pivot) {
623
- // const dateFilter =
624
- // report && filtersActive
625
- // ? report.filtersApplied.find((filter: any) => {
626
- // return filter.filterType === 'date_range';
627
- // })
628
- // : undefined;
629
673
  let dateBucket = undefined;
630
- if (overrideDateRange) {
631
- dateBucket = getDateBucketFromRange(overrideDateRange);
674
+ if (filtersEnabled) {
675
+ const dateFilter = dashboardFilters?.find((f) => f.filterType === 'date_range');
676
+ dateBucket =
677
+ dateFilter?.startDate && dateFilter?.endDate
678
+ ? getDateBucketFromRange({
679
+ start: dateFilter?.startDate,
680
+ end: dateFilter?.endDate,
681
+ })
682
+ : undefined;
632
683
  }
633
684
  try {
634
685
  const pivotTable = await generatePivotTable({
635
686
  pivot,
636
687
  dateBucket,
637
- report,
688
+ report: { ...report, ...(tableInfo ?? { itemQuery }) },
638
689
  client,
639
690
  uniqueValues,
640
691
  });
641
692
  setSelectedPivotTable(pivotTable);
642
693
  }
643
694
  catch (e) {
695
+ console.log('error', e);
644
696
  if (e instanceof Error) {
645
697
  setPivotError(e.message);
646
698
  }
@@ -697,6 +749,129 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
697
749
  rows,
698
750
  formData.pivot,
699
751
  ]);
752
+ const fetchRowCount = async (processing, overrideFilters) => {
753
+ if (!client || !query) {
754
+ return;
755
+ }
756
+ setRowCountIsLoading(true);
757
+ const tableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, false, true, canonicalFilterMap);
758
+ if (tableInfo.rowCount) {
759
+ setRowCount(tableInfo.rowCount);
760
+ }
761
+ setRowCountIsLoading(false);
762
+ };
763
+ const onDashboardFilterChange = (label, value) => {
764
+ const updatedFilters = currentDashboardFilters.map((filter) => {
765
+ if (filter.label === label) {
766
+ return {
767
+ ...filter,
768
+ ...value,
769
+ };
770
+ }
771
+ return filter;
772
+ });
773
+ loadFiltersForReport(report?.id ?? TEMP_REPORT_ID, 'ChartBuilder', updatedFilters, label, undefined, canonicalFilterMap, report?.dashboardName).then(() => {
774
+ setCurrentPage(0);
775
+ setMaxPage(0);
776
+ handleRunQuery(baseProcessing, updatedFilters);
777
+ });
778
+ };
779
+ const mounted = useRef(false);
780
+ useEffect(() => {
781
+ if (!mounted.current) {
782
+ mounted.current = true;
783
+ return;
784
+ }
785
+ setCurrentPage(0);
786
+ setMaxPage(0);
787
+ handleRunQuery(baseProcessing, currentDashboardFilters);
788
+ }, [filtersEnabled]);
789
+ const handleRunQuery = async (processing, overrideFilters) => {
790
+ if (!client || !query) {
791
+ return;
792
+ }
793
+ try {
794
+ setIsLoading(true);
795
+ const tableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, true, false, canonicalFilterMap);
796
+ setCurrentProcessing(processing);
797
+ setRows(tableInfo.rows);
798
+ setProcessedColumns(processColumns(tableInfo.columns));
799
+ setItemQuery(tableInfo.itemQuery);
800
+ fetchRowCount(processing, overrideFilters);
801
+ if (formData.pivot) {
802
+ try {
803
+ const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, schemaData.customFields ?? [], overrideFilters);
804
+ fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
805
+ }
806
+ catch (e) {
807
+ console.log('error fetching pivot', e);
808
+ setPivotError(e.message);
809
+ }
810
+ }
811
+ setIsLoading(false);
812
+ }
813
+ catch (e) {
814
+ console.log(e);
815
+ }
816
+ };
817
+ const onPageChange = (page) => {
818
+ // only fetch if report is valid, else use query task
819
+ if (currentProcessing.page &&
820
+ shouldFetchMore(currentProcessing.page, page, maxPage)) {
821
+ const newPagination = {
822
+ ...currentProcessing.page,
823
+ page,
824
+ };
825
+ const updatedProcessing = {
826
+ ...currentProcessing,
827
+ page: newPagination,
828
+ };
829
+ setCurrentProcessing(updatedProcessing);
830
+ updateTableRows(updatedProcessing);
831
+ }
832
+ if (page > maxPage) {
833
+ setMaxPage(page);
834
+ }
835
+ };
836
+ const onSortChange = (sort) => {
837
+ if (shouldSortInMemory(baseProcessing.page, rowCount)) {
838
+ return;
839
+ }
840
+ const updatedProcessing = { ...baseProcessing, sort };
841
+ updateTableRows(updatedProcessing, true);
842
+ setCurrentProcessing(updatedProcessing);
843
+ setCurrentPage(0);
844
+ setMaxPage(0);
845
+ };
846
+ const updateTableRows = async (processing, resetRows = false) => {
847
+ if (!client) {
848
+ return;
849
+ }
850
+ if (!isLoading && report && query) {
851
+ setIsLoading(true);
852
+ try {
853
+ const updatedProcessing = { ...currentProcessing, ...processing };
854
+ const paginatedRows = await fetchResultsByQuery(query, client, updatedProcessing, schemaData.customFields, filtersEnabled ? currentDashboardFilters : undefined, filtersEnabled
855
+ ? (report?.dateField ?? formData.dateField)
856
+ : undefined, false, false, canonicalFilterMap);
857
+ if (paginatedRows.error) {
858
+ throw new Error('Error fetching chart');
859
+ }
860
+ let tempRows = [...rows, ...paginatedRows.rows];
861
+ if (resetRows) {
862
+ tempRows = paginatedRows.rows;
863
+ }
864
+ setRows(tempRows);
865
+ setCurrentProcessing(updatedProcessing);
866
+ }
867
+ catch (e) {
868
+ console.log(e);
869
+ }
870
+ finally {
871
+ setIsLoading(false);
872
+ }
873
+ }
874
+ };
700
875
  const handleChange = async (value, fieldName, index) => {
701
876
  let updatedForm = { ...formData };
702
877
  try {
@@ -754,7 +929,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
754
929
  }
755
930
  else if (field === 'dateField' &&
756
931
  subfield === 'table' &&
757
- !formData.dateField.field) {
932
+ !formData.dateField?.field) {
758
933
  const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
759
934
  updatedForm.dateField = {
760
935
  // @ts-ignore
@@ -785,7 +960,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
785
960
  }
786
961
  setFormData(updatedForm);
787
962
  };
788
- const handleAddPivot = async (pivot, uniqueValues, dateRange, pivotData) => {
963
+ const handleAddPivot = async (pivot, uniqueValues, pivotData) => {
789
964
  const newPivotFormData = pivotFormData(pivot);
790
965
  // Only keep the old chart type if the shapes of the pivots are the same
791
966
  // since the valid chart types for some pivots might have changed (eg. going
@@ -802,7 +977,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
802
977
  });
803
978
  }
804
979
  else {
805
- await fetchPivotData(pivot, uniqueValues, dateRange);
980
+ await fetchPivotData(pivot, undefined, uniqueValues);
806
981
  }
807
982
  setFormData((formData) => ({
808
983
  ...formData,
@@ -818,6 +993,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
818
993
  }
819
994
  setFormData({
820
995
  ...formEmptyState,
996
+ ...formData,
821
997
  dashboardName: formData.dashboardName,
822
998
  pivot: null,
823
999
  });
@@ -893,26 +1069,25 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
893
1069
  return;
894
1070
  }
895
1071
  // If the dashboardItem is a template but the editor isn't an admin, create a new dashboardItem and set the template to false
896
- let dashboardItemId = report ? report.id : undefined;
1072
+ let dashboardItemId = reportId ? reportId : undefined;
897
1073
  if (report && !isAdmin && formData.template) {
898
1074
  dashboardItemId = undefined;
899
1075
  }
900
1076
  const newReport = {
901
1077
  ...formData,
1078
+ filterMap,
902
1079
  columns: formData.columns.filter((col) => !invalidColumns.includes(col)),
903
1080
  ...(formData.dateField?.table
904
1081
  ? {}
905
1082
  : { dateField: { ...defaultDateField } }),
906
1083
  ...(formData.dashboardName
907
1084
  ? {}
908
- : { dashboardName: defaultDashboardName }),
909
- query: queryNoDateColumn || query || '',
1085
+ : { dashboardName: report?.dashboardName }),
1086
+ query: queryNoDateColumn || report?.queryString || '',
910
1087
  pivot: formData.pivot,
911
1088
  referencedTables: allTables,
912
1089
  referencedColumns,
913
- template: report && !showAccessControlOptions && formData.template
914
- ? false
915
- : formData.template,
1090
+ template: report && !isAdmin && formData.template ? false : formData.template,
916
1091
  };
917
1092
  const resp = await saveReport({
918
1093
  report: newReport,
@@ -948,7 +1123,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
948
1123
  // Prevent horizontal view on small screens.
949
1124
  isHorizontalView = windowWidth < 1200 ? false : isHorizontalView;
950
1125
  if (!schemaData.schema) {
951
- return _jsx("div", { children: "bruh" });
1126
+ return _jsx("div", { children: "No schema" });
952
1127
  }
953
1128
  return (_jsxs("div", { style: {
954
1129
  width: '100%',
@@ -969,70 +1144,45 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
969
1144
  display: 'flex',
970
1145
  flexDirection: 'column',
971
1146
  gap: isOpen ? 16 : 20,
972
- overflowY: 'visible',
1147
+ overflowY: 'scroll',
973
1148
  height: isHorizontalView || !isOpen ? '100%' : 800,
974
1149
  ...(isHorizontalView && {
975
1150
  flexGrow: 1,
976
1151
  maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
977
1152
  }),
978
1153
  ...(!isHorizontalView && isOpen && { width: formWidth }),
979
- }, children: [onFilterPreviewChange && (_jsxs("div", { className: "filters-active-toggle", style: {
980
- cursor: 'pointer',
981
- display: isOpen ? 'flex' : 'none',
982
- flexDirection: 'row',
983
- gap: 4,
984
- marginTop: -16,
985
- userSelect: 'none',
986
- }, onClick: () => {
987
- onFilterPreviewChange && onFilterPreviewChange(!filtersActive);
988
- setCurrentPage(0);
989
- setFiltersActive(!filtersActive);
990
- }, children: [_jsx(AdjustmentsIcon, { style: {
991
- color: filtersActive ? '#212121' : '#9e9e9e',
992
- height: 20,
993
- width: 20,
994
- }, strokeWidth: filtersActive ? 1.5 : 1 }), _jsx("div", { style: {
995
- color: filtersActive ? '#212121' : '#9e9e9e',
996
- fontSize: 14,
997
- fontWeight: 300,
998
- userSelect: 'none',
999
- }, children: filtersActive
1000
- ? 'Previewing with filters'
1001
- : 'Previewing without filters' })] })), !isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : (((!isHorizontalView && windowWidth >= 1200) ||
1002
- formData.chartType !== 'table') && (_jsx(ChartDisplay, { reportId: report?.id, config: chartData, scrollable: true, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
1154
+ }, children: [!isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1155
+ onFiltersEnabledChanged(hide);
1156
+ }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1003
1157
  width: '100%',
1004
- height: formData.chartType === 'metric'
1005
- ? 100
1006
- : isHorizontalView || !isOpen
1007
- ? showTableFormatOptions
1008
- ? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1009
- : `calc(100% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1010
- : 400,
1158
+ // height:
1159
+ // formData.chartType === 'metric'
1160
+ // ? 100
1161
+ // : `calc(${filtersEnabled ? 50 : 70}%)`,
1011
1162
  ...(isHorizontalView && { flexGrow: 1 }),
1012
- }, onClickChartElement: onClickChartElement }))),
1163
+ }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }))),
1013
1164
  // Make sure to display non-pivoted table when using pivot chart
1014
- showTableFormatOptions &&
1165
+ isAdmin &&
1015
1166
  (isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsx("div", { style: {
1016
1167
  width: '100%',
1017
- height: isHorizontalView || !isOpen
1018
- ? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1019
- : 400,
1168
+ // height:
1169
+ // isHorizontalView || !isOpen
1170
+ // ? `calc(${filtersEnabled ? 30 : 50}%)`
1171
+ // : 400,
1020
1172
  flexGrow: 1,
1021
1173
  }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1022
- onPageChange &&
1023
- onPageChange(page, filtersActive, 'ChartBuilder');
1174
+ onPageChange(page);
1024
1175
  setCurrentPage(page);
1025
1176
  }, onSortChange: (sort) => {
1026
- onSortChange && onSortChange(sort, filtersActive);
1177
+ onSortChange && onSortChange(sort);
1027
1178
  }, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1028
1179
  ? selectedPivotTable.columns
1029
1180
  : formData.columns, onPageChange: (page) => {
1030
- onPageChange &&
1031
- onPageChange(page, filtersActive, 'ChartBuilder');
1181
+ onPageChange(page);
1032
1182
  setCurrentPage(page);
1033
1183
  }, onSortChange: (sort) => {
1034
- onSortChange && onSortChange(sort, filtersActive);
1035
- }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1184
+ onSortChange && onSortChange(sort);
1185
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1036
1186
  display: 'flex',
1037
1187
  flexDirection: 'column',
1038
1188
  gap: 20,
@@ -1069,11 +1219,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1069
1219
  // marginTop: 6,
1070
1220
  display: 'flex',
1071
1221
  flexDirection: 'column',
1072
- }, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotValueField2: pivotValueField2, setPivotValueField2: setPivotValueField2, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processedColumns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, uniqueValuesIsLoading: initialUniqueValuesIsLoading, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled, report: report }) }), formData.pivot && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: {
1073
- pivot: formData.pivot,
1074
- rows: selectedPivotTable?.rows ?? [],
1075
- columns: selectedPivotTable?.columns ?? [],
1076
- }, theme: theme, index: 0, onSelectPivot: () => {
1222
+ }, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotValueField2: pivotValueField2, setPivotValueField2: setPivotValueField2, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processedColumns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, uniqueValuesIsLoading: initialUniqueValuesIsLoading, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled, report: report }) }), formData.pivot && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: pivotCardTable, theme: theme, index: 0, onSelectPivot: () => {
1077
1223
  setIsEdittingPivot(true);
1078
1224
  setShowPivotPopover(true);
1079
1225
  setPivotRowField(formData.pivot?.rowField);
@@ -1082,7 +1228,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1082
1228
  setPivotValueField2(formData.pivot?.valueField2);
1083
1229
  setPivotAggregation(formData.pivot?.aggregationType);
1084
1230
  setPivotPopUpTitle('Edit pivot');
1085
- }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
1231
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [windowWidth < 1200 && _jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1232
+ onFiltersEnabledChanged(hide);
1233
+ }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1234
+ width: '100%',
1235
+ height: 500,
1236
+ flexGrow: 1,
1237
+ }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
1086
1238
  display: 'flex',
1087
1239
  flexDirection: 'column',
1088
1240
  }, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
@@ -1096,11 +1248,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1096
1248
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
1097
1249
  isDateField(formData.pivot.rowFieldType || '')
1098
1250
  ? [{ value: 'pivot_date', label: 'date' }]
1099
- : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields
1100
- // .filter((yAxisField: YAxisField) => {
1101
- // return !yAxisField.field.startsWith('comparison_');
1102
- // })
1103
- .map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1251
+ : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1104
1252
  ? formData.pivot.valueField || 'count'
1105
1253
  : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
1106
1254
  ? [
@@ -1126,25 +1274,23 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1126
1274
  : ''
1127
1275
  : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
1128
1276
  ? NUMBER_OPTIONS
1129
- : formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && windowWidth < 1200 && (_jsx("div", { style: {
1277
+ : formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), isAdmin && windowWidth < 1200 && (_jsx("div", { style: {
1130
1278
  width: '100%',
1131
1279
  height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1132
1280
  flexGrow: 1,
1133
1281
  }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1134
- onPageChange &&
1135
- onPageChange(page, filtersActive, 'ChartBuilder');
1282
+ onPageChange(page);
1136
1283
  setCurrentPage(page);
1137
1284
  }, onSortChange: (sort) => {
1138
- onSortChange && onSortChange(sort, filtersActive);
1285
+ onSortChange && onSortChange(sort);
1139
1286
  }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1140
1287
  ? selectedPivotTable.columns
1141
1288
  : formData.columns, onPageChange: (page) => {
1142
- onPageChange &&
1143
- onPageChange(page, filtersActive, 'ChartBuilder');
1289
+ onPageChange(page);
1144
1290
  setCurrentPage(page);
1145
1291
  }, onSortChange: (sort) => {
1146
- onSortChange && onSortChange(sort, filtersActive);
1147
- }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
1292
+ onSortChange && onSortChange(sort);
1293
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), isAdmin && (_jsxs("div", { children: [_jsxs("div", { style: {
1148
1294
  display: 'flex',
1149
1295
  flexDirection: 'column',
1150
1296
  }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
@@ -1182,11 +1328,20 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1182
1328
  (formData.pivot &&
1183
1329
  selectedPivotTable &&
1184
1330
  selectedPivotTable.columns &&
1185
- formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
1331
+ formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), (specificDashboardFilters.length > 0 ||
1332
+ (isAdmin &&
1333
+ formData.dateField &&
1334
+ dashboardConfig[formData.dashboardName ?? '']?.config
1335
+ .dateFilter?.label)) && (_jsxs("div", { style: {
1186
1336
  display: 'flex',
1187
1337
  flexDirection: 'column',
1188
1338
  gap: 6,
1189
- }, children: [_jsx(HeaderComponent, { label: "Date filter field" }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
1339
+ }, children: [_jsx(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
1340
+ formData.dateField &&
1341
+ dashboardConfig[formData.dashboardName ?? destinationDashboard ?? '']?.config.dateFilter?.label && (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.dateFilter.' +
1342
+ (dashboardConfig[formData.dashboardName ?? '']
1343
+ ?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
1344
+ ?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
1190
1345
  label: elem.name,
1191
1346
  value: elem.name,
1192
1347
  })), width: 200 }) }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Field", value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
@@ -1194,7 +1349,67 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1194
1349
  ?.columns?.map((elem) => ({
1195
1350
  label: elem.field,
1196
1351
  value: elem.field,
1197
- })) || [], width: 200 }) })] })] })), showAccessControlOptions && !client?.multiTenancyDisabled && (_jsxs("div", { style: {
1352
+ })) || [], width: 200 }) }), (!formData.dateField?.table ||
1353
+ !formData.dateField?.field) && (_jsx("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
1354
+ color: '#dc143c',
1355
+ } }) }))] })), specificDashboardFilters.length > 0 && (_jsx("div", { style: {
1356
+ display: 'flex',
1357
+ flexDirection: 'column',
1358
+ gap: 6,
1359
+ }, children: specificDashboardFilters
1360
+ .filter((f) => {
1361
+ return f.filterType !== 'date_range';
1362
+ })
1363
+ .map((filter, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
1364
+ !(isAdmin &&
1365
+ formData.dateField &&
1366
+ dashboardConfig[formData.dashboardName ?? '']
1367
+ ?.config.dateFilter?.label)
1368
+ ? 'Filter'
1369
+ : '', disabled: true }), _jsx(SelectComponent, { label: index === 0 &&
1370
+ !(isAdmin &&
1371
+ formData.dateField &&
1372
+ dashboardConfig[formData.dashboardName ?? '']
1373
+ ?.config.dateFilter?.label)
1374
+ ? 'Virtual Table'
1375
+ : '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
1376
+ ...filterMap,
1377
+ [filter.label]: {
1378
+ table: e.target.value,
1379
+ field: schemaData.schema
1380
+ .find((t) => t.name == e.target.value)
1381
+ ?.columns.find((elem) => elem.field ===
1382
+ (filterMap[filter.label]?.field ??
1383
+ filter.field))?.field ?? '',
1384
+ },
1385
+ }), options: allTables.map((elem) => ({
1386
+ label: elem,
1387
+ value: elem,
1388
+ })), width: 200 }), _jsx(SelectComponent, { label: index === 0 &&
1389
+ !(isAdmin &&
1390
+ formData.dateField &&
1391
+ dashboardConfig[formData.dashboardName ?? '']
1392
+ ?.config.dateFilter?.label)
1393
+ ? 'Field'
1394
+ : '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
1395
+ ...filterMap,
1396
+ [filter.label]: {
1397
+ table: filterMap[filter.label]?.table ??
1398
+ filter.table,
1399
+ field: e.target.value,
1400
+ },
1401
+ }), options: schemaData.schema
1402
+ .find((t) => t.name ==
1403
+ (filterMap[filter.label]?.table ??
1404
+ filter.table) &&
1405
+ allTables.includes(t.name))
1406
+ ?.columns.filter((column) => isStringType(column.fieldType))
1407
+ .map((elem) => ({
1408
+ label: elem.label,
1409
+ value: elem.field,
1410
+ })) ?? [], width: 200 }), !validFilter[filter.label] && (_jsx("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
1411
+ color: '#dc143c',
1412
+ } }) }))] }, filter.label))) }))] })), isAdmin && !client?.multiTenancyDisabled && (_jsxs("div", { style: {
1198
1413
  display: 'flex',
1199
1414
  flexDirection: 'column',
1200
1415
  gap: 12,
@@ -1224,7 +1439,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
1224
1439
  }, disabled: formData.name === '' ||
1225
1440
  formData.dashboardName === '' ||
1226
1441
  formData.chartType === '' ||
1227
- filterIssues.length !== 0, label: buttonLabel
1442
+ filterIssues.length !== 0 ||
1443
+ Object.values(validFilter).includes(false), label: buttonLabel
1228
1444
  ? buttonLabel
1229
1445
  : report
1230
1446
  ? 'Save changes'