@quillsql/react 2.12.27 → 2.12.28
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 +34 -17
- package/dist/cjs/ChartBuilder.d.ts +3 -3
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +30 -23
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +66 -26
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Dashboard.d.ts +6 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +3 -1
- package/dist/cjs/ReportBuilder.d.ts +1 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +12 -10
- package/dist/cjs/SQLEditor.d.ts +10 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +27 -3
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +17 -7
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +52 -15
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
- package/dist/cjs/components/QuillTable.d.ts +2 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +7 -5
- package/dist/cjs/components/UiComponents.d.ts +3 -3
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +4 -4
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +155 -80
- package/dist/cjs/utils/constants.d.ts +2 -0
- package/dist/cjs/utils/constants.d.ts.map +1 -0
- package/dist/cjs/utils/constants.js +4 -0
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +26 -96
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +56 -13
- package/dist/cjs/utils/dates.d.ts +8 -0
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +34 -1
- package/dist/cjs/utils/logging.d.ts +2 -0
- package/dist/cjs/utils/logging.d.ts.map +1 -0
- package/dist/cjs/utils/logging.js +10 -0
- package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
- package/dist/cjs/utils/pivotConstructor.js +87 -0
- package/dist/cjs/utils/queryConstructor.d.ts +2 -1
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +46 -11
- package/dist/cjs/utils/tableProcessing.d.ts +22 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +87 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +34 -17
- package/dist/esm/ChartBuilder.d.ts +3 -3
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +30 -23
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +66 -26
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Dashboard.d.ts +6 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +3 -1
- package/dist/esm/ReportBuilder.d.ts +1 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +13 -11
- package/dist/esm/SQLEditor.d.ts +10 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +27 -3
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +17 -7
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +5 -4
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +52 -15
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +2 -14
- package/dist/esm/components/QuillTable.d.ts +2 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +7 -5
- package/dist/esm/components/UiComponents.d.ts +3 -3
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +4 -4
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +153 -80
- package/dist/esm/utils/constants.d.ts +2 -0
- package/dist/esm/utils/constants.d.ts.map +1 -0
- package/dist/esm/utils/constants.js +1 -0
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +27 -97
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +56 -13
- package/dist/esm/utils/dates.d.ts +8 -0
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +31 -0
- package/dist/esm/utils/logging.d.ts +2 -0
- package/dist/esm/utils/logging.d.ts.map +1 -0
- package/dist/esm/utils/logging.js +6 -0
- package/dist/esm/utils/pivotConstructor.d.ts +6 -0
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
- package/dist/esm/utils/pivotConstructor.js +83 -0
- package/dist/esm/utils/queryConstructor.d.ts +2 -1
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +44 -10
- package/dist/esm/utils/tableProcessing.d.ts +22 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +85 -1
- package/package.json +1 -1
|
@@ -331,7 +331,7 @@ export const LoadingSpinner = () => (_jsx("div", { style: {
|
|
|
331
331
|
justifyContent: 'center',
|
|
332
332
|
alignItems: 'center',
|
|
333
333
|
}, children: _jsxs("svg", { width: "24", height: "24", children: [_jsx("circle", { cx: "12", cy: "12", r: "9.375", strokeWidth: "3.75", strokeDasharray: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 2 / 3)", strokeDashoffset: "calc(2 * 3.14 * 9.375 / 6)", stroke: "#364153", fill: "none", transform: "rotate(-90 12 12)", children: _jsx("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "-180 12 12", to: "180 12 12", dur: "0.8s", repeatCount: "indefinite" }) }), _jsx("circle", { cx: "12", cy: "12", r: "9.375", strokeWidth: "3.75", strokeDasharray: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 1 / 3)", strokeDashoffset: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 2 / 3)", stroke: '#ADB1B9', fill: "none", transform: "rotate(90 12 12)", children: _jsx("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 12 12", to: "360 12 12", dur: "0.8s", repeatCount: "indefinite" }) })] }) }));
|
|
334
|
-
export const QuillTableSQLEditorComponent = ({ rows, columns, isLoading = false,
|
|
334
|
+
export const QuillTableSQLEditorComponent = ({ rows, columns, isLoading = false, rowCount, onPageChange, onSortChange, }) => {
|
|
335
335
|
const [sort, setSort] = useState({ field: '', direction: '' });
|
|
336
336
|
const [page, setPage] = useState(0);
|
|
337
337
|
if (isLoading) {
|
|
@@ -343,7 +343,7 @@ export const QuillTableSQLEditorComponent = ({ rows, columns, isLoading = false,
|
|
|
343
343
|
height: '100%',
|
|
344
344
|
}, children: _jsx(LoadingSpinner, {}) }));
|
|
345
345
|
}
|
|
346
|
-
return (_jsx(QuillTable, { rows: rows, columns: columns, rowsPerPage: 20,
|
|
346
|
+
return (_jsx(QuillTable, { rows: rows, columns: columns, rowsPerPage: 20, rowCount: rowCount, onPageChange: (page) => {
|
|
347
347
|
setPage(page.currentPage);
|
|
348
348
|
onPageChange && onPageChange(page);
|
|
349
349
|
}, onSortChange: (sort) => {
|
|
@@ -352,7 +352,7 @@ export const QuillTableSQLEditorComponent = ({ rows, columns, isLoading = false,
|
|
|
352
352
|
onSortChange && onSortChange(sort);
|
|
353
353
|
}, sort: sort, currentPage: page, isLoading: isLoading }));
|
|
354
354
|
};
|
|
355
|
-
export const QuillTableComponent = ({ rows, columns, isLoading = false,
|
|
355
|
+
export const QuillTableComponent = ({ rows, columns, isLoading = false, rowCount, onPageChange, onSortChange, }) => {
|
|
356
356
|
const [sort, setSort] = useState({ field: '', direction: '' });
|
|
357
357
|
const [page, setPage] = useState(0);
|
|
358
358
|
const [initialLoad, setInitialLoad] = useState(true);
|
|
@@ -370,7 +370,7 @@ export const QuillTableComponent = ({ rows, columns, isLoading = false, numberOf
|
|
|
370
370
|
height: '100%',
|
|
371
371
|
}, children: _jsx(ChartSkeleton, {}) }));
|
|
372
372
|
}
|
|
373
|
-
return (_jsx(QuillTable, { rows: rows, columns: columns, rowsPerPage: 20,
|
|
373
|
+
return (_jsx(QuillTable, { rows: rows, columns: columns, rowsPerPage: 20, rowCount: rowCount, onPageChange: (page) => {
|
|
374
374
|
setPage(page.currentPage);
|
|
375
375
|
onPageChange && onPageChange(page);
|
|
376
376
|
}, onSortChange: (sort) => {
|
|
@@ -87,8 +87,9 @@ export interface PivotModalProps {
|
|
|
87
87
|
initialSelectedPivotTable?: any;
|
|
88
88
|
disabled?: boolean;
|
|
89
89
|
pivotRecommendationsEnabled?: boolean;
|
|
90
|
+
report?: any;
|
|
90
91
|
}
|
|
91
|
-
export declare const PivotModal: ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent, PivotRowContainer, PivotColumnContainer, LoadingComponent, CardComponent, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText, showPivotEditButton, showEditOnPivotClick, selectPivotOnEdit, showTrigger, rightAlign, parentRef, pivotCountRequest, query, initialUniqueValues, initialSelectedPivotTable, disabled, pivotRecommendationsEnabled, }: PivotModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
92
|
+
export declare const PivotModal: ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent, PivotRowContainer, PivotColumnContainer, LoadingComponent, CardComponent, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText, showPivotEditButton, showEditOnPivotClick, selectPivotOnEdit, showTrigger, rightAlign, parentRef, pivotCountRequest, query, initialUniqueValues, initialSelectedPivotTable, disabled, pivotRecommendationsEnabled, report, }: PivotModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
92
93
|
export declare function generatePivotTableYAxis(pivot: Pivot, cols: {
|
|
93
94
|
label: string;
|
|
94
95
|
field: string;
|
|
@@ -109,6 +110,10 @@ export declare function getDateRange(dateRange: {
|
|
|
109
110
|
start: Date;
|
|
110
111
|
end: Date;
|
|
111
112
|
};
|
|
113
|
+
export declare function getDateBuckets(dateRange: {
|
|
114
|
+
start: Date;
|
|
115
|
+
end: Date;
|
|
116
|
+
} | undefined, column: string, data: any, dateBucket?: string): Date[];
|
|
112
117
|
export declare function getDateString(value: string, dateRange?: {
|
|
113
118
|
start: Date;
|
|
114
119
|
end: Date;
|
|
@@ -120,6 +125,16 @@ export declare function generatePivotTable(pivot: Pivot, data: any, dateRange: {
|
|
|
120
125
|
} | undefined, isComparison: boolean, rowLimit?: number, compRange?: {
|
|
121
126
|
start: Date;
|
|
122
127
|
end: Date;
|
|
128
|
+
} | undefined, dateBucket?: string, report?: any, client?: any, uniqueValues?: any): Promise<{
|
|
129
|
+
rows: any;
|
|
130
|
+
columns: any;
|
|
131
|
+
}>;
|
|
132
|
+
export declare function generatePivotTableInMemory(pivot: Pivot, data: any, dateRange: {
|
|
133
|
+
start: Date;
|
|
134
|
+
end: Date;
|
|
135
|
+
} | undefined, isComparison: boolean, rowLimit?: number, compRange?: {
|
|
136
|
+
start: Date;
|
|
137
|
+
end: Date;
|
|
123
138
|
} | undefined, dateBucket?: string): {
|
|
124
139
|
rows: any[];
|
|
125
140
|
columns: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"AAAA,OAAc,EAOZ,SAAS,EACV,MAAM,OAAO,CAAC;AAuBf,OAAO,EACL,oBAAoB,EAKrB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,9 @@ 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';
|
|
15
|
-
import { getUniqueValuesByColumns } from '../../utils/tableProcessing';
|
|
15
|
+
import { getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
|
|
16
|
+
import { generatePivotWithSQL } from '../../utils/pivotConstructor';
|
|
17
|
+
import { getDateBucketFromRange, } from '../../utils/dates';
|
|
16
18
|
const QuillHover = () => {
|
|
17
19
|
return (_jsx("style", { children: `
|
|
18
20
|
.quill-hover {
|
|
@@ -26,7 +28,7 @@ const QuillHover = () => {
|
|
|
26
28
|
}
|
|
27
29
|
` }));
|
|
28
30
|
};
|
|
29
|
-
export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, pivotCountRequest = 6, query, initialUniqueValues, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, }) => {
|
|
31
|
+
export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, pivotCountRequest = 6, query, initialUniqueValues, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, }) => {
|
|
30
32
|
const [isLoading, setIsLoading] = useState(false);
|
|
31
33
|
const [selectedPivotType, setSelectedPivotType] = useState('recommended');
|
|
32
34
|
const [errors, setErrors] = useState([]);
|
|
@@ -41,6 +43,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
41
43
|
const [allowedRowFields, setAllowedRowFields] = useState([]);
|
|
42
44
|
const [allowedValueFields, setAllowedValueFields] = useState([]);
|
|
43
45
|
const [uniqueValues, setUniqueValues] = useState(initialUniqueValues);
|
|
46
|
+
const [dateRanges, setDateRanges] = useState({});
|
|
44
47
|
const getDistinctValues = async () => {
|
|
45
48
|
if (columns) {
|
|
46
49
|
const stringColumns = columns.filter((column) => {
|
|
@@ -66,6 +69,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
66
69
|
}
|
|
67
70
|
return { rowFields: [], columnFields: [], valueFields: [] };
|
|
68
71
|
};
|
|
72
|
+
const getAllDateRangesByColumn = async () => {
|
|
73
|
+
// Don't reprocess dateRanges if they are already gathered
|
|
74
|
+
if (Object.keys(dateRanges).length > 0 ||
|
|
75
|
+
(client && client.databaseType !== 'postgresql')) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (columns) {
|
|
79
|
+
const dateColumns = columns.filter((column) => {
|
|
80
|
+
return column.jsType === 'date';
|
|
81
|
+
});
|
|
82
|
+
if (dateColumns.length === 0) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const dateRangeByColumn = await getDateRangeByColumns(dateColumns, query || '', client, customFields);
|
|
86
|
+
setDateRanges(dateRangeByColumn || {});
|
|
87
|
+
}
|
|
88
|
+
};
|
|
69
89
|
useEffect(() => {
|
|
70
90
|
const calculatePivotCardSize = () => {
|
|
71
91
|
// The pivot card should be the same width as the row of inputs
|
|
@@ -90,30 +110,65 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
90
110
|
}, 500);
|
|
91
111
|
}
|
|
92
112
|
}, [showUpdatePivot, isOpen]);
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
const fetchPivotData = async () => {
|
|
115
|
+
if (pivotRowField && data && columns) {
|
|
116
|
+
const pivot = {
|
|
117
|
+
rowField: pivotRowField || '',
|
|
118
|
+
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
119
|
+
columnField: pivotColumnField,
|
|
120
|
+
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
121
|
+
valueField: pivotValueField || '',
|
|
122
|
+
aggregationType: pivotAggregation || '',
|
|
123
|
+
};
|
|
124
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
|
|
125
|
+
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
126
|
+
}
|
|
127
|
+
if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
|
|
128
|
+
getDistinctValues();
|
|
129
|
+
}
|
|
130
|
+
if (initialUniqueValues) {
|
|
131
|
+
const possibleColumns = getPossiblePivotFieldOptions(columns, initialUniqueValues);
|
|
132
|
+
setAllowedRowFields(possibleColumns.rowFields);
|
|
133
|
+
setAllowedColumnFields(possibleColumns.columnFields);
|
|
134
|
+
setAllowedValueFields(possibleColumns.valueFields);
|
|
135
|
+
setUniqueValues(initialUniqueValues);
|
|
136
|
+
}
|
|
137
|
+
if (pivotRowField && data && columns) {
|
|
138
|
+
const pivot = {
|
|
139
|
+
rowField: pivotRowField || '',
|
|
140
|
+
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
141
|
+
columnField: pivotColumnField,
|
|
142
|
+
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
143
|
+
valueField: pivotValueField || '',
|
|
144
|
+
aggregationType: pivotAggregation || '',
|
|
145
|
+
};
|
|
146
|
+
if (initialSelectedPivotTable) {
|
|
147
|
+
setSamplePivotTable({
|
|
148
|
+
pivot: pivot,
|
|
149
|
+
rows: initialSelectedPivotTable.rows,
|
|
150
|
+
columns: initialSelectedPivotTable.columns,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
155
|
+
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
fetchPivotData();
|
|
160
|
+
}, []);
|
|
93
161
|
useEffect(() => {
|
|
94
162
|
if (pivotRowField && data && columns) {
|
|
95
|
-
const pivot = {
|
|
96
|
-
rowField: pivotRowField || '',
|
|
97
|
-
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
98
|
-
columnField: pivotColumnField,
|
|
99
|
-
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
100
|
-
valueField: pivotValueField || '',
|
|
101
|
-
aggregationType: pivotAggregation || '',
|
|
102
|
-
};
|
|
103
|
-
const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
|
|
104
|
-
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
105
|
-
}
|
|
106
|
-
if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
|
|
107
163
|
getDistinctValues();
|
|
164
|
+
getAllDateRangesByColumn();
|
|
108
165
|
}
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
setAllowedRowFields(possibleColumns.rowFields);
|
|
112
|
-
setAllowedColumnFields(possibleColumns.columnFields);
|
|
113
|
-
setAllowedValueFields(possibleColumns.valueFields);
|
|
114
|
-
setUniqueValues(initialUniqueValues);
|
|
166
|
+
else if (initialSelectedPivotTable) {
|
|
167
|
+
getDistinctValues();
|
|
115
168
|
}
|
|
116
|
-
|
|
169
|
+
}, [initialSelectedPivotTable, columns, data, pivotRowField]);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
const fetchPivotTables = async () => {
|
|
117
172
|
const pivot = {
|
|
118
173
|
rowField: pivotRowField || '',
|
|
119
174
|
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
@@ -122,37 +177,12 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
122
177
|
valueField: pivotValueField || '',
|
|
123
178
|
aggregationType: pivotAggregation || '',
|
|
124
179
|
};
|
|
125
|
-
if (
|
|
126
|
-
|
|
127
|
-
pivot: pivot,
|
|
128
|
-
rows: initialSelectedPivotTable.rows,
|
|
129
|
-
columns: initialSelectedPivotTable.columns,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
|
|
180
|
+
if (isValidPivot(pivot) && data && columns) {
|
|
181
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
134
182
|
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
135
183
|
}
|
|
136
|
-
}
|
|
137
|
-
}, []);
|
|
138
|
-
useEffect(() => {
|
|
139
|
-
if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
|
|
140
|
-
getDistinctValues();
|
|
141
|
-
}
|
|
142
|
-
}, [initialSelectedPivotTable, columns, data, pivotRowField]);
|
|
143
|
-
useEffect(() => {
|
|
144
|
-
const pivot = {
|
|
145
|
-
rowField: pivotRowField || '',
|
|
146
|
-
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
147
|
-
columnField: pivotColumnField,
|
|
148
|
-
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
149
|
-
valueField: pivotValueField || '',
|
|
150
|
-
aggregationType: pivotAggregation || '',
|
|
151
184
|
};
|
|
152
|
-
|
|
153
|
-
const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
|
|
154
|
-
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
155
|
-
}
|
|
185
|
+
fetchPivotTables();
|
|
156
186
|
}, [
|
|
157
187
|
data,
|
|
158
188
|
columns,
|
|
@@ -181,17 +211,21 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
181
211
|
return map;
|
|
182
212
|
}, {});
|
|
183
213
|
}, [columns]);
|
|
184
|
-
const selectedPivotTable =
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
214
|
+
const [selectedPivotTable, setSelectedPivotTable] = useState(null);
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
const fetchPivotTables = async () => {
|
|
217
|
+
if (selectedPivotIndex === -1) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const pivot = createdPivots[selectedPivotIndex];
|
|
221
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
222
|
+
setSelectedPivotTable({
|
|
223
|
+
pivot: pivot,
|
|
224
|
+
rows: rows,
|
|
225
|
+
columns: columns,
|
|
226
|
+
});
|
|
194
227
|
};
|
|
228
|
+
fetchPivotTables();
|
|
195
229
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
196
230
|
const onSelectRecommendedPivot = (pivot, index) => {
|
|
197
231
|
if (showEditOnPivotClick) {
|
|
@@ -208,12 +242,12 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
208
242
|
setIsOpen(false);
|
|
209
243
|
};
|
|
210
244
|
const onSelectCreatedPivot = (pivot, index) => {
|
|
211
|
-
selectPivot(pivot);
|
|
245
|
+
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange);
|
|
212
246
|
setSelectedPivotType('created');
|
|
213
247
|
setIsOpen(false);
|
|
214
248
|
setPopUpTitle('Add pivot');
|
|
215
249
|
};
|
|
216
|
-
const onEditPivot = (pivot, index) => {
|
|
250
|
+
const onEditPivot = async (pivot, index) => {
|
|
217
251
|
setIsLoading(false);
|
|
218
252
|
setPivotRowField(pivot.rowField);
|
|
219
253
|
setPivotColumnField(pivot.columnField);
|
|
@@ -221,7 +255,11 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
221
255
|
setPivotAggregation(pivot.aggregationType);
|
|
222
256
|
setShowUpdatePivot(true);
|
|
223
257
|
if (isValidPivot(pivot)) {
|
|
224
|
-
|
|
258
|
+
let dateBucket = undefined;
|
|
259
|
+
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
260
|
+
dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
|
|
261
|
+
}
|
|
262
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
|
|
225
263
|
setSamplePivotTable({ pivot, rows, columns });
|
|
226
264
|
return;
|
|
227
265
|
}
|
|
@@ -323,26 +361,38 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
323
361
|
setSamplePivotTable(null);
|
|
324
362
|
return;
|
|
325
363
|
}
|
|
326
|
-
|
|
327
|
-
|
|
364
|
+
let dateBucket = undefined;
|
|
365
|
+
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
366
|
+
dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
|
|
367
|
+
}
|
|
368
|
+
setTimeout(async () => {
|
|
369
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
|
|
328
370
|
setSamplePivotTable({ pivot, rows, columns });
|
|
329
371
|
setIsLoading(false);
|
|
330
372
|
}, 500);
|
|
331
373
|
};
|
|
332
|
-
const recommendedPivotTables =
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
374
|
+
const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
|
|
375
|
+
useEffect(() => {
|
|
376
|
+
const fetchPivotTables = async () => {
|
|
377
|
+
const pts = await Promise.all(recommendedPivots.map(async (p) => {
|
|
378
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
|
|
379
|
+
return { pivot: p, rows, columns };
|
|
380
|
+
}));
|
|
381
|
+
setRecommendedPivotTables(pts);
|
|
382
|
+
};
|
|
383
|
+
fetchPivotTables();
|
|
384
|
+
}, [recommendedPivots, dateRange]);
|
|
385
|
+
const [createdPivotTables, setCreatedPivotTables] = useState([]);
|
|
386
|
+
useEffect(() => {
|
|
387
|
+
const fetchPivotTables = async () => {
|
|
388
|
+
const pts = await Promise.all(createdPivots.map(async (p) => {
|
|
389
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
|
|
390
|
+
return { pivot: p, rows, columns };
|
|
391
|
+
}));
|
|
392
|
+
setCreatedPivotTables(pts);
|
|
393
|
+
};
|
|
394
|
+
fetchPivotTables();
|
|
395
|
+
}, [createdPivots, dateRange]);
|
|
346
396
|
return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
|
|
347
397
|
position: 'relative',
|
|
348
398
|
display: 'inline-block',
|
|
@@ -619,7 +669,7 @@ function determineIntervalThroughOverride(dateBucket, dateRange) {
|
|
|
619
669
|
return eachMonthOfInterval(dateRange);
|
|
620
670
|
}
|
|
621
671
|
}
|
|
622
|
-
function getDateBuckets(dateRange, column, data, dateBucket) {
|
|
672
|
+
export function getDateBuckets(dateRange, column, data, dateBucket) {
|
|
623
673
|
if (!dateRange) {
|
|
624
674
|
if (dateBucket) {
|
|
625
675
|
return determineIntervalThroughOverride(dateBucket, getDateRange(undefined, column, data));
|
|
@@ -736,7 +786,30 @@ const fixBigQueryData = (data = []) => {
|
|
|
736
786
|
}
|
|
737
787
|
return newData;
|
|
738
788
|
};
|
|
739
|
-
export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
|
|
789
|
+
export async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
|
|
790
|
+
try {
|
|
791
|
+
if (report &&
|
|
792
|
+
report.rowCount &&
|
|
793
|
+
report.rowCount !== data.length &&
|
|
794
|
+
client &&
|
|
795
|
+
client.databaseType.toLowerCase() === 'postgresql') {
|
|
796
|
+
let dateFilter = report
|
|
797
|
+
? report.filtersApplied.find((f) => f.filterType === 'date_range')
|
|
798
|
+
: undefined;
|
|
799
|
+
const pivotTable = await generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
|
|
800
|
+
? Object.keys(uniqueValues[pivot.columnField])
|
|
801
|
+
: undefined);
|
|
802
|
+
if (pivotTable) {
|
|
803
|
+
return pivotTable;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
catch (e) {
|
|
808
|
+
console.error('Error generating pivot table with SQL, using in memory process', e);
|
|
809
|
+
}
|
|
810
|
+
return generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit, compRange);
|
|
811
|
+
}
|
|
812
|
+
export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
|
|
740
813
|
// If there is no rowField, aggregate on the valueField
|
|
741
814
|
if (!pivot.rowField) {
|
|
742
815
|
return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MAX_COLUMN_ROWS_LIMIT = 500;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAoC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;AA0KD,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,GAAG,CAAC,CA0Bd"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { valueFormatter } from './valueFormatter';
|
|
2
|
-
import { generatePivotTable, generatePivotTableYAxis,
|
|
2
|
+
import { generatePivotTable, generatePivotTableYAxis, } from '../internals/ReportBuilder/PivotModal';
|
|
3
3
|
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
4
|
-
import { generatePivotQuery } from './queryConstructor';
|
|
5
4
|
import { getData } from './dataFetcher';
|
|
6
|
-
import {
|
|
5
|
+
import { getDateBucketFromRange } from './dates';
|
|
6
|
+
import { generatePivotWithSQL } from './pivotConstructor';
|
|
7
7
|
const defaultDashboardItem = {
|
|
8
8
|
id: '',
|
|
9
9
|
name: '',
|
|
@@ -67,8 +67,10 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
67
67
|
xAxisFormat: item.xAxisFormat,
|
|
68
68
|
order: item.order,
|
|
69
69
|
filtersApplied: item.filtersApplied,
|
|
70
|
+
rowCount: parseInt(item.rowCount),
|
|
70
71
|
sort: item.sort,
|
|
71
72
|
page: item.page,
|
|
73
|
+
itemQuery: item.itemQuery,
|
|
72
74
|
};
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
@@ -118,106 +120,34 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
|
|
|
118
120
|
}
|
|
119
121
|
const pivot = report?.pivot;
|
|
120
122
|
const data = report || {};
|
|
121
|
-
if (client && client.databaseType.toLowerCase() === 'postgresql') {
|
|
123
|
+
if (pivot && client && client.databaseType.toLowerCase() === 'postgresql') {
|
|
124
|
+
if (report.rowCount === 0) {
|
|
125
|
+
return { rows: [], columns: [] };
|
|
126
|
+
}
|
|
122
127
|
try {
|
|
123
|
-
let dateRange = undefined;
|
|
124
|
-
let comparisonInterval = undefined;
|
|
125
128
|
let dateBucket = dateBucketInitial;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
dateRange = getDateRange(filterDateRange, pivot.rowField, data.rows);
|
|
135
|
-
const difference = differenceInDays(dateRange.end, dateRange.start);
|
|
136
|
-
if (difference < 14) {
|
|
137
|
-
dateBucket = 'day';
|
|
138
|
-
}
|
|
139
|
-
else if (difference < 60) {
|
|
140
|
-
dateBucket = 'week';
|
|
141
|
-
}
|
|
142
|
-
else if (difference < 365 * 3) {
|
|
143
|
-
dateBucket = 'month';
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
dateBucket = 'year';
|
|
147
|
-
}
|
|
129
|
+
let filterDateRange = undefined;
|
|
130
|
+
if (dateFilter) {
|
|
131
|
+
filterDateRange = {
|
|
132
|
+
start: dateFilter.startDate,
|
|
133
|
+
end: dateFilter.endDate,
|
|
134
|
+
};
|
|
148
135
|
}
|
|
149
|
-
if (
|
|
150
|
-
|
|
151
|
-
if (!isNaN(comparisonRange)) {
|
|
152
|
-
if (dateBucket === 'month') {
|
|
153
|
-
comparisonInterval = comparisonRange / 30 + ' month';
|
|
154
|
-
}
|
|
155
|
-
else if (dateBucket === 'year') {
|
|
156
|
-
comparisonInterval = comparisonRange / 365 + ' year';
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
comparisonInterval = comparisonRange + ' day';
|
|
160
|
-
}
|
|
161
|
-
}
|
|
136
|
+
else if (report.dateRange) {
|
|
137
|
+
filterDateRange = report.dateRange;
|
|
162
138
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
orgId: client.customerId || '*',
|
|
170
|
-
clientId: client.publicKey,
|
|
171
|
-
databaseType: client?.databaseType,
|
|
172
|
-
getCustomFields: false,
|
|
173
|
-
runQueryConfig: {
|
|
174
|
-
overridePost: true,
|
|
175
|
-
convertDatatypes: true,
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
const cloudBody = { ...hostedBody };
|
|
180
|
-
const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody);
|
|
181
|
-
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
182
|
-
const rows = resp.queryResults[0].rows;
|
|
183
|
-
const columns = resp.queryResults[0].fields
|
|
184
|
-
.map((field) => ({
|
|
185
|
-
field: field.name,
|
|
186
|
-
label: field.name.replace('comparison_', 'comparison '),
|
|
187
|
-
}))
|
|
188
|
-
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0);
|
|
189
|
-
if (pivot.rowFieldType !== 'string') {
|
|
190
|
-
rows.forEach((row) => {
|
|
191
|
-
row[pivot.rowField] = getDateString(row[pivot.rowField], undefined, dateBucket);
|
|
192
|
-
});
|
|
193
|
-
// add a row for each date in the range that doesn't have a value
|
|
194
|
-
if (pivot.rowFieldType !== 'string') {
|
|
195
|
-
const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
|
|
196
|
-
// create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
|
|
197
|
-
for (let date = dateFilter.startDate; date <= dateFilter.endDate; date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
|
|
198
|
-
const formattedDate = getDateString(date.toDateString(), undefined, dateBucket);
|
|
199
|
-
if (!dateSet.has(formattedDate)) {
|
|
200
|
-
const newRow = {};
|
|
201
|
-
newRow[pivot.rowField] = formattedDate;
|
|
202
|
-
rows.push(newRow);
|
|
203
|
-
dateSet.add(formattedDate);
|
|
204
|
-
}
|
|
205
|
-
// order the rows by the date field
|
|
206
|
-
rows.sort((a, b) => {
|
|
207
|
-
return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
|
|
208
|
-
? -1
|
|
209
|
-
: 1;
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
rows: rows,
|
|
216
|
-
columns: columns,
|
|
217
|
-
};
|
|
139
|
+
if (!dateBucket && filterDateRange) {
|
|
140
|
+
dateBucket = getDateBucketFromRange(filterDateRange);
|
|
141
|
+
}
|
|
142
|
+
const pivotTable = await generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, report.distinctStrings);
|
|
143
|
+
if (pivotTable) {
|
|
144
|
+
return pivotTable;
|
|
218
145
|
}
|
|
146
|
+
throw new Error('Error generating pivot table');
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
throw new Error('Error generating pivot table: ' + e);
|
|
219
150
|
}
|
|
220
|
-
catch (e) { }
|
|
221
151
|
}
|
|
222
152
|
return pivot && data.rows
|
|
223
153
|
? generatePivotTable(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAmGhB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
|