@quillsql/react 2.12.21 → 2.12.23

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 (71) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +43 -18
  3. package/dist/cjs/ChartEditor.js +1 -1
  4. package/dist/cjs/Dashboard.d.ts +10 -2
  5. package/dist/cjs/Dashboard.d.ts.map +1 -1
  6. package/dist/cjs/Dashboard.js +16 -9
  7. package/dist/cjs/Table.js +2 -2
  8. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  9. package/dist/cjs/components/Chart/BarChart.js +4 -2
  10. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  11. package/dist/cjs/components/Chart/ChartTooltip.js +1 -1
  12. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  13. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  14. package/dist/cjs/components/Dashboard/DataLoader.js +13 -20
  15. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  16. package/dist/cjs/components/QuillTable.js +2 -2
  17. package/dist/cjs/components/ReportBuilder/convert.d.ts +2 -2
  18. package/dist/cjs/components/UiComponents.d.ts +6 -1
  19. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  20. package/dist/cjs/components/UiComponents.js +40 -2
  21. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -4
  22. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +11 -0
  23. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  24. package/dist/cjs/internals/ReportBuilder/PivotModal.js +8 -1
  25. package/dist/cjs/utils/dashboard.d.ts +1 -1
  26. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  27. package/dist/cjs/utils/dashboard.js +112 -4
  28. package/dist/cjs/utils/errorProcessing.d.ts.map +1 -1
  29. package/dist/cjs/utils/errorProcessing.js +0 -3
  30. package/dist/cjs/utils/merge.js +1 -1
  31. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  32. package/dist/cjs/utils/pivotProcessing.js +0 -42
  33. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  34. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  35. package/dist/cjs/utils/queryConstructor.js +124 -1
  36. package/dist/esm/Chart.d.ts.map +1 -1
  37. package/dist/esm/Chart.js +43 -18
  38. package/dist/esm/ChartEditor.js +1 -1
  39. package/dist/esm/Dashboard.d.ts +10 -2
  40. package/dist/esm/Dashboard.d.ts.map +1 -1
  41. package/dist/esm/Dashboard.js +17 -10
  42. package/dist/esm/Table.js +2 -2
  43. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  44. package/dist/esm/components/Chart/BarChart.js +4 -2
  45. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  46. package/dist/esm/components/Chart/ChartTooltip.js +1 -1
  47. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  48. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  49. package/dist/esm/components/Dashboard/DataLoader.js +13 -20
  50. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  51. package/dist/esm/components/QuillTable.js +2 -2
  52. package/dist/esm/components/ReportBuilder/convert.d.ts +2 -2
  53. package/dist/esm/components/UiComponents.d.ts +6 -1
  54. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  55. package/dist/esm/components/UiComponents.js +15 -1
  56. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -4
  57. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +11 -0
  58. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  59. package/dist/esm/internals/ReportBuilder/PivotModal.js +7 -2
  60. package/dist/esm/utils/dashboard.d.ts +1 -1
  61. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  62. package/dist/esm/utils/dashboard.js +113 -5
  63. package/dist/esm/utils/errorProcessing.d.ts.map +1 -1
  64. package/dist/esm/utils/errorProcessing.js +0 -3
  65. package/dist/esm/utils/merge.js +1 -1
  66. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  67. package/dist/esm/utils/pivotProcessing.js +0 -42
  68. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  69. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  70. package/dist/esm/utils/queryConstructor.js +122 -0
  71. package/package.json +1 -1
@@ -102,6 +102,17 @@ export declare function generatePivotTableYAxis(pivot: Pivot, cols: {
102
102
  format: AxisFormat;
103
103
  }[];
104
104
  export declare function generatePivotTitle(pivot: Pivot): string;
105
+ export declare function getDateRange(dateRange: {
106
+ start: Date;
107
+ end: Date;
108
+ } | undefined, column: string, data: any): {
109
+ start: Date;
110
+ end: Date;
111
+ };
112
+ export declare function getDateString(value: string, dateRange?: {
113
+ start: Date;
114
+ end: Date;
115
+ }, dateBucket?: string): string;
105
116
  export declare function isDateField(fieldType: string): boolean;
106
117
  export declare function generatePivotTable(pivot: Pivot, data: any, dateRange: {
107
118
  start: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generatePivotTable = exports.isDateField = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
3
+ exports.generatePivotTable = exports.isDateField = exports.getDateString = exports.getDateRange = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const Context_1 = require("../../Context");
@@ -138,6 +138,11 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
138
138
  }
139
139
  }
140
140
  }, []);
141
+ (0, react_1.useEffect)(() => {
142
+ if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
143
+ getDistinctValues();
144
+ }
145
+ }, [initialSelectedPivotTable, columns, data, pivotRowField]);
141
146
  (0, react_1.useEffect)(() => {
142
147
  const pivot = {
143
148
  rowField: pivotRowField || '',
@@ -606,6 +611,7 @@ function getDateRange(dateRange, column, data) {
606
611
  return dateRange;
607
612
  }
608
613
  }
614
+ exports.getDateRange = getDateRange;
609
615
  function determineIntervalThroughOverride(dateBucket, dateRange) {
610
616
  switch (dateBucket) {
611
617
  case 'day':
@@ -702,6 +708,7 @@ function getDateString(value, dateRange, dateBucket) {
702
708
  fields: [{ field: 'date', format }],
703
709
  });
704
710
  }
711
+ exports.getDateString = getDateString;
705
712
  function isDateField(fieldType) {
706
713
  return (fieldType === 'date' ||
707
714
  fieldType === 'datetime' ||
@@ -8,5 +8,5 @@ import { QuillReportInternal } from '../Dashboard';
8
8
  */
9
9
  export declare function cleanDashboardItem(item: {
10
10
  [key: string]: any;
11
- } | undefined, dashboardFilters: any): QuillReportInternal;
11
+ } | undefined, dashboardFilters: any, client?: any, dateBucket?: string): Promise<QuillReportInternal>;
12
12
  //# sourceMappingURL=dashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA6B5E;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,GACpB,mBAAmB,CA0CrB"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAkC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B"}
@@ -4,6 +4,9 @@ exports.cleanDashboardItem = void 0;
4
4
  const valueFormatter_1 = require("./valueFormatter");
5
5
  const PivotModal_1 = require("../internals/ReportBuilder/PivotModal");
6
6
  const textProcessing_1 = require("./textProcessing");
7
+ const queryConstructor_1 = require("./queryConstructor");
8
+ const dataFetcher_1 = require("./dataFetcher");
9
+ const date_fns_1 = require("date-fns");
7
10
  const defaultDashboardItem = {
8
11
  id: '',
9
12
  name: '',
@@ -31,7 +34,7 @@ const defaultDashboardItem = {
31
34
  * interface to build amazing dashboards on top of.
32
35
  * @param item
33
36
  */
34
- function cleanDashboardItem(item, dashboardFilters) {
37
+ async function cleanDashboardItem(item, dashboardFilters, client, dateBucket) {
35
38
  if (!item)
36
39
  return defaultDashboardItem;
37
40
  if (!item.rows)
@@ -40,7 +43,7 @@ function cleanDashboardItem(item, dashboardFilters) {
40
43
  id: item._id,
41
44
  name: item.name,
42
45
  };
43
- const pivotTable = getPivotTable(item, dashboardFilters);
46
+ const pivotTable = await getPivotTable(item, dashboardFilters, client, dateBucket);
44
47
  const { primaryAggregation, comparisonAggregation, aggregationPercentChange, } = getAggragations(pivotTable, item);
45
48
  return {
46
49
  id: item._id,
@@ -109,12 +112,117 @@ function formatAggragation(item, value) {
109
112
  /**
110
113
  * Extract and transform the data from itemInfo.
111
114
  */
112
- function getPivotTable(report, dashboardFilters) {
115
+ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial) {
113
116
  if (!report)
114
117
  return undefined;
115
- const dateFilter = Object.values(dashboardFilters ?? {}).find((filter) => filter.filterType == 'date_range');
118
+ let dateFilter = Object.values(dashboardFilters ?? {}).find((filter) => filter.filterType === 'date_range' || filter.opterator === 'BETWEEN');
119
+ if (dateFilter?.opterator === 'BETWEEN') {
120
+ dateFilter.startDate = dateFilter.value[0];
121
+ dateFilter.endDate = dateFilter.value[1];
122
+ }
116
123
  const pivot = report?.pivot;
117
124
  const data = report || {};
125
+ if (client && client.databaseType.toLowerCase() === 'postgresql') {
126
+ try {
127
+ let dateRange = undefined;
128
+ let comparisonInterval = undefined;
129
+ let dateBucket = dateBucketInitial;
130
+ if (!dateBucket && pivot.rowFieldType !== 'string' && pivot.rowField) {
131
+ let filterDateRange = undefined;
132
+ if (dateFilter) {
133
+ filterDateRange = {
134
+ start: dateFilter.startDate,
135
+ end: dateFilter.endDate,
136
+ };
137
+ }
138
+ dateRange = (0, PivotModal_1.getDateRange)(filterDateRange, pivot.rowField, data.rows);
139
+ const difference = (0, date_fns_1.differenceInDays)(dateRange.end, dateRange.start);
140
+ if (difference < 14) {
141
+ dateBucket = 'day';
142
+ }
143
+ else if (difference < 60) {
144
+ dateBucket = 'week';
145
+ }
146
+ else if (difference < 365 * 3) {
147
+ dateBucket = 'month';
148
+ }
149
+ else {
150
+ dateBucket = 'year';
151
+ }
152
+ }
153
+ if (dateFilter && dateFilter && dateFilter.comparisonRange) {
154
+ const comparisonRange = (0, date_fns_1.differenceInDays)(dateFilter?.comparisonRange.endDate, dateFilter?.comparisonRange.startDate);
155
+ if (!isNaN(comparisonRange)) {
156
+ if (dateBucket === 'month') {
157
+ comparisonInterval = comparisonRange / 30 + ' month';
158
+ }
159
+ else if (dateBucket === 'year') {
160
+ comparisonInterval = comparisonRange / 365 + ' year';
161
+ }
162
+ else {
163
+ comparisonInterval = comparisonRange + ' day';
164
+ }
165
+ }
166
+ }
167
+ const sqlQuery = (0, queryConstructor_1.generatePivotQuery)(pivot, report.itemQuery, report.rows, dateBucket, comparisonInterval);
168
+ if (sqlQuery && report.rows.length > 0) {
169
+ const hostedBody = {
170
+ metadata: {
171
+ preQueries: [sqlQuery],
172
+ task: 'query',
173
+ orgId: client.customerId || '*',
174
+ clientId: client.publicKey,
175
+ databaseType: client?.databaseType,
176
+ getCustomFields: false,
177
+ runQueryConfig: {
178
+ overridePost: true,
179
+ convertDatatypes: true,
180
+ },
181
+ },
182
+ };
183
+ const cloudBody = { ...hostedBody };
184
+ const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody);
185
+ // With our current design we have to remove the second row field but leave the first for comparison purposes.
186
+ const rows = resp.queryResults[0].rows;
187
+ const columns = resp.queryResults[0].fields
188
+ .map((field) => ({
189
+ field: field.name,
190
+ label: field.name.replace('comparison_', 'comparison '),
191
+ }))
192
+ .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0);
193
+ if (pivot.rowFieldType !== 'string') {
194
+ rows.forEach((row) => {
195
+ row[pivot.rowField] = (0, PivotModal_1.getDateString)(row[pivot.rowField], undefined, dateBucket);
196
+ });
197
+ // add a row for each date in the range that doesn't have a value
198
+ if (pivot.rowFieldType !== 'string') {
199
+ const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
200
+ // create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
201
+ for (let date = dateFilter.startDate; date <= dateFilter.endDate; date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
202
+ const formattedDate = (0, PivotModal_1.getDateString)(date.toDateString(), undefined, dateBucket);
203
+ if (!dateSet.has(formattedDate)) {
204
+ const newRow = {};
205
+ newRow[pivot.rowField] = formattedDate;
206
+ rows.push(newRow);
207
+ dateSet.add(formattedDate);
208
+ }
209
+ // order the rows by the date field
210
+ rows.sort((a, b) => {
211
+ return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
212
+ ? -1
213
+ : 1;
214
+ });
215
+ }
216
+ }
217
+ }
218
+ return {
219
+ rows: rows,
220
+ columns: columns,
221
+ };
222
+ }
223
+ }
224
+ catch (e) { }
225
+ }
118
226
  return pivot && data.rows
119
227
  ? (0, PivotModal_1.generatePivotTable)(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
120
228
  dateFilter?.startDate && dateFilter?.endDate
@@ -1 +1 @@
1
- {"version":3,"file":"errorProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/errorProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,QAO/C"}
1
+ {"version":3,"file":"errorProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/errorProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,QAI/C"}
@@ -5,8 +5,5 @@ function processFilterErrorList(resp) {
5
5
  if (!resp || !resp.filterErrorList || !Array.isArray(resp.filterErrorList)) {
6
6
  return;
7
7
  }
8
- resp.filterErrorList.forEach((filterError) => {
9
- console.error(filterError);
10
- });
11
8
  }
12
9
  exports.processFilterErrorList = processFilterErrorList;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mergeComparisonRange = void 0;
4
4
  function mergeComparisonRange(resp) {
5
- if (resp.chartType === "table")
5
+ if (resp.chartType === 'table')
6
6
  return;
7
7
  mergeForwards(resp);
8
8
  // mergeBackwards(resp); // uncomment to switch back and forth
@@ -1 +1 @@
1
- {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAsCR;AAmED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EAsCvC;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAqCP"}
1
+ {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAsCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EAsCvC;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAqCP"}
@@ -34,48 +34,6 @@ function pivotToSql(pivot, query, columns) {
34
34
  return query;
35
35
  }
36
36
  exports.pivotToSql = pivotToSql;
37
- function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
38
- // const sqlAggregationType = convertToSqlAggregationType(aggregationType);
39
- return `with query_table as (${query}),
40
- distinct_column_fields as (
41
- select distinct
42
- ${columnField}
43
- from
44
- query_table
45
- ),
46
- case_when_query as (
47
- select
48
- string_agg(
49
- concat(
50
- '${aggregationType}(CASE WHEN ${columnField} = ''',
51
- replace(${columnField}, '''', ''''''),
52
- ''' THEN ${valueField} ELSE 0 END) AS ',
53
- concat(concat('"', replace(${columnField}, ' ', '_')), '"')
54
- ),
55
- ',
56
- '
57
- ) as sql_part
58
- from
59
- distinct_column_fields
60
- ),
61
- joined_queries as (
62
- select
63
- concat(
64
- 'WITH query_table as (${query}) SELECT ${rowField}, ',
65
- sql_part,
66
- '
67
- FROM query_table
68
- GROUP BY ${rowField}
69
- ORDER BY ${rowField}'
70
- ) as query
71
- from
72
- case_when_query
73
- )
74
- select
75
- query
76
- from
77
- joined_queries;`;
78
- }
79
37
  function generateTwoDPivotQuery(pivot, query, columns) {
80
38
  const caseWhens = columns.map((column) => {
81
39
  return `${pivot.aggregationType}(
@@ -1,2 +1,4 @@
1
+ import { Pivot } from '../internals/ReportBuilder/PivotModal';
1
2
  export declare function generateDistinctQuery(stringFields: string[], query: string): string;
3
+ export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], rows: any[], dateBucket?: string, comparisonInterval?: string): string | undefined;
2
4
  //# sourceMappingURL=queryConstructor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAe9D,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,GAAG,EAAE,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,GAAG,SAAS,CAiBpB"}
@@ -1,6 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateDistinctQuery = void 0;
3
+ exports.generatePivotQuery = exports.generateDistinctQuery = void 0;
4
+ const pivotProcessing_1 = require("./pivotProcessing");
5
+ function processAggType(aggType) {
6
+ if (aggType === 'count')
7
+ return 'SUM';
8
+ return aggType?.toLowerCase() === 'average' ? 'AVG' : aggType?.toLowerCase();
9
+ }
10
+ function processValueField(aggType, valueField) {
11
+ if (aggType === 'min' || aggType === 'max')
12
+ return `"${valueField}" ELSE null`;
13
+ if (aggType === 'count')
14
+ return `1 ELSE 0`;
15
+ return valueField ? `"${valueField}" ELSE 0` : `1 ELSE 0`;
16
+ }
4
17
  function generateDistinctQuery(stringFields, query) {
5
18
  const distinctQueries = stringFields.map((field) => {
6
19
  return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
@@ -9,3 +22,113 @@ function generateDistinctQuery(stringFields, query) {
9
22
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
10
23
  }
11
24
  exports.generateDistinctQuery = generateDistinctQuery;
25
+ function generatePivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
26
+ if (!(0, pivotProcessing_1.isValidPivot)(pivot)) {
27
+ return undefined;
28
+ }
29
+ if (!pivot.rowField) {
30
+ return undefined;
31
+ }
32
+ if (pivot.columnField) {
33
+ return create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval);
34
+ }
35
+ return create1DPivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
36
+ }
37
+ exports.generatePivotQuery = generatePivotQuery;
38
+ function create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
39
+ if (!pivot || !pivot.columnField) {
40
+ return undefined;
41
+ }
42
+ // @ts-ignore
43
+ const columnValues = rows.map((row) => row[pivot.columnField]);
44
+ const distinctColumnValues = Array.from(new Set(columnValues)).filter((value) => value !== undefined && value !== null);
45
+ if (distinctColumnValues.length === 0) {
46
+ return undefined;
47
+ }
48
+ if (pivot.rowFieldType === 'string') {
49
+ return create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues);
50
+ }
51
+ return create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket, comparisonInterval);
52
+ }
53
+ function create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues) {
54
+ const caseWhens = distinctColumnValues.map((column) => {
55
+ return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "${column}"`;
56
+ });
57
+ const caseWhensCompare = distinctColumnValues.map((column) => {
58
+ return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "comparison_${column}"`;
59
+ });
60
+ const compareCTE = itemQueries[1]
61
+ ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
62
+ : '';
63
+ const compareCaseWhenCTE = itemQueries[1]
64
+ ? `, quill_ct_cw as (SELECT "${pivot.rowField}" as "comparison_${pivot.rowField}", ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY ${pivot.rowField})`
65
+ : '';
66
+ const joinQuery = itemQueries[1]
67
+ ? `JOIN quill_ct_cw ct ON ct."comparison_${pivot.rowField}" = qt."${pivot.rowField}"`
68
+ : '';
69
+ return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
70
+ quill_qt_cw AS (SELECT ${pivot.rowField}, ${caseWhens.join(', ')} FROM quill_qt GROUP BY ${pivot.rowField})
71
+ ${compareCTE} ${compareCaseWhenCTE}
72
+ SELECT * FROM quill_qt_cw qt
73
+ ${joinQuery}`;
74
+ }
75
+ function create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket = 'month', comparisonInterval) {
76
+ const caseWhens = distinctColumnValues.map((column) => {
77
+ return `${processAggType(pivot.aggregationType)}(CASE WHEN qt."${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "${column}"`;
78
+ });
79
+ const caseWhensCompare = distinctColumnValues.map((column) => {
80
+ return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "comparison_${column}"`;
81
+ });
82
+ const compareCTE = itemQueries[1] && comparisonInterval
83
+ ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
84
+ : '';
85
+ const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
86
+ ? `, quill_ct_cw as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as comparison_${pivot.rowField}, ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))`
87
+ : '';
88
+ const joinQuery = itemQueries[1] && comparisonInterval
89
+ ? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval} day'))`
90
+ : '';
91
+ return `WITH quill_query_table AS (${itemQueries[0]?.replaceAll(';', '')}),
92
+ quill_qt_agg as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as ${pivot.rowField}, ${caseWhens.join(', ')} FROM quill_query_table qt GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))
93
+ ${compareCTE} ${compareCaseWhenCTE}
94
+ SELECT * FROM quill_qt_agg qt
95
+ ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
96
+ }
97
+ function create1DPivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
98
+ if (pivot.rowFieldType === 'string') {
99
+ return create1DStringPivotQuery(pivot, itemQueries);
100
+ }
101
+ return create1DDatePivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
102
+ }
103
+ function create1DStringPivotQuery(pivot, itemQueries) {
104
+ const compareCTE = itemQueries[1]
105
+ ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
106
+ : '';
107
+ const compareCaseWhenCTE = itemQueries[1]
108
+ ? `, quill_ct_cw as (SELECT ${pivot.rowField} as "comparison_${pivot.rowField}", ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct GROUP BY ${pivot.rowField})`
109
+ : '';
110
+ const joinQuery = itemQueries[1]
111
+ ? `JOIN quill_ct_cw ct ON ct."comparison_${pivot.rowField}" = qt."${pivot.rowField}"`
112
+ : '';
113
+ return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
114
+ quill_qt_cw AS (SELECT ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt GROUP BY ${pivot.rowField})
115
+ ${compareCTE} ${compareCaseWhenCTE}
116
+ SELECT * FROM quill_qt_cw qt
117
+ ${joinQuery}`;
118
+ }
119
+ function create1DDatePivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
120
+ const compareCTE = itemQueries[1] && comparisonInterval
121
+ ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
122
+ : '';
123
+ const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
124
+ ? `, quill_ct_cw as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as comparison_${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))`
125
+ : '';
126
+ const joinQuery = itemQueries[1] && comparisonInterval
127
+ ? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval}'))`
128
+ : '';
129
+ return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
130
+ quill_qt_agg AS (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))
131
+ ${compareCTE} ${compareCaseWhenCTE}
132
+ SELECT * FROM quill_qt_agg qt
133
+ ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
134
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAe7C,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA6DzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WAkE5D;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAKlE;AAED,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;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,GAAG,CAAC;IAE3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;OAEG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAEzC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE5C;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,KAAK,YAAY,CAAC;IAE7E;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAErC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1C,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAgD/B,CAAC;AAwyBF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAe7C,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA6DzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WA4F5D;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAKlE;AAED,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;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,GAAG,CAAC;IAE3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;OAEG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAEzC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE5C;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,KAAK,YAAY,CAAC;IAE7E;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAErC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1C,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAgD/B,CAAC;AA+yBF,eAAe,KAAK,CAAC"}
package/dist/esm/Chart.js CHANGED
@@ -66,12 +66,34 @@ export function isEquivalent(filters1, filters2) {
66
66
  return false;
67
67
  }
68
68
  }
69
+ else if (filter1?.operator === 'BETWEEN' &&
70
+ filter2?.operator === 'BETWEEN') {
71
+ if (!filter1?.values && !filter2?.values) {
72
+ continue;
73
+ }
74
+ else if (!filter1?.values || !filter2?.values) {
75
+ return false;
76
+ }
77
+ if (filter1?.values && filter2?.values) {
78
+ if (!areDatesNearby(filter1.values[0], filter2.values[0]) ||
79
+ !areDatesNearby(filter1.values[1], filter2.values[1])) {
80
+ return false;
81
+ }
82
+ }
83
+ }
69
84
  else if (filterType === 'date_range') {
85
+ if (!filter1.startDate && !filter2.startDate) {
86
+ continue;
87
+ }
70
88
  if (!areDatesNearby(filter1.startDate, filter2.startDate) ||
71
89
  !areDatesNearby(filter1.endDate, filter2.endDate)) {
72
90
  return false;
73
91
  }
74
92
  if (filter1.comparisonRange && filter2.comparisonRange) {
93
+ if (!filter1.comparisonRange.startDate &&
94
+ !filter2.comparisonRange.endDate) {
95
+ continue;
96
+ }
75
97
  if (!areDatesNearby(filter1.comparisonRange.startDate, filter2.comparisonRange.startDate) ||
76
98
  !areDatesNearby(filter1.comparisonRange.endDate, filter2.comparisonRange.endDate)) {
77
99
  return false;
@@ -225,7 +247,7 @@ const ChartUpdater = ({ colors, reportId, className, containerStyle, isAnimation
225
247
  ...resp,
226
248
  filtersApplied: minimalFilters.filter((f) => f.dashboardName === dashboard[reportId].dashboardName),
227
249
  };
228
- const cleanedReport = cleanDashboardItem(dashboardItem, filters);
250
+ const cleanedReport = await cleanDashboardItem(dashboardItem, filters);
229
251
  setReport(cleanedReport);
230
252
  dispatch({
231
253
  type: 'UPDATE_DASHBOARD_ITEM',
@@ -310,7 +332,7 @@ const ChartUpdater = ({ colors, reportId, className, containerStyle, isAnimation
310
332
  ...resp,
311
333
  filtersApplied: minimalFilters.filter((f) => f.dashboardName === dashboard[reportId].dashboardName),
312
334
  };
313
- const cleanedReport = cleanDashboardItem(dashboardItem, filters);
335
+ const cleanedReport = await cleanDashboardItem(dashboardItem, filters);
314
336
  if (cleanedReport.chartType === 'table' && cleanedReport.pivot) {
315
337
  cleanedReport.columns = cleanedReport.yAxisFields;
316
338
  }
@@ -356,6 +378,8 @@ const ChartDisplay = ({ reportId, config, colors, className, containerStyle, hid
356
378
  : ['#4E80EE', '#E14F62', '#55B5A6', '#E9A23B', '#6466E9', '#55B685'];
357
379
  }, [colors]);
358
380
  const rows = config?.pivotRows ?? config?.rows ?? [];
381
+ const dateFilter = !hideDateRangeFilter &&
382
+ findAndProcessDateFilter(Object.values(specificDashboardFilter ?? []));
359
383
  const getYAxisFields = () => {
360
384
  if (config && config.pivot && config.pivot.columnField) {
361
385
  return (config?.pivotColumns
@@ -376,12 +400,25 @@ const ChartDisplay = ({ reportId, config, colors, className, containerStyle, hid
376
400
  }) ?? []);
377
401
  }
378
402
  else {
403
+ if (dateFilter?.comparison &&
404
+ dateFilter.comparisonRange.value !== 'NO_COMPARISON') {
405
+ const comparisonYAxisFields = config?.yAxisFields?.map((field) => {
406
+ return {
407
+ ...field,
408
+ field: `comparison_${field.field}`,
409
+ label: `comparison ${field.label ?? field.field}`,
410
+ };
411
+ });
412
+ return (config?.pivotColumns ?? [
413
+ ...config?.yAxisFields,
414
+ ...comparisonYAxisFields,
415
+ ] ??
416
+ []);
417
+ }
379
418
  return config?.pivotColumns ?? config?.yAxisFields ?? [];
380
419
  }
381
420
  };
382
421
  const yAxisFields = getYAxisFields();
383
- const dateFilter = !hideDateRangeFilter &&
384
- findAndProcessDateFilter(Object.values(specificDashboardFilter ?? []));
385
422
  if (error) {
386
423
  return _jsx(ChartError, { className: className, containerStyle: containerStyle });
387
424
  }
@@ -462,19 +499,6 @@ const ChartDisplay = ({ reportId, config, colors, className, containerStyle, hid
462
499
  if (chartTypes.includes('bar')) {
463
500
  return (_jsx(BarList, { data: rows, theme: theme, yAxisFields: yAxisFields, colors: chartColors, xAxisField: config.xAxisField, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, className: className, colorMap: colorMap, onClickChartElement: onClickChartElement }));
464
501
  }
465
- if (yAxisFields.length === 1) {
466
- if (yAxisFields[0].label === '' && yAxisFields.length === 1) {
467
- yAxisFields[0].label = yAxisFields[0].label;
468
- }
469
- if (dateFilter?.comparison) {
470
- const sampleField = yAxisFields[0];
471
- yAxisFields[yAxisFields.length] = {
472
- ...sampleField,
473
- field: `comparison_${sampleField?.field}`,
474
- label: `comparison ${sampleField?.label}`,
475
- };
476
- }
477
- }
478
502
  if (chartTypes.includes('column')) {
479
503
  // Autofill the column chart with an empty column if there are no rows
480
504
  let barChartData = rows;
@@ -500,7 +524,8 @@ const ChartDisplay = ({ reportId, config, colors, className, containerStyle, hid
500
524
  break;
501
525
  }
502
526
  }
503
- return (_jsx(BarChart, { colors: chartColors, theme: theme, isStacked: config.pivot && yAxisFields.length > (dateFilter?.comparison ? 2 : 1), yAxisFields: yAxisFields, data: barChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: xAxisFormat, containerStyle: containerStyle, className: className, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, colorMap: colorMap, onClickChartElement: onClickChartElement, dateFilter: dateFilter }));
527
+ return (_jsx(BarChart, { colors: chartColors, theme: theme, isStacked: config.pivot && yAxisFields.length > (dateFilter?.comparison ? 2 : 1), yAxisFields: yAxisFields, data: barChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: xAxisFormat, containerStyle: containerStyle, className: className, comparison: dateFilter?.comparison &&
528
+ dateFilter.comparisonRange.value !== 'NO_COMPARISON', isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, colorMap: colorMap, onClickChartElement: onClickChartElement, dateFilter: dateFilter }));
504
529
  }
505
530
  if (chartTypes.includes('metric')) {
506
531
  const isComparison = rows?.length > 0 &&
@@ -150,7 +150,7 @@ export default function ChartEditor({ isOpen, reportId, isAdmin = false, destina
150
150
  ...resp,
151
151
  filtersApplied: specificDashboardFilter,
152
152
  };
153
- const cleanedReport = cleanDashboardItem(curDashboardItem, specificDashboardFilter);
153
+ const cleanedReport = await cleanDashboardItem(curDashboardItem, specificDashboardFilter);
154
154
  setDashboardItem({ ...dashboardItem, ...cleanedReport });
155
155
  dispatch({
156
156
  type: 'UPDATE_DASHBOARD_ITEM',
@@ -1,4 +1,4 @@
1
- import React, { ReactNode, ChangeEvent } from 'react';
1
+ import React, { CSSProperties, ReactNode, ChangeEvent } from 'react';
2
2
  import { Column } from './models/Columns';
3
3
  import { Filter } from './models/Filter';
4
4
  /**
@@ -231,6 +231,14 @@ export interface DashboardProps {
231
231
  }) => JSX.Element;
232
232
  /** A fallback component displayed when an active dashboard has no items. */
233
233
  EmptyDashboardComponent?: () => JSX.Element;
234
+ /** A component that displays a loading state for charts. */
235
+ DashboardLoadingComponent?: ({ showFilterLoading, numCharts, containerStyle, chartContainerStyle, LoadingComponent, }: {
236
+ showFilterLoading?: boolean;
237
+ numCharts?: number;
238
+ containerStyle?: CSSProperties;
239
+ chartContainerStyle?: CSSProperties;
240
+ LoadingComponent?: () => JSX.Element;
241
+ }) => JSX.Element;
234
242
  /** A callback fired when a report is clicked. */
235
243
  onClickReport?: (report: QuillReport) => void;
236
244
  /** A callback that is fired when the loading status of the dashboard changes. */
@@ -306,5 +314,5 @@ export interface DashboardProps {
306
314
  * ### API Reference
307
315
  * @see https://docs.quillsql.com/components/dashboard
308
316
  */
309
- export default function Dashboard({ name, hidden, SelectComponent, MultiSelectComponent, EmptyDashboardComponent, DateRangePickerComponent, MetricComponent, ChartComponent, TableComponent, DashboardSectionComponent, DashboardSectionContainerComponent, FilterContainerComponent, onClickReport, onChangeLoading, hideFilters, hideDateRangeFilter, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, containerStyle, className, chartContainerStyle, filters, onClickChartElement, dateBucket, additionalProcessing, }: DashboardProps): import("react/jsx-runtime").JSX.Element | null;
317
+ export default function Dashboard({ name, hidden, SelectComponent, MultiSelectComponent, EmptyDashboardComponent, DateRangePickerComponent, MetricComponent, ChartComponent, TableComponent, DashboardSectionComponent, DashboardSectionContainerComponent, FilterContainerComponent, DashboardLoadingComponent, onClickReport, onChangeLoading, hideFilters, hideDateRangeFilter, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, containerStyle, className, chartContainerStyle, filters, onClickChartElement, dateBucket, additionalProcessing, }: DashboardProps): import("react/jsx-runtime").JSX.Element | null;
310
318
  //# sourceMappingURL=Dashboard.d.ts.map