@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
@@ -14,20 +14,23 @@ const Context_1 = require("./Context");
14
14
  const dataFetcher_1 = require("./utils/dataFetcher");
15
15
  const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
16
16
  const PivotList_1 = require("./internals/ReportBuilder/PivotList");
17
- const Chart_1 = require("./Chart");
18
17
  const UiComponents_1 = require("./components/UiComponents");
19
18
  const textProcessing_1 = require("./utils/textProcessing");
20
19
  const QuillSelect_1 = require("./components/QuillSelect");
20
+ const Report_1 = require("./models/Report");
21
21
  const QuillCard_1 = require("./components/QuillCard");
22
22
  const valueFormatter_1 = require("./utils/valueFormatter");
23
23
  const columnProcessing_1 = require("./utils/columnProcessing");
24
24
  const astProcessing_1 = require("./utils/astProcessing");
25
- const dates_1 = require("./utils/dates");
26
25
  const validation_1 = require("./utils/validation");
27
26
  const ChartError_1 = require("./components/Chart/ChartError");
28
27
  const report_1 = require("./utils/report");
29
- const AdjustmentsIcon_1 = __importDefault(require("./assets/AdjustmentsIcon"));
30
28
  const merge_1 = require("./utils/merge");
29
+ const assets_1 = require("./assets");
30
+ const InternalChart_1 = __importDefault(require("./components/Chart/InternalChart"));
31
+ const paginationProcessing_1 = require("./utils/paginationProcessing");
32
+ const tableProcessing_1 = require("./utils/tableProcessing");
33
+ const dates_1 = require("./utils/dates");
31
34
  const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
32
35
  const CHART_TO_LABELS = {
33
36
  column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
@@ -74,7 +77,6 @@ function createInitialFormData(columns) {
74
77
  xAxisLabel: '',
75
78
  chartType: firstNumberColumn ? 'line' : 'table',
76
79
  pivot: null,
77
- dateField: { table: '', field: '' },
78
80
  template: true,
79
81
  };
80
82
  return formEmptyState;
@@ -117,9 +119,9 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
117
119
  ...formData,
118
120
  dashboardName: formData.dashboardName || '',
119
121
  pivot: formData.pivot,
120
- id: '',
122
+ id: report?.id ?? Report_1.TEMP_REPORT_ID,
121
123
  order: -1,
122
- compareRows: report?.compareRows || [],
124
+ compareRows: report?.compareRows,
123
125
  filtersApplied: report?.filtersApplied || [],
124
126
  queryString: '',
125
127
  rows: rows,
@@ -201,6 +203,7 @@ function ChartBuilderWithModal(props) {
201
203
  const [modalHeight, setModalHeight] = (0, react_1.useState)(200);
202
204
  const { isOpen, setIsOpen, title, isHorizontalView } = props;
203
205
  const Modal = props.ModalComponent ?? UiComponents_1.MemoizedModal;
206
+ const [dashboard] = (0, react_1.useContext)(Context_1.DashboardContext);
204
207
  (0, react_1.useEffect)(() => {
205
208
  function handleResize() {
206
209
  const screenSize = window.innerWidth;
@@ -221,7 +224,7 @@ function ChartBuilderWithModal(props) {
221
224
  return ((0, jsx_runtime_1.jsx)("div", { style: { height: '100%' }, ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
222
225
  // For isHorizontalView, use full viewport size minus 80px for padding,
223
226
  // otherwise use the default layout method of the modal (contents).
224
- width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }) }));
227
+ width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: dashboard[props.reportId ?? Report_1.TEMP_REPORT_ID] ? ((0, jsx_runtime_1.jsx)(ChartBuilder, { ...props })) : ((0, jsx_runtime_1.jsx)("div", { style: { padding: 20 }, children: (0, jsx_runtime_1.jsx)(UiComponents_1.QuillLoadingComponent, {}) })) }) }));
225
228
  }
226
229
  /**
227
230
  * ### Quill Chart Builder
@@ -247,45 +250,32 @@ function ChartBuilderWithModal(props) {
247
250
  * ### Chart Builder API
248
251
  * @see https://docs.quillsql.com/components/chart-builder
249
252
  */
250
- function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent = UiComponents_1.MemoizedModal, LoadingComponent = UiComponents_1.QuillLoadingComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.QuillChartBuilderFormContainer, ErrorComponent = ChartError_1.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, }) {
253
+ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent = UiComponents_1.MemoizedModal, LoadingComponent = UiComponents_1.QuillLoadingComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.QuillChartBuilderFormContainer, ErrorComponent = ChartError_1.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,
254
+ // isLoading,
255
+ onClickChartElement, isEditingMode = false, disableSort = true, }) {
251
256
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
252
257
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
253
258
  const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
259
+ const [dashboard, dispatch] = (0, react_1.useContext)(Context_1.DashboardContext);
260
+ const { dashboardConfig } = (0, react_1.useContext)(Context_1.DashboardConfigContext);
261
+ const report = (0, react_1.useMemo)(() => {
262
+ return dashboard[Report_1.TEMP_REPORT_ID] ?? dashboard[reportId ?? Report_1.TEMP_REPORT_ID];
263
+ }, [reportId]);
254
264
  const [windowWidth, setWindowWidth] = (0, react_1.useState)(1200);
265
+ const [rows, setRows] = (0, react_1.useState)(report?.rows ?? []);
266
+ const [itemQuery, setItemQuery] = (0, react_1.useState)(report?.itemQuery);
267
+ const [rowCount, setRowCount] = (0, react_1.useState)(report?.rowCount ?? 0);
268
+ const [maxPage, setMaxPage] = (0, react_1.useState)(0);
269
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
270
+ const [rowCountIsLoading, setRowCountIsLoading] = (0, react_1.useState)(false);
255
271
  const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
256
272
  const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(665);
257
273
  const [formWidth, setFormWidth] = (0, react_1.useState)(665);
258
274
  const inputRef = (0, react_1.useRef)(null);
259
275
  const selectRef = (0, react_1.useRef)(null);
260
- const [, dispatch] = (0, react_1.useContext)(Context_1.DashboardContext);
261
- const [processedColumns, setProcessedColumns] = (0, react_1.useState)(columns);
262
- const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
263
- const parentRef = (0, react_1.useRef)(null);
264
- const deleteRef = (0, react_1.useRef)(null);
265
- const modalPadding = 20;
266
- const deleteButtonMargin = -12;
267
- // Note: Commenting out for now because it was auto-focusing on table page changes
268
- // If the TextInputComponent is a forwardRef it will have a $$typeof property
269
- // So we only want to pass the ref if the TextInputComponent is a forwardRef
270
- // const autofocusRefProp =
271
- // '$$typeof' in TextInputComponent
272
- // ? {
273
- // ref: (input: HTMLInputElement) =>
274
- // formData.name === '' && !showPivotPopover && input?.focus(),
275
- // }
276
- // : {};
277
- const validationHelper = (formData, dashboard, dateField, tables) => {
278
- const issues = (0, validation_1.validateReport)(formData, dashboard, dateField || defaultDateField, tables || allTables);
279
- if (issues.length > 0) {
280
- setFilterIssues(issues);
281
- }
282
- else {
283
- setFilterIssues([]);
284
- }
285
- };
286
- (0, react_1.useEffect)(() => {
276
+ const processColumns = (columns) => {
287
277
  if (schemaData.schema) {
288
- const newProcessedColumns = columns.map((col) => {
278
+ const newProcessedColumns = columns?.map((col) => {
289
279
  if (col.jsType) {
290
280
  return col;
291
281
  }
@@ -306,47 +296,39 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
306
296
  newCol.jsType = (0, columnProcessing_1.convertFieldTypeToJSType)(foundColumn.fieldType);
307
297
  return newCol;
308
298
  });
309
- setProcessedColumns(newProcessedColumns);
299
+ return newProcessedColumns;
310
300
  }
311
- }, [schemaData.schema]);
312
- (0, react_1.useEffect)(() => {
313
- const handleResize = () => setWindowWidth(window.innerWidth);
314
- handleResize();
315
- window.addEventListener('resize', handleResize);
316
- return () => {
317
- window.removeEventListener('resize', handleResize);
318
- };
319
- }, []);
320
- (0, react_1.useEffect)(() => {
321
- const handleResize = () => {
322
- // The pivot card should be the same width as the row of inputs
323
- // above it (an input, two selects, plus the gaps between them).
324
- if (inputRef.current && selectRef.current) {
325
- const inputSize = inputRef.current?.getBoundingClientRect();
326
- const selectSize = selectRef.current?.getBoundingClientRect();
327
- const selectWidth = selectSize.width;
328
- const showDash = showDashboardDropdown && !destinationDashboard;
329
- const spaceBetween = selectSize.left - inputSize.right;
330
- const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
331
- const width = inputSize.width + 2 * gap + 2 * selectWidth;
332
- setPivotCardWidth(width);
333
- // Calculate the form width by adding the width of the delete button
334
- const deleteSize = deleteRef.current?.getBoundingClientRect();
335
- const deleteWidth = deleteSize?.width ?? 0;
336
- setFormWidth(width + deleteWidth);
337
- }
338
- };
339
- handleResize();
340
- }, [isOpen]);
301
+ return columns;
302
+ };
303
+ const [processedColumns, setProcessedColumns] = (0, react_1.useState)(processColumns(report?.columnInternal ?? []));
304
+ const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
305
+ const parentRef = (0, react_1.useRef)(null);
306
+ const deleteRef = (0, react_1.useRef)(null);
307
+ const modalPadding = 20;
308
+ const deleteButtonMargin = -12;
309
+ const { dashboardFilters } = (0, react_1.useContext)(Context_1.DashboardFiltersContext);
310
+ const specificDashboardFilters = (0, react_1.useMemo)(() => {
311
+ return Object.values(dashboardFilters[report?.dashboardName ?? ''] ?? {}).map((f) => f.filter);
312
+ }, [dashboard.filters, report?.dashboardName]);
313
+ const validationHelper = (formData, dashboard, dateField, tables) => {
314
+ const issues = (0, validation_1.validateReport)(formData, dashboard, dateField || defaultDateField, tables || allTables);
315
+ if (issues.length > 0) {
316
+ setFilterIssues(issues);
317
+ }
318
+ else {
319
+ setFilterIssues([]);
320
+ }
321
+ };
341
322
  (0, react_1.useEffect)(() => {
342
323
  const handleResize = () => {
324
+ setWindowWidth(window.innerWidth);
343
325
  // The pivot card should be the same width as the row of inputs
344
326
  // above it (an input, two selects, plus the gaps between them).
345
327
  if (inputRef.current && selectRef.current) {
346
328
  const inputSize = inputRef.current?.getBoundingClientRect();
347
329
  const selectSize = selectRef.current?.getBoundingClientRect();
348
330
  const selectWidth = selectSize.width;
349
- const showDash = showDashboardDropdown && !destinationDashboard;
331
+ const showDash = showDashboardDropdown && !report?.dashboardName;
350
332
  const spaceBetween = selectSize.left - inputSize.right;
351
333
  const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
352
334
  const width = inputSize.width + 2 * gap + 2 * selectWidth;
@@ -362,15 +344,35 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
362
344
  return () => {
363
345
  window.removeEventListener('resize', handleResize);
364
346
  };
365
- }, []);
347
+ }, [isOpen]);
366
348
  const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
367
- const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard || report?.dashboardName || '');
368
- const { dashboardFilters } = (0, react_1.useContext)(Context_1.DashboardFiltersContext);
369
- const { dashboardConfig } = (0, react_1.useContext)(Context_1.DashboardConfigContext);
370
- const [filtersActive, setFiltersActive] = (0, react_1.useState)(true);
371
- const specificDashboardFilters = (0, react_1.useMemo)(() => {
372
- return Object.values(dashboardFilters[defaultDashboardName] ?? {}).map((f) => f.filter);
373
- }, [dashboardFilters, filtersActive]);
349
+ const { reportFilters, reportFiltersDispatch, loadFiltersForReport } = (0, react_1.useContext)(Context_1.ReportFiltersContext);
350
+ (0, react_1.useEffect)(() => {
351
+ loadFiltersForReport(report?.id ?? Report_1.TEMP_REPORT_ID, 'ChartBuilder', specificDashboardFilters, undefined, undefined, canonicalFilterMap, report?.dashboardName);
352
+ return () => {
353
+ reportFiltersDispatch({
354
+ type: 'CLEAR_REPORT_FILTERS',
355
+ id: report?.id ?? Report_1.TEMP_REPORT_ID,
356
+ });
357
+ // TODO: Currently the behavior of Chart Builder is dependent on whether there is a TEMP_REPORT_ID in context or not
358
+ /* The Chart Builder can essentially be in three states
359
+ 1. Creating a new report, all we have is an ephemeral temp report
360
+ 2. Editing an existing report, we have a report id and the report is in the dashboard context
361
+ 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
362
+ One can imagine this going wrong: somehow the temp report gets set by SQLEditor or ReportBuilder but never cleared
363
+ and now its going to start popping up during state 2 rather than the real report.
364
+ For now we're going on faith that unmounting will always clear the temp report
365
+ but we may want to fiddle with the props to make this more robust
366
+ */
367
+ dispatch({
368
+ type: 'REMOVE_DASHBOARD_ITEM',
369
+ id: Report_1.TEMP_REPORT_ID,
370
+ });
371
+ };
372
+ }, []);
373
+ const currentDashboardFilters = (0, react_1.useMemo)(() => {
374
+ return Object.values(reportFilters[report?.id ?? Report_1.TEMP_REPORT_ID] ?? {}).map((f) => f.filter);
375
+ }, [reportFilters, report?.id]);
374
376
  const [showFilterModal, setShowFilterModal] = (0, react_1.useState)(false);
375
377
  const [filterIssues, setFilterIssues] = (0, react_1.useState)([]);
376
378
  const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
@@ -381,38 +383,72 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
381
383
  const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
382
384
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
383
385
  const [pivotError, setPivotError] = (0, react_1.useState)(undefined);
386
+ const pivotData = report?.pivotRows && report?.pivotColumns
387
+ ? { rows: report.pivotRows, columns: report.pivotColumns }
388
+ : undefined;
389
+ const columns = report?.columnInternal ?? [];
390
+ const destinationDashboard = report?.dashboardName;
391
+ const query = report?.queryString;
384
392
  const [loadingFormData, setLoadingFormData] = (0, react_1.useState)(false);
385
393
  const [triggeredEditChart, setTriggeredEditChart] = (0, react_1.useState)(false);
386
- const [createdPivots, setCreatedPivots] = (0, react_1.useState)(pivot ? [pivot] : report?.pivot ? [report.pivot] : cp);
394
+ const [createdPivots, setCreatedPivots] = (0, react_1.useState)(report?.pivot ? [report.pivot] : cp);
387
395
  const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)(rp);
388
- const [pivotRowField, setPivotRowField] = (0, react_1.useState)(pivot?.rowField);
389
- const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(pivot?.columnField);
390
- const [pivotValueField, setPivotValueField] = (0, react_1.useState)(pivot?.valueField);
391
- const [pivotValueField2, setPivotValueField2] = (0, react_1.useState)(pivot?.valueField2);
392
- const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(pivot?.aggregationType);
396
+ const [pivotRowField, setPivotRowField] = (0, react_1.useState)(report?.pivot?.rowField);
397
+ const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(report?.pivot?.columnField);
398
+ const [pivotValueField, setPivotValueField] = (0, react_1.useState)(report?.pivot?.valueField);
399
+ const [pivotValueField2, setPivotValueField2] = (0, react_1.useState)(report?.pivot?.valueField2);
400
+ const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(report?.pivot?.aggregationType);
401
+ const baseProcessing = {
402
+ page: report?.pagination ?? {
403
+ page: 0,
404
+ rowsPerPage: 10,
405
+ rowsPerRequest: report?.chartType === 'table' ? 50 : 500,
406
+ },
407
+ };
408
+ const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)(baseProcessing);
393
409
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
394
410
  const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
395
411
  const [allTables, setAllTables] = (0, react_1.useState)([]);
396
412
  const [customFieldTableRef, setCustomFieldTableRef] = (0, react_1.useState)(false);
397
413
  const [referencedColumns, setReferencedColumns] = (0, react_1.useState)({});
414
+ const [filterMap, setFilterMap] = (0, react_1.useState)(report?.filterMap ?? {});
415
+ const canonicalFilterMap = (0, react_1.useMemo)(() => {
416
+ return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
417
+ }, [filterMap]);
418
+ const validFilter = (0, react_1.useMemo)(() => {
419
+ return currentDashboardFilters.reduce((acc, filter) => {
420
+ if (filter.filterType === 'date_range') {
421
+ acc[filter.label] = true;
422
+ return acc;
423
+ }
424
+ acc[filter.label] =
425
+ !!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
426
+ !!schemaData.schema
427
+ ?.find((table) => {
428
+ return (table.displayName === (filterMap[filter.label] ?? filter).table);
429
+ })
430
+ ?.columns.find((col) => col.field === (filterMap[filter.label] ?? filter).field);
431
+ return acc;
432
+ }, {});
433
+ }, [currentDashboardFilters, filterMap, allTables]);
398
434
  const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
399
435
  table: dateFieldOptions[0]?.name || '',
400
436
  field: dateFieldOptions[0]?.columns[0]?.field || '',
401
437
  });
402
- const firstNumberColumn = columns?.find((col) => exports.numberFormatOptions.includes(col.format));
438
+ const firstNumberColumn = report?.columnInternal?.find((col) => exports.numberFormatOptions.includes(col.format));
403
439
  const formEmptyState = {
404
440
  name: report?.name ?? '',
405
- dashboardName: dashboardOptions[0]?.label || '',
406
- columns: columns.map((col) => {
441
+ dashboardName: dashboardOptions[0]?.label ?? '',
442
+ columns: report?.columns.map((col) => {
407
443
  return { ...col, label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(col.label) };
408
- }),
409
- xAxisField: columns?.[0]?.field || '',
410
- xAxisFormat: columns?.[0]?.format || 'string',
444
+ }) ?? [],
445
+ xAxisField: report?.columns?.[0]?.field ?? '',
446
+ xAxisFormat: report?.columns?.[0]?.format ?? 'string',
411
447
  yAxisFields: [
412
448
  {
413
- field: firstNumberColumn?.field || columns?.[0]?.field || '',
449
+ field: firstNumberColumn?.field ?? report?.columns?.[0]?.field ?? '',
414
450
  label: '',
415
- format: firstNumberColumn?.format || columns?.[0]?.format || 'string',
451
+ format: firstNumberColumn?.format ?? report?.columns?.[0]?.format ?? 'string',
416
452
  },
417
453
  ],
418
454
  xAxisLabel: '',
@@ -471,7 +507,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
471
507
  xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
472
508
  xAxisFormat: (0, PivotModal_1.isDateField)(pivot.rowFieldType || '')
473
509
  ? 'string'
474
- : columns.find((col) => col.field === pivot.rowField)?.format ||
510
+ : report?.columns.find((col) => col.field === pivot.rowField)?.format ||
475
511
  report?.xAxisFormat ||
476
512
  'whole_number',
477
513
  xAxisLabel: report?.xAxisLabel || pivot.rowField,
@@ -484,8 +520,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
484
520
  : report?.yAxisFields && report?.yAxisFields?.length > 0
485
521
  ? // @ts-ignore
486
522
  report?.yAxisFields[0].format
487
- : columns.find((col) => col.field === pivot.valueField)?.format ||
488
- 'whole_number',
523
+ : report?.columns.find((col) => col.field === pivot.valueField)
524
+ ?.format || 'whole_number',
489
525
  },
490
526
  ],
491
527
  };
@@ -493,8 +529,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
493
529
  const formFormDataFromReport = (report) => {
494
530
  let pivotData = {};
495
531
  let dateField = defaultDateField;
496
- if (pivot) {
497
- pivotData = pivotFormData(pivot);
532
+ if (report?.pivot) {
533
+ pivotData = pivotFormData(report.pivot);
498
534
  }
499
535
  if (report) {
500
536
  dateField = report.dateField || defaultDateField;
@@ -503,7 +539,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
503
539
  ...formEmptyState,
504
540
  ...report,
505
541
  ...pivotData,
506
- ...(destinationDashboard && { dashboardName: destinationDashboard }),
542
+ ...(report?.dashboardName && { dashboardName: report?.dashboardName }),
507
543
  dateField: dateField,
508
544
  };
509
545
  };
@@ -512,7 +548,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
512
548
  if (!rows || !rows.length) {
513
549
  return [];
514
550
  }
515
- if (pivot || pivotData) {
551
+ if (report?.pivot || pivotData) {
516
552
  return [];
517
553
  }
518
554
  const columnsObservedInRows = rows[0] ? Object.keys(rows[0]) : [];
@@ -561,8 +597,6 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
561
597
  const curDashboard = await updateDashboardFilters(dashboardName);
562
598
  setDashboardOptions(dashboardOptions);
563
599
  curFormData.dashboardName = dashboardName;
564
- setDefaultDashboardName(dashboardName ??
565
- (report ? report?.dashboardName : dashboardOptions[0]?.label));
566
600
  const curSchemaData = schemaData.schema;
567
601
  if (!query) {
568
602
  setLoadingFormData(false);
@@ -623,34 +657,49 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
623
657
  }
624
658
  getFormData();
625
659
  }, []);
626
- const [selectedPivotTable, setSelectedPivotTable] = (0, react_1.useState)(pivotData || undefined);
660
+ const [selectedPivotTable, setSelectedPivotTable] = (0, react_1.useState)(pivotData);
661
+ const pivotCardTable = (0, react_1.useMemo)(() => {
662
+ return {
663
+ pivot: formData.pivot,
664
+ rows: selectedPivotTable?.rows ?? [],
665
+ columns: selectedPivotTable?.columns ?? [],
666
+ };
667
+ }, [selectedPivotTable, formData.pivot]);
627
668
  const chartData = (0, react_1.useMemo)(() => {
628
- const data = createReportFromForm(formData, report, selectedPivotTable, rows, specificDashboardFilters);
629
- return data;
669
+ const data = createReportFromForm(formData, report, selectedPivotTable, rows, currentDashboardFilters);
670
+ return {
671
+ ...data,
672
+ filterMap: canonicalFilterMap,
673
+ };
630
674
  }, [formData, selectedPivotTable, report, rows]);
631
- const fetchPivotData = async (pivot, uniqueValues, overrideDateRange) => {
675
+ const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
676
+ const dashboardFilters = filtersEnabled
677
+ ? (overrideFilters ?? currentDashboardFilters)
678
+ : undefined;
632
679
  if (pivot) {
633
- // const dateFilter =
634
- // report && filtersActive
635
- // ? report.filtersApplied.find((filter: any) => {
636
- // return filter.filterType === 'date_range';
637
- // })
638
- // : undefined;
639
680
  let dateBucket = undefined;
640
- if (overrideDateRange) {
641
- dateBucket = (0, dates_1.getDateBucketFromRange)(overrideDateRange);
681
+ if (filtersEnabled) {
682
+ const dateFilter = dashboardFilters?.find((f) => f.filterType === 'date_range');
683
+ dateBucket =
684
+ dateFilter?.startDate && dateFilter?.endDate
685
+ ? (0, dates_1.getDateBucketFromRange)({
686
+ start: dateFilter?.startDate,
687
+ end: dateFilter?.endDate,
688
+ })
689
+ : undefined;
642
690
  }
643
691
  try {
644
692
  const pivotTable = await (0, PivotModal_1.generatePivotTable)({
645
693
  pivot,
646
694
  dateBucket,
647
- report,
695
+ report: { ...report, ...(tableInfo ?? { itemQuery }) },
648
696
  client,
649
697
  uniqueValues,
650
698
  });
651
699
  setSelectedPivotTable(pivotTable);
652
700
  }
653
701
  catch (e) {
702
+ console.log('error', e);
654
703
  if (e instanceof Error) {
655
704
  setPivotError(e.message);
656
705
  }
@@ -707,6 +756,129 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
707
756
  rows,
708
757
  formData.pivot,
709
758
  ]);
759
+ const fetchRowCount = async (processing, overrideFilters) => {
760
+ if (!client || !query) {
761
+ return;
762
+ }
763
+ setRowCountIsLoading(true);
764
+ const tableInfo = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, false, true, canonicalFilterMap);
765
+ if (tableInfo.rowCount) {
766
+ setRowCount(tableInfo.rowCount);
767
+ }
768
+ setRowCountIsLoading(false);
769
+ };
770
+ const onDashboardFilterChange = (label, value) => {
771
+ const updatedFilters = currentDashboardFilters.map((filter) => {
772
+ if (filter.label === label) {
773
+ return {
774
+ ...filter,
775
+ ...value,
776
+ };
777
+ }
778
+ return filter;
779
+ });
780
+ loadFiltersForReport(report?.id ?? Report_1.TEMP_REPORT_ID, 'ChartBuilder', updatedFilters, label, undefined, canonicalFilterMap, report?.dashboardName).then(() => {
781
+ setCurrentPage(0);
782
+ setMaxPage(0);
783
+ handleRunQuery(baseProcessing, updatedFilters);
784
+ });
785
+ };
786
+ const mounted = (0, react_1.useRef)(false);
787
+ (0, react_1.useEffect)(() => {
788
+ if (!mounted.current) {
789
+ mounted.current = true;
790
+ return;
791
+ }
792
+ setCurrentPage(0);
793
+ setMaxPage(0);
794
+ handleRunQuery(baseProcessing, currentDashboardFilters);
795
+ }, [filtersEnabled]);
796
+ const handleRunQuery = async (processing, overrideFilters) => {
797
+ if (!client || !query) {
798
+ return;
799
+ }
800
+ try {
801
+ setIsLoading(true);
802
+ const tableInfo = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, true, false, canonicalFilterMap);
803
+ setCurrentProcessing(processing);
804
+ setRows(tableInfo.rows);
805
+ setProcessedColumns(processColumns(tableInfo.columns));
806
+ setItemQuery(tableInfo.itemQuery);
807
+ fetchRowCount(processing, overrideFilters);
808
+ if (formData.pivot) {
809
+ try {
810
+ const uniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, schemaData.customFields ?? [], overrideFilters);
811
+ fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
812
+ }
813
+ catch (e) {
814
+ console.log('error fetching pivot', e);
815
+ setPivotError(e.message);
816
+ }
817
+ }
818
+ setIsLoading(false);
819
+ }
820
+ catch (e) {
821
+ console.log(e);
822
+ }
823
+ };
824
+ const onPageChange = (page) => {
825
+ // only fetch if report is valid, else use query task
826
+ if (currentProcessing.page &&
827
+ (0, paginationProcessing_1.shouldFetchMore)(currentProcessing.page, page, maxPage)) {
828
+ const newPagination = {
829
+ ...currentProcessing.page,
830
+ page,
831
+ };
832
+ const updatedProcessing = {
833
+ ...currentProcessing,
834
+ page: newPagination,
835
+ };
836
+ setCurrentProcessing(updatedProcessing);
837
+ updateTableRows(updatedProcessing);
838
+ }
839
+ if (page > maxPage) {
840
+ setMaxPage(page);
841
+ }
842
+ };
843
+ const onSortChange = (sort) => {
844
+ if ((0, paginationProcessing_1.shouldSortInMemory)(baseProcessing.page, rowCount)) {
845
+ return;
846
+ }
847
+ const updatedProcessing = { ...baseProcessing, sort };
848
+ updateTableRows(updatedProcessing, true);
849
+ setCurrentProcessing(updatedProcessing);
850
+ setCurrentPage(0);
851
+ setMaxPage(0);
852
+ };
853
+ const updateTableRows = async (processing, resetRows = false) => {
854
+ if (!client) {
855
+ return;
856
+ }
857
+ if (!isLoading && report && query) {
858
+ setIsLoading(true);
859
+ try {
860
+ const updatedProcessing = { ...currentProcessing, ...processing };
861
+ const paginatedRows = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, updatedProcessing, schemaData.customFields, filtersEnabled ? currentDashboardFilters : undefined, filtersEnabled
862
+ ? (report?.dateField ?? formData.dateField)
863
+ : undefined, false, false, canonicalFilterMap);
864
+ if (paginatedRows.error) {
865
+ throw new Error('Error fetching chart');
866
+ }
867
+ let tempRows = [...rows, ...paginatedRows.rows];
868
+ if (resetRows) {
869
+ tempRows = paginatedRows.rows;
870
+ }
871
+ setRows(tempRows);
872
+ setCurrentProcessing(updatedProcessing);
873
+ }
874
+ catch (e) {
875
+ console.log(e);
876
+ }
877
+ finally {
878
+ setIsLoading(false);
879
+ }
880
+ }
881
+ };
710
882
  const handleChange = async (value, fieldName, index) => {
711
883
  let updatedForm = { ...formData };
712
884
  try {
@@ -764,7 +936,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
764
936
  }
765
937
  else if (field === 'dateField' &&
766
938
  subfield === 'table' &&
767
- !formData.dateField.field) {
939
+ !formData.dateField?.field) {
768
940
  const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
769
941
  updatedForm.dateField = {
770
942
  // @ts-ignore
@@ -795,7 +967,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
795
967
  }
796
968
  setFormData(updatedForm);
797
969
  };
798
- const handleAddPivot = async (pivot, uniqueValues, dateRange, pivotData) => {
970
+ const handleAddPivot = async (pivot, uniqueValues, pivotData) => {
799
971
  const newPivotFormData = pivotFormData(pivot);
800
972
  // Only keep the old chart type if the shapes of the pivots are the same
801
973
  // since the valid chart types for some pivots might have changed (eg. going
@@ -812,7 +984,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
812
984
  });
813
985
  }
814
986
  else {
815
- await fetchPivotData(pivot, uniqueValues, dateRange);
987
+ await fetchPivotData(pivot, undefined, uniqueValues);
816
988
  }
817
989
  setFormData((formData) => ({
818
990
  ...formData,
@@ -828,6 +1000,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
828
1000
  }
829
1001
  setFormData({
830
1002
  ...formEmptyState,
1003
+ ...formData,
831
1004
  dashboardName: formData.dashboardName,
832
1005
  pivot: null,
833
1006
  });
@@ -903,26 +1076,25 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
903
1076
  return;
904
1077
  }
905
1078
  // If the dashboardItem is a template but the editor isn't an admin, create a new dashboardItem and set the template to false
906
- let dashboardItemId = report ? report.id : undefined;
1079
+ let dashboardItemId = reportId ? reportId : undefined;
907
1080
  if (report && !isAdmin && formData.template) {
908
1081
  dashboardItemId = undefined;
909
1082
  }
910
1083
  const newReport = {
911
1084
  ...formData,
1085
+ filterMap,
912
1086
  columns: formData.columns.filter((col) => !invalidColumns.includes(col)),
913
1087
  ...(formData.dateField?.table
914
1088
  ? {}
915
1089
  : { dateField: { ...defaultDateField } }),
916
1090
  ...(formData.dashboardName
917
1091
  ? {}
918
- : { dashboardName: defaultDashboardName }),
919
- query: queryNoDateColumn || query || '',
1092
+ : { dashboardName: report?.dashboardName }),
1093
+ query: queryNoDateColumn || report?.queryString || '',
920
1094
  pivot: formData.pivot,
921
1095
  referencedTables: allTables,
922
1096
  referencedColumns,
923
- template: report && !showAccessControlOptions && formData.template
924
- ? false
925
- : formData.template,
1097
+ template: report && !isAdmin && formData.template ? false : formData.template,
926
1098
  };
927
1099
  const resp = await (0, report_1.saveReport)({
928
1100
  report: newReport,
@@ -958,7 +1130,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
958
1130
  // Prevent horizontal view on small screens.
959
1131
  isHorizontalView = windowWidth < 1200 ? false : isHorizontalView;
960
1132
  if (!schemaData.schema) {
961
- return (0, jsx_runtime_1.jsx)("div", { children: "bruh" });
1133
+ return (0, jsx_runtime_1.jsx)("div", { children: "No schema" });
962
1134
  }
963
1135
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
964
1136
  width: '100%',
@@ -979,70 +1151,45 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
979
1151
  display: 'flex',
980
1152
  flexDirection: 'column',
981
1153
  gap: isOpen ? 16 : 20,
982
- overflowY: 'visible',
1154
+ overflowY: 'scroll',
983
1155
  height: isHorizontalView || !isOpen ? '100%' : 800,
984
1156
  ...(isHorizontalView && {
985
1157
  flexGrow: 1,
986
1158
  maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
987
1159
  }),
988
1160
  ...(!isHorizontalView && isOpen && { width: formWidth }),
989
- }, children: [onFilterPreviewChange && ((0, jsx_runtime_1.jsxs)("div", { className: "filters-active-toggle", style: {
990
- cursor: 'pointer',
991
- display: isOpen ? 'flex' : 'none',
992
- flexDirection: 'row',
993
- gap: 4,
994
- marginTop: -16,
995
- userSelect: 'none',
996
- }, onClick: () => {
997
- onFilterPreviewChange && onFilterPreviewChange(!filtersActive);
998
- setCurrentPage(0);
999
- setFiltersActive(!filtersActive);
1000
- }, children: [(0, jsx_runtime_1.jsx)(AdjustmentsIcon_1.default, { style: {
1001
- color: filtersActive ? '#212121' : '#9e9e9e',
1002
- height: 20,
1003
- width: 20,
1004
- }, strokeWidth: filtersActive ? 1.5 : 1 }), (0, jsx_runtime_1.jsx)("div", { style: {
1005
- color: filtersActive ? '#212121' : '#9e9e9e',
1006
- fontSize: 14,
1007
- fontWeight: 300,
1008
- userSelect: 'none',
1009
- }, children: filtersActive
1010
- ? 'Previewing with filters'
1011
- : 'Previewing without filters' })] })), !isEditingMode && (report?.adminError || report?.error) ? ((0, jsx_runtime_1.jsx)(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : (((!isHorizontalView && windowWidth >= 1200) ||
1012
- formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.ChartDisplay, { reportId: report?.id, config: chartData, scrollable: true, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
1161
+ }, children: [!isEditingMode && (report?.adminError || report?.error) ? ((0, jsx_runtime_1.jsx)(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth < 1200)) && ((0, jsx_runtime_1.jsx)(InternalChart_1.default, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1162
+ onFiltersEnabledChanged(hide);
1163
+ }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1013
1164
  width: '100%',
1014
- height: formData.chartType === 'metric'
1015
- ? 100
1016
- : isHorizontalView || !isOpen
1017
- ? showTableFormatOptions
1018
- ? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1019
- : `calc(100% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1020
- : 400,
1165
+ // height:
1166
+ // formData.chartType === 'metric'
1167
+ // ? 100
1168
+ // : `calc(${filtersEnabled ? 50 : 70}%)`,
1021
1169
  ...(isHorizontalView && { flexGrow: 1 }),
1022
- }, onClickChartElement: onClickChartElement }))),
1170
+ }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }))),
1023
1171
  // Make sure to display non-pivoted table when using pivot chart
1024
- showTableFormatOptions &&
1172
+ isAdmin &&
1025
1173
  (isHorizontalView || (!isOpen && windowWidth < 1200)) && ((0, jsx_runtime_1.jsx)("div", { style: {
1026
1174
  width: '100%',
1027
- height: isHorizontalView || !isOpen
1028
- ? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
1029
- : 400,
1175
+ // height:
1176
+ // isHorizontalView || !isOpen
1177
+ // ? `calc(${filtersEnabled ? 30 : 50}%)`
1178
+ // : 400,
1030
1179
  flexGrow: 1,
1031
1180
  }, children: formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1032
- onPageChange &&
1033
- onPageChange(page, filtersActive, 'ChartBuilder');
1181
+ onPageChange(page);
1034
1182
  setCurrentPage(page);
1035
1183
  }, onSortChange: (sort) => {
1036
- onSortChange && onSortChange(sort, filtersActive);
1184
+ onSortChange && onSortChange(sort);
1037
1185
  }, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1038
1186
  ? selectedPivotTable.columns
1039
1187
  : formData.columns, onPageChange: (page) => {
1040
- onPageChange &&
1041
- onPageChange(page, filtersActive, 'ChartBuilder');
1188
+ onPageChange(page);
1042
1189
  setCurrentPage(page);
1043
1190
  }, onSortChange: (sort) => {
1044
- onSortChange && onSortChange(sort, filtersActive);
1045
- }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1191
+ onSortChange && onSortChange(sort);
1192
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1046
1193
  display: 'flex',
1047
1194
  flexDirection: 'column',
1048
1195
  gap: 20,
@@ -1079,11 +1226,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1079
1226
  // marginTop: 6,
1080
1227
  display: 'flex',
1081
1228
  flexDirection: 'column',
1082
- }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
1083
- pivot: formData.pivot,
1084
- rows: selectedPivotTable?.rows ?? [],
1085
- columns: selectedPivotTable?.columns ?? [],
1086
- }, theme: theme, index: 0, onSelectPivot: () => {
1229
+ }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: pivotCardTable, theme: theme, index: 0, onSelectPivot: () => {
1087
1230
  setIsEdittingPivot(true);
1088
1231
  setShowPivotPopover(true);
1089
1232
  setPivotRowField(formData.pivot?.rowField);
@@ -1092,7 +1235,13 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1092
1235
  setPivotValueField2(formData.pivot?.valueField2);
1093
1236
  setPivotAggregation(formData.pivot?.aggregationType);
1094
1237
  setPivotPopUpTitle('Edit pivot');
1095
- }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
1238
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [windowWidth < 1200 && (0, jsx_runtime_1.jsx)(InternalChart_1.default, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1239
+ onFiltersEnabledChanged(hide);
1240
+ }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1241
+ width: '100%',
1242
+ height: 500,
1243
+ flexGrow: 1,
1244
+ }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
1096
1245
  display: 'flex',
1097
1246
  flexDirection: 'column',
1098
1247
  }, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
@@ -1106,11 +1255,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1106
1255
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
1107
1256
  (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType || '')
1108
1257
  ? [{ value: 'pivot_date', label: 'date' }]
1109
- : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields
1110
- // .filter((yAxisField: YAxisField) => {
1111
- // return !yAxisField.field.startsWith('comparison_');
1112
- // })
1113
- .map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
1258
+ : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
1114
1259
  ? formData.pivot.valueField || 'count'
1115
1260
  : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
1116
1261
  ? [
@@ -1136,25 +1281,23 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1136
1281
  : ''
1137
1282
  : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
1138
1283
  ? NUMBER_OPTIONS
1139
- : formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && windowWidth < 1200 && ((0, jsx_runtime_1.jsx)("div", { style: {
1284
+ : formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), isAdmin && windowWidth < 1200 && ((0, jsx_runtime_1.jsx)("div", { style: {
1140
1285
  width: '100%',
1141
1286
  height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1142
1287
  flexGrow: 1,
1143
1288
  }, children: formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1144
- onPageChange &&
1145
- onPageChange(page, filtersActive, 'ChartBuilder');
1289
+ onPageChange(page);
1146
1290
  setCurrentPage(page);
1147
1291
  }, onSortChange: (sort) => {
1148
- onSortChange && onSortChange(sort, filtersActive);
1292
+ onSortChange && onSortChange(sort);
1149
1293
  }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1150
1294
  ? selectedPivotTable.columns
1151
1295
  : formData.columns, onPageChange: (page) => {
1152
- onPageChange &&
1153
- onPageChange(page, filtersActive, 'ChartBuilder');
1296
+ onPageChange(page);
1154
1297
  setCurrentPage(page);
1155
1298
  }, onSortChange: (sort) => {
1156
- onSortChange && onSortChange(sort, filtersActive);
1157
- }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), showTableFormatOptions && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
1299
+ onSortChange && onSortChange(sort);
1300
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), isAdmin && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
1158
1301
  display: 'flex',
1159
1302
  flexDirection: 'column',
1160
1303
  }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
@@ -1192,11 +1335,20 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1192
1335
  (formData.pivot &&
1193
1336
  selectedPivotTable &&
1194
1337
  selectedPivotTable.columns &&
1195
- formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
1338
+ formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), (specificDashboardFilters.length > 0 ||
1339
+ (isAdmin &&
1340
+ formData.dateField &&
1341
+ dashboardConfig[formData.dashboardName ?? '']?.config
1342
+ .dateFilter?.label)) && ((0, jsx_runtime_1.jsxs)("div", { style: {
1196
1343
  display: 'flex',
1197
1344
  flexDirection: 'column',
1198
1345
  gap: 6,
1199
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Date filter field" }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
1346
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
1347
+ formData.dateField &&
1348
+ dashboardConfig[formData.dashboardName ?? destinationDashboard ?? '']?.config.dateFilter?.label && ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'filterMap.dateFilter.' +
1349
+ (dashboardConfig[formData.dashboardName ?? '']
1350
+ ?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
1351
+ ?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
1200
1352
  label: elem.name,
1201
1353
  value: elem.name,
1202
1354
  })), width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Field", value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
@@ -1204,7 +1356,67 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1204
1356
  ?.columns?.map((elem) => ({
1205
1357
  label: elem.field,
1206
1358
  value: elem.field,
1207
- })) || [], width: 200 }) })] })] })), showAccessControlOptions && !client?.multiTenancyDisabled && ((0, jsx_runtime_1.jsxs)("div", { style: {
1359
+ })) || [], width: 200 }) }), (!formData.dateField?.table ||
1360
+ !formData.dateField?.field) && ((0, jsx_runtime_1.jsx)("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: (0, jsx_runtime_1.jsx)(assets_1.ExclamationFilledIcon, { height: 28, width: 28, style: {
1361
+ color: '#dc143c',
1362
+ } }) }))] })), specificDashboardFilters.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
1363
+ display: 'flex',
1364
+ flexDirection: 'column',
1365
+ gap: 6,
1366
+ }, children: specificDashboardFilters
1367
+ .filter((f) => {
1368
+ return f.filterType !== 'date_range';
1369
+ })
1370
+ .map((filter, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
1371
+ !(isAdmin &&
1372
+ formData.dateField &&
1373
+ dashboardConfig[formData.dashboardName ?? '']
1374
+ ?.config.dateFilter?.label)
1375
+ ? 'Filter'
1376
+ : '', disabled: true }), (0, jsx_runtime_1.jsx)(SelectComponent, { label: index === 0 &&
1377
+ !(isAdmin &&
1378
+ formData.dateField &&
1379
+ dashboardConfig[formData.dashboardName ?? '']
1380
+ ?.config.dateFilter?.label)
1381
+ ? 'Virtual Table'
1382
+ : '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
1383
+ ...filterMap,
1384
+ [filter.label]: {
1385
+ table: e.target.value,
1386
+ field: schemaData.schema
1387
+ .find((t) => t.name == e.target.value)
1388
+ ?.columns.find((elem) => elem.field ===
1389
+ (filterMap[filter.label]?.field ??
1390
+ filter.field))?.field ?? '',
1391
+ },
1392
+ }), options: allTables.map((elem) => ({
1393
+ label: elem,
1394
+ value: elem,
1395
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { label: index === 0 &&
1396
+ !(isAdmin &&
1397
+ formData.dateField &&
1398
+ dashboardConfig[formData.dashboardName ?? '']
1399
+ ?.config.dateFilter?.label)
1400
+ ? 'Field'
1401
+ : '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
1402
+ ...filterMap,
1403
+ [filter.label]: {
1404
+ table: filterMap[filter.label]?.table ??
1405
+ filter.table,
1406
+ field: e.target.value,
1407
+ },
1408
+ }), options: schemaData.schema
1409
+ .find((t) => t.name ==
1410
+ (filterMap[filter.label]?.table ??
1411
+ filter.table) &&
1412
+ allTables.includes(t.name))
1413
+ ?.columns.filter((column) => (0, columnProcessing_1.isStringType)(column.fieldType))
1414
+ .map((elem) => ({
1415
+ label: elem.label,
1416
+ value: elem.field,
1417
+ })) ?? [], width: 200 }), !validFilter[filter.label] && ((0, jsx_runtime_1.jsx)("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: (0, jsx_runtime_1.jsx)(assets_1.ExclamationFilledIcon, { height: 28, width: 28, style: {
1418
+ color: '#dc143c',
1419
+ } }) }))] }, filter.label))) }))] })), isAdmin && !client?.multiTenancyDisabled && ((0, jsx_runtime_1.jsxs)("div", { style: {
1208
1420
  display: 'flex',
1209
1421
  flexDirection: 'column',
1210
1422
  gap: 12,
@@ -1234,7 +1446,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
1234
1446
  }, disabled: formData.name === '' ||
1235
1447
  formData.dashboardName === '' ||
1236
1448
  formData.chartType === '' ||
1237
- filterIssues.length !== 0, label: buttonLabel
1449
+ filterIssues.length !== 0 ||
1450
+ Object.values(validFilter).includes(false), label: buttonLabel
1238
1451
  ? buttonLabel
1239
1452
  : report
1240
1453
  ? 'Save changes'