@quillsql/react 2.12.30 → 2.12.31
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 +6 -37
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +86 -327
- package/dist/cjs/ChartBuilder.d.ts +12 -49
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +68 -36
- package/dist/cjs/ChartEditor.d.ts +1 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +11 -7
- package/dist/cjs/Context.d.ts +4 -1
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +10 -4
- package/dist/cjs/Dashboard.d.ts +61 -114
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +261 -30
- package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePicker.js +0 -26
- package/dist/cjs/ReportBuilder.d.ts +1 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +62 -97
- package/dist/cjs/SQLEditor.d.ts +2 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +10 -5
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +41 -43
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +12 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +25 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +7 -7
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +64 -28
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +11 -45
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +1 -30
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +16 -1
- package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +4 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +10 -2
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +94 -70
- package/dist/cjs/components/ReportBuilder/convert.d.ts +7 -2
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +53 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +6 -6
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +6 -22
- package/dist/cjs/components/UiComponents.d.ts +26 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +97 -4
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +19 -3
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -0
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/models/Columns.d.ts +2 -1
- package/dist/cjs/models/Columns.d.ts.map +1 -1
- package/dist/cjs/models/Filter.d.ts +15 -4
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +9 -1
- package/dist/cjs/models/Report.d.ts +10 -23
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +37 -2
- package/dist/cjs/utils/columnProcessing.d.ts +2 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +54 -1
- package/dist/cjs/utils/dashboard.d.ts +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +3 -56
- package/dist/cjs/utils/dataProcessing.d.ts +4 -2
- package/dist/cjs/utils/dataProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/dataProcessing.js +18 -1
- package/dist/cjs/utils/dates.d.ts +2 -1
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +23 -1
- package/dist/cjs/utils/filterProcessing.d.ts +7 -1
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +100 -13
- package/dist/cjs/utils/pivotConstructor.d.ts +2 -1
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +7 -1
- package/dist/cjs/utils/report.d.ts +4 -1
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +94 -7
- package/dist/cjs/utils/tableProcessing.d.ts +1 -1
- package/dist/esm/Chart.d.ts +6 -37
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +87 -329
- package/dist/esm/ChartBuilder.d.ts +12 -49
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +68 -33
- package/dist/esm/ChartEditor.d.ts +1 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +11 -7
- package/dist/esm/Context.d.ts +4 -1
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +9 -3
- package/dist/esm/Dashboard.d.ts +61 -114
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +263 -32
- package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePicker.js +0 -26
- package/dist/esm/ReportBuilder.d.ts +1 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +64 -99
- package/dist/esm/SQLEditor.d.ts +2 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +11 -6
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +42 -44
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +13 -2
- package/dist/esm/components/Chart/LineChart.d.ts +2 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +26 -2
- package/dist/esm/components/Dashboard/DataLoader.d.ts +7 -7
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +65 -29
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +11 -45
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +1 -30
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +16 -1
- package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +5 -2
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +10 -2
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +94 -70
- package/dist/esm/components/ReportBuilder/convert.d.ts +7 -2
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +51 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.js +280 -13
- package/dist/esm/components/ReportBuilder/ui.d.ts +6 -6
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +6 -22
- package/dist/esm/components/UiComponents.d.ts +26 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +95 -3
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +19 -3
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -0
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/models/Columns.d.ts +2 -1
- package/dist/esm/models/Columns.d.ts.map +1 -1
- package/dist/esm/models/Filter.d.ts +15 -4
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +8 -0
- package/dist/esm/models/Report.d.ts +10 -23
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/test-utils/constants.d.ts +56 -0
- package/dist/esm/test-utils/constants.d.ts.map +1 -0
- package/dist/esm/test-utils/constants.js +271 -0
- package/dist/esm/test-utils/generators.d.ts +4 -0
- package/dist/esm/test-utils/generators.d.ts.map +1 -0
- package/dist/esm/test-utils/generators.js +37 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +38 -3
- package/dist/esm/utils/astFilterProcessing.uspec.js +153 -5
- package/dist/esm/utils/columnProcessing.d.ts +2 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +52 -0
- package/dist/esm/utils/columnProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/columnProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/columnProcessing.uspec.js +65 -0
- package/dist/esm/utils/dashboard.d.ts +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +3 -56
- package/dist/esm/utils/dataProcessing.d.ts +4 -2
- package/dist/esm/utils/dataProcessing.d.ts.map +1 -1
- package/dist/esm/utils/dataProcessing.js +16 -0
- package/dist/esm/utils/dataProcessing.uspec.js +1 -0
- package/dist/esm/utils/dates.d.ts +2 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +21 -0
- package/dist/esm/utils/filterProcessing.d.ts +7 -1
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +97 -12
- package/dist/esm/utils/filterProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/filterProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/filterProcessing.uspec.js +245 -0
- package/dist/esm/utils/pivotConstructor.d.ts +2 -1
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +7 -1
- package/dist/esm/utils/report.d.ts +4 -1
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +92 -6
- package/dist/esm/utils/report.uspec.d.ts +2 -0
- package/dist/esm/utils/report.uspec.d.ts.map +1 -0
- package/dist/esm/utils/report.uspec.js +66 -0
- package/dist/esm/utils/tableProcessing.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,QAMtE"}
|
|
1
|
+
{"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,QAMtE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,UAoBzD"}
|
package/dist/esm/utils/dates.js
CHANGED
|
@@ -72,3 +72,24 @@ export function parseDateByDatabaseType(date, databaseType) {
|
|
|
72
72
|
return new Date(date);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
+
export function getDateFormatFromBucket(dateBucket) {
|
|
76
|
+
let format = 'MMM_yyyy';
|
|
77
|
+
switch (dateBucket) {
|
|
78
|
+
case 'day':
|
|
79
|
+
format = 'MMM_dd';
|
|
80
|
+
break;
|
|
81
|
+
case 'week':
|
|
82
|
+
format = 'MMM_dd-MMM_dd';
|
|
83
|
+
break;
|
|
84
|
+
case 'month':
|
|
85
|
+
format = 'MMM_yyyy';
|
|
86
|
+
break;
|
|
87
|
+
case 'year':
|
|
88
|
+
format = 'yyyy';
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
format = 'MMM_yyyy';
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
return format;
|
|
95
|
+
}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
import { Filter } from '../models/Filter';
|
|
1
2
|
export declare function findAndProcessDateFilter(filters: any[]): any;
|
|
2
|
-
export declare function processFilterFromBackend(filter: any
|
|
3
|
+
export declare function processFilterFromBackend(filter: any): any;
|
|
3
4
|
export declare function updateFilter(filter: any, value?: any, comparison?: any): any;
|
|
5
|
+
export declare const getType: (t: string) => "string" | "boolean" | "numeric" | "date";
|
|
6
|
+
/**
|
|
7
|
+
* Returns a sentence to describe a Filter
|
|
8
|
+
*/
|
|
9
|
+
export declare function filterSentence(filter: Filter): string;
|
|
4
10
|
//# sourceMappingURL=filterProcessing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,MAAM,EAAe,MAAM,kBAAkB,CAAC;AAGrE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D;AAMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,OAkBnD;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,EACX,KAAK,GAAE,GAAU,EACjB,UAAU,GAAE,GAAU,OAuGvB;AAGD,eAAO,MAAM,OAAO,MAAO,MAAM,8CAwDhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwBrD"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { COMPARISON_RANGE, PRIMARY_RANGE, defaultOptionsV2, getRangeFromPresetOptions, } from '../DateRangePicker/dateRangePickerUtils';
|
|
2
|
+
import { DateOperator, FilterNames } from '../models/Filter';
|
|
3
|
+
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
2
4
|
export function findAndProcessDateFilter(filters) {
|
|
3
5
|
let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
|
|
4
6
|
if (dateFilter) {
|
|
@@ -20,7 +22,7 @@ export function findAndProcessDateFilter(filters) {
|
|
|
20
22
|
function isValidDate(date) {
|
|
21
23
|
return !isNaN(Date.parse(date));
|
|
22
24
|
}
|
|
23
|
-
export function processFilterFromBackend(filter
|
|
25
|
+
export function processFilterFromBackend(filter) {
|
|
24
26
|
if (filter.filterType === 'date_range') {
|
|
25
27
|
return {
|
|
26
28
|
...filter,
|
|
@@ -29,20 +31,12 @@ export function processFilterFromBackend(filter, rows) {
|
|
|
29
31
|
options: defaultOptionsV2,
|
|
30
32
|
comparisonRange: {
|
|
31
33
|
...filter.comparisonRange,
|
|
32
|
-
value:
|
|
34
|
+
value: 'PREV_PERIOD',
|
|
33
35
|
},
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
if (filter.filterType === 'string') {
|
|
37
|
-
|
|
38
|
-
const distinctOptions = Array.from(new Set(options)).filter((value) => value !== undefined && value !== null);
|
|
39
|
-
return {
|
|
40
|
-
...filter,
|
|
41
|
-
options: distinctOptions.map((option) => ({
|
|
42
|
-
label: option,
|
|
43
|
-
value: option,
|
|
44
|
-
})),
|
|
45
|
-
};
|
|
39
|
+
return filter;
|
|
46
40
|
}
|
|
47
41
|
return filter;
|
|
48
42
|
}
|
|
@@ -51,7 +45,7 @@ export function updateFilter(filter, value = null, comparison = null) {
|
|
|
51
45
|
const { ...filterWithoutSelectedValue } = filter;
|
|
52
46
|
if (filter.filterType === 'string') {
|
|
53
47
|
let selectedValue = {};
|
|
54
|
-
if (value) {
|
|
48
|
+
if (value || value === '') {
|
|
55
49
|
if (filter.stringFilterType === 'multiselect') {
|
|
56
50
|
const parsedValue = value;
|
|
57
51
|
if (parsedValue.length === 0) {
|
|
@@ -145,3 +139,94 @@ export function updateFilter(filter, value = null, comparison = null) {
|
|
|
145
139
|
}
|
|
146
140
|
}
|
|
147
141
|
}
|
|
142
|
+
// Function to translate field type to "string", "numeric", or "date"
|
|
143
|
+
export const getType = (t) => {
|
|
144
|
+
// strip any size numbers at the end
|
|
145
|
+
// TODO: 'max' data types, e.g. varchar(max)
|
|
146
|
+
t = t.replace(/\d+$/, '');
|
|
147
|
+
switch (t) {
|
|
148
|
+
case 'string':
|
|
149
|
+
case 'char':
|
|
150
|
+
case 'varchar':
|
|
151
|
+
case 'nchar':
|
|
152
|
+
case 'nvarchar':
|
|
153
|
+
case 'ntext':
|
|
154
|
+
case 'binary':
|
|
155
|
+
case 'varbinary':
|
|
156
|
+
case 'tinyblob':
|
|
157
|
+
case 'tinytext':
|
|
158
|
+
case 'blob':
|
|
159
|
+
case 'mediumtext':
|
|
160
|
+
case 'mediumblob':
|
|
161
|
+
case 'longtext':
|
|
162
|
+
case 'longblob':
|
|
163
|
+
case 'text':
|
|
164
|
+
return 'string';
|
|
165
|
+
case 'numeric':
|
|
166
|
+
case 'bit':
|
|
167
|
+
case 'tinybit':
|
|
168
|
+
case 'smallint':
|
|
169
|
+
case 'mediumint':
|
|
170
|
+
case 'int':
|
|
171
|
+
case 'tinyint':
|
|
172
|
+
case 'integer':
|
|
173
|
+
case 'bigint':
|
|
174
|
+
case 'float':
|
|
175
|
+
case 'double':
|
|
176
|
+
case 'double precision':
|
|
177
|
+
case 'decimal':
|
|
178
|
+
case 'dec':
|
|
179
|
+
case 'smallmoney':
|
|
180
|
+
case 'money':
|
|
181
|
+
case 'real':
|
|
182
|
+
return 'numeric';
|
|
183
|
+
case 'date':
|
|
184
|
+
case 'datetime':
|
|
185
|
+
case 'datetime2':
|
|
186
|
+
case 'smalldatetime':
|
|
187
|
+
case 'datetimeoffset':
|
|
188
|
+
case 'timestamp':
|
|
189
|
+
case 'timestamptz':
|
|
190
|
+
case 'time':
|
|
191
|
+
case 'year':
|
|
192
|
+
return 'date';
|
|
193
|
+
case 'bool':
|
|
194
|
+
case 'boolean':
|
|
195
|
+
return 'boolean';
|
|
196
|
+
default:
|
|
197
|
+
return 'string';
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Returns a sentence to describe a Filter
|
|
202
|
+
*/
|
|
203
|
+
export function filterSentence(filter) {
|
|
204
|
+
let value = '';
|
|
205
|
+
if (filter.name == FilterNames.NullFilter) {
|
|
206
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}`;
|
|
207
|
+
}
|
|
208
|
+
else if (filter.value === null || filter.value === undefined) {
|
|
209
|
+
return 'Error: filter missing value';
|
|
210
|
+
}
|
|
211
|
+
if (typeof filter.value === 'string' || typeof filter.value === 'number') {
|
|
212
|
+
value = filter.value.toString();
|
|
213
|
+
}
|
|
214
|
+
else if (filter.value === false || filter.value === true) {
|
|
215
|
+
value = filter.value.toString();
|
|
216
|
+
}
|
|
217
|
+
else if ('unit' in filter.value) {
|
|
218
|
+
if (filter.operator === DateOperator.InTheCurrent) {
|
|
219
|
+
value = `${filter.value.unit}`;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else if ('startDate' in filter.value) {
|
|
226
|
+
value = `from ${filter.value.startDate}`;
|
|
227
|
+
}
|
|
228
|
+
else if (filter.value.length > 0) {
|
|
229
|
+
value = filter.value.join(', ');
|
|
230
|
+
}
|
|
231
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}${filter.operator === 'is' || filter.operator === 'is not' ? ' one of' : ''} ${value}`;
|
|
232
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterProcessing.uspec.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.uspec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { BoolOperator, DateOperator, FieldTypes, FilterNames, NullOperator, NumberOperator, StringOperator, } from '../models/Filter';
|
|
2
|
+
import { filterSentence } from './filterProcessing';
|
|
3
|
+
describe('filterSentence', () => {
|
|
4
|
+
it('should handle null filters', () => {
|
|
5
|
+
const isNullFilter = {
|
|
6
|
+
name: FilterNames.NullFilter,
|
|
7
|
+
operator: NullOperator.IsNull,
|
|
8
|
+
field: 'field',
|
|
9
|
+
type: FieldTypes.Null,
|
|
10
|
+
value: null,
|
|
11
|
+
};
|
|
12
|
+
const isNotNullFilter = {
|
|
13
|
+
name: FilterNames.NullFilter,
|
|
14
|
+
operator: NullOperator.IsNotNull,
|
|
15
|
+
field: 'field',
|
|
16
|
+
type: FieldTypes.Null,
|
|
17
|
+
value: null,
|
|
18
|
+
};
|
|
19
|
+
expect(filterSentence(isNullFilter)).toEqual('Field is null');
|
|
20
|
+
expect(filterSentence(isNotNullFilter)).toEqual('Field is not null');
|
|
21
|
+
});
|
|
22
|
+
it('should handle string filters', () => {
|
|
23
|
+
const stringExactlyFilter = {
|
|
24
|
+
name: FilterNames.StringFilter,
|
|
25
|
+
operator: StringOperator.IsExactly,
|
|
26
|
+
field: 'field',
|
|
27
|
+
type: FieldTypes.String,
|
|
28
|
+
value: 'this',
|
|
29
|
+
};
|
|
30
|
+
const stringNotExactlyFilter = {
|
|
31
|
+
name: FilterNames.StringFilter,
|
|
32
|
+
operator: StringOperator.IsNotExactly,
|
|
33
|
+
field: 'field',
|
|
34
|
+
type: FieldTypes.String,
|
|
35
|
+
value: 'this',
|
|
36
|
+
};
|
|
37
|
+
const stringContainsFilter = {
|
|
38
|
+
name: FilterNames.StringFilter,
|
|
39
|
+
operator: StringOperator.Contains,
|
|
40
|
+
field: 'field',
|
|
41
|
+
type: FieldTypes.String,
|
|
42
|
+
value: 'this',
|
|
43
|
+
};
|
|
44
|
+
expect(filterSentence(stringExactlyFilter)).toEqual('Field is exactly this');
|
|
45
|
+
expect(filterSentence(stringNotExactlyFilter)).toEqual('Field is not exactly this');
|
|
46
|
+
expect(filterSentence(stringContainsFilter)).toEqual('Field contains this');
|
|
47
|
+
});
|
|
48
|
+
it('should handle number filters', () => {
|
|
49
|
+
const numberEqualToFilter = {
|
|
50
|
+
name: FilterNames.NumericFilter,
|
|
51
|
+
operator: NumberOperator.EqualTo,
|
|
52
|
+
field: 'field',
|
|
53
|
+
type: FieldTypes.Numeric,
|
|
54
|
+
value: 0,
|
|
55
|
+
};
|
|
56
|
+
const numberNotEqualToFilter = {
|
|
57
|
+
name: FilterNames.NumericFilter,
|
|
58
|
+
operator: NumberOperator.NotEqualTo,
|
|
59
|
+
field: 'field',
|
|
60
|
+
type: FieldTypes.Numeric,
|
|
61
|
+
value: 0,
|
|
62
|
+
};
|
|
63
|
+
const numberGreaterThanFilter = {
|
|
64
|
+
name: FilterNames.NumericFilter,
|
|
65
|
+
operator: NumberOperator.GreaterThan,
|
|
66
|
+
field: 'field',
|
|
67
|
+
type: FieldTypes.Numeric,
|
|
68
|
+
value: 0,
|
|
69
|
+
};
|
|
70
|
+
const numberLessThanFilter = {
|
|
71
|
+
name: FilterNames.NumericFilter,
|
|
72
|
+
operator: NumberOperator.LessThan,
|
|
73
|
+
field: 'field',
|
|
74
|
+
type: FieldTypes.Numeric,
|
|
75
|
+
value: 0,
|
|
76
|
+
};
|
|
77
|
+
const numberGreaterThanOrEqualToFilter = {
|
|
78
|
+
name: FilterNames.NumericFilter,
|
|
79
|
+
operator: NumberOperator.GreaterThanOrEqualTo,
|
|
80
|
+
field: 'field',
|
|
81
|
+
type: FieldTypes.Numeric,
|
|
82
|
+
value: 0,
|
|
83
|
+
};
|
|
84
|
+
const numberLessThanOrEqualToFilter = {
|
|
85
|
+
name: FilterNames.NumericFilter,
|
|
86
|
+
operator: NumberOperator.LessThanOrEqualTo,
|
|
87
|
+
field: 'field',
|
|
88
|
+
type: FieldTypes.Numeric,
|
|
89
|
+
value: 0,
|
|
90
|
+
};
|
|
91
|
+
expect(filterSentence(numberEqualToFilter)).toEqual('Field equal to 0');
|
|
92
|
+
expect(filterSentence(numberNotEqualToFilter)).toEqual('Field not equal to 0');
|
|
93
|
+
expect(filterSentence(numberGreaterThanFilter)).toEqual('Field greater than 0');
|
|
94
|
+
expect(filterSentence(numberLessThanFilter)).toEqual('Field less than 0');
|
|
95
|
+
expect(filterSentence(numberGreaterThanOrEqualToFilter)).toEqual('Field greater than or equal to 0');
|
|
96
|
+
expect(filterSentence(numberLessThanOrEqualToFilter)).toEqual('Field less than or equal to 0');
|
|
97
|
+
});
|
|
98
|
+
it('should handle boolean filters', () => {
|
|
99
|
+
const booleanEqualToFilter = {
|
|
100
|
+
name: FilterNames.BooleanFilter,
|
|
101
|
+
operator: BoolOperator.EqualTo,
|
|
102
|
+
field: 'field',
|
|
103
|
+
type: FieldTypes.Boolean,
|
|
104
|
+
value: true,
|
|
105
|
+
};
|
|
106
|
+
const booleanNotEqualToFilter = {
|
|
107
|
+
name: FilterNames.BooleanFilter,
|
|
108
|
+
operator: BoolOperator.NotEqualTo,
|
|
109
|
+
field: 'field',
|
|
110
|
+
type: FieldTypes.Boolean,
|
|
111
|
+
value: true,
|
|
112
|
+
};
|
|
113
|
+
expect(filterSentence(booleanEqualToFilter)).toEqual('Field equal to true');
|
|
114
|
+
expect(filterSentence(booleanNotEqualToFilter)).toEqual('Field not equal to true');
|
|
115
|
+
});
|
|
116
|
+
it('should handle date filters', () => {
|
|
117
|
+
const dateInTheLastFilter = {
|
|
118
|
+
name: FilterNames.DateFilter,
|
|
119
|
+
operator: DateOperator.InTheLast,
|
|
120
|
+
field: 'field',
|
|
121
|
+
type: FieldTypes.Date,
|
|
122
|
+
value: { value: 10, unit: 'day' },
|
|
123
|
+
};
|
|
124
|
+
const dateInTheLastFilterSingular = {
|
|
125
|
+
name: FilterNames.DateFilter,
|
|
126
|
+
operator: DateOperator.InTheLast,
|
|
127
|
+
field: 'field',
|
|
128
|
+
type: FieldTypes.Date,
|
|
129
|
+
value: { value: 1, unit: 'day' },
|
|
130
|
+
};
|
|
131
|
+
const dateInTheCurrentFilter = {
|
|
132
|
+
name: FilterNames.DateFilter,
|
|
133
|
+
operator: DateOperator.InTheCurrent,
|
|
134
|
+
field: 'field',
|
|
135
|
+
type: FieldTypes.Date,
|
|
136
|
+
value: { value: 1, unit: 'day' },
|
|
137
|
+
};
|
|
138
|
+
const dateInThePreviousFilter = {
|
|
139
|
+
name: FilterNames.DateFilter,
|
|
140
|
+
operator: DateOperator.InThePrevious,
|
|
141
|
+
field: 'field',
|
|
142
|
+
type: FieldTypes.Date,
|
|
143
|
+
value: { value: 10, unit: 'day' },
|
|
144
|
+
};
|
|
145
|
+
const dateInThePreviousFilterSingular = {
|
|
146
|
+
name: FilterNames.DateFilter,
|
|
147
|
+
operator: DateOperator.InThePrevious,
|
|
148
|
+
field: 'field',
|
|
149
|
+
type: FieldTypes.Date,
|
|
150
|
+
value: { value: 1, unit: 'day' },
|
|
151
|
+
};
|
|
152
|
+
expect(filterSentence(dateInTheLastFilter)).toEqual('Field in the last 10 days');
|
|
153
|
+
expect(filterSentence(dateInTheLastFilterSingular)).toEqual('Field in the last 1 day');
|
|
154
|
+
expect(filterSentence(dateInTheCurrentFilter)).toEqual('Field in the current day');
|
|
155
|
+
expect(filterSentence(dateInThePreviousFilter)).toEqual('Field in the previous 10 days');
|
|
156
|
+
expect(filterSentence(dateInThePreviousFilterSingular)).toEqual('Field in the previous 1 day');
|
|
157
|
+
});
|
|
158
|
+
it('should handle date comparison filters', () => {
|
|
159
|
+
const dateEqualToFilter = {
|
|
160
|
+
name: FilterNames.DateComparisonFilter,
|
|
161
|
+
operator: DateOperator.EqualTo,
|
|
162
|
+
field: 'field',
|
|
163
|
+
type: FieldTypes.Date,
|
|
164
|
+
value: '2021-01-01',
|
|
165
|
+
};
|
|
166
|
+
const dateNotEqualToFilter = {
|
|
167
|
+
name: FilterNames.DateComparisonFilter,
|
|
168
|
+
operator: DateOperator.NotEqualTo,
|
|
169
|
+
field: 'field',
|
|
170
|
+
type: FieldTypes.Date,
|
|
171
|
+
value: '2021-01-01',
|
|
172
|
+
};
|
|
173
|
+
const dateGreaterThanFilter = {
|
|
174
|
+
name: FilterNames.DateComparisonFilter,
|
|
175
|
+
operator: DateOperator.GreaterThan,
|
|
176
|
+
field: 'field',
|
|
177
|
+
type: FieldTypes.Date,
|
|
178
|
+
value: '2021-01-01',
|
|
179
|
+
};
|
|
180
|
+
const dateLessThanFilter = {
|
|
181
|
+
name: FilterNames.DateComparisonFilter,
|
|
182
|
+
operator: DateOperator.LessThan,
|
|
183
|
+
field: 'field',
|
|
184
|
+
type: FieldTypes.Date,
|
|
185
|
+
value: '2021-01-01',
|
|
186
|
+
};
|
|
187
|
+
const dateGreaterThanOrEqualToFilter = {
|
|
188
|
+
name: FilterNames.DateComparisonFilter,
|
|
189
|
+
operator: DateOperator.GreaterThanOrEqualTo,
|
|
190
|
+
field: 'field',
|
|
191
|
+
type: FieldTypes.Date,
|
|
192
|
+
value: '2021-01-01',
|
|
193
|
+
};
|
|
194
|
+
const dateLessThanOrEqualToFilter = {
|
|
195
|
+
name: FilterNames.DateComparisonFilter,
|
|
196
|
+
operator: DateOperator.LessThanOrEqualTo,
|
|
197
|
+
field: 'field',
|
|
198
|
+
type: FieldTypes.Date,
|
|
199
|
+
value: '2021-01-01',
|
|
200
|
+
};
|
|
201
|
+
expect(filterSentence(dateEqualToFilter)).toEqual('Field equal to 2021-01-01');
|
|
202
|
+
expect(filterSentence(dateNotEqualToFilter)).toEqual('Field not equal to 2021-01-01');
|
|
203
|
+
expect(filterSentence(dateGreaterThanFilter)).toEqual('Field greater than 2021-01-01');
|
|
204
|
+
expect(filterSentence(dateLessThanFilter)).toEqual('Field less than 2021-01-01');
|
|
205
|
+
expect(filterSentence(dateGreaterThanOrEqualToFilter)).toEqual('Field greater than or equal to 2021-01-01');
|
|
206
|
+
expect(filterSentence(dateLessThanOrEqualToFilter)).toEqual('Field less than or equal to 2021-01-01');
|
|
207
|
+
});
|
|
208
|
+
it('should handle custom date filters', () => {
|
|
209
|
+
const dateCustomFilter = {
|
|
210
|
+
name: FilterNames.DateCustomFilter,
|
|
211
|
+
operator: DateOperator.Custom,
|
|
212
|
+
field: 'field',
|
|
213
|
+
type: FieldTypes.Date,
|
|
214
|
+
value: { startDate: '2021-01-01', endDate: '2021-12-31' },
|
|
215
|
+
};
|
|
216
|
+
expect(filterSentence(dateCustomFilter)).toEqual('Field custom from 2021-01-01');
|
|
217
|
+
});
|
|
218
|
+
it('should handle string in filters', () => {
|
|
219
|
+
const stringIsFilter = {
|
|
220
|
+
name: FilterNames.StringFilter,
|
|
221
|
+
operator: StringOperator.Is,
|
|
222
|
+
field: 'field',
|
|
223
|
+
type: FieldTypes.String,
|
|
224
|
+
value: ['this', 'that'],
|
|
225
|
+
};
|
|
226
|
+
const stringIsNotFilter = {
|
|
227
|
+
name: FilterNames.StringFilter,
|
|
228
|
+
operator: StringOperator.IsNot,
|
|
229
|
+
field: 'field',
|
|
230
|
+
type: FieldTypes.String,
|
|
231
|
+
value: ['this', 'that'],
|
|
232
|
+
};
|
|
233
|
+
expect(filterSentence(stringIsFilter)).toEqual('Field is one of this, that');
|
|
234
|
+
expect(filterSentence(stringIsNotFilter)).toEqual('Field is not one of this, that');
|
|
235
|
+
});
|
|
236
|
+
it('should throw an error for invalid filters', () => {
|
|
237
|
+
const invalidFilter = {
|
|
238
|
+
name: 'filter',
|
|
239
|
+
operator: '=',
|
|
240
|
+
field: 'field',
|
|
241
|
+
type: 'string',
|
|
242
|
+
};
|
|
243
|
+
expect(filterSentence(invalidFilter)).toEqual('Error: filter missing value');
|
|
244
|
+
});
|
|
245
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
-
|
|
2
|
+
import { QuillReportInternal } from '../models/Report';
|
|
3
|
+
export declare function generatePivotWithSQL(pivot: Pivot, report: QuillReportInternal, client: any, dateBucket?: string, dateFilter?: any, distinctStrings?: any): Promise<{
|
|
3
4
|
rows: any;
|
|
4
5
|
columns: any;
|
|
5
6
|
} | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAiB,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAiB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,GAAG,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAyLtB"}
|
|
@@ -24,13 +24,16 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
24
24
|
}
|
|
25
25
|
if (pivot.rowField && !pivot.rowFieldType) {
|
|
26
26
|
const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
|
|
27
|
-
pivot.rowFieldType = rowColumn
|
|
27
|
+
pivot.rowFieldType = rowColumn?.format || 'string';
|
|
28
28
|
}
|
|
29
29
|
let distinctStringValues = undefined;
|
|
30
30
|
if (!distinctStrings && report.rows && pivot.columnField) {
|
|
31
31
|
const distinctValues = Array.from(new Set(report.rows.map((row) => row[pivot.columnField])));
|
|
32
32
|
distinctStringValues = distinctValues.map((value) => value.toString());
|
|
33
33
|
}
|
|
34
|
+
if (!report.itemQuery) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
34
37
|
const sqlQuery = generatePivotQuery(pivot, report.itemQuery, client.databaseType, comparisonInterval, distinctStrings ? distinctStrings : distinctStringValues, dateBucket);
|
|
35
38
|
if (sqlQuery && report.rows.length > 0) {
|
|
36
39
|
const hostedBody = {
|
|
@@ -67,6 +70,9 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
67
70
|
.map((field) => ({
|
|
68
71
|
field: processColumnName(field.name),
|
|
69
72
|
label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
|
|
73
|
+
format: field.name === pivot.rowField
|
|
74
|
+
? 'string'
|
|
75
|
+
: pivot.valueFieldType ?? 'whole_number',
|
|
70
76
|
}))
|
|
71
77
|
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
|
|
72
78
|
.sort((a, b) => {
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { QuillReport, QuillReportInternal } from '../models/Report';
|
|
1
2
|
import { AdditionalProcessing } from './tableProcessing';
|
|
3
|
+
export declare const EMPTY_REPORT: QuillReport;
|
|
2
4
|
export declare function fetchReport(reportId: string, client: any, useReportTask?: boolean, filters?: any[], additionalProcessing?: AdditionalProcessing, dateBucket?: string, customFields?: any): Promise<{
|
|
3
|
-
report:
|
|
5
|
+
report: QuillReportInternal;
|
|
4
6
|
error?: string;
|
|
5
7
|
}>;
|
|
6
8
|
export declare const formatRowsFromReport: (report: any) => any;
|
|
9
|
+
export declare function convertInternalReportToReport(report: QuillReportInternal): QuillReport;
|
|
7
10
|
//# sourceMappingURL=report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,eAAO,MAAM,YAAY,EAAE,WAkB1B,CAAC;AAEF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,EACX,aAAa,UAAO,EACpB,OAAO,GAAE,GAAG,EAAO,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2F1D;AAED,eAAO,MAAM,oBAAoB,WAAY,GAAG,QAkB/C,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAsDb"}
|
package/dist/esm/utils/report.js
CHANGED
|
@@ -1,10 +1,31 @@
|
|
|
1
|
+
import { getYAxisFields } from './columnProcessing';
|
|
1
2
|
import { cleanDashboardItem } from './dashboard';
|
|
2
3
|
import { getData } from './dataFetcher';
|
|
3
4
|
import { DataLoadError } from './error';
|
|
4
5
|
import { processFilterErrorList } from './errorProcessing';
|
|
5
6
|
import { internalLog } from './logging';
|
|
6
7
|
import { mergeComparisonRange } from './merge';
|
|
8
|
+
import { isValidPivot } from './pivotProcessing';
|
|
7
9
|
import { quillFormat } from './valueFormatter';
|
|
10
|
+
export const EMPTY_REPORT = {
|
|
11
|
+
id: '',
|
|
12
|
+
name: '',
|
|
13
|
+
dashboardName: '',
|
|
14
|
+
rows: [],
|
|
15
|
+
columns: [],
|
|
16
|
+
chartType: '',
|
|
17
|
+
dateField: null,
|
|
18
|
+
pivot: null,
|
|
19
|
+
xAxisLabel: '',
|
|
20
|
+
xAxisField: '',
|
|
21
|
+
xAxisFormat: 'string',
|
|
22
|
+
yAxisFields: [],
|
|
23
|
+
order: -1,
|
|
24
|
+
compareRows: [],
|
|
25
|
+
filtersApplied: [],
|
|
26
|
+
queryString: '',
|
|
27
|
+
rowCount: 0,
|
|
28
|
+
};
|
|
8
29
|
export async function fetchReport(reportId, client, useReportTask = true, filters = [], additionalProcessing, dateBucket, customFields) {
|
|
9
30
|
let reportInfo = undefined;
|
|
10
31
|
let errorMessage = undefined;
|
|
@@ -53,12 +74,18 @@ export async function fetchReport(reportId, client, useReportTask = true, filter
|
|
|
53
74
|
errorMessage = error;
|
|
54
75
|
}
|
|
55
76
|
else {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
77
|
+
if (!error.data.data) {
|
|
78
|
+
errorMessage = "Couln't find report";
|
|
79
|
+
reportInfo = EMPTY_REPORT;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
reportInfo = {
|
|
83
|
+
...error.data.data,
|
|
84
|
+
id: error.data.data._id,
|
|
85
|
+
error: error.message,
|
|
86
|
+
adminError: error.data.adminErrorMessage,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
62
89
|
errorMessage = error.message;
|
|
63
90
|
}
|
|
64
91
|
}
|
|
@@ -74,6 +101,9 @@ export async function fetchReport(reportId, client, useReportTask = true, filter
|
|
|
74
101
|
return { report: reportInfo, error: errorMessage };
|
|
75
102
|
}
|
|
76
103
|
export const formatRowsFromReport = (report) => {
|
|
104
|
+
if (!report.rows || !report.columns) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
77
107
|
return report.rows.map((row) => {
|
|
78
108
|
return report.columns.reduce((formattedRow, column) => {
|
|
79
109
|
// Apply the format function to each field in the row
|
|
@@ -86,3 +116,59 @@ export const formatRowsFromReport = (report) => {
|
|
|
86
116
|
}, {});
|
|
87
117
|
});
|
|
88
118
|
};
|
|
119
|
+
export function convertInternalReportToReport(report) {
|
|
120
|
+
try {
|
|
121
|
+
if (!report) {
|
|
122
|
+
return EMPTY_REPORT;
|
|
123
|
+
}
|
|
124
|
+
const formattedReport = {
|
|
125
|
+
...report,
|
|
126
|
+
};
|
|
127
|
+
if (formattedReport.pivot && isValidPivot(formattedReport.pivot)) {
|
|
128
|
+
let columns = report.pivotColumns ?? report.columns;
|
|
129
|
+
let rows = report.pivotRows ?? report.rows;
|
|
130
|
+
if (report.chartType === 'table') {
|
|
131
|
+
columns =
|
|
132
|
+
report.pivotColumns?.map((col, index) => {
|
|
133
|
+
if (index === 0) {
|
|
134
|
+
return {
|
|
135
|
+
...col,
|
|
136
|
+
format: col.format || 'string',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
...col,
|
|
141
|
+
format: report.pivot?.valueFieldType || 'whole_number',
|
|
142
|
+
};
|
|
143
|
+
}) ?? report.columns;
|
|
144
|
+
rows = formatRowsFromReport({ rows, columns });
|
|
145
|
+
}
|
|
146
|
+
else if (report.chartType === 'metric') {
|
|
147
|
+
columns =
|
|
148
|
+
report.pivotColumns?.map((col) => {
|
|
149
|
+
return { ...col, format: report.xAxisFormat };
|
|
150
|
+
}) ?? report.columns;
|
|
151
|
+
rows = formatRowsFromReport({ rows, columns });
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
...formattedReport,
|
|
155
|
+
rows: rows,
|
|
156
|
+
yAxisFields: getYAxisFields(report),
|
|
157
|
+
columns: columns,
|
|
158
|
+
rowCount: rows ? rows.length : 0,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
let rows = report.rows;
|
|
162
|
+
if (report.chartType === 'metric' || report.chartType === 'table') {
|
|
163
|
+
rows = formatRowsFromReport(report);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
...formattedReport,
|
|
167
|
+
rows: rows,
|
|
168
|
+
yAxisFields: getYAxisFields(report),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return EMPTY_REPORT;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.uspec.d.ts","sourceRoot":"","sources":["../../../src/utils/report.uspec.ts"],"names":[],"mappings":""}
|