@quillsql/react 2.11.16 → 2.11.18
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 +109 -42
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +44 -18
- package/dist/cjs/ChartBuilder.d.ts +204 -30
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +124 -63
- package/dist/cjs/ChartEditor.d.ts +123 -19
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +47 -15
- package/dist/cjs/Dashboard.d.ts +148 -91
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +51 -159
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +5 -2
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/cjs/QuillProvider.d.ts +105 -2
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +59 -0
- package/dist/cjs/ReportBuilder.d.ts +194 -42
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +563 -416
- package/dist/cjs/SQLEditor.d.ts +160 -23
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +36 -30
- package/dist/cjs/Table.d.ts +119 -15
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +37 -6
- package/dist/cjs/TableChart.d.ts.map +1 -1
- package/dist/cjs/TableChart.js +0 -194
- package/dist/cjs/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -0
- package/dist/cjs/{BarList.js → components/Chart/BarList.js} +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -3
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +3 -3
- package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -0
- package/dist/cjs/{PieChart.js → components/Chart/PieChart.js} +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +2 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +6 -7
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +22 -0
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/cjs/components/Dashboard/DashboardFilter.js +75 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts +2 -12
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +39 -17
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +6 -9
- package/dist/cjs/components/QuillCard.d.ts +2 -7
- package/dist/cjs/components/QuillCard.d.ts.map +1 -1
- package/dist/cjs/components/QuillCard.js +15 -9
- package/dist/cjs/components/QuillSelect.d.ts +4 -1
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +13 -8
- package/dist/cjs/components/QuillTable.d.ts +16 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +4 -4
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +10 -6
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +5 -15
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +21 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +15 -17
- package/dist/cjs/components/ReportBuilder/bigDateMap.js +1 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +3 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +60 -21
- package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -10
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +23 -10
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +82 -18
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +55 -103
- package/dist/cjs/components/ReportBuilder/util.d.ts +10 -4
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +124 -71
- package/dist/cjs/components/UiComponents.d.ts +81 -87
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +76 -103
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.d.ts.map +1 -1
- package/dist/cjs/hooks/index.js +3 -1
- package/dist/cjs/hooks/useTheme.d.ts +7 -0
- package/dist/cjs/hooks/useTheme.d.ts.map +1 -0
- package/dist/cjs/hooks/useTheme.js +12 -0
- package/dist/cjs/index.d.ts +10 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +5 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -21
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +30 -14
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +77 -52
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +2 -0
- package/dist/cjs/utils/parserBigQuery.d.ts +6 -0
- package/dist/cjs/utils/parserBigQuery.d.ts.map +1 -0
- package/dist/cjs/utils/parserBigQuery.js +60 -0
- package/dist/cjs/utils/parserPostgres.d.ts +3 -0
- package/dist/cjs/utils/parserPostgres.d.ts.map +1 -0
- package/dist/cjs/utils/parserPostgres.js +42 -0
- package/dist/esm/Chart.d.ts +109 -42
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +45 -19
- package/dist/esm/ChartBuilder.d.ts +204 -30
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +124 -63
- package/dist/esm/ChartEditor.d.ts +123 -19
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +51 -19
- package/dist/esm/Dashboard.d.ts +148 -91
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +54 -160
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +6 -3
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/esm/QuillProvider.d.ts +105 -2
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +59 -0
- package/dist/esm/ReportBuilder.d.ts +194 -42
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +566 -419
- package/dist/esm/SQLEditor.d.ts +160 -23
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +36 -30
- package/dist/esm/Table.d.ts +119 -15
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +38 -7
- package/dist/esm/TableChart.d.ts.map +1 -1
- package/dist/esm/TableChart.js +0 -194
- package/dist/esm/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
- package/dist/esm/{BarList.js → components/Chart/BarList.js} +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts +2 -3
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +3 -3
- package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
- package/dist/esm/{PieChart.js → components/Chart/PieChart.js} +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +2 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +5 -6
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +22 -0
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/esm/components/Dashboard/DashboardFilter.js +71 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.d.ts +2 -12
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +39 -17
- package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +6 -9
- package/dist/esm/components/QuillCard.d.ts +2 -7
- package/dist/esm/components/QuillCard.d.ts.map +1 -1
- package/dist/esm/components/QuillCard.js +15 -9
- package/dist/esm/components/QuillSelect.d.ts +4 -1
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +14 -9
- package/dist/esm/components/QuillTable.d.ts +16 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +4 -4
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.js +10 -6
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +5 -15
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +21 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +17 -19
- package/dist/esm/components/ReportBuilder/bigDateMap.js +1 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts +3 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +51 -13
- package/dist/esm/components/ReportBuilder/operators.d.ts +15 -10
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +23 -10
- package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +82 -18
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +53 -101
- package/dist/esm/components/ReportBuilder/util.d.ts +10 -4
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +114 -67
- package/dist/esm/components/UiComponents.d.ts +81 -87
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +71 -102
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.d.ts.map +1 -1
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/useTheme.d.ts +7 -0
- package/dist/esm/hooks/useTheme.d.ts.map +1 -0
- package/dist/esm/hooks/useTheme.js +10 -0
- package/dist/esm/index.d.ts +10 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +5 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +21 -21
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +30 -14
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +77 -52
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +2 -0
- package/dist/esm/utils/parserBigQuery.d.ts +6 -0
- package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
- package/dist/esm/utils/parserBigQuery.js +52 -0
- package/dist/esm/utils/parserPostgres.d.ts +3 -0
- package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
- package/dist/esm/utils/parserPostgres.js +37 -0
- package/package.json +1 -1
- package/dist/cjs/BarList.d.ts.map +0 -1
- package/dist/cjs/PieChart.d.ts.map +0 -1
- package/dist/esm/BarList.d.ts.map +0 -1
- package/dist/esm/PieChart.d.ts.map +0 -1
- /package/dist/cjs/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
- /package/dist/esm/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Functions use to parse BigQuery SQL
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isEqualsBigQuery = exports.isTheCurrentIntervalBigQuery = exports.isBeforeBigQuery = exports.isAfterBigQuery = exports.isInTheLastIntervalBigQuery = void 0;
|
|
5
|
+
const isInTheLastIntervalBigQuery = (node) => {
|
|
6
|
+
const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
|
|
7
|
+
(node.left.type === 'column_ref' ||
|
|
8
|
+
(node.left.type === 'function' &&
|
|
9
|
+
node.left.name.toLowerCase() === 'timestamp')) &&
|
|
10
|
+
node.right.type === 'function' &&
|
|
11
|
+
node.right.name.toLowerCase() === 'timestamp_sub' &&
|
|
12
|
+
node.right.args.value[0].type === 'function' &&
|
|
13
|
+
node.right.args.value[1].type === 'interval' &&
|
|
14
|
+
['current_timestamp'].includes(node.right.args.value[0].name.toLowerCase());
|
|
15
|
+
return isOutsideOfDateTrunc;
|
|
16
|
+
};
|
|
17
|
+
exports.isInTheLastIntervalBigQuery = isInTheLastIntervalBigQuery;
|
|
18
|
+
const isAfterBigQuery = (node) => {
|
|
19
|
+
const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
|
|
20
|
+
(node.left.type === 'column_ref' ||
|
|
21
|
+
(node.left.type === 'function' &&
|
|
22
|
+
node.left.name.toLowerCase() === 'timestamp')) &&
|
|
23
|
+
((node.right.type === 'function' &&
|
|
24
|
+
node.right.name.toLowerCase() === 'timestamp') ||
|
|
25
|
+
node.right.type === 'timestamp');
|
|
26
|
+
return isOutsideOfDateTrunc;
|
|
27
|
+
};
|
|
28
|
+
exports.isAfterBigQuery = isAfterBigQuery;
|
|
29
|
+
const isBeforeBigQuery = (node) => {
|
|
30
|
+
const isOutsideOfDateTrunc = ['<=', '<'].includes(node.operator) &&
|
|
31
|
+
(node.left.type === 'column_ref' ||
|
|
32
|
+
(node.left.type === 'function' &&
|
|
33
|
+
node.left.name.toLowerCase() === 'timestamp')) &&
|
|
34
|
+
((node.right.type === 'function' &&
|
|
35
|
+
node.right.name.toLowerCase() === 'timestamp') ||
|
|
36
|
+
node.right.type === 'timestamp');
|
|
37
|
+
return isOutsideOfDateTrunc;
|
|
38
|
+
};
|
|
39
|
+
exports.isBeforeBigQuery = isBeforeBigQuery;
|
|
40
|
+
const isTheCurrentIntervalBigQuery = (node) => {
|
|
41
|
+
const isInsideOfDateTrunc = ['='].includes(node.operator) &&
|
|
42
|
+
node.left.type === 'function' &&
|
|
43
|
+
node.left.name &&
|
|
44
|
+
node.left.name.toLowerCase() === 'timestamp_trunc' &&
|
|
45
|
+
node.right.type === 'function' &&
|
|
46
|
+
node.right.name.toLowerCase() === 'timestamp_trunc' &&
|
|
47
|
+
node.right.args?.value[0]?.name?.toLowerCase() === 'current_timestamp';
|
|
48
|
+
return isInsideOfDateTrunc;
|
|
49
|
+
};
|
|
50
|
+
exports.isTheCurrentIntervalBigQuery = isTheCurrentIntervalBigQuery;
|
|
51
|
+
const isEqualsBigQuery = (node) => {
|
|
52
|
+
const isEquals = ['='].includes(node.operator) &&
|
|
53
|
+
node.left.type === 'function' &&
|
|
54
|
+
node.left.name &&
|
|
55
|
+
node.left.name.toLowerCase() === 'timestamp_trunc' &&
|
|
56
|
+
node.right.name.toLowerCase() === 'timestamp_trunc' &&
|
|
57
|
+
node.right.args.value[0].type.toLowerCase() === 'timestamp';
|
|
58
|
+
return isEquals;
|
|
59
|
+
};
|
|
60
|
+
exports.isEqualsBigQuery = isEqualsBigQuery;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parserPostgres.d.ts","sourceRoot":"","sources":["../../../src/utils/parserPostgres.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,SAAU,GAAG,KAAG,OAyBvD,CAAC;AAEF,eAAO,MAAM,4BAA4B,SAAU,GAAG,KAAG,OAiBxD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTheCurrentIntervalPostgres = exports.isInTheLastIntervalPostgres = void 0;
|
|
4
|
+
const isInTheLastIntervalPostgres = (node) => {
|
|
5
|
+
const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
|
|
6
|
+
node.left.type === 'column_ref' &&
|
|
7
|
+
node.right.type === 'binary_expr' &&
|
|
8
|
+
node.right.operator === '-' &&
|
|
9
|
+
node.right.left.type === 'function' &&
|
|
10
|
+
node.right.left.name.toLowerCase() === 'date_trunc' &&
|
|
11
|
+
node.right.left.args.value[0].type === 'single_quote_string' &&
|
|
12
|
+
node.right.left.args.value[1].type === 'function' &&
|
|
13
|
+
['current_date', 'now'].includes(node.right.left.args.value[1].name.toLowerCase()) &&
|
|
14
|
+
node.right.right.type.toLowerCase() === 'interval' &&
|
|
15
|
+
node.right.right.expr.type === 'single_quote_string';
|
|
16
|
+
const noDateTrunc = ['>=', '>'].includes(node.operator) &&
|
|
17
|
+
node.left.type === 'column_ref' &&
|
|
18
|
+
node.right.type === 'binary_expr' &&
|
|
19
|
+
node.right.operator === '-' &&
|
|
20
|
+
node.right.left.type === 'function' &&
|
|
21
|
+
['current_date', 'now'].includes(node.right.left.name.toLowerCase()) &&
|
|
22
|
+
node.right.right.type.toLowerCase() === 'interval' &&
|
|
23
|
+
node.right.right.expr.type === 'single_quote_string';
|
|
24
|
+
return isOutsideOfDateTrunc || noDateTrunc;
|
|
25
|
+
};
|
|
26
|
+
exports.isInTheLastIntervalPostgres = isInTheLastIntervalPostgres;
|
|
27
|
+
const isTheCurrentIntervalPostgres = (node) => {
|
|
28
|
+
const isInsideOfDateTrunc = ['AND'].includes(node.operator) &&
|
|
29
|
+
(node.left.operator === '=' || node.left.type === 'double_quote_string') &&
|
|
30
|
+
node.right.operator === '=' &&
|
|
31
|
+
node.right.name &&
|
|
32
|
+
node.right.name.toLowerCase() === 'date_trunc' &&
|
|
33
|
+
node.args.value[0].type === 'single_quote_string' &&
|
|
34
|
+
node.args.value[1].type === 'binary_expr' &&
|
|
35
|
+
node.args.value[1].operator === '-' &&
|
|
36
|
+
node.args.value[1].left.type === 'function' &&
|
|
37
|
+
['now', 'current_date'].includes(node.args.value[1].left.name.toLowerCase()) &&
|
|
38
|
+
node.args.value[1].right.type === 'interval' &&
|
|
39
|
+
node.args.value[1].right.expr.type === 'single_quote_string';
|
|
40
|
+
return isInsideOfDateTrunc;
|
|
41
|
+
};
|
|
42
|
+
exports.isTheCurrentIntervalPostgres = isTheCurrentIntervalPostgres;
|
package/dist/esm/Chart.d.ts
CHANGED
|
@@ -1,46 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { QuillTheme } from './QuillProvider';
|
|
3
|
-
|
|
4
|
-
colors?: string[];
|
|
5
|
-
containerStyle?: React.CSSProperties;
|
|
6
|
-
dateFilter?: any;
|
|
7
|
-
theme?: any;
|
|
8
|
-
isDateFilter?: boolean;
|
|
9
|
-
isAnimationActive?: boolean;
|
|
10
|
-
hideXAxis?: boolean;
|
|
11
|
-
hideYAxis?: boolean;
|
|
12
|
-
hideCartesianGrid?: boolean;
|
|
13
|
-
dashedComparison?: boolean;
|
|
14
|
-
dateRangeFilterDisabled?: boolean;
|
|
15
|
-
singlePointStyle?: 'dot' | 'line';
|
|
16
|
-
mapColorsToFields?: (_dashboardItem: DashboardItem, _theme: QuillTheme) => ColorMapType;
|
|
17
|
-
}
|
|
18
|
-
interface WithChartId extends BaseChartProps {
|
|
19
|
-
chartId: string;
|
|
20
|
-
}
|
|
21
|
-
export type FieldFormat = 'whole_number' | 'one_decimal_place' | 'two_decimal_places' | 'dollar_amount' | 'dollar_cents' | 'MMM_yyyy' | 'MMM_dd_yyyy' | 'MMM_dd-MMM_dd' | 'MMM_dd_hh:mm_ap_pm' | 'hh_ap_pm' | 'percent' | 'string';
|
|
22
|
-
interface YAxisField {
|
|
23
|
-
label: string;
|
|
24
|
-
field: string;
|
|
25
|
-
chartType: string;
|
|
26
|
-
format: FieldFormat;
|
|
27
|
-
}
|
|
28
|
-
export interface DashboardItem {
|
|
29
|
-
id: string;
|
|
30
|
-
name: string;
|
|
31
|
-
chartType: string;
|
|
32
|
-
xAxisField: string;
|
|
33
|
-
xAxisLabel: string;
|
|
34
|
-
xAxisFormat: FieldFormat;
|
|
35
|
-
yAxisFields: YAxisField[];
|
|
36
|
-
rows: any[];
|
|
37
|
-
columns: any[];
|
|
38
|
-
pivot: any;
|
|
39
|
-
}
|
|
40
|
-
interface WithConfig extends BaseChartProps {
|
|
41
|
-
config: DashboardItem | any;
|
|
42
|
-
}
|
|
43
|
-
type ChartProps = WithChartId | WithConfig;
|
|
3
|
+
import { type DashboardItem } from './Dashboard';
|
|
44
4
|
export declare function didFiltersChange(dashboardItem: any, filters: any): boolean;
|
|
45
5
|
export type ColorMapType = {
|
|
46
6
|
[key: string]: {
|
|
@@ -52,6 +12,113 @@ export type ColorMapType = {
|
|
|
52
12
|
comparisonGradientStop?: string;
|
|
53
13
|
};
|
|
54
14
|
};
|
|
55
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Props for the Quill Chart component.
|
|
17
|
+
*/
|
|
18
|
+
export interface ChartProps {
|
|
19
|
+
/**
|
|
20
|
+
* A dashboard item to render, if any.
|
|
21
|
+
*
|
|
22
|
+
* When config is passed, the chart will not refetch the given dashboard item
|
|
23
|
+
* and will instead simply render the item it was given.
|
|
24
|
+
*
|
|
25
|
+
* A `config` must be passed if `chartId` is not present.
|
|
26
|
+
*/
|
|
27
|
+
config?: DashboardItem | any;
|
|
28
|
+
/**
|
|
29
|
+
* A dashboard item to render, if any.
|
|
30
|
+
*
|
|
31
|
+
* When a chartId is passed, the chart will first fetch the data necessary to
|
|
32
|
+
* render this chart, and then it will render the dashboard item that it
|
|
33
|
+
* receives from the server.
|
|
34
|
+
*
|
|
35
|
+
* A `chartId` must be passed if `config` is not present.
|
|
36
|
+
*/
|
|
37
|
+
chartId?: string;
|
|
38
|
+
/**
|
|
39
|
+
* A list of color strings used to color the chart.
|
|
40
|
+
*
|
|
41
|
+
* For example, a pie chart would use the colors for each section and a bar
|
|
42
|
+
* chart would use the colors for each bar.
|
|
43
|
+
*/
|
|
44
|
+
colors?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* Whether to show animations on render complete.
|
|
47
|
+
*/
|
|
48
|
+
isAnimationActive?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Whether to hide the x axis.
|
|
51
|
+
*/
|
|
52
|
+
hideXAxis?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Whether to hide the y axis.
|
|
55
|
+
*/
|
|
56
|
+
hideYAxis?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Whether to hide the cartesian grid lines.
|
|
59
|
+
*/
|
|
60
|
+
hideCartesianGrid?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Whether the date range filter has been disabled.
|
|
63
|
+
*/
|
|
64
|
+
hideDateRangeFilter?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Whether the comparison range shows as dashed for date comparison line
|
|
67
|
+
* charts (as opposed to the default solid line).
|
|
68
|
+
*/
|
|
69
|
+
comparisonLineStyle?: 'solid' | 'dashed';
|
|
70
|
+
/**
|
|
71
|
+
* An optional function that takes a dashboard item and theme and returns a
|
|
72
|
+
* map of keys used in that dashboard item to the colors they should use.
|
|
73
|
+
*
|
|
74
|
+
* The color values support RGB hexcodes and CSS color literals.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```js
|
|
78
|
+
* let mapColorsToFields = (item, theme) => {
|
|
79
|
+
* return {
|
|
80
|
+
* // all the queries with yAxis of 'amount' get colored this way:
|
|
81
|
+
* amount: {
|
|
82
|
+
* primary: 'red',
|
|
83
|
+
* comparison: 'gray',
|
|
84
|
+
* primaryGradientStart: 'red',
|
|
85
|
+
* primaryGradientStop: 'lightred',
|
|
86
|
+
* comparisonGradientStart: '#EFEFEF',
|
|
87
|
+
* comparisonGradientStop: '#EFEFEF00',
|
|
88
|
+
* },
|
|
89
|
+
* total: {
|
|
90
|
+
* primary: 'red'
|
|
91
|
+
* },
|
|
92
|
+
* };
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
mapColorsToFields?: (dashboardItem: DashboardItem, theme: QuillTheme) => ColorMapType;
|
|
97
|
+
/**
|
|
98
|
+
* Styles the top-level container of the Chart.
|
|
99
|
+
*/
|
|
100
|
+
containerStyle?: React.CSSProperties;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* ### Quill Chart
|
|
104
|
+
*
|
|
105
|
+
* A simple component that displays the given data in one of many chart types.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```js
|
|
109
|
+
* // Usage with chart id (will auto-fetch data)
|
|
110
|
+
* <Chart chartId="12345" />
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```js
|
|
115
|
+
* // Usage with a dashboard item (will not auto-fetch data)
|
|
116
|
+
* <Chart config={dashboardItem} />
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* ### Chart API
|
|
120
|
+
* @see https://docs.quillsql.com/components/chart
|
|
121
|
+
*/
|
|
122
|
+
declare const Chart: (props: ChartProps) => import("react/jsx-runtime").JSX.Element;
|
|
56
123
|
export default Chart;
|
|
57
124
|
//# sourceMappingURL=Chart.d.ts.map
|
package/dist/esm/Chart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";
|
|
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;AA+FjD,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;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAqC/B,CAAC;AA+hBF,eAAe,KAAK,CAAC"}
|
package/dist/esm/Chart.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* eslint-disable no-unused-vars */
|
|
2
3
|
import { useState, useEffect, useContext, useMemo } from 'react';
|
|
3
4
|
import { differenceInHours } from 'date-fns';
|
|
4
|
-
import BarList from './BarList';
|
|
5
|
-
import PieChart from './PieChart';
|
|
6
|
-
import { ClientContext, DashboardContext,
|
|
5
|
+
import BarList from './components/Chart/BarList';
|
|
6
|
+
import PieChart from './components/Chart/PieChart';
|
|
7
|
+
import { ClientContext, DashboardContext, DashboardFiltersContext, } from './Context';
|
|
7
8
|
import QuillTable from './components/QuillTable';
|
|
8
9
|
import { getData } from './utils/dataFetcher';
|
|
9
10
|
import { generatePivotTable, generatePivotTableYAxis, } from './internals/ReportBuilder/PivotModal';
|
|
@@ -16,6 +17,7 @@ import ChartError from './components/Chart/ChartError';
|
|
|
16
17
|
import { COMPARISON_OPTIONS } from './DateRangePicker/dateRangePickerUtils';
|
|
17
18
|
import { quillFormat } from './utils/valueFormatter';
|
|
18
19
|
import { downloadCSV } from './utils/csv';
|
|
20
|
+
import useTheme from './hooks/useTheme';
|
|
19
21
|
// @ts-ignore
|
|
20
22
|
function sumByKey(arr, key) {
|
|
21
23
|
// @ts-ignore
|
|
@@ -76,11 +78,33 @@ function fallbackMapColorsToFields(_dashboardItem, _theme) {
|
|
|
76
78
|
// By default, if the key is not in the map we use the colors array.
|
|
77
79
|
return {};
|
|
78
80
|
}
|
|
79
|
-
|
|
81
|
+
/**
|
|
82
|
+
* ### Quill Chart
|
|
83
|
+
*
|
|
84
|
+
* A simple component that displays the given data in one of many chart types.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```js
|
|
88
|
+
* // Usage with chart id (will auto-fetch data)
|
|
89
|
+
* <Chart chartId="12345" />
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```js
|
|
94
|
+
* // Usage with a dashboard item (will not auto-fetch data)
|
|
95
|
+
* <Chart config={dashboardItem} />
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* ### Chart API
|
|
99
|
+
* @see https://docs.quillsql.com/components/chart
|
|
100
|
+
*/
|
|
101
|
+
const Chart = (props) => {
|
|
102
|
+
// Cast the props to the internal version so we can use the inherited types.
|
|
103
|
+
let data = props;
|
|
80
104
|
if ('config' in data) {
|
|
81
105
|
return (_jsx(ChartDisplay, { ...data, error: data.config.rows ? undefined : 'No rows found', loading: Boolean(!data.config), isComparison: Boolean(data?.config?.compareRows?.length) }));
|
|
82
106
|
}
|
|
83
|
-
const
|
|
107
|
+
const theme = useTheme();
|
|
84
108
|
const chartColors = useMemo(() => {
|
|
85
109
|
return data.colors?.length
|
|
86
110
|
? data.colors
|
|
@@ -88,9 +112,9 @@ const Chart = (data) => {
|
|
|
88
112
|
? theme.chartColors
|
|
89
113
|
: ['#4E80EE', '#E14F62', '#55B5A6', '#E9A23B', '#6466E9', '#55B685'];
|
|
90
114
|
}, [data.colors]);
|
|
91
|
-
return (_jsx(ChartUpdater, { chartId: data.chartId, containerStyle: data.containerStyle, colors: chartColors,
|
|
115
|
+
return (_jsx(ChartUpdater, { chartId: data.chartId, 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 }));
|
|
92
116
|
};
|
|
93
|
-
const ChartUpdater = ({ colors, chartId, containerStyle,
|
|
117
|
+
const ChartUpdater = ({ colors, chartId, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, hideDateRangeFilter, mapColorsToFields, }) => {
|
|
94
118
|
const { dispatch, dashboard } = useContext(DashboardContext);
|
|
95
119
|
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
96
120
|
const [initialLoad, setInitialLoad] = useState(true);
|
|
@@ -99,6 +123,7 @@ const ChartUpdater = ({ colors, chartId, containerStyle, theme, isAnimationActiv
|
|
|
99
123
|
const [isComparison, setIsComparison] = useState(false);
|
|
100
124
|
const [colorMap, setColorMap] = useState({});
|
|
101
125
|
const [client, _] = useContext(ClientContext);
|
|
126
|
+
const theme = useTheme();
|
|
102
127
|
useEffect(() => {
|
|
103
128
|
async function getChartOptions() {
|
|
104
129
|
setLoading(true);
|
|
@@ -108,7 +133,7 @@ const ChartUpdater = ({ colors, chartId, containerStyle, theme, isAnimationActiv
|
|
|
108
133
|
}
|
|
109
134
|
try {
|
|
110
135
|
// Remove extra fields on each filter so we don't confuse the backend.
|
|
111
|
-
const allowDateRange = !
|
|
136
|
+
const allowDateRange = !hideDateRangeFilter;
|
|
112
137
|
const minimalFilters = Object.values(dashboardFilters).length
|
|
113
138
|
? Object.values(dashboardFilters)
|
|
114
139
|
.filter((f) => allowDateRange || f.filterType !== 'date_range')
|
|
@@ -166,11 +191,11 @@ const ChartUpdater = ({ colors, chartId, containerStyle, theme, isAnimationActiv
|
|
|
166
191
|
setInitialLoad(false);
|
|
167
192
|
getChartOptions();
|
|
168
193
|
}, [dashboardFilters, client, chartId]);
|
|
169
|
-
return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid,
|
|
194
|
+
return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, isComparison: isComparison, loading: loading || initialLoad, error: error, colorMap: colorMap }));
|
|
170
195
|
};
|
|
171
|
-
const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid,
|
|
196
|
+
const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, isAnimationActive, loading = false, error = undefined, isComparison = false, colorMap, }) => {
|
|
172
197
|
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
173
|
-
const
|
|
198
|
+
const theme = useTheme();
|
|
174
199
|
const chartColors = useMemo(() => {
|
|
175
200
|
return colors?.length
|
|
176
201
|
? colors
|
|
@@ -298,13 +323,14 @@ const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hi
|
|
|
298
323
|
return (_jsx(BarChart, { colors: chartColors, theme: theme, isStacked: isPivot && yAxisFields.length > (dateFilter?.comparison ? 2 : 1), yAxisFields: yAxisFields, data: barChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, colorMap: colorMap }));
|
|
299
324
|
}
|
|
300
325
|
if (chartTypes.includes('metric')) {
|
|
301
|
-
const data = config;
|
|
302
|
-
const
|
|
303
|
-
|
|
326
|
+
const data = config;
|
|
327
|
+
const rows = pivotTable?.rows ?? data.rows ?? [];
|
|
328
|
+
const isComparison = rows?.length > 0 &&
|
|
329
|
+
Object.keys(rows[0]).includes(`comparison_${data.xAxisField}`);
|
|
304
330
|
const primaryMetricLabel = data?.filtersApplied?.date_range?.preset?.label;
|
|
305
331
|
const comparisonKey = data?.filtersApplied?.date_range?.comparisonRange?.value;
|
|
306
332
|
const comparisonLabel = COMPARISON_OPTIONS.find((opt) => opt.value === comparisonKey)?.text;
|
|
307
|
-
if (
|
|
333
|
+
if (rows?.length === 0 || rows[0][data.xAxisField] === null) {
|
|
308
334
|
return (_jsx("div", { style: {
|
|
309
335
|
display: 'flex',
|
|
310
336
|
flex: '1 0 auto',
|
|
@@ -342,7 +368,7 @@ const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hi
|
|
|
342
368
|
marginRight: 'auto',
|
|
343
369
|
}, children: [_jsx("span", { children: data.rows?.length > 0 &&
|
|
344
370
|
valueFormatter({
|
|
345
|
-
value:
|
|
371
|
+
value: rows[0][data.xAxisField] ?? 0,
|
|
346
372
|
field: data.xAxisField,
|
|
347
373
|
fields: [
|
|
348
374
|
{
|
|
@@ -371,9 +397,9 @@ const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hi
|
|
|
371
397
|
fontWeight: '500',
|
|
372
398
|
fontFamily: theme?.fontFamily,
|
|
373
399
|
color: theme?.secondaryTextColor,
|
|
374
|
-
}, children:
|
|
400
|
+
}, children: rows?.length > 0 &&
|
|
375
401
|
valueFormatter({
|
|
376
|
-
value:
|
|
402
|
+
value: rows[0][`comparison_${data.xAxisField}`] ?? 0,
|
|
377
403
|
field: data.xAxisField,
|
|
378
404
|
fields: [
|
|
379
405
|
{
|
|
@@ -407,6 +433,6 @@ const ChartDisplay = ({ config, colors, containerStyle, hideXAxis, hideYAxis, hi
|
|
|
407
433
|
{ [xAxis]: endDate, [yAxis]: '0' },
|
|
408
434
|
];
|
|
409
435
|
}
|
|
410
|
-
return (_jsx(LineChart, { colors: chartColors, colorMap: colorMap, yAxisFields: yAxisFields, data: lineChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, theme: theme, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid,
|
|
436
|
+
return (_jsx(LineChart, { colors: chartColors, colorMap: colorMap, yAxisFields: yAxisFields, data: lineChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, theme: theme, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle ?? 'solid' }));
|
|
411
437
|
};
|
|
412
438
|
export default Chart;
|