@quillsql/react 2.11.25 → 2.11.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +15 -12
- package/dist/cjs/ChartBuilder.d.ts +7 -20
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +25 -25
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +3 -3
- package/dist/cjs/Dashboard.d.ts +2 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.d.ts +6 -4
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +208 -126
- package/dist/cjs/SQLEditor.d.ts +4 -11
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +31 -97
- package/dist/cjs/components/Dashboard/DashboardFilter.js +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +9 -12
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +12 -10
- package/dist/cjs/components/QuillTable.d.ts +4 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +1 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +2 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +27 -24
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +9 -7
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +9 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +46 -41
- package/dist/cjs/models/Columns.d.ts +11 -0
- package/dist/cjs/models/Columns.d.ts.map +1 -0
- package/dist/cjs/models/Columns.js +2 -0
- package/dist/cjs/models/Tables.d.ts +0 -8
- package/dist/cjs/models/Tables.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.d.ts +3 -0
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/astProcessing.js +20 -0
- package/dist/cjs/utils/columnProcessing.d.ts +9 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/columnProcessing.js +207 -0
- package/dist/cjs/utils/dashboard.js +9 -9
- package/dist/cjs/utils/pivotProcessing.d.ts +2 -1
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +3 -8
- package/dist/cjs/utils/tableProcessing.d.ts +2 -2
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +1 -3
- package/dist/cjs/utils/valueFormatter.d.ts +2 -1
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +12 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +15 -12
- package/dist/esm/ChartBuilder.d.ts +7 -20
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +25 -25
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +3 -3
- package/dist/esm/Dashboard.d.ts +2 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.d.ts +6 -4
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +204 -122
- package/dist/esm/SQLEditor.d.ts +4 -11
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +30 -95
- package/dist/esm/components/Dashboard/DashboardFilter.js +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +9 -12
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +12 -10
- package/dist/esm/components/QuillTable.d.ts +4 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +1 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts +2 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +27 -24
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +9 -7
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +9 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +48 -43
- package/dist/esm/models/Columns.d.ts +11 -0
- package/dist/esm/models/Columns.d.ts.map +1 -0
- package/dist/esm/models/Columns.js +1 -0
- package/dist/esm/models/Tables.d.ts +0 -8
- package/dist/esm/models/Tables.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.d.ts +3 -0
- package/dist/esm/utils/astProcessing.d.ts.map +1 -0
- package/dist/esm/utils/astProcessing.js +16 -0
- package/dist/esm/utils/columnProcessing.d.ts +9 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
- package/dist/esm/utils/columnProcessing.js +201 -0
- package/dist/esm/utils/dashboard.js +9 -9
- package/dist/esm/utils/pivotProcessing.d.ts +2 -1
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +3 -8
- package/dist/esm/utils/tableProcessing.d.ts +2 -2
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +1 -3
- package/dist/esm/utils/valueFormatter.d.ts +2 -1
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +11 -0
- package/package.json +1 -1
- package/dist/cjs/utils/types.d.ts +0 -4
- package/dist/cjs/utils/types.d.ts.map +0 -1
- package/dist/cjs/utils/types.js +0 -52
- package/dist/cjs/utils/valueFormatterCSV.d.ts +0 -17
- package/dist/cjs/utils/valueFormatterCSV.d.ts.map +0 -1
- package/dist/cjs/utils/valueFormatterCSV.js +0 -99
- package/dist/esm/utils/types.d.ts +0 -4
- package/dist/esm/utils/types.d.ts.map +0 -1
- package/dist/esm/utils/types.js +0 -48
- package/dist/esm/utils/valueFormatterCSV.d.ts +0 -17
- package/dist/esm/utils/valueFormatterCSV.d.ts.map +0 -1
- package/dist/esm/utils/valueFormatterCSV.js +0 -95
|
@@ -3,12 +3,12 @@ import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from '
|
|
|
3
3
|
import { ClientContext } from '../../Context';
|
|
4
4
|
import { getDataFromCloud } from '../../utils/dataFetcher';
|
|
5
5
|
import { PivotList, PivotCard } from './PivotList';
|
|
6
|
-
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds,
|
|
6
|
+
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, } from 'date-fns';
|
|
7
7
|
import { valueFormatter } from '../../utils/valueFormatter';
|
|
8
8
|
import { numberFormatOptions, dateFormatOptions } from '../../ChartBuilder';
|
|
9
9
|
import { snakeCaseToTitleCase } from '../../utils/textProcessing';
|
|
10
10
|
import { QuillErrorMessageComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
|
|
11
|
-
import { isNumericColumnType,
|
|
11
|
+
import { isNumericColumnType, } from '../../components/ReportBuilder/ast';
|
|
12
12
|
import { QuillCard } from '../../components/QuillCard';
|
|
13
13
|
import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
|
|
14
14
|
import { hashCode } from '../../utils/crypto';
|
|
@@ -43,7 +43,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
43
43
|
const getDistinctValues = async () => {
|
|
44
44
|
if (columns) {
|
|
45
45
|
const stringColumns = columns.filter((column) => {
|
|
46
|
-
return
|
|
46
|
+
return column.format === 'string';
|
|
47
47
|
});
|
|
48
48
|
if (stringColumns.length === 0) {
|
|
49
49
|
const possibleColumns = getPossiblePivotFieldOptions(columns, {});
|
|
@@ -153,15 +153,6 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
153
153
|
pivotValueField,
|
|
154
154
|
pivotAggregation,
|
|
155
155
|
]);
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
setSelectedPivotIndex(-1);
|
|
158
|
-
setSelectedPivotType('');
|
|
159
|
-
setPivotRowField(undefined);
|
|
160
|
-
setPivotColumnField(undefined);
|
|
161
|
-
setPivotValueField(undefined);
|
|
162
|
-
setPivotAggregation(undefined);
|
|
163
|
-
setErrors([]);
|
|
164
|
-
}, [selectedTable]);
|
|
165
156
|
useEffect(() => {
|
|
166
157
|
if (!initialUniqueValues) {
|
|
167
158
|
return;
|
|
@@ -442,7 +433,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
442
433
|
}), width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
|
|
443
434
|
if (e.target.value !== 'count' &&
|
|
444
435
|
pivotValueField &&
|
|
445
|
-
!numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)
|
|
436
|
+
!numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
|
|
446
437
|
setPivotValueField(null);
|
|
447
438
|
}
|
|
448
439
|
pivotFieldChange('aggregationType', e.target.value);
|
|
@@ -563,7 +554,7 @@ function castValueToDate(value) {
|
|
|
563
554
|
}
|
|
564
555
|
return new Date(value);
|
|
565
556
|
}
|
|
566
|
-
function
|
|
557
|
+
function getLatestDate(a, b) {
|
|
567
558
|
return a > b ? a : b;
|
|
568
559
|
}
|
|
569
560
|
function getEarliestDate(a, b) {
|
|
@@ -574,7 +565,7 @@ function getDateRange(dateRange, column, data) {
|
|
|
574
565
|
const ONE_CENTURY_IN_MILLISECONDS = 100 * 365 * 24 * 60 * 60 * 1000;
|
|
575
566
|
const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
|
|
576
567
|
const minDate = new Date(0);
|
|
577
|
-
if (!dateRange
|
|
568
|
+
if (!dateRange) {
|
|
578
569
|
if (data.length == 0 || !data[0][column]) {
|
|
579
570
|
return { start: new Date(), end: new Date() };
|
|
580
571
|
}
|
|
@@ -585,22 +576,30 @@ function getDateRange(dateRange, column, data) {
|
|
|
585
576
|
end: firstDate || new Date(),
|
|
586
577
|
};
|
|
587
578
|
}
|
|
588
|
-
let earliestDate =
|
|
589
|
-
let
|
|
579
|
+
let earliestDate = undefined;
|
|
580
|
+
let latestDate = undefined;
|
|
581
|
+
for (let i = 0; i < data.length; i++) {
|
|
582
|
+
if (earliestDate && latestDate) {
|
|
583
|
+
break;
|
|
584
|
+
}
|
|
585
|
+
const value = castValueToDate(data[i][column]);
|
|
586
|
+
earliestDate = value && value > minDate ? value : null;
|
|
587
|
+
latestDate = value && value < maxDate ? value : null;
|
|
588
|
+
}
|
|
589
|
+
if (!earliestDate || !latestDate) {
|
|
590
|
+
return {
|
|
591
|
+
start: earliestDate || new Date(),
|
|
592
|
+
end: latestDate || new Date(),
|
|
593
|
+
};
|
|
594
|
+
}
|
|
590
595
|
for (let i = 0; i < data.length; i++) {
|
|
591
596
|
if (data[i][column]) {
|
|
592
597
|
const value = castValueToDate(data[i][column]);
|
|
593
|
-
if (lastestDate && lastestDate > minDate) {
|
|
594
|
-
lastestDate = value;
|
|
595
|
-
}
|
|
596
598
|
if (value && value < maxDate) {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
+
latestDate =
|
|
600
|
+
latestDate === null ? value : getLatestDate(latestDate, value);
|
|
599
601
|
}
|
|
600
602
|
if (value && value > minDate) {
|
|
601
|
-
if (earliestDate && earliestDate < minDate) {
|
|
602
|
-
earliestDate = value;
|
|
603
|
-
}
|
|
604
603
|
earliestDate =
|
|
605
604
|
earliestDate === null
|
|
606
605
|
? value
|
|
@@ -609,40 +608,40 @@ function getDateRange(dateRange, column, data) {
|
|
|
609
608
|
}
|
|
610
609
|
}
|
|
611
610
|
return {
|
|
612
|
-
start: earliestDate,
|
|
613
|
-
end:
|
|
611
|
+
start: earliestDate || new Date(),
|
|
612
|
+
end: latestDate || new Date(),
|
|
614
613
|
};
|
|
615
614
|
}
|
|
616
615
|
else {
|
|
617
|
-
return
|
|
616
|
+
return dateRange;
|
|
618
617
|
}
|
|
619
618
|
}
|
|
620
619
|
function getDateBuckets(dateRange, column, data) {
|
|
621
|
-
if (!dateRange
|
|
620
|
+
if (!dateRange) {
|
|
622
621
|
return eachMonthOfInterval(getDateRange(dateRange, column, data));
|
|
623
622
|
}
|
|
624
|
-
const dayDifference = differenceInDays(
|
|
623
|
+
const dayDifference = differenceInDays(dateRange.end, dateRange.start);
|
|
625
624
|
return dayDifferenceToInterval(dayDifference, dateRange);
|
|
626
625
|
}
|
|
627
626
|
function getCompDateBuckets(dateRange, compDateRange, column, data) {
|
|
628
|
-
if (!dateRange
|
|
629
|
-
return eachMonthOfInterval(getDateRange(
|
|
627
|
+
if (!dateRange) {
|
|
628
|
+
return eachMonthOfInterval(getDateRange(undefined, column, data));
|
|
630
629
|
}
|
|
631
|
-
const dayDifference = differenceInDays(
|
|
630
|
+
const dayDifference = differenceInDays(dateRange.end, dateRange.start);
|
|
632
631
|
return dayDifferenceToInterval(dayDifference, compDateRange);
|
|
633
632
|
}
|
|
634
633
|
function dayDifferenceToInterval(dayDifference, dateRange) {
|
|
635
634
|
if (dayDifference < 14) {
|
|
636
|
-
return eachDayOfInterval(
|
|
635
|
+
return eachDayOfInterval(dateRange);
|
|
637
636
|
}
|
|
638
637
|
else if (dayDifference < 60) {
|
|
639
|
-
return eachWeekOfInterval(
|
|
638
|
+
return eachWeekOfInterval(dateRange, { weekStartsOn: 1 });
|
|
640
639
|
}
|
|
641
640
|
else if (dayDifference < 365 * 3) {
|
|
642
|
-
return eachMonthOfInterval(
|
|
641
|
+
return eachMonthOfInterval(dateRange);
|
|
643
642
|
}
|
|
644
643
|
else {
|
|
645
|
-
return eachYearOfInterval(
|
|
644
|
+
return eachYearOfInterval(dateRange);
|
|
646
645
|
}
|
|
647
646
|
}
|
|
648
647
|
function getDateString(value, dateRange) {
|
|
@@ -707,23 +706,22 @@ const fixBigQueryData = (data = []) => {
|
|
|
707
706
|
}
|
|
708
707
|
return newData;
|
|
709
708
|
};
|
|
710
|
-
export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange =
|
|
709
|
+
export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined) {
|
|
711
710
|
// If there is no rowField, aggregate on the valueField
|
|
712
711
|
if (!pivot.rowField) {
|
|
713
712
|
return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
|
|
714
713
|
}
|
|
715
714
|
// Handle edge-case for BigQuery objects.
|
|
716
715
|
data = fixBigQueryData(data);
|
|
717
|
-
if (dateRange
|
|
718
|
-
dateRange = [new Date(0), add(new Date(), { years: 5 })];
|
|
716
|
+
if (!dateRange) {
|
|
719
717
|
if (isDateField(pivot.rowFieldType)) {
|
|
720
718
|
dateRange = getDateRange(dateRange, pivot.rowField, data);
|
|
721
719
|
}
|
|
722
720
|
}
|
|
723
721
|
if (!compRange ||
|
|
724
|
-
isNullUndefinedOrInvalidDate(compRange
|
|
725
|
-
isNullUndefinedOrInvalidDate(compRange
|
|
726
|
-
compRange =
|
|
722
|
+
isNullUndefinedOrInvalidDate(compRange.start) ||
|
|
723
|
+
isNullUndefinedOrInvalidDate(compRange.end)) {
|
|
724
|
+
compRange = undefined;
|
|
727
725
|
}
|
|
728
726
|
const pivotRows = [];
|
|
729
727
|
const uniqueRows = (isDateField(pivot.rowFieldType)
|
|
@@ -980,6 +978,13 @@ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimi
|
|
|
980
978
|
}
|
|
981
979
|
}
|
|
982
980
|
});
|
|
981
|
+
if (pivot.aggregationType === 'max' || pivot.aggregationType === 'min') {
|
|
982
|
+
for (const [key, value] of Object.entries(row)) {
|
|
983
|
+
if (value === '-Infinity' || value === 'Infinity') {
|
|
984
|
+
row[key] = null;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
983
988
|
pivotRows.push(row);
|
|
984
989
|
});
|
|
985
990
|
const columns = [
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Columns.d.ts","sourceRoot":"","sources":["../../../src/models/Columns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;CAAG;AAEzB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/astProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAe5D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function processStarColumn(ast, columns) {
|
|
2
|
+
if (ast.columns === '*') {
|
|
3
|
+
ast.columns = columns.map((column) => {
|
|
4
|
+
return {
|
|
5
|
+
type: 'expr',
|
|
6
|
+
expr: {
|
|
7
|
+
type: 'column_ref',
|
|
8
|
+
table: null,
|
|
9
|
+
column: column.field,
|
|
10
|
+
},
|
|
11
|
+
as: null,
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return ast;
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ColumnInfo } from '../components/ReportBuilder/schema';
|
|
2
|
+
import { Column, ColumnInternal } from '../models/Columns';
|
|
3
|
+
export declare function convertPostgresColumn(field: {
|
|
4
|
+
name: string;
|
|
5
|
+
dataTypeID: number;
|
|
6
|
+
}): ColumnInternal;
|
|
7
|
+
export declare function convertColumnInfoToColumnInternal(columnInfo: ColumnInfo): ColumnInternal;
|
|
8
|
+
export declare function convertFormatToJsType(column: Column): string;
|
|
9
|
+
//# sourceMappingURL=columnProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAyGjB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AAiFD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
export function convertPostgresColumn(field) {
|
|
2
|
+
let format;
|
|
3
|
+
let fieldType;
|
|
4
|
+
let jsType;
|
|
5
|
+
switch (field.dataTypeID) {
|
|
6
|
+
case 16: // bool
|
|
7
|
+
format = 'string';
|
|
8
|
+
break;
|
|
9
|
+
case 20: // int8
|
|
10
|
+
case 21: // int2
|
|
11
|
+
case 23: // int4
|
|
12
|
+
format = 'whole_number';
|
|
13
|
+
break;
|
|
14
|
+
case 700: // float4
|
|
15
|
+
case 701: // float8
|
|
16
|
+
case 1700: // numeric
|
|
17
|
+
format = 'two_decimal_places';
|
|
18
|
+
break;
|
|
19
|
+
case 1082: // date
|
|
20
|
+
case 1083: // time
|
|
21
|
+
case 1184: // timestamptz
|
|
22
|
+
case 1114: // timestamp
|
|
23
|
+
format = 'MMM_dd_yyyy';
|
|
24
|
+
break;
|
|
25
|
+
case 1186: // interval
|
|
26
|
+
case 1043: // varchar
|
|
27
|
+
default:
|
|
28
|
+
format = 'string';
|
|
29
|
+
}
|
|
30
|
+
switch (field.dataTypeID) {
|
|
31
|
+
case 16: // boolean
|
|
32
|
+
fieldType = 'bool';
|
|
33
|
+
break;
|
|
34
|
+
case 20: // int8
|
|
35
|
+
fieldType = 'int8';
|
|
36
|
+
break;
|
|
37
|
+
case 21: // int2
|
|
38
|
+
fieldType = 'int2';
|
|
39
|
+
break;
|
|
40
|
+
case 23: // int4
|
|
41
|
+
fieldType = 'int4';
|
|
42
|
+
break;
|
|
43
|
+
case 700: // float4
|
|
44
|
+
fieldType = 'float4';
|
|
45
|
+
break;
|
|
46
|
+
case 701: // float8
|
|
47
|
+
fieldType = 'float8';
|
|
48
|
+
break;
|
|
49
|
+
case 1700: // numeric
|
|
50
|
+
fieldType = 'numeric';
|
|
51
|
+
break;
|
|
52
|
+
case 1082: // date
|
|
53
|
+
fieldType = 'date';
|
|
54
|
+
break;
|
|
55
|
+
case 1083: // time
|
|
56
|
+
fieldType = 'time';
|
|
57
|
+
break;
|
|
58
|
+
case 1184: // timestamptz
|
|
59
|
+
fieldType = 'timestamptz';
|
|
60
|
+
break;
|
|
61
|
+
case 1186: // interval
|
|
62
|
+
fieldType = 'interval';
|
|
63
|
+
break;
|
|
64
|
+
case 1114: // timestamp
|
|
65
|
+
fieldType = 'timestamp';
|
|
66
|
+
break;
|
|
67
|
+
case 1043: // varchar
|
|
68
|
+
default:
|
|
69
|
+
fieldType = 'varchar';
|
|
70
|
+
}
|
|
71
|
+
switch (field.dataTypeID) {
|
|
72
|
+
case 16: // boolean
|
|
73
|
+
jsType = 'bool';
|
|
74
|
+
break;
|
|
75
|
+
case 20: // int8
|
|
76
|
+
case 21: // int2
|
|
77
|
+
case 23: // int4
|
|
78
|
+
case 700: // float4
|
|
79
|
+
case 701: // float8
|
|
80
|
+
case 1700: // numeric
|
|
81
|
+
jsType = 'number';
|
|
82
|
+
break;
|
|
83
|
+
case 1082: // date
|
|
84
|
+
case 1083: // time
|
|
85
|
+
case 1184: // timestamptz
|
|
86
|
+
case 1186: // interval
|
|
87
|
+
case 1114: // timestamp
|
|
88
|
+
jsType = 'date';
|
|
89
|
+
break;
|
|
90
|
+
case 1043: // varchar
|
|
91
|
+
default:
|
|
92
|
+
jsType = 'string';
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
label: field.name,
|
|
96
|
+
field: field.name,
|
|
97
|
+
format,
|
|
98
|
+
fieldType,
|
|
99
|
+
dataTypeID: field.dataTypeID,
|
|
100
|
+
jsType: jsType,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function convertColumnInfoToColumnInternal(columnInfo) {
|
|
104
|
+
return {
|
|
105
|
+
label: columnInfo.name,
|
|
106
|
+
field: columnInfo.name,
|
|
107
|
+
format: fieldTypeToFormat(columnInfo.fieldType),
|
|
108
|
+
fieldType: columnInfo.fieldType,
|
|
109
|
+
dataTypeID: fieldTypeToDataTypeID(columnInfo.fieldType),
|
|
110
|
+
jsType: convertFieldTypeToJSType(columnInfo.fieldType),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function fieldTypeToFormat(fieldType) {
|
|
114
|
+
switch (fieldType) {
|
|
115
|
+
case 'bool':
|
|
116
|
+
return 'string';
|
|
117
|
+
case 'int8':
|
|
118
|
+
case 'int2':
|
|
119
|
+
case 'int4':
|
|
120
|
+
return 'whole_number';
|
|
121
|
+
case 'float4':
|
|
122
|
+
case 'float8':
|
|
123
|
+
case 'numeric':
|
|
124
|
+
return 'two_decimal_places';
|
|
125
|
+
case 'date':
|
|
126
|
+
case 'time':
|
|
127
|
+
case 'timestamptz':
|
|
128
|
+
case 'timestamp':
|
|
129
|
+
return 'MMM_dd_yyyy';
|
|
130
|
+
case 'interval':
|
|
131
|
+
case 'varchar':
|
|
132
|
+
default:
|
|
133
|
+
return 'string';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function fieldTypeToDataTypeID(fieldType) {
|
|
137
|
+
switch (fieldType) {
|
|
138
|
+
case 'bool':
|
|
139
|
+
return 16;
|
|
140
|
+
case 'int8':
|
|
141
|
+
return 20;
|
|
142
|
+
case 'int2':
|
|
143
|
+
return 21;
|
|
144
|
+
case 'int4':
|
|
145
|
+
return 23;
|
|
146
|
+
case 'float4':
|
|
147
|
+
return 700;
|
|
148
|
+
case 'float8':
|
|
149
|
+
return 701;
|
|
150
|
+
case 'numeric':
|
|
151
|
+
return 1700;
|
|
152
|
+
case 'date':
|
|
153
|
+
return 1082;
|
|
154
|
+
case 'time':
|
|
155
|
+
return 1083;
|
|
156
|
+
case 'timestamptz':
|
|
157
|
+
return 1184;
|
|
158
|
+
case 'timestamp':
|
|
159
|
+
return 1114;
|
|
160
|
+
case 'interval':
|
|
161
|
+
return 1186;
|
|
162
|
+
case 'varchar':
|
|
163
|
+
default:
|
|
164
|
+
return 1043;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function convertFieldTypeToJSType(fieldType) {
|
|
168
|
+
switch (fieldType) {
|
|
169
|
+
case 'bool':
|
|
170
|
+
return 'bool';
|
|
171
|
+
case 'int8':
|
|
172
|
+
case 'int2':
|
|
173
|
+
case 'int4':
|
|
174
|
+
case 'float4':
|
|
175
|
+
case 'float8':
|
|
176
|
+
case 'numeric':
|
|
177
|
+
return 'number';
|
|
178
|
+
case 'date':
|
|
179
|
+
case 'time':
|
|
180
|
+
case 'timestamptz':
|
|
181
|
+
case 'timestamp':
|
|
182
|
+
return 'date';
|
|
183
|
+
case 'interval':
|
|
184
|
+
case 'varchar':
|
|
185
|
+
default:
|
|
186
|
+
return 'string';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export function convertFormatToJsType(column) {
|
|
190
|
+
switch (column.format) {
|
|
191
|
+
case 'string':
|
|
192
|
+
return 'string';
|
|
193
|
+
case 'whole_number':
|
|
194
|
+
case 'two_decimal_places':
|
|
195
|
+
return 'number';
|
|
196
|
+
case 'MMM_dd_yyyy':
|
|
197
|
+
return 'date';
|
|
198
|
+
default:
|
|
199
|
+
return 'string';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -117,15 +117,15 @@ function getPivotTable(itemInfo, dashboardFilters, config = undefined) {
|
|
|
117
117
|
const data = itemInfo ? itemInfo : config;
|
|
118
118
|
return pivot && data?.rows
|
|
119
119
|
? generatePivotTable(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
|
|
120
|
-
dateFilter?.startDate
|
|
121
|
-
?
|
|
122
|
-
:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
dateFilter
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
:
|
|
120
|
+
dateFilter?.startDate && dateFilter?.endDate
|
|
121
|
+
? { start: dateFilter.startDate, end: dateFilter.endDate }
|
|
122
|
+
: undefined, Boolean(dateFilter?.comparisonRange?.startDate), -1, dateFilter?.comparisonRange?.startDate &&
|
|
123
|
+
dateFilter?.comparisonRange?.endDate
|
|
124
|
+
? {
|
|
125
|
+
start: dateFilter.comparisonRange.startDate,
|
|
126
|
+
end: dateFilter.comparisonRange.endDate,
|
|
127
|
+
}
|
|
128
|
+
: undefined)
|
|
129
129
|
: null;
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
+
import { Column } from '../models/Columns';
|
|
2
3
|
export declare function pivotToSql(pivot: Pivot, query: string, client: any): {
|
|
3
4
|
query: string;
|
|
4
5
|
preQueries?: string[];
|
|
5
6
|
runQueryConfig?: any;
|
|
6
7
|
} | undefined;
|
|
7
8
|
export declare function isValidPivot(pivot: Pivot): boolean;
|
|
8
|
-
export declare function getPossiblePivotFieldOptions(columns:
|
|
9
|
+
export declare function getPossiblePivotFieldOptions(columns: Column[], uniqueValues: {
|
|
9
10
|
[field: string]: any;
|
|
10
11
|
}): {
|
|
11
12
|
rowFields: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAkB,MAAM,mBAAmB,CAAC;AAG3D,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,MAAM,EAAE,EACjB,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EAsCvC;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAqCP"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { dateFormatOptions, numberFormatOptions } from '../ChartBuilder';
|
|
2
|
-
import { isNumericColumnType } from '../components/ReportBuilder/ast';
|
|
3
1
|
import { isIdColumn } from '../components/ReportBuilder/util';
|
|
2
|
+
import { DATE_FORMAT_TYPES, NUMBER_FORMAT_TYPES } from './valueFormatter';
|
|
4
3
|
export function pivotToSql(pivot, query, client) {
|
|
5
4
|
const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
|
|
6
5
|
? 'avg'
|
|
@@ -105,9 +104,7 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
|
|
|
105
104
|
let valueFields = [];
|
|
106
105
|
for (let column of columns) {
|
|
107
106
|
// row fields can be dates or strings
|
|
108
|
-
if (column.format
|
|
109
|
-
column.fieldType === 'date' ||
|
|
110
|
-
dateFormatOptions.includes(column.format)) {
|
|
107
|
+
if (DATE_FORMAT_TYPES.includes(column.format)) {
|
|
111
108
|
rowFields.push(column.field);
|
|
112
109
|
}
|
|
113
110
|
// column fields can be strings
|
|
@@ -124,9 +121,7 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
|
|
|
124
121
|
}
|
|
125
122
|
}
|
|
126
123
|
// value fields can be numbers
|
|
127
|
-
if (column.format
|
|
128
|
-
numberFormatOptions.includes(column.format) ||
|
|
129
|
-
isNumericColumnType(column.fieldType)) {
|
|
124
|
+
if (NUMBER_FORMAT_TYPES.includes(column.format)) {
|
|
130
125
|
if (!isIdColumn(column.field)) {
|
|
131
126
|
valueFields.push(column.field);
|
|
132
127
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const getUniqueValuesByColumns: (columns:
|
|
1
|
+
import { Column } from '../models/Columns';
|
|
2
|
+
export declare const getUniqueValuesByColumns: (columns: Column[], query: string, rows: any, client: any) => Promise<{
|
|
3
3
|
[column: string]: {
|
|
4
4
|
[value: string]: boolean;
|
|
5
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,eAAO,MAAM,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG;;;;SAwDZ,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { getData } from './dataFetcher';
|
|
2
2
|
import { generateDistinctQuery } from './queryConstructor';
|
|
3
3
|
export const getUniqueValuesByColumns = async (columns, query, rows, client) => {
|
|
4
|
-
const stringNames = columns.map(
|
|
5
|
-
// @ts-ignore
|
|
6
|
-
(column) => column.name || column.field);
|
|
4
|
+
const stringNames = columns.map((column) => column.field);
|
|
7
5
|
const uniqueValues = {};
|
|
8
6
|
if (!client.databaseType ||
|
|
9
7
|
client.databaseType.toLowerCase() === 'bigquery') {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type AxisFormat } from '../Dashboard';
|
|
2
|
-
type Field = {
|
|
2
|
+
export type Field = {
|
|
3
3
|
_id: string;
|
|
4
4
|
label: string;
|
|
5
5
|
field: string;
|
|
@@ -11,6 +11,7 @@ type Props = {
|
|
|
11
11
|
fields: Field[];
|
|
12
12
|
};
|
|
13
13
|
export declare const DATE_FORMAT_TYPES: string[];
|
|
14
|
+
export declare const NUMBER_FORMAT_TYPES: string[];
|
|
14
15
|
/**
|
|
15
16
|
* Pretty-prints the given values to their nice-looking string form.
|
|
16
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,MAAM,MAAM,KAAK,GAAG;IAClB,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,eAAO,MAAM,mBAAmB,UAM/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAwCH,CAAC;AAoMF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MA6CF,CAAC"}
|
|
@@ -9,6 +9,13 @@ export const DATE_FORMAT_TYPES = [
|
|
|
9
9
|
'MMM_dd_hh:mm_ap_pm',
|
|
10
10
|
'wo, yyyy',
|
|
11
11
|
];
|
|
12
|
+
export const NUMBER_FORMAT_TYPES = [
|
|
13
|
+
'whole_number',
|
|
14
|
+
'one_decimal_place',
|
|
15
|
+
'two_decimal_places',
|
|
16
|
+
'dollar_amount',
|
|
17
|
+
'dollar_cents',
|
|
18
|
+
];
|
|
12
19
|
/**
|
|
13
20
|
* Pretty-prints the given values to their nice-looking string form.
|
|
14
21
|
*/
|
|
@@ -50,6 +57,10 @@ export const valueFormatter = ({ value, field, fields }) => {
|
|
|
50
57
|
return formatString(value); // by default make this value a string
|
|
51
58
|
};
|
|
52
59
|
export const quillFormat = ({ value, format, }) => {
|
|
60
|
+
// Handle special case, if value is null and format is numeric display '-'
|
|
61
|
+
if (value === null && NUMBER_FORMAT_TYPES.includes(format)) {
|
|
62
|
+
return '-';
|
|
63
|
+
}
|
|
53
64
|
const HANDLERS = {
|
|
54
65
|
percent: formatPercent,
|
|
55
66
|
dollar_amount: formatDollarAmount,
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAgDlE"}
|