@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
@@ -3,12 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
4
4
  import { useState, useContext, useEffect, useRef, useMemo, useCallback, } from 'react';
5
5
  import MonacoEditor from '@monaco-editor/react';
6
- import { ClientContext, DashboardFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
6
+ import { ClientContext, DashboardContext, DashboardFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
7
7
  import { getDataFromCloud } from './utils/dataFetcher';
8
8
  import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
9
9
  import { MemoizedButton, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedModal, MemoizedPopover, MemoizedSecondaryButton, MemoizedSubHeader, MemoizedText, OverflowContainer, QuillChartBuilderFormContainer, QuillChartBuilderInputColumnContainer, QuillChartBuilderInputRowContainer, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, QuillTableSQLEditorComponent, } from './components/UiComponents';
10
10
  import { QuillTextInput } from './components/UiComponents';
11
11
  import { updateFirstChildWidth } from './utils/width';
12
+ import { TEMP_REPORT_ID, } from './models/Report';
12
13
  import { QuillCard } from './components/QuillCard';
13
14
  import { QuillSelectComponent } from './components/QuillSelect';
14
15
  import { fetchResultsByQuery, } from './utils/tableProcessing';
@@ -83,17 +84,17 @@ function setEditorTheme(_editor, monaco, schema, databaseType, clientName) {
83
84
  * ### SQLEditor API
84
85
  * @see https://docs.quillsql.com/components/sql-editor
85
86
  */
86
- export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, isNewQueryEnabled = false, LoadingComponent = QuillLoadingComponent, ModalComponent = MemoizedModal, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, ChartBuilderFormContainer = QuillChartBuilderFormContainer, defaultQuery, destinationDashboard, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, onDiscardChanges, onSaveChanges, onCloseChartBuilder, isChartBuilderEnabled = false, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, isAdminEnabled = false, chartBuilderTitle, runQueryOnMount = false, onAddToDashboardComplete, addToDashboardButtonLabel = 'Add to dashboard', report = undefined, organizationName = undefined, isChartBuilderHorizontalView = true, containerStyle = { height: '100vh' }, className, onClickChartElement, }) {
87
+ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, isNewQueryEnabled = false, LoadingComponent = QuillLoadingComponent, ModalComponent = MemoizedModal, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, ChartBuilderFormContainer = QuillChartBuilderFormContainer, defaultQuery, destinationDashboard, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, onDiscardChanges, onSaveChanges, onCloseChartBuilder, isChartBuilderEnabled = false, isAdminEnabled = false, chartBuilderTitle, runQueryOnMount = false, onAddToDashboardComplete, addToDashboardButtonLabel = 'Add to dashboard', report = undefined, organizationName = undefined, isChartBuilderHorizontalView = true, containerStyle = { height: '100vh' }, className, onClickChartElement, }) {
87
88
  const [sqlPrompt, setSqlPrompt] = useState('');
88
89
  const [client] = useContext(ClientContext);
89
90
  const [theme] = useContext(ThemeContext);
90
91
  const [query, setQuery] = useState(defaultQuery);
91
92
  const [rows, setRows] = useState([]);
92
- const [filteredRows, setFilteredRows] = useState([]);
93
- const [chartBuilderInFilteredPreview, setChartBuilderInFilteredPreview] = useState(true);
93
+ const [filtersEnabled, setFiltersEnabled] = useState(!!report);
94
94
  const [columns, setColumns] = useState([]);
95
95
  const [schemaData] = useContext(SchemaDataContext);
96
96
  const { dashboardFilters } = useContext(DashboardFiltersContext);
97
+ const [, dashboardDispatch] = useContext(DashboardContext);
97
98
  const specificDashboardFilters = useMemo(() => {
98
99
  return Object.values(dashboardFilters[report?.dashboardName ?? destinationDashboard ?? ''] ??
99
100
  {}).map((f) => f.filter);
@@ -174,7 +175,6 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
174
175
  useEffect(() => {
175
176
  if (client) {
176
177
  setRows([]);
177
- setFilteredRows([]);
178
178
  setColumns([]);
179
179
  setDisplayTable(false);
180
180
  }
@@ -211,7 +211,7 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
211
211
  }
212
212
  };
213
213
  const onSortChange = (sort) => {
214
- if (tempReport && shouldSortInMemory(pagination, rowCount, false)) {
214
+ if (tempReport && shouldSortInMemory(pagination, rowCount)) {
215
215
  return;
216
216
  }
217
217
  const updatedProcessing = { page: pagination, sort };
@@ -219,9 +219,6 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
219
219
  setCurrentProcessing(updatedProcessing);
220
220
  setMaxPage(0);
221
221
  };
222
- const onFilterPreviewChange = (preview) => {
223
- setChartBuilderInFilteredPreview(preview);
224
- };
225
222
  const fetchRowCount = async (processing, includeFilters) => {
226
223
  if (!client || !query) {
227
224
  return;
@@ -250,27 +247,25 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
250
247
  setMaxPage(1);
251
248
  }
252
249
  const tableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, undefined, undefined, true);
253
- const filteredTableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, specificDashboardFilters, tempReport.dateField ?? report?.dateField, true);
254
250
  if (!!tableInfo.error) {
255
251
  throw new Error(tableInfo.error);
256
252
  }
257
- else if (filteredTableInfo.error) {
258
- throw new Error(filteredTableInfo.error);
253
+ // Search through tableInfo.columns for any two columns with the same 'field' value
254
+ const duplicateColumns = tableInfo.columns
255
+ .map((col) => col.field)
256
+ .filter((field, index, self) => self.indexOf(field) !== index);
257
+ if (duplicateColumns.length > 0) {
258
+ setErrorMessage(`Column named "${duplicateColumns[0]}" occurs more than once in results.`);
259
+ return;
259
260
  }
260
- // else if (tableInfo.rows.length === 0) {
261
- // throw new Error('No data found');
262
- // }
263
261
  fetchRowCount(processing, includeFilters);
264
262
  setSqlQueryLoading(false);
265
263
  setCurrentProcessing(processing);
266
264
  let tempRows = [...rows, ...tableInfo.rows];
267
- let tempFilteredRows = [...filteredRows, ...filteredTableInfo.rows];
268
265
  if (resetRows) {
269
266
  tempRows = tableInfo.rows;
270
- tempFilteredRows = filteredTableInfo.rows;
271
267
  }
272
268
  setRows(tempRows);
273
- setFilteredRows(tempFilteredRows);
274
269
  setFormattedRows(formatRowsFromReport({ rows: tempRows, columns: tableInfo.columns }));
275
270
  if (onChangeData) {
276
271
  onChangeData(tempRows);
@@ -290,7 +285,6 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
290
285
  ...formData,
291
286
  itemQuery: tableInfo.itemQuery,
292
287
  rowCount: tableInfo.rowCount ?? tableInfo.rows.length,
293
- filtersApplied: tempReport.filtersApplied ?? [],
294
288
  rows: tempRows,
295
289
  columns: tableInfo.columns,
296
290
  };
@@ -422,6 +416,21 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
422
416
  }, label: "Run query" })), isNewQueryEnabled && (_jsx(SecondaryButtonComponent, { onClick: handleClearQuery, label: "Clear query" })), addToDashboardButtonLabel ===
423
417
  'Add to dashboard' && (_jsx(ButtonComponent, { onClick: async () => {
424
418
  onSaveChanges && onSaveChanges();
419
+ dashboardDispatch({
420
+ id: TEMP_REPORT_ID,
421
+ type: 'ADD_DASHBOARD_ITEM',
422
+ data: {
423
+ ...tempReport,
424
+ id: TEMP_REPORT_ID,
425
+ rows,
426
+ columns: columns,
427
+ columnInternal: columns,
428
+ rowCount: rowCount ?? 0,
429
+ queryString: query ?? '',
430
+ dashboardName: report?.dashboardName ??
431
+ destinationDashboard,
432
+ },
433
+ });
425
434
  setIsChartBuilderOpen(true);
426
435
  }, label: addToDashboardButtonLabel, disabled: !!errorMessage ||
427
436
  !(lastSuccessfulQuery === query) ||
@@ -471,13 +480,27 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
471
480
  marginBottom: 5,
472
481
  }, children: [onDiscardChanges && (_jsx(SecondaryButtonComponent, { onClick: onDiscardChanges, label: "Discard changes" })), addToDashboardButtonLabel !== 'Add to dashboard' && (_jsx(ButtonComponent, { onClick: async () => {
473
482
  onSaveChanges && onSaveChanges();
483
+ dashboardDispatch({
484
+ id: TEMP_REPORT_ID,
485
+ type: 'ADD_DASHBOARD_ITEM',
486
+ data: {
487
+ ...tempReport,
488
+ id: TEMP_REPORT_ID,
489
+ rows,
490
+ columns: columns,
491
+ columnInternal: columns,
492
+ rowCount: rowCount ?? 0,
493
+ queryString: query ?? '',
494
+ dashboardName: report?.dashboardName ?? destinationDashboard,
495
+ },
496
+ });
474
497
  setIsChartBuilderOpen(true);
475
- }, label: addToDashboardButtonLabel, disabled: !!errorMessage || !(lastSuccessfulQuery === query) }))] }))] })] }) }) })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { rows: chartBuilderInFilteredPreview ? filteredRows : rows, columns: columns, query: query, isHorizontalView: isChartBuilderHorizontalView, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions, isAdmin: isAdminEnabled, destinationDashboard: destinationDashboard, title: chartBuilderTitle, buttonLabel: addToDashboardButtonLabel, report: tempReport, pivot: tempReport?.pivot ?? undefined, pivotData: tempReport?.pivotRows && tempReport?.pivotColumns
476
- ? {
477
- rows: tempReport.pivotRows,
478
- columns: tempReport.pivotColumns,
479
- }
480
- : undefined, organizationName: organizationName, CardComponent: CardComponent, TableComponent: TableComponent, ModalComponent: ModalComponent, ButtonComponent: ButtonComponent, TextInputComponent: TextInputComponent, SelectComponent: SelectComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, PopoverComponent: PopoverComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, onClickChartElement: onClickChartElement, rowCount: rowCount, onPageChange: onPageChange, onSortChange: onSortChange, onFilterPreviewChange: onFilterPreviewChange, isLoading: sqlQueryLoading, isEditingMode: true }))] }));
498
+ }, label: addToDashboardButtonLabel, disabled: !!errorMessage || !(lastSuccessfulQuery === query) }))] }))] })] }) }) })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { isHorizontalView: isChartBuilderHorizontalView, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, isAdmin: isAdminEnabled, title: chartBuilderTitle, buttonLabel: addToDashboardButtonLabel, reportId: report?.id, organizationName: organizationName, CardComponent: CardComponent, TableComponent: TableComponent, ModalComponent: ModalComponent, ButtonComponent: ButtonComponent, TextInputComponent: TextInputComponent, SelectComponent: SelectComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, PopoverComponent: PopoverComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, onClickChartElement: onClickChartElement,
499
+ // onPageChange={onPageChange}
500
+ // onSortChange={onSortChange}
501
+ filtersEnabled: filtersEnabled, onFiltersEnabledChanged: (enabled) => setFiltersEnabled(enabled),
502
+ // isLoading={sqlQueryLoading}
503
+ isEditingMode: true }))] }));
481
504
  }
482
505
  const SQLEditorComponent = ({ query, schema, databaseType, clientName, setQuery, setEditorMounted, handleRunQuery, defineEditorTheme, setEditorTheme, runQueryOnMount = false, theme, loading, LoadingComponent = QuillLoadingComponent, }) => {
483
506
  const [editorKey, setEditorKey] = useState(0);
@@ -39,7 +39,7 @@ export default function BarChart({ colors, colorMap, yAxisFields, data, containe
39
39
  return (_jsx("div", { style: {
40
40
  boxSizing: 'content-box',
41
41
  ...containerStyle,
42
- }, className: className, children: _jsx(ResponsiveContainer, { width: "100%", height: '100%', children: _jsxs(ReChartsBarChart, { data: data ?? [], layout: 'horizontal', onClick: (event) => onClickChartElement
42
+ }, className: className, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(ReChartsBarChart, { data: data ?? [], layout: 'horizontal', onClick: (event) => onClickChartElement
43
43
  ? onClickChartElement(event?.activePayload
44
44
  ? event.activePayload[0].payload
45
45
  : undefined)
@@ -0,0 +1,25 @@
1
+ import { ChartProps } from '../../Chart';
2
+ import { QuillReport } from '../../models/Report';
3
+ export declare function isEquivalent(filters1: any[], filters2: any[]): boolean;
4
+ export declare function didFiltersChange(dashboardItem: any, filters: any[]): boolean;
5
+ export type ColorMapType = {
6
+ [key: string]: {
7
+ primary: string;
8
+ comparison?: string;
9
+ primaryGradientStart?: string;
10
+ primaryGradientStop?: string;
11
+ comparisonGradientStart?: string;
12
+ comparisonGradientStop?: string;
13
+ };
14
+ };
15
+ export default function InternalChart({ report, colors, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, hideHorizontalCartesianGrid, hideVerticalCartesianGrid, hideSubsequentXAxisTicks, cartesianGridLineStyle, cartesianGridLineColor, comparisonLineStyle, hideDateRangeFilter, filtersEnabled, setFiltersEnabled, mapColorsToFields, LoadingComponent, SelectComponent, MultiSelectComponent, DateRangePickerComponent, MetricComponent, filters, onDashboardFilterChange, onClickChartElement, loading, error, isAdmin, filterToggleDisabled, }: Omit<ChartProps, 'reportId'> & {
16
+ report: QuillReport;
17
+ loading: boolean;
18
+ error?: string;
19
+ filtersEnabled: boolean;
20
+ setFiltersEnabled: (hide: boolean) => void;
21
+ isAdmin?: boolean;
22
+ onDashboardFilterChange: (label: string, value: any) => void;
23
+ filterToggleDisabled?: boolean;
24
+ }): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=InternalChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/InternalChart.tsx"],"names":[],"mappings":"AA6BA,OAAO,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAC;AAMlE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WAiH5D;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAKlE;AAkFD,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,MAAM,EACN,MAAM,EACN,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,2BAAmC,EACnC,yBAAgC,EAChC,wBAAgC,EAChC,sBAAgC,EAChC,sBAAsB,EACtB,mBAAmB,EACnB,mBAA2B,EAC3B,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAuC,EACvC,eAAsC,EACtC,oBAAgD,EAChD,wBAA+C,EAC/C,eAAsC,EACtC,OAAO,EACP,uBAAuB,EACvB,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,OAAO,EACP,oBAAoB,GACrB,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,2CA8VA"}
@@ -0,0 +1,379 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useContext, useMemo } from 'react';
3
+ import { differenceInHours } from 'date-fns';
4
+ import { DashboardConfigContext, ReportFiltersContext, ThemeContext, } from '../../Context';
5
+ import { QuillLoadingSkeleton } from '../../components/Chart/ChartSkeleton';
6
+ import ChartError from '../../components/Chart/ChartError';
7
+ import {
8
+ // convertCustomFilter,
9
+ DashboardFilterType as DashboardFilterVariant, FilterType, } from '../../models/Filter';
10
+ import { applyCustomFilterToDashDateFilter } from '../../utils/filterProcessing';
11
+ import { DashboardFilter } from '../../components/Dashboard/DashboardFilter';
12
+ import { QuillSelectComponent } from '../../components/QuillSelect';
13
+ import { QuillMultiSelectComponent } from '../../components/QuillMultiSelect';
14
+ import { QuillDateRangePicker } from '../../DateRangePicker/QuillDateRangePicker';
15
+ import QuillMetricComponent from '../../components/Dashboard/MetricComponent';
16
+ import { COMPARISON_RANGE, defaultOptionsV2, getRangeFromPresetOptions, PRIMARY_RANGE, } from '../../DateRangePicker/dateRangePickerUtils';
17
+ import { ChartDisplay } from '../../Chart';
18
+ import { TEMP_REPORT_ID } from '../../models/Report';
19
+ function areDatesNearby(date1, date2) {
20
+ return Math.abs(differenceInHours(date1, date2)) < 24;
21
+ }
22
+ export function isEquivalent(filters1, filters2) {
23
+ if (filters2.length !== filters1.length) {
24
+ return false;
25
+ }
26
+ // const filterKeys = Object.keys(filters2);
27
+ for (let i = 0; i < filters1.length; i++) {
28
+ const filter1 = filters1[i];
29
+ if (!filter1) {
30
+ return false;
31
+ }
32
+ const filter2 = filters2[i];
33
+ if (filter1.isUserFilter !== filter2.isUserFilter) {
34
+ return false;
35
+ }
36
+ else if (filter1.isUserFilter) {
37
+ if (filter1.operator !== filter2.operator ||
38
+ filter1.value !== filter2.value) {
39
+ return false;
40
+ }
41
+ }
42
+ const filterType = filter2.filterType;
43
+ if (filterType === 'string') {
44
+ if (filter1.stringFilterType === 'multiselect') {
45
+ if (filter1.values &&
46
+ filter2.values &&
47
+ filter1.values.length !== filter2.values.length) {
48
+ return false;
49
+ }
50
+ if ((filter1.values && !filter2.values) ||
51
+ (filter2.values && !filter1.values)) {
52
+ return false;
53
+ }
54
+ // make sure that filter1.values is equivalent to filter2.values ignoring order
55
+ const sortedValues1 = filter1.values?.slice().sort() || [];
56
+ const sortedValues2 = filter2.values?.slice().sort() || [];
57
+ if (!sortedValues1.every((value, index) => value === sortedValues2[index])) {
58
+ return false;
59
+ }
60
+ }
61
+ if (filter1.selectedValue !== filter2.selectedValue) {
62
+ return false;
63
+ }
64
+ }
65
+ else if (filter1?.operator === 'BETWEEN' &&
66
+ filter2?.operator === 'BETWEEN') {
67
+ if (!filter1?.values && !filter2?.values) {
68
+ continue;
69
+ }
70
+ else if (!filter1?.values || !filter2?.values) {
71
+ return false;
72
+ }
73
+ if (filter1?.values && filter2?.values) {
74
+ if (!areDatesNearby(filter1.values[0], filter2.values[0]) ||
75
+ !areDatesNearby(filter1.values[1], filter2.values[1])) {
76
+ return false;
77
+ }
78
+ }
79
+ }
80
+ else if (filterType === 'date_range') {
81
+ if (!filter1.startDate && !filter2.startDate) {
82
+ continue;
83
+ }
84
+ if (!areDatesNearby(filter1.startDate, filter2.startDate) ||
85
+ !areDatesNearby(filter1.endDate, filter2.endDate)) {
86
+ return false;
87
+ }
88
+ if (filter1.comparison !== filter2.comparison) {
89
+ return false;
90
+ }
91
+ if (filter1.comparisonRange && !filter2.comparisonRange) {
92
+ return false;
93
+ }
94
+ if (!filter1.comparisonRange && filter2.comparisonRange) {
95
+ return false;
96
+ }
97
+ if (filter1.comparisonRange && filter2.comparisonRange) {
98
+ if (!filter1.comparisonRange.startDate &&
99
+ !filter2.comparisonRange.endDate) {
100
+ continue;
101
+ }
102
+ if (!areDatesNearby(filter1.comparisonRange.startDate, filter2.comparisonRange.startDate) ||
103
+ !areDatesNearby(filter1.comparisonRange.endDate, filter2.comparisonRange.endDate)) {
104
+ return false;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ export function didFiltersChange(dashboardItem, filters) {
112
+ if (!dashboardItem?.filtersApplied || !filters) {
113
+ return true;
114
+ }
115
+ return !isEquivalent(dashboardItem.filtersApplied, filters);
116
+ }
117
+ const TogglePrimitive = ({ value, onClick, style, disabled, }) => {
118
+ const toggleStyle = {
119
+ container: {
120
+ display: 'inline-block',
121
+ position: 'relative',
122
+ width: '30px',
123
+ height: '18px',
124
+ borderRadius: '24px',
125
+ backgroundColor: value ? '#212121' : '#ccc',
126
+ cursor: 'pointer',
127
+ transition: 'background-color 0.4s',
128
+ // Fade out the toggle when disabled
129
+ opacity: disabled ? 0.5 : 1,
130
+ ...style,
131
+ },
132
+ circle: {
133
+ position: 'absolute',
134
+ top: '3px',
135
+ left: value ? '15px' : '3px',
136
+ width: '12px',
137
+ height: '12px',
138
+ borderRadius: '50%',
139
+ backgroundColor: '#FFF',
140
+ transition: 'left 0.4s',
141
+ },
142
+ icon: {
143
+ position: 'absolute',
144
+ top: '3px',
145
+ left: '3px',
146
+ display: 'flex',
147
+ alignItems: 'center',
148
+ justifyContent: 'center',
149
+ width: '20px',
150
+ height: '20px',
151
+ color: '#FFF',
152
+ },
153
+ };
154
+ return (_jsxs("div", { style: toggleStyle.container, onClick: disabled ? () => { } : onClick, "aria-checked": value, role: "switch", "aria-label": "Toggle", children: [_jsx("div", { style: toggleStyle.circle }), value ? (_jsx("div", { style: {
155
+ ...toggleStyle.icon,
156
+ left: '35px',
157
+ color: '#FFC107',
158
+ } })) : (_jsx("div", { style: {
159
+ ...toggleStyle.icon,
160
+ color: '#607D8B',
161
+ } }))] }));
162
+ };
163
+ export default function InternalChart({ report, colors, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, hideHorizontalCartesianGrid = false, hideVerticalCartesianGrid = true, hideSubsequentXAxisTicks = false, cartesianGridLineStyle = 'solid', cartesianGridLineColor, comparisonLineStyle, hideDateRangeFilter = false, filtersEnabled, setFiltersEnabled, mapColorsToFields, LoadingComponent = QuillLoadingSkeleton, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponent, DateRangePickerComponent = QuillDateRangePicker, MetricComponent = QuillMetricComponent, filters, onDashboardFilterChange, onClickChartElement, loading, error, isAdmin, filterToggleDisabled, }) {
164
+ const { reportFilters } = useContext(ReportFiltersContext);
165
+ const { dashboardConfig } = useContext(DashboardConfigContext);
166
+ const currentReportFilters = useMemo(() => {
167
+ const dashFilters = dashboardConfig[report?.dashboardName ?? '']?.config.filters;
168
+ if (!dashFilters)
169
+ return Object.values(reportFilters[report?.id ?? ''] ?? {});
170
+ // Sort the filters with "date_range" type first, followed by the rest in the same order as the dashFilters, by label.
171
+ return Object.values(reportFilters[report?.id ?? ''] ?? {}).sort((a, b) => {
172
+ if (a.filter.filterType === 'date_range' &&
173
+ b.filter.filterType !== 'date_range') {
174
+ return -1;
175
+ }
176
+ else if (a.filter.filterType !== 'date_range' &&
177
+ b.filter.filterType === 'date_range') {
178
+ return 1;
179
+ }
180
+ else {
181
+ return (dashFilters.findIndex((f) => f.label === a.filter.label) -
182
+ dashFilters.findIndex((f) => f.label === b.filter.label));
183
+ }
184
+ });
185
+ }, [reportFilters, report?.id]);
186
+ const reportDateFilter = useMemo(() => {
187
+ return Object.values(reportFilters[report?.id ?? ''] ?? {}).find((f) => f.filter.filterType === 'date_range')?.filter;
188
+ }, [reportFilters, report?.id]);
189
+ const presetOptions = useMemo(() => {
190
+ return reportDateFilter
191
+ ? (reportDateFilter.presetRanges?.map((elem) => {
192
+ if (!elem.isStatic) {
193
+ return {
194
+ label: elem.label,
195
+ value: elem.value,
196
+ startDate: PRIMARY_RANGE[elem.value]?.startDate ??
197
+ PRIMARY_RANGE['LAST_30_DAYS'].startDate,
198
+ endDate: PRIMARY_RANGE[elem.value]?.endDate ??
199
+ PRIMARY_RANGE['LAST_30_DAYS'].endDate,
200
+ };
201
+ }
202
+ return {
203
+ label: elem.label,
204
+ value: elem.value,
205
+ startDate: new Date(elem.startDate),
206
+ endDate: new Date(elem.endDate),
207
+ };
208
+ }) ?? defaultOptionsV2)
209
+ : defaultOptionsV2;
210
+ }, [reportDateFilter]);
211
+ // const userFilters = useMemo(() => {
212
+ // return filters?.filter(
213
+ // (f) =>
214
+ // f.filterType !== FilterType.DateCustomFilter &&
215
+ // f.filterType !== FilterType.DateFilter &&
216
+ // f.filterType !== FilterType.DateComparisonFilter,
217
+ // );
218
+ // }, [filters]);
219
+ // A filter value can either be a string, an array of strings for a multiselect, or a date range (that could have a comparison range)
220
+ const [filterValues, setFilterValues] = useState({});
221
+ useEffect(() => {
222
+ if (reportDateFilter) {
223
+ // Filter for custom date filter that applies to the report's dateField
224
+ const customDateFilter = filters?.find((f) => f.filterType === FilterType.DateCustomFilter ||
225
+ f.filterType === FilterType.DateFilter ||
226
+ f.filterType === FilterType.DateComparisonFilter);
227
+ if (!customDateFilter) {
228
+ return;
229
+ }
230
+ const newFilter = applyCustomFilterToDashDateFilter(customDateFilter, reportDateFilter);
231
+ setFilterValues((filterValues) => ({
232
+ ...filterValues,
233
+ [reportDateFilter.label]: {
234
+ startDate: newFilter.startDate,
235
+ endDate: newFilter.endDate,
236
+ preset: newFilter.preset,
237
+ comparisonRange: newFilter.comparisonRange,
238
+ },
239
+ }));
240
+ }
241
+ }, [filters]);
242
+ const [theme] = useContext(ThemeContext);
243
+ const colorMap = useMemo(() => {
244
+ if (mapColorsToFields && report && theme) {
245
+ return mapColorsToFields(report, theme);
246
+ }
247
+ }, [report, theme]);
248
+ const updateFilter = (filter, value, comparison) => {
249
+ let filterValue = {};
250
+ if (filter.filterType === DashboardFilterVariant.String) {
251
+ if (filter.stringFilterType === 'multiselect') {
252
+ if ((value?.length ?? 0) === 0) {
253
+ filterValue = { values: undefined, operator: undefined };
254
+ }
255
+ else {
256
+ filterValue = { values: value, operator: 'IN' };
257
+ }
258
+ }
259
+ else {
260
+ filterValue = { selectedValue: value };
261
+ }
262
+ }
263
+ else if (filter.filterType === DashboardFilterVariant.Date) {
264
+ if (comparison ||
265
+ (filter.comparison &&
266
+ (filter.comparisonRange?.value ?? 'NO_COMPARISON') !==
267
+ 'NO_COMPARISON')) {
268
+ let preset = '';
269
+ if (comparison) {
270
+ preset = filter.preset.value;
271
+ }
272
+ const key = comparison?.value ||
273
+ (filter.comparisonRange?.value ?? 'NO_COMPARISON');
274
+ let primaryRange = {
275
+ startDate: value ? value.startDate : filter.startDate,
276
+ endDate: value ? value.endDate : filter.endDate,
277
+ };
278
+ if (value && value.preset) {
279
+ preset = value.preset;
280
+ primaryRange = getRangeFromPresetOptions(value.preset, presetOptions);
281
+ }
282
+ filterValue = {
283
+ startDate: primaryRange.startDate,
284
+ endDate: primaryRange.endDate,
285
+ preset: {
286
+ label: presetOptions.find((o) => o.value === preset)?.label ?? preset,
287
+ value: preset,
288
+ },
289
+ comparisonRange: {
290
+ startDate: COMPARISON_RANGE[key](primaryRange)
291
+ ?.startDate,
292
+ endDate: COMPARISON_RANGE[key](primaryRange)
293
+ ?.endDate,
294
+ value: key,
295
+ },
296
+ };
297
+ }
298
+ else {
299
+ const primaryRange = value && value.preset
300
+ ? getRangeFromPresetOptions(value.preset, presetOptions)
301
+ : {
302
+ startDate: value?.startDate || filter.startDate,
303
+ endDate: value?.endDate || filter.endDate,
304
+ };
305
+ const preset = value?.preset ? value.preset : '';
306
+ filterValue = {
307
+ startDate: primaryRange.startDate,
308
+ endDate: primaryRange.endDate,
309
+ preset: {
310
+ label: presetOptions.find((o) => o.value === preset)?.label ?? preset,
311
+ value: preset,
312
+ },
313
+ };
314
+ }
315
+ }
316
+ setFilterValues((filterValues) => ({
317
+ ...filterValues,
318
+ [filter.label]: filterValue,
319
+ }));
320
+ onDashboardFilterChange(filter.label, filterValue);
321
+ };
322
+ if (error) {
323
+ return (_jsx("div", { style: containerStyle, className: className, children: _jsx(ChartError, { errorMessage: error }) }));
324
+ }
325
+ return (_jsxs("div", { style: {
326
+ display: 'flex',
327
+ flexDirection: 'column',
328
+ ...containerStyle,
329
+ }, id: `quill-internal-chart-${report.id}`, className: className, children: [isAdmin && !!currentReportFilters?.length && (_jsxs("div", { style: {
330
+ maxWidth: 'fit-content',
331
+ marginBottom: 25,
332
+ display: 'flex',
333
+ flexDirection: 'column',
334
+ gap: 4,
335
+ alignItems: 'flex-start',
336
+ flexWrap: 'wrap',
337
+ border: filtersEnabled
338
+ ? `1px solid ${theme?.borderColor ?? 'black'}`
339
+ : 'none',
340
+ padding: filtersEnabled ? 12 : 0,
341
+ borderRadius: 6,
342
+ opacity: filterToggleDisabled ? 0.5 : 1,
343
+ }, children: [_jsxs("div", { style: {
344
+ display: 'flex',
345
+ flexDirection: 'row',
346
+ gap: 8,
347
+ border: `1px solid ${theme?.borderColor ?? 'black'}`,
348
+ padding: 8,
349
+ borderRadius: 6,
350
+ }, children: [_jsx(TogglePrimitive, { value: filtersEnabled, onClick: () => setFiltersEnabled(!filtersEnabled), style: {
351
+ marginTop: 2,
352
+ cursor: filterToggleDisabled ? 'not-allowed' : 'pointer',
353
+ }, disabled: filterToggleDisabled }), _jsx("h1", { style: {
354
+ fontSize: 14,
355
+ fontWeight: 600,
356
+ fontFamily: theme?.fontFamily,
357
+ color: theme?.primaryTextColor || '#575E6A',
358
+ userSelect: 'none',
359
+ margin: 0,
360
+ }, children: filtersEnabled
361
+ ? 'Previewing with dashboard filters'
362
+ : 'Previewing without dashboard filters' })] }), _jsx("div", { style: {
363
+ display: 'flex',
364
+ flexDirection: 'row',
365
+ alignItems: 'flex-end',
366
+ flexWrap: 'wrap',
367
+ gap: 12,
368
+ }, children: filtersEnabled &&
369
+ currentReportFilters.map((filter, index) => (_jsx(DashboardFilter, { filter: {
370
+ ...filter.filter,
371
+ ...(filter.filter.filterType === 'date_range' && {
372
+ options: presetOptions,
373
+ }),
374
+ ...filterValues[filter.filter.label],
375
+ }, isLoading: filter.loading, onChangeFilter: updateFilter, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent, disabled: !filtersEnabled }, index))) })] })), loading || !report ? (_jsx(LoadingComponent, {})) : (_jsxs(_Fragment, { children: ['metric' === report.chartType && (_jsx(MetricComponent, { error: error, isLoading: loading, report: report })), report.chartType !== 'table' && report.chartType !== 'metric' && (_jsx(ChartDisplay, { config: report, containerStyle: {
376
+ width: '100%',
377
+ height: '100%',
378
+ }, reportId: TEMP_REPORT_ID, colors: colors, className: className, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, hideHorizontalCartesianGrid: hideHorizontalCartesianGrid, hideVerticalCartesianGrid: hideVerticalCartesianGrid, hideSubsequentXAxisTicks: hideSubsequentXAxisTicks, cartesianGridLineStyle: cartesianGridLineStyle, cartesianGridLineColor: cartesianGridLineColor, hideDateRangeFilter: hideDateRangeFilter, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, loading: loading, scrollable: true, colorMap: colorMap, LoadingComponent: LoadingComponent, onClickChartElement: onClickChartElement }))] }))] }));
379
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/LineChart.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyB7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,MAAM,EACN,QAAa,EACb,WAAW,EACX,IAAI,EACJ,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,iBAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,iBAAyB,EACzB,2BAAmC,EACnC,yBAAgC,EAChC,wBAAgC,EAChC,sBAAgC,EAChC,mBAA6B,EAC7B,sBAAsB,EACtB,mBAA8B,EAC9B,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,GAAG,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,2BAA2B,EAAE,OAAO,CAAC;IACrC,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,OAAO,CAAC;IAClC,sBAAsB,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3C,mBAAmB,EAAE,OAAO,GAAG,QAAQ,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB,2CAsRA"}
1
+ {"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/LineChart.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA2B7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,MAAM,EACN,QAAa,EACb,WAAW,EACX,IAAI,EACJ,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,iBAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,iBAAyB,EACzB,2BAAmC,EACnC,yBAAgC,EAChC,wBAAgC,EAChC,sBAAgC,EAChC,mBAA6B,EAC7B,sBAAsB,EACtB,mBAA8B,EAC9B,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,GAAG,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,2BAA2B,EAAE,OAAO,CAAC;IACrC,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,OAAO,CAAC;IAClC,sBAAsB,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3C,mBAAmB,EAAE,OAAO,GAAG,QAAQ,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB,2CAsRA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Area, CartesianGrid, ComposedChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts';
3
- import { DATE_FORMAT_TYPES, valueFormatter, } from '../../utils/valueFormatter';
3
+ import { DATE_FORMAT_TYPES, valueFormatter } from '../../utils/valueFormatter';
4
4
  import { axisFormatter } from '../../utils/axisFormatter';
5
5
  import { selectColor } from '../../utils/color';
6
6
  import ChartTooltip from '../../components/Chart/ChartTooltip';
@@ -9,7 +9,9 @@ import { hashCode } from '../../utils/crypto';
9
9
  import { useMemo } from 'react';
10
10
  function createLineForEmptyChart(yAxisFields, dateFilter, xAxisField, xAxisFormat) {
11
11
  let lineChartData = [];
12
- if (dateFilter && dateFilter.startDate && dateFilter.endDate &&
12
+ if (dateFilter &&
13
+ dateFilter.startDate &&
14
+ dateFilter.endDate &&
13
15
  DATE_FORMAT_TYPES.includes(xAxisFormat || '') &&
14
16
  (!lineChartData || lineChartData.length === 0)) {
15
17
  const xAxis = xAxisField || '';