@quillsql/react 2.11.23 → 2.11.24
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.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +32 -16
- package/dist/cjs/ChartBuilder.d.ts +55 -2
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +223 -206
- package/dist/cjs/ChartEditor.d.ts +49 -2
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +3 -3
- package/dist/cjs/Dashboard.d.ts +5 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +42 -18
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
- package/dist/cjs/ReportBuilder.d.ts +57 -2
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +969 -684
- package/dist/cjs/SQLEditor.d.ts +83 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +10 -2
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +8 -6
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarList.js +0 -153
- package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +13 -7
- package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
- package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +32 -31
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +11 -12
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +13 -2
- package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/constants.js +14 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +14 -3
- package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +19 -27
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +54 -28
- package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +3 -0
- package/dist/cjs/components/UiComponents.d.ts +34 -4
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +165 -68
- package/dist/cjs/hooks/useQuill.d.ts +1 -0
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
- package/dist/cjs/utils/axisFormatter.js +3 -3
- package/dist/cjs/utils/getDomain.d.ts.map +1 -1
- package/dist/cjs/utils/getDomain.js +3 -0
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +2 -0
- package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/pivotProcessing.js +177 -0
- package/dist/cjs/utils/queryConstructor.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
- package/dist/cjs/utils/queryConstructor.js +11 -0
- package/dist/cjs/utils/tableProcessing.d.ts +7 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/tableProcessing.js +84 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +40 -8
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +33 -17
- package/dist/esm/ChartBuilder.d.ts +55 -2
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +225 -208
- package/dist/esm/ChartEditor.d.ts +49 -2
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +4 -4
- package/dist/esm/Dashboard.d.ts +5 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +21 -20
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
- package/dist/esm/ReportBuilder.d.ts +57 -2
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +971 -687
- package/dist/esm/SQLEditor.d.ts +83 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +11 -3
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +8 -6
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarList.js +0 -153
- package/dist/esm/components/Chart/ChartError.d.ts +1 -1
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +13 -7
- package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +6 -7
- package/dist/esm/components/Chart/LineChart.d.ts +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +32 -31
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +82 -0
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +11 -12
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +11 -1
- package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/constants.js +13 -0
- package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +14 -3
- package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +19 -27
- package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +55 -29
- package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +3 -0
- package/dist/esm/components/UiComponents.d.ts +34 -4
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +155 -66
- package/dist/esm/hooks/useQuill.d.ts +1 -0
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
- package/dist/esm/utils/axisFormatter.js +3 -3
- package/dist/esm/utils/getDomain.d.ts.map +1 -1
- package/dist/esm/utils/getDomain.js +3 -0
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +2 -0
- package/dist/esm/utils/pivotProcessing.d.ts +20 -0
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/esm/utils/pivotProcessing.js +170 -0
- package/dist/esm/utils/queryConstructor.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.js +7 -0
- package/dist/esm/utils/tableProcessing.d.ts +7 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
- package/dist/esm/utils/tableProcessing.js +80 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +41 -9
- package/package.json +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
|
@@ -20,10 +20,10 @@ const axisFormatter = ({ value, field, fields, }) => {
|
|
|
20
20
|
const HANDLERS = {
|
|
21
21
|
percent: formatPercent,
|
|
22
22
|
dollar_amount: formatDollarAmount,
|
|
23
|
-
dollar_cents:
|
|
23
|
+
dollar_cents: formatDollarAmount, // no cents for axis format
|
|
24
24
|
whole_number: formatWholeNumber,
|
|
25
|
-
one_decimal_place:
|
|
26
|
-
two_decimal_places:
|
|
25
|
+
one_decimal_place: formatWholeNumber, // no decimals for axis format
|
|
26
|
+
two_decimal_places: formatWholeNumber, // no decimals for axis format
|
|
27
27
|
string: formatString,
|
|
28
28
|
yyyy: format_YYYY,
|
|
29
29
|
MMM_yyyy: format_MMM_yyyy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAkCtE"}
|
|
@@ -26,6 +26,9 @@ function getDomain(data, fields) {
|
|
|
26
26
|
if (minValue === 0 && maxValue === 0) {
|
|
27
27
|
return [0, 1];
|
|
28
28
|
}
|
|
29
|
+
if (minValue === Infinity && maxValue === -Infinity) {
|
|
30
|
+
return [0, 1];
|
|
31
|
+
}
|
|
29
32
|
return fuzzyRound(Math.min(minValue, 0), maxValue);
|
|
30
33
|
}
|
|
31
34
|
exports.default = getDomain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,QAI7C"}
|
package/dist/cjs/utils/merge.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mergeComparisonRange = void 0;
|
|
4
4
|
function mergeComparisonRange(resp) {
|
|
5
|
+
if (resp.chartType === "table")
|
|
6
|
+
return;
|
|
5
7
|
mergeForwards(resp);
|
|
6
8
|
// mergeBackwards(resp); // uncomment to switch back and forth
|
|
7
9
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
+
export declare function pivotToSql(pivot: Pivot, query: string, client: any): {
|
|
3
|
+
query: string;
|
|
4
|
+
preQueries?: string[];
|
|
5
|
+
runQueryConfig?: any;
|
|
6
|
+
} | undefined;
|
|
7
|
+
export declare function isValidPivot(pivot: Pivot): boolean;
|
|
8
|
+
export declare function getPossiblePivotFieldOptions(columns: any, uniqueValues: {
|
|
9
|
+
[field: string]: any;
|
|
10
|
+
}): {
|
|
11
|
+
rowFields: string[];
|
|
12
|
+
columnFields: string[];
|
|
13
|
+
valueFields: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function cleanPivot(pivot: Pivot, possibleColumns: {
|
|
16
|
+
rowFields: any;
|
|
17
|
+
columnFields: any;
|
|
18
|
+
valueFields: any;
|
|
19
|
+
}): Pivot;
|
|
20
|
+
//# sourceMappingURL=pivotProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAG9D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,GAAG,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,SAAS,CAgD5E;AAmDD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EA8CvC;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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cleanPivot = exports.getPossiblePivotFieldOptions = exports.isValidPivot = exports.pivotToSql = void 0;
|
|
4
|
+
const ChartBuilder_1 = require("../ChartBuilder");
|
|
5
|
+
const ast_1 = require("../components/ReportBuilder/ast");
|
|
6
|
+
const util_1 = require("../components/ReportBuilder/util");
|
|
7
|
+
function pivotToSql(pivot, query, client) {
|
|
8
|
+
const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
|
|
9
|
+
? 'avg'
|
|
10
|
+
: pivot.aggregationType?.toLowerCase();
|
|
11
|
+
if ((!pivot.rowField && pivot.valueField && processedAggType) ||
|
|
12
|
+
(!pivot.valueField && pivot.rowField && processedAggType === 'count')) {
|
|
13
|
+
// table aggregation
|
|
14
|
+
return {
|
|
15
|
+
query: `with
|
|
16
|
+
prePivotQuery as (${query})
|
|
17
|
+
SELECT ${processedAggType}(${pivot.valueField ?? pivot.rowField}) FROM prePivotQuery`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
else if (!pivot.columnField &&
|
|
21
|
+
processedAggType &&
|
|
22
|
+
pivot.rowField &&
|
|
23
|
+
pivot.valueField) {
|
|
24
|
+
// 1-d pivot
|
|
25
|
+
return {
|
|
26
|
+
query: `with
|
|
27
|
+
prePivotQuery as (${query})
|
|
28
|
+
SELECT ${pivot.rowField}, ${processedAggType}(${pivot.valueField}) FROM prePivotQuery GROUP BY ${pivot.rowField}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
else if (pivot.columnField &&
|
|
32
|
+
pivot.rowField &&
|
|
33
|
+
pivot.valueField &&
|
|
34
|
+
processedAggType) {
|
|
35
|
+
// 2-d pivot
|
|
36
|
+
const sqlQuery = createPivotSqlQuery(pivot.rowField, pivot.columnField, pivot.valueField, processedAggType, query);
|
|
37
|
+
return {
|
|
38
|
+
preQueries: [sqlQuery],
|
|
39
|
+
query: '',
|
|
40
|
+
runQueryConfig: { getPivotQuery: true },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
exports.pivotToSql = pivotToSql;
|
|
46
|
+
function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
|
|
47
|
+
// const sqlAggregationType = convertToSqlAggregationType(aggregationType);
|
|
48
|
+
return `with querytable as (${query}),
|
|
49
|
+
DistinctProducts as (
|
|
50
|
+
select distinct
|
|
51
|
+
${columnField}
|
|
52
|
+
from
|
|
53
|
+
querytable
|
|
54
|
+
),
|
|
55
|
+
DynamicSQL as (
|
|
56
|
+
select
|
|
57
|
+
string_agg(
|
|
58
|
+
concat(
|
|
59
|
+
'${aggregationType}(CASE WHEN ${columnField} = ''',
|
|
60
|
+
replace(${columnField}, '''', ''''''),
|
|
61
|
+
''' THEN ${valueField} ELSE 0 END) AS ',
|
|
62
|
+
concat(concat('"', replace(${columnField}, ' ', '_')), '"')
|
|
63
|
+
),
|
|
64
|
+
',
|
|
65
|
+
'
|
|
66
|
+
) as sql_part
|
|
67
|
+
from
|
|
68
|
+
DistinctProducts
|
|
69
|
+
),
|
|
70
|
+
FinalQuery as (
|
|
71
|
+
select
|
|
72
|
+
concat(
|
|
73
|
+
'WITH querytable as (${query}) SELECT ${rowField}, ',
|
|
74
|
+
sql_part,
|
|
75
|
+
'
|
|
76
|
+
FROM querytable
|
|
77
|
+
GROUP BY ${rowField}
|
|
78
|
+
ORDER BY ${rowField}'
|
|
79
|
+
) as query
|
|
80
|
+
from
|
|
81
|
+
DynamicSQL
|
|
82
|
+
)
|
|
83
|
+
select
|
|
84
|
+
query
|
|
85
|
+
from
|
|
86
|
+
FinalQuery;`;
|
|
87
|
+
}
|
|
88
|
+
function isValidPivot(pivot) {
|
|
89
|
+
if (pivot.rowField && pivot.aggregationType === 'count') {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
else if (pivot.rowField && pivot.valueField && pivot.aggregationType) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
else if (pivot.valueField && pivot.aggregationType) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
else if (pivot.rowField &&
|
|
99
|
+
pivot.columnField &&
|
|
100
|
+
pivot.valueField &&
|
|
101
|
+
pivot.aggregationType) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
exports.isValidPivot = isValidPivot;
|
|
107
|
+
function getPossiblePivotFieldOptions(columns, uniqueValues) {
|
|
108
|
+
let rowFields = [];
|
|
109
|
+
let columnFields = [];
|
|
110
|
+
let valueFields = [];
|
|
111
|
+
for (let column of columns) {
|
|
112
|
+
// row fields can be dates or strings
|
|
113
|
+
if (column.format === 'date' ||
|
|
114
|
+
column.fieldType === 'date' ||
|
|
115
|
+
ChartBuilder_1.dateFormatOptions.includes(column.format)) {
|
|
116
|
+
rowFields.push(column.field);
|
|
117
|
+
}
|
|
118
|
+
// column fields can be strings
|
|
119
|
+
if (column.format === 'string') {
|
|
120
|
+
const possibleValues = uniqueValues ? uniqueValues[column.field] : 0;
|
|
121
|
+
const isNullValuesOnly = !possibleValues ||
|
|
122
|
+
(Object.keys(possibleValues).length === 1 &&
|
|
123
|
+
Object.keys(possibleValues)[0] === 'null');
|
|
124
|
+
if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
|
|
125
|
+
columnFields.push(column.field);
|
|
126
|
+
}
|
|
127
|
+
if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
|
|
128
|
+
rowFields.push(column.field);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// value fields can be numbers
|
|
132
|
+
if (column.format === 'whole_number' ||
|
|
133
|
+
ChartBuilder_1.numberFormatOptions.includes(column.format) ||
|
|
134
|
+
(0, ast_1.isNumericColumnType)(column.fieldType)) {
|
|
135
|
+
if (!(0, util_1.isIdColumn)(column.field)) {
|
|
136
|
+
valueFields.push(column.field);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
rowFields,
|
|
142
|
+
columnFields,
|
|
143
|
+
valueFields,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
exports.getPossiblePivotFieldOptions = getPossiblePivotFieldOptions;
|
|
147
|
+
function cleanPivot(pivot, possibleColumns) {
|
|
148
|
+
if (possibleColumns.columnFields.length === 0 &&
|
|
149
|
+
possibleColumns.rowFields.length === 0 &&
|
|
150
|
+
possibleColumns.valueFields.length === 0) {
|
|
151
|
+
return pivot;
|
|
152
|
+
}
|
|
153
|
+
// Swap row field and column field if the AI put a date field as the column field
|
|
154
|
+
if (pivot.columnField &&
|
|
155
|
+
!possibleColumns.columnFields.includes(pivot.columnField)) {
|
|
156
|
+
if (possibleColumns.rowFields.includes(pivot.columnField)) {
|
|
157
|
+
const rowField = pivot.rowField;
|
|
158
|
+
pivot.rowField = pivot.columnField;
|
|
159
|
+
pivot.columnField = possibleColumns.columnFields.includes(rowField)
|
|
160
|
+
? rowField
|
|
161
|
+
: undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (pivot.rowField && !possibleColumns.rowFields.includes(pivot.rowField)) {
|
|
165
|
+
pivot.rowField = '';
|
|
166
|
+
}
|
|
167
|
+
if (pivot.valueField &&
|
|
168
|
+
!possibleColumns.valueFields.includes(pivot.valueField)) {
|
|
169
|
+
pivot.valueField = '';
|
|
170
|
+
}
|
|
171
|
+
if (pivot.columnField &&
|
|
172
|
+
!possibleColumns.columnFields.includes(pivot.columnField)) {
|
|
173
|
+
pivot.columnField = undefined;
|
|
174
|
+
}
|
|
175
|
+
return pivot;
|
|
176
|
+
}
|
|
177
|
+
exports.cleanPivot = cleanPivot;
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateDistinctQuery = void 0;
|
|
4
|
+
function generateDistinctQuery(stringFields, query) {
|
|
5
|
+
const distinctQueries = stringFields.map((field) => {
|
|
6
|
+
return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
|
|
7
|
+
});
|
|
8
|
+
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
9
|
+
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
10
|
+
}
|
|
11
|
+
exports.generateDistinctQuery = generateDistinctQuery;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ColumnInfo } from '../components/ReportBuilder/schema';
|
|
2
|
+
export declare const getUniqueValuesByColumns: (columns: ColumnInfo[], query: string, rows: any, client: any) => Promise<{
|
|
3
|
+
[column: string]: {
|
|
4
|
+
[value: string]: boolean;
|
|
5
|
+
};
|
|
6
|
+
} | null>;
|
|
7
|
+
//# sourceMappingURL=tableProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,oCAAoC,CAAC;AAI3E,eAAO,MAAM,wBAAwB,YAC1B,UAAU,EAAE,SACd,MAAM,QACP,GAAG,UACD,GAAG;;;;SA2DZ,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUniqueValuesByColumns = void 0;
|
|
4
|
+
const dataFetcher_1 = require("./dataFetcher");
|
|
5
|
+
const queryConstructor_1 = require("./queryConstructor");
|
|
6
|
+
const getUniqueValuesByColumns = async (columns, query, rows, client) => {
|
|
7
|
+
const stringNames = columns.map(
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
(column) => column.name || column.field);
|
|
10
|
+
const uniqueValues = {};
|
|
11
|
+
if (!client.databaseType ||
|
|
12
|
+
client.databaseType.toLowerCase() === 'bigquery') {
|
|
13
|
+
if (rows.length === 0) {
|
|
14
|
+
const hostedBody = {
|
|
15
|
+
metadata: {
|
|
16
|
+
query: query,
|
|
17
|
+
task: 'query',
|
|
18
|
+
orgId: client.customerId || '*',
|
|
19
|
+
clientId: client.publicKey,
|
|
20
|
+
databaseType: client?.databaseType,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const cloudBody = { query };
|
|
24
|
+
const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
25
|
+
if (data.errorMessage) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
rows = data.rows;
|
|
29
|
+
}
|
|
30
|
+
for (const column of columns) {
|
|
31
|
+
const values = Array.from(
|
|
32
|
+
//@ts-ignore
|
|
33
|
+
new Set(rows.map((row) => row[column.name || column.field])));
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
uniqueValues[column.name || column.field] = values.reduce((result, value) => {
|
|
36
|
+
result[value] = false;
|
|
37
|
+
return result;
|
|
38
|
+
}, {});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const distinctValueQuery = (0, queryConstructor_1.generateDistinctQuery)(stringNames, query);
|
|
43
|
+
const distinctStrings = await fetchDistinctStrings(distinctValueQuery, client);
|
|
44
|
+
for (const column of distinctStrings) {
|
|
45
|
+
uniqueValues[column.column] = column.values;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return uniqueValues;
|
|
49
|
+
};
|
|
50
|
+
exports.getUniqueValuesByColumns = getUniqueValuesByColumns;
|
|
51
|
+
const fetchDistinctStrings = async (query, client) => {
|
|
52
|
+
try {
|
|
53
|
+
const hostedBody = {
|
|
54
|
+
metadata: {
|
|
55
|
+
query,
|
|
56
|
+
task: 'query',
|
|
57
|
+
orgId: client.customerId || '*',
|
|
58
|
+
clientId: client.publicKey,
|
|
59
|
+
databaseType: client?.databaseType,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const cloudBody = { query };
|
|
63
|
+
const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
64
|
+
if (data.errorMessage) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const results = data.rows.map((columnInfo) => {
|
|
68
|
+
const column = columnInfo.field;
|
|
69
|
+
if (!columnInfo.string_values) {
|
|
70
|
+
return { column, values: {} };
|
|
71
|
+
}
|
|
72
|
+
const values = columnInfo.string_values.reduce((result, value) => {
|
|
73
|
+
result[value] = false;
|
|
74
|
+
return result;
|
|
75
|
+
}, {});
|
|
76
|
+
return { column, values };
|
|
77
|
+
});
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(e);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAQ7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAoCH,CAAC;AAoMF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MA6CF,CAAC"}
|
|
@@ -54,8 +54,6 @@ const valueFormatter = ({ value, field, fields }) => {
|
|
|
54
54
|
};
|
|
55
55
|
exports.valueFormatter = valueFormatter;
|
|
56
56
|
const quillFormat = ({ value, format, }) => {
|
|
57
|
-
if (value === undefined || value === null)
|
|
58
|
-
return '';
|
|
59
57
|
const HANDLERS = {
|
|
60
58
|
percent: formatPercent,
|
|
61
59
|
dollar_amount: formatDollarAmount,
|
|
@@ -67,6 +65,7 @@ const quillFormat = ({ value, format, }) => {
|
|
|
67
65
|
yyyy: format_YYYY,
|
|
68
66
|
MMM_yyyy: format_MMM_yyyy,
|
|
69
67
|
MMM_dd_yyyy: format_MMM_dd_yyyy,
|
|
68
|
+
MMM_dd: format_MMM_dd,
|
|
70
69
|
hh_ap_pm: format_hh_ap_pm,
|
|
71
70
|
'MMM_dd-MMM_dd': format_MMM_dd_MMM_dd,
|
|
72
71
|
'MMM_dd_hh:mm_ap_pm': format_MMM_dd_hh_mm_ap_pm,
|
|
@@ -78,6 +77,7 @@ const quillFormat = ({ value, format, }) => {
|
|
|
78
77
|
// if bigquery date type, we have to pull the value out of the json
|
|
79
78
|
if (exports.DATE_FORMAT_TYPES.includes(formatType) &&
|
|
80
79
|
typeof value === 'object' &&
|
|
80
|
+
value &&
|
|
81
81
|
value.value) {
|
|
82
82
|
return HANDLERS[formatType](value.value);
|
|
83
83
|
}
|
|
@@ -93,6 +93,9 @@ exports.quillFormat = quillFormat;
|
|
|
93
93
|
* Formats the value as a string using the built-in converstion.
|
|
94
94
|
*/
|
|
95
95
|
const formatString = (value) => {
|
|
96
|
+
if (!value) {
|
|
97
|
+
return 'null';
|
|
98
|
+
}
|
|
96
99
|
if (typeof value === 'object') {
|
|
97
100
|
return JSON.stringify(value);
|
|
98
101
|
}
|
|
@@ -192,6 +195,7 @@ const _getUTCDateHelper = (value, fmt) => {
|
|
|
192
195
|
const format_YYYY = (value) => _getUTCDateHelper(value, 'yyyy');
|
|
193
196
|
const format_MMM_yyyy = (value) => _getUTCDateHelper(value, 'MMM yyyy');
|
|
194
197
|
const format_hh_ap_pm = (value) => _getUTCDateHelper(value, 'hh:mm aa');
|
|
198
|
+
const format_MMM_dd = (value) => _getUTCDateHelper(value, 'MMM dd');
|
|
195
199
|
const format_MMM_dd_yyyy = (value) => {
|
|
196
200
|
return _getUTCDateHelper(value, 'dd MMM yyyy');
|
|
197
201
|
};
|
|
@@ -243,6 +247,26 @@ function parseNumber(value) {
|
|
|
243
247
|
}
|
|
244
248
|
// Moved this out of parseNumber for perf reasons
|
|
245
249
|
const localeFormatter = Intl.NumberFormat(typeof navigator !== 'undefined' ? navigator.language : 'en-US');
|
|
250
|
+
const FORMATS = [
|
|
251
|
+
'dd MMM yyyy',
|
|
252
|
+
'yyyy-mm-dd',
|
|
253
|
+
'MMM yyyy',
|
|
254
|
+
'MMM do h a',
|
|
255
|
+
'MMM do h:mm a',
|
|
256
|
+
];
|
|
257
|
+
function isValidDate(dateString) {
|
|
258
|
+
const date = getValidDate(dateString);
|
|
259
|
+
if (date)
|
|
260
|
+
return true;
|
|
261
|
+
// Try parsing as native date object
|
|
262
|
+
const d = new Date(dateString);
|
|
263
|
+
return !isNaN(d.getTime());
|
|
264
|
+
// return FORMATS.some((fmt) => isValid(parse(d, fmt, new Date())));
|
|
265
|
+
}
|
|
266
|
+
function getValidDate(dateString) {
|
|
267
|
+
const dates = FORMATS.map((fmt) => (0, date_fns_1.parse)(dateString, fmt, new Date()));
|
|
268
|
+
return dates.find((date) => (0, date_fns_1.isValid)(date));
|
|
269
|
+
}
|
|
246
270
|
const compareValues = (a, b, column) => {
|
|
247
271
|
const valueA = a[column];
|
|
248
272
|
const valueB = b[column];
|
|
@@ -266,16 +290,24 @@ const compareValues = (a, b, column) => {
|
|
|
266
290
|
else if (valueB === undefined) {
|
|
267
291
|
return 1; // ValueB is undefined, consider it smaller
|
|
268
292
|
}
|
|
293
|
+
// For dates
|
|
294
|
+
if (isValidDate(valueA) && isValidDate(valueB)) {
|
|
295
|
+
const dateA = new Date(valueA);
|
|
296
|
+
const dateB = new Date(valueB);
|
|
297
|
+
if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
|
|
298
|
+
return dateA.getTime() - dateB.getTime();
|
|
299
|
+
}
|
|
300
|
+
// Handle edge case for AM/PM date formats
|
|
301
|
+
const date1 = getValidDate(valueA);
|
|
302
|
+
const date2 = getValidDate(valueB);
|
|
303
|
+
if (date1 && date2) {
|
|
304
|
+
return date1.getTime() - date2.getTime();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
269
307
|
// For numbers
|
|
270
308
|
if (!isNaN(parseNumber(valueA)) && !isNaN(parseNumber(valueB))) {
|
|
271
309
|
return parseNumber(valueA) - parseNumber(valueB);
|
|
272
310
|
}
|
|
273
|
-
// For dates
|
|
274
|
-
const dateA = new Date(valueA);
|
|
275
|
-
const dateB = new Date(valueB);
|
|
276
|
-
if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
|
|
277
|
-
return dateA.getTime() - dateB.getTime();
|
|
278
|
-
}
|
|
279
311
|
// For strings
|
|
280
312
|
return valueA.localeCompare(valueB);
|
|
281
313
|
};
|
package/dist/esm/Chart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAkGjD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,WAQhE;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,aAAa,GAAG,GAAG,CAAC;IAE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;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,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAEzC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,EAAE,CAClB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,YAAY,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAuC/B,CAAC;AAukBF,eAAe,KAAK,CAAC"}
|
package/dist/esm/Chart.js
CHANGED
|
@@ -8,7 +8,7 @@ import { ClientContext, DashboardContext, DashboardFiltersContext, } from './Con
|
|
|
8
8
|
import QuillTable from './components/QuillTable';
|
|
9
9
|
import { getData } from './utils/dataFetcher';
|
|
10
10
|
import { generatePivotTable, generatePivotTableYAxis, } from './internals/ReportBuilder/PivotModal';
|
|
11
|
-
import { valueFormatter } from './utils/valueFormatter';
|
|
11
|
+
import { DATE_FORMAT_TYPES, valueFormatter } from './utils/valueFormatter';
|
|
12
12
|
import LineChart from './components/Chart/LineChart';
|
|
13
13
|
import BarChart from './components/Chart/BarChart';
|
|
14
14
|
import { mergeComparisonRange } from './utils/merge';
|
|
@@ -18,6 +18,7 @@ import { COMPARISON_OPTIONS } from './DateRangePicker/dateRangePickerUtils';
|
|
|
18
18
|
import { quillFormat } from './utils/valueFormatter';
|
|
19
19
|
import { downloadCSV } from './utils/csv';
|
|
20
20
|
import useTheme from './hooks/useTheme';
|
|
21
|
+
const MAX_ROWS_FOR_GENERIC_TABLE = 300;
|
|
21
22
|
// @ts-ignore
|
|
22
23
|
function sumByKey(arr, key) {
|
|
23
24
|
// @ts-ignore
|
|
@@ -102,7 +103,8 @@ const Chart = (props) => {
|
|
|
102
103
|
// Cast the props to the internal version so we can use the inherited types.
|
|
103
104
|
let data = props;
|
|
104
105
|
if ('config' in data) {
|
|
105
|
-
|
|
106
|
+
const isLoading = Boolean(!data.config);
|
|
107
|
+
return (_jsx(ChartDisplay, { ...data, error: isLoading || data.config?.rows ? undefined : 'No rows found', loading: isLoading, isComparison: Boolean(data?.config?.compareRows?.length) }));
|
|
106
108
|
}
|
|
107
109
|
const theme = useTheme();
|
|
108
110
|
const chartColors = useMemo(() => {
|
|
@@ -114,7 +116,7 @@ const Chart = (props) => {
|
|
|
114
116
|
}, [data.colors]);
|
|
115
117
|
return (_jsx(ChartUpdater, { chartId: data.chartId, className: data.className, containerStyle: data.containerStyle, colors: chartColors, isAnimationActive: data.isAnimationActive, hideXAxis: data.hideXAxis, hideYAxis: data.hideYAxis, hideCartesianGrid: data.hideCartesianGrid, hideDateRangeFilter: data.hideDateRangeFilter, comparisonLineStyle: data.comparisonLineStyle, mapColorsToFields: data.mapColorsToFields ?? fallbackMapColorsToFields }));
|
|
116
118
|
};
|
|
117
|
-
const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, hideDateRangeFilter, mapColorsToFields, }) => {
|
|
119
|
+
const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, hideDateRangeFilter = false, mapColorsToFields, }) => {
|
|
118
120
|
const { dispatch, dashboard } = useContext(DashboardContext);
|
|
119
121
|
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
120
122
|
const [initialLoad, setInitialLoad] = useState(true);
|
|
@@ -191,9 +193,9 @@ const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationA
|
|
|
191
193
|
setInitialLoad(false);
|
|
192
194
|
getChartOptions();
|
|
193
195
|
}, [dashboardFilters, client, chartId]);
|
|
194
|
-
return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, className: className, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, isComparison: isComparison, loading: loading || initialLoad, error: error, colorMap: colorMap }));
|
|
196
|
+
return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, className: className, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, hideDateRangeFilter: hideDateRangeFilter, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, isComparison: isComparison, loading: loading || initialLoad, error: error, colorMap: colorMap }));
|
|
195
197
|
};
|
|
196
|
-
const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, isAnimationActive, loading = false, error = undefined, isComparison = false, colorMap, }) => {
|
|
198
|
+
const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid, hideDateRangeFilter = false, comparisonLineStyle, isAnimationActive, loading = false, error = undefined, isComparison = false, colorMap, }) => {
|
|
197
199
|
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
198
200
|
const theme = useTheme();
|
|
199
201
|
const chartColors = useMemo(() => {
|
|
@@ -203,7 +205,8 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
|
|
|
203
205
|
? theme.chartColors
|
|
204
206
|
: ['#4E80EE', '#E14F62', '#55B5A6', '#E9A23B', '#6466E9', '#55B685'];
|
|
205
207
|
}, [colors]);
|
|
206
|
-
const dateFilter =
|
|
208
|
+
const dateFilter = !hideDateRangeFilter &&
|
|
209
|
+
Object.values(dashboardFilters).find((filter) => filter.filterType == 'date_range');
|
|
207
210
|
const isPivot = config?.pivot;
|
|
208
211
|
const pivotTable = useMemo(() => {
|
|
209
212
|
const pivot = config?.pivot;
|
|
@@ -234,10 +237,15 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
|
|
|
234
237
|
if (error) {
|
|
235
238
|
return _jsx(ChartError, { className: className, containerStyle: containerStyle });
|
|
236
239
|
}
|
|
240
|
+
else if (!pivotTable &&
|
|
241
|
+
config &&
|
|
242
|
+
config.rows &&
|
|
243
|
+
config.rows.length > MAX_ROWS_FOR_GENERIC_TABLE) {
|
|
244
|
+
return (_jsx(ChartError, { className: className, containerStyle: containerStyle, label: "Charts can only display 100 rows. Please add a pivot or modify the query." }));
|
|
245
|
+
}
|
|
237
246
|
else if (!config || loading) {
|
|
238
|
-
return _jsx(ChartSkeleton, { className: className, containerStyle: containerStyle });
|
|
247
|
+
return (_jsx(ChartSkeleton, { className: className, containerStyle: containerStyle }));
|
|
239
248
|
}
|
|
240
|
-
// TODO: Figure out if we can use ?? to coalesce these into the variable.
|
|
241
249
|
const chartTypes = [config?.chartType];
|
|
242
250
|
if (chartTypes.includes('pie')) {
|
|
243
251
|
const rows = pivotTable ? pivotTable.rows : config.rows;
|
|
@@ -299,13 +307,18 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
|
|
|
299
307
|
const yAxisFields = pivotTableYAxis
|
|
300
308
|
? pivotTableYAxis
|
|
301
309
|
: config.yAxisFields;
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
310
|
+
if (yAxisFields.length === 1) {
|
|
311
|
+
if (yAxisFields[0].label === '' && config.yAxisFields.length === 1) {
|
|
312
|
+
yAxisFields[0].label = config.yAxisFields[0].label;
|
|
313
|
+
}
|
|
314
|
+
if (isComparison) {
|
|
315
|
+
const sampleField = yAxisFields[0];
|
|
316
|
+
yAxisFields[yAxisFields.length] = {
|
|
317
|
+
...sampleField,
|
|
318
|
+
field: `comparison_${sampleField?.field}`,
|
|
319
|
+
label: `comparison ${sampleField?.label}`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
309
322
|
}
|
|
310
323
|
const data = (pivotTable ? pivotTable.rows : config.rows)
|
|
311
324
|
// filter out any rows with a comparison key but no corresponding primary
|
|
@@ -366,7 +379,7 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
|
|
|
366
379
|
gap: 4,
|
|
367
380
|
alignItems: 'baseline',
|
|
368
381
|
marginRight: 'auto',
|
|
369
|
-
}, children: [_jsx("span", { children:
|
|
382
|
+
}, children: [_jsx("span", { children: rows?.length > 0 &&
|
|
370
383
|
valueFormatter({
|
|
371
384
|
value: rows[0][data.xAxisField] ?? 0,
|
|
372
385
|
field: data.xAxisField,
|
|
@@ -422,7 +435,10 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
|
|
|
422
435
|
// Autofill the line chart with two zero values, so they form a line at 0.0
|
|
423
436
|
// when there are no rows on the config.
|
|
424
437
|
let lineChartData = data;
|
|
425
|
-
|
|
438
|
+
const xAxisFieldFormat = config.columns.find((col) => col.field === config.xAxisField)?.format;
|
|
439
|
+
if (dateFilter &&
|
|
440
|
+
DATE_FORMAT_TYPES.includes(xAxisFieldFormat) &&
|
|
441
|
+
(!data || data.length === 0)) {
|
|
426
442
|
const xAxis = config.xAxisField;
|
|
427
443
|
const yAxis = yAxisFields[0]?.field;
|
|
428
444
|
const format = config.columns.find((c) => c.field === xAxis).format;
|