@quillsql/react 2.12.27 → 2.12.29
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 +40 -21
- package/dist/cjs/ChartBuilder.d.ts +38 -4
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +66 -25
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +66 -26
- package/dist/cjs/Context.d.ts +1 -19
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +32 -83
- package/dist/cjs/Dashboard.d.ts +6 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +79 -50
- package/dist/cjs/ReportBuilder.d.ts +10 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +331 -99
- package/dist/cjs/SQLEditor.d.ts +10 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +122 -29
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +21 -11
- 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 +61 -20
- 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/hooks/useDashboard.d.ts +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +18 -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 +179 -105
- package/dist/cjs/utils/columnProcessing.d.ts +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +8 -1
- 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 +1 -1
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +63 -15
- package/dist/cjs/utils/dates.d.ts +9 -0
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +43 -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/monacoAutocomplete.d.ts +20 -0
- package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/cjs/utils/monacoAutocomplete.js +145 -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 +140 -0
- package/dist/cjs/utils/queryConstructor.d.ts +5 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +149 -53
- package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
- package/dist/cjs/utils/tableProcessing.d.ts +23 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +125 -2
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +40 -21
- package/dist/esm/ChartBuilder.d.ts +38 -4
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +64 -24
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +66 -26
- package/dist/esm/Context.d.ts +1 -19
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +32 -82
- package/dist/esm/Dashboard.d.ts +6 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +80 -51
- package/dist/esm/ReportBuilder.d.ts +10 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +333 -101
- package/dist/esm/SQLEditor.d.ts +10 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +123 -30
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +21 -11
- 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 +61 -20
- 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/hooks/useDashboard.d.ts +1 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +19 -5
- 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 +177 -105
- package/dist/esm/utils/columnProcessing.d.ts +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +6 -0
- 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 +1 -1
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +63 -15
- package/dist/esm/utils/dates.d.ts +9 -0
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +39 -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/monacoAutocomplete.d.ts +20 -0
- package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/esm/utils/monacoAutocomplete.js +140 -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 +136 -0
- package/dist/esm/utils/queryConstructor.d.ts +5 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +145 -52
- package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.uspec.js +223 -0
- package/dist/esm/utils/tableProcessing.d.ts +23 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +122 -2
- package/package.json +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
|
@@ -41,6 +41,8 @@ const columnProcessing_1 = require("./utils/columnProcessing");
|
|
|
41
41
|
const astProcessing_1 = require("./utils/astProcessing");
|
|
42
42
|
const PivotForm_1 = __importDefault(require("./internals/ReportBuilder/PivotForm"));
|
|
43
43
|
const schema_1 = require("./utils/schema");
|
|
44
|
+
const constants_2 = require("./utils/constants");
|
|
45
|
+
const dates_1 = require("./utils/dates");
|
|
44
46
|
exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
45
47
|
'https://quill-344421.uc.r.appspot.com';
|
|
46
48
|
/**
|
|
@@ -74,7 +76,7 @@ exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SE
|
|
|
74
76
|
* ### Report Builder API
|
|
75
77
|
* @see https://docs.quillsql.com/components/report-builder
|
|
76
78
|
*/
|
|
77
|
-
function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, TableComponent = UiComponents_1.QuillTableSQLEditorComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, ChartBuilderModalComponent = UiComponents_1.MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement }) {
|
|
79
|
+
function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, TableComponent = UiComponents_1.QuillTableSQLEditorComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, ChartBuilderModalComponent = UiComponents_1.MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
|
|
78
80
|
const { data: report } = (0, useQuill_1.useQuill)(reportId || '');
|
|
79
81
|
const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
|
|
80
82
|
const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
|
|
@@ -97,6 +99,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
97
99
|
const [rows, setRows] = (0, react_1.useState)([]);
|
|
98
100
|
const [formattedRows, setFormattedRows] = (0, react_1.useState)([]);
|
|
99
101
|
const [columns, setColumns] = (0, react_1.useState)([]);
|
|
102
|
+
const [tempReport, setTempReport] = (0, react_1.useState)({});
|
|
100
103
|
const [topLevelBinaryOperator, setTopLevelBinaryOperator] = (0, react_1.useState)('AND');
|
|
101
104
|
const [editPopoverKey, setEditPopoverKey] = (0, react_1.useState)(null);
|
|
102
105
|
const [uniqueValues, setUniqueValues] = (0, react_1.useState)({});
|
|
@@ -122,19 +125,23 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
122
125
|
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
|
|
123
126
|
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(undefined);
|
|
124
127
|
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(undefined);
|
|
128
|
+
const [dateRanges, setDateRanges] = (0, react_1.useState)(null);
|
|
125
129
|
// eslint-disable-next-line no-unused-vars
|
|
126
130
|
const [client, _setClient] = (0, react_1.useContext)(Context_1.ClientContext);
|
|
127
131
|
// JANK: This is temp and stupid
|
|
128
132
|
const [overrideRecommendations, setOverrideRecommendations] = (0, react_1.useState)(true);
|
|
129
133
|
const [customFields, setCustomFields] = (0, react_1.useContext)(Context_1.CustomFieldContext);
|
|
130
134
|
(0, react_1.useEffect)(() => {
|
|
135
|
+
if (!client) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
131
138
|
if (client.publicKey === '663416663aa9bc716e59a89d') {
|
|
132
139
|
setOverrideRecommendations(false);
|
|
133
140
|
}
|
|
134
141
|
if (!loadingSchema) {
|
|
135
142
|
fetchSchema();
|
|
136
143
|
}
|
|
137
|
-
}, [client
|
|
144
|
+
}, [client]);
|
|
138
145
|
(0, react_1.useEffect)(() => {
|
|
139
146
|
(0, width_1.updateFirstChildWidth)(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
140
147
|
(0, width_1.updateFirstChildWidth)(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
@@ -152,8 +159,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
152
159
|
window.removeEventListener('resize', handleResize);
|
|
153
160
|
};
|
|
154
161
|
}, []);
|
|
155
|
-
const updatePivot = (changeField, fieldKey) => {
|
|
162
|
+
const updatePivot = async (changeField, fieldKey) => {
|
|
156
163
|
const newPivot = pivot;
|
|
164
|
+
setTableLoading(true);
|
|
157
165
|
// @ts-ignore
|
|
158
166
|
newPivot[fieldKey] = changeField;
|
|
159
167
|
if (fieldKey === 'rowField') {
|
|
@@ -171,11 +179,17 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
171
179
|
newPivot.sort = undefined;
|
|
172
180
|
}
|
|
173
181
|
}
|
|
174
|
-
|
|
175
|
-
const
|
|
182
|
+
let dateBucket = undefined;
|
|
183
|
+
const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
|
|
184
|
+
if (tempDateRange) {
|
|
185
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
186
|
+
}
|
|
187
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
176
188
|
setPivotData(pivotedData || []);
|
|
177
189
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
190
|
+
setPivot(newPivot);
|
|
178
191
|
setFormattedRows(formattedRows);
|
|
192
|
+
setTableLoading(false);
|
|
179
193
|
};
|
|
180
194
|
const enforceOrderOnColumns = (columnNames) => {
|
|
181
195
|
if (pivot) {
|
|
@@ -220,10 +234,13 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
220
234
|
}, 0);
|
|
221
235
|
};
|
|
222
236
|
(0, react_1.useEffect)(() => {
|
|
237
|
+
if (!client) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
223
240
|
if (!initialLoad && client.publicKey) {
|
|
224
241
|
clearAllState();
|
|
225
242
|
}
|
|
226
|
-
}, [client
|
|
243
|
+
}, [client]);
|
|
227
244
|
(0, react_1.useEffect)(() => {
|
|
228
245
|
if (activePath !== null) {
|
|
229
246
|
// update the modal with the new subtree
|
|
@@ -360,6 +377,34 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
360
377
|
console.error(error);
|
|
361
378
|
}
|
|
362
379
|
};
|
|
380
|
+
const getUniqueStringValues = async (columns, tableName) => {
|
|
381
|
+
const convertedStringColumns = columns
|
|
382
|
+
.filter((column) => {
|
|
383
|
+
return (0, ast_1.isTextColumnType)(column.fieldType);
|
|
384
|
+
})
|
|
385
|
+
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
386
|
+
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
387
|
+
const smallStringColumns = await (0, tableProcessing_1.getCountsByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
|
|
388
|
+
const smallStringNames = smallStringColumns.map((column) => column.field);
|
|
389
|
+
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
390
|
+
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
391
|
+
joinedUniqueValues[tableName] = newUniqueValues;
|
|
392
|
+
return joinedUniqueValues;
|
|
393
|
+
};
|
|
394
|
+
const getDateRanges = async (columns, tableName) => {
|
|
395
|
+
const dateColumns = columns.filter((column) => {
|
|
396
|
+
return column.fieldType === 'date';
|
|
397
|
+
});
|
|
398
|
+
if (dateColumns.length === 0) {
|
|
399
|
+
return {};
|
|
400
|
+
}
|
|
401
|
+
const dateColumnNames = dateColumns.map((column) => {
|
|
402
|
+
//@ts-ignore
|
|
403
|
+
return column.field || column.name;
|
|
404
|
+
});
|
|
405
|
+
const dateRanges = await (0, tableProcessing_1.getDateRangeByColumns)(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
|
|
406
|
+
return dateRanges;
|
|
407
|
+
};
|
|
363
408
|
// It's just like getColumnsInPivot but we expand the columnField
|
|
364
409
|
// if there is one to include all the variants just like it would
|
|
365
410
|
// show up in the table. (eg. category -> ...[Fuel, Food, Other])
|
|
@@ -386,18 +431,12 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
386
431
|
setLoading(true);
|
|
387
432
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
|
|
388
433
|
if (tableInfo) {
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
})
|
|
393
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
394
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
395
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
|
|
396
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
397
|
-
joinedUniqueValues[initialTableName] = newUniqueValues;
|
|
398
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
|
|
399
|
-
setUniqueValues(joinedUniqueValues);
|
|
434
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
|
|
435
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
436
|
+
setUniqueValues(newUniqueValues);
|
|
400
437
|
}
|
|
438
|
+
const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
|
|
439
|
+
setDateRanges(dateRangesTemp);
|
|
401
440
|
}
|
|
402
441
|
const columnsForTable = tables
|
|
403
442
|
.find((t) => t.name === initialTableName)
|
|
@@ -489,17 +528,13 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
489
528
|
setBaseAst(newAst);
|
|
490
529
|
const initialRows = await fetchUponChange(newAst, undefined);
|
|
491
530
|
const tableInfo = schemaInfo.find((table) => table.name === tableName);
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
500
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
501
|
-
joinedUniqueValues[tableName] = newUniqueValues;
|
|
502
|
-
setUniqueValues(joinedUniqueValues);
|
|
531
|
+
let newUniqueValues = undefined;
|
|
532
|
+
let dateRangesTemp = undefined;
|
|
533
|
+
if (tableName) {
|
|
534
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
|
|
535
|
+
setUniqueValues(newUniqueValues);
|
|
536
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
|
|
537
|
+
setDateRanges(dateRangesTemp);
|
|
503
538
|
}
|
|
504
539
|
if (groupByPivot) {
|
|
505
540
|
// @ts-ignore
|
|
@@ -511,9 +546,16 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
511
546
|
// @ts-ignore
|
|
512
547
|
setPivotValueField(groupByPivot.valueField);
|
|
513
548
|
setPivot(groupByPivot);
|
|
514
|
-
|
|
549
|
+
let dateBucket = undefined;
|
|
550
|
+
const tempDateRange = dateRangesTemp &&
|
|
551
|
+
groupByPivot.rowField &&
|
|
552
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
553
|
+
if (tempDateRange) {
|
|
554
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
555
|
+
}
|
|
556
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
515
557
|
// @ts-ignore
|
|
516
|
-
groupByPivot, initialRows, undefined,
|
|
558
|
+
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
517
559
|
setPivotData(pivotedData || []);
|
|
518
560
|
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
519
561
|
// @ts-ignore
|
|
@@ -921,6 +963,89 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
921
963
|
return [{ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(pivot.valueField) }];
|
|
922
964
|
}
|
|
923
965
|
};
|
|
966
|
+
const [previousPage, setPreviousPage] = (0, react_1.useState)(0);
|
|
967
|
+
const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)({
|
|
968
|
+
page: { currentPage: 0, rowsPerPage: 20 },
|
|
969
|
+
});
|
|
970
|
+
const [numberOfRows, setNumberOfRows] = (0, react_1.useState)(0);
|
|
971
|
+
const [tableLoading, setTableLoading] = (0, react_1.useState)(false);
|
|
972
|
+
const onPageChange = (page) => {
|
|
973
|
+
if (pivot) {
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
if ((previousPage < page.currentPage &&
|
|
977
|
+
(page.currentPage * page.rowsPerPage) % constants_2.MAX_COLUMN_ROWS_LIMIT === 0) ||
|
|
978
|
+
(previousPage > page.currentPage &&
|
|
979
|
+
(previousPage * page.rowsPerPage) % constants_2.MAX_COLUMN_ROWS_LIMIT === 0)) {
|
|
980
|
+
handleRunQuery({ ...currentProcessing, page });
|
|
981
|
+
}
|
|
982
|
+
setPreviousPage(page.currentPage);
|
|
983
|
+
};
|
|
984
|
+
const onSortChange = (sort) => {
|
|
985
|
+
if (pivot) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
handleRunQuery({ sort, page: { currentPage: 0, rowsPerPage: 20 } });
|
|
989
|
+
setPreviousPage(0);
|
|
990
|
+
};
|
|
991
|
+
const handleRunQuery = async (processing) => {
|
|
992
|
+
try {
|
|
993
|
+
setErrorMessage('');
|
|
994
|
+
setTableLoading(true);
|
|
995
|
+
const hostedBody = {
|
|
996
|
+
metadata: {
|
|
997
|
+
query: activeQuery,
|
|
998
|
+
task: 'query',
|
|
999
|
+
orgId: client.customerId || '*',
|
|
1000
|
+
clientId: client.publicKey,
|
|
1001
|
+
databaseType: client?.databaseType,
|
|
1002
|
+
getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
|
|
1003
|
+
customFieldsByTable: customFields,
|
|
1004
|
+
additionalProcessing: processing,
|
|
1005
|
+
useUpdatedDataGathering: true,
|
|
1006
|
+
},
|
|
1007
|
+
};
|
|
1008
|
+
const cloudBody = { activeQuery };
|
|
1009
|
+
const resp = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1010
|
+
if (resp && resp.errorMessage) {
|
|
1011
|
+
setTableLoading(false);
|
|
1012
|
+
setErrorMessage('Failed to run SQL query: ' + resp.errorMessage);
|
|
1013
|
+
setRows([]);
|
|
1014
|
+
setColumns([]);
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
if (resp.rowCount) {
|
|
1018
|
+
setNumberOfRows(resp.rowCount);
|
|
1019
|
+
}
|
|
1020
|
+
setErrorMessage('');
|
|
1021
|
+
setCurrentProcessing(processing);
|
|
1022
|
+
if (resp.rows.length === 0) {
|
|
1023
|
+
setErrorMessage('No data found');
|
|
1024
|
+
}
|
|
1025
|
+
const temp_rows = resp.rows && resp.rows.length ? resp.rows : [];
|
|
1026
|
+
const processedFields = resp.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
1027
|
+
setRows(temp_rows);
|
|
1028
|
+
// setNumberOfRows(resp.compareRows[0]?.count || temp_rows.length);
|
|
1029
|
+
setFormattedRows(temp_rows.map((row) => {
|
|
1030
|
+
return processedFields.reduce((formattedRow, column) => {
|
|
1031
|
+
// Apply the format function to each field in the row
|
|
1032
|
+
const formattedValue = (0, valueFormatter_1.quillFormat)({
|
|
1033
|
+
value: row[column.field],
|
|
1034
|
+
format: column.format,
|
|
1035
|
+
});
|
|
1036
|
+
formattedRow[column.field] = formattedValue;
|
|
1037
|
+
return formattedRow;
|
|
1038
|
+
}, {});
|
|
1039
|
+
}));
|
|
1040
|
+
setColumns(processedFields);
|
|
1041
|
+
setTableLoading(false);
|
|
1042
|
+
}
|
|
1043
|
+
catch (e) {
|
|
1044
|
+
setTableLoading(false);
|
|
1045
|
+
console.log('ERROR: ', e);
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
};
|
|
924
1049
|
/**
|
|
925
1050
|
* Render form fields based on the type of the node
|
|
926
1051
|
* @param node the AST or subtree to render recursively
|
|
@@ -1786,6 +1911,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1786
1911
|
task: 'patterns',
|
|
1787
1912
|
getCustomFields: false,
|
|
1788
1913
|
customFields,
|
|
1914
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
1915
|
+
useUpdatedDataGathering: true,
|
|
1789
1916
|
},
|
|
1790
1917
|
};
|
|
1791
1918
|
const cloudBody = {};
|
|
@@ -1794,23 +1921,23 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1794
1921
|
throw new Error(data2.errorMessage);
|
|
1795
1922
|
}
|
|
1796
1923
|
rows = data2.rows;
|
|
1924
|
+
if (data2.rowCount) {
|
|
1925
|
+
setNumberOfRows(data2.rowCount);
|
|
1926
|
+
}
|
|
1797
1927
|
const tables = (0, ast_1.getTableNames)(baseAst);
|
|
1798
1928
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1929
|
+
let newUniqueValues = uniqueValues;
|
|
1930
|
+
let dateRangesTemp = dateRanges;
|
|
1931
|
+
let curReport = undefined;
|
|
1799
1932
|
if (table !== currentTable) {
|
|
1800
1933
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1801
1934
|
if (tableInfo) {
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
})
|
|
1806
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
1807
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1808
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1809
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
1810
|
-
joinedUniqueValues[table] = newUniqueValues;
|
|
1811
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
|
|
1812
|
-
setUniqueValues(joinedUniqueValues);
|
|
1935
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
1936
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
1937
|
+
setUniqueValues(newUniqueValues);
|
|
1813
1938
|
}
|
|
1939
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
1940
|
+
setDateRanges(dateRangesTemp || {});
|
|
1814
1941
|
}
|
|
1815
1942
|
setCurrentTable(table);
|
|
1816
1943
|
}
|
|
@@ -1823,6 +1950,22 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1823
1950
|
setPivotData(null);
|
|
1824
1951
|
setRows(data2.rows);
|
|
1825
1952
|
setColumns(processedFields);
|
|
1953
|
+
if (data2.rowCount) {
|
|
1954
|
+
const processedFormData = report
|
|
1955
|
+
? report
|
|
1956
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
1957
|
+
setNumberOfRows(data2.rowCount);
|
|
1958
|
+
curReport = {
|
|
1959
|
+
...formData,
|
|
1960
|
+
...processedFormData,
|
|
1961
|
+
itemQuery: data2.itemQuery,
|
|
1962
|
+
rowCount: data2.rowCount,
|
|
1963
|
+
filtersApplied: [],
|
|
1964
|
+
rows: data2.rows,
|
|
1965
|
+
columns: processedFields,
|
|
1966
|
+
};
|
|
1967
|
+
setTempReport(curReport);
|
|
1968
|
+
}
|
|
1826
1969
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
1827
1970
|
setFormattedRows(formattedRows);
|
|
1828
1971
|
return;
|
|
@@ -1834,12 +1977,36 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1834
1977
|
return acc;
|
|
1835
1978
|
}, {});
|
|
1836
1979
|
uniqueFormatted[pivot.columnField] = uniqueRecords;
|
|
1837
|
-
|
|
1980
|
+
let dateBucket = undefined;
|
|
1981
|
+
const tempDateRange = dateRangesTemp &&
|
|
1982
|
+
pivot.rowField &&
|
|
1983
|
+
dateRangesTemp[pivot.rowField];
|
|
1984
|
+
if (tempDateRange) {
|
|
1985
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
1986
|
+
}
|
|
1987
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
1988
|
+
// @ts-ignore
|
|
1989
|
+
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, uniqueFormatted[pivot.columnField]);
|
|
1838
1990
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1839
1991
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
1840
1992
|
setPivotData(pivotedData);
|
|
1841
1993
|
setRows(data2.rows);
|
|
1842
1994
|
setColumns(processedFields);
|
|
1995
|
+
if (data2.rowCount) {
|
|
1996
|
+
const processedFormData = report
|
|
1997
|
+
? report
|
|
1998
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
1999
|
+
setNumberOfRows(data2.rowCount);
|
|
2000
|
+
setTempReport({
|
|
2001
|
+
...formData,
|
|
2002
|
+
...processedFormData,
|
|
2003
|
+
itemQuery: data2.itemQuery,
|
|
2004
|
+
rowCount: data2.rowCount,
|
|
2005
|
+
filtersApplied: [],
|
|
2006
|
+
rows: data2.rows,
|
|
2007
|
+
columns: processedFields,
|
|
2008
|
+
});
|
|
2009
|
+
}
|
|
1843
2010
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
|
|
1844
2011
|
setSelectedColumns(processedFields.map((column) => {
|
|
1845
2012
|
return `${table}.${column.field}`;
|
|
@@ -1850,6 +2017,21 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1850
2017
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
1851
2018
|
setRows(data2.rows);
|
|
1852
2019
|
setColumns(processedFields);
|
|
2020
|
+
if (data2.rowCount) {
|
|
2021
|
+
const processedFormData = report
|
|
2022
|
+
? report
|
|
2023
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2024
|
+
setNumberOfRows(data2.rowCount);
|
|
2025
|
+
setTempReport({
|
|
2026
|
+
...formData,
|
|
2027
|
+
...processedFormData,
|
|
2028
|
+
itemQuery: data2.itemQuery,
|
|
2029
|
+
rowCount: data2.rowCount,
|
|
2030
|
+
filtersApplied: [],
|
|
2031
|
+
rows: data2.rows,
|
|
2032
|
+
columns: processedFields,
|
|
2033
|
+
});
|
|
2034
|
+
}
|
|
1853
2035
|
setSelectedColumns(processedFields.map((column) => {
|
|
1854
2036
|
return `${table}.${column.field}`;
|
|
1855
2037
|
}));
|
|
@@ -2084,6 +2266,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2084
2266
|
publicKey: client.publicKey,
|
|
2085
2267
|
orgId: client.customerId,
|
|
2086
2268
|
task: 'patterns',
|
|
2269
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2270
|
+
useUpdatedDataGathering: true,
|
|
2271
|
+
pivot: groupByPivot,
|
|
2087
2272
|
},
|
|
2088
2273
|
};
|
|
2089
2274
|
const cloudBody = {};
|
|
@@ -2092,20 +2277,16 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2092
2277
|
throw new Error('Error querying data from patterns');
|
|
2093
2278
|
}
|
|
2094
2279
|
let currentUniqueValues = uniqueValues;
|
|
2280
|
+
let dateRangesTemp = dateRanges;
|
|
2095
2281
|
if (table !== currentTable) {
|
|
2096
2282
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
2097
2283
|
if (tableInfo) {
|
|
2098
|
-
const
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
})
|
|
2102
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
2103
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2104
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2105
|
-
currentUniqueValues[table] = newUniqueValues;
|
|
2106
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(currentUniqueValues)) {
|
|
2107
|
-
setUniqueValues(currentUniqueValues);
|
|
2284
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2285
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
2286
|
+
setUniqueValues(newUniqueValues);
|
|
2108
2287
|
}
|
|
2288
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2289
|
+
setDateRanges(dateRangesTemp);
|
|
2109
2290
|
}
|
|
2110
2291
|
setCurrentTable(table);
|
|
2111
2292
|
}
|
|
@@ -2148,15 +2329,43 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2148
2329
|
errored = true;
|
|
2149
2330
|
}
|
|
2150
2331
|
if (groupByPivot && possiblePivot) {
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2332
|
+
let curReport = report ? report : undefined;
|
|
2333
|
+
if (data2.rowCount) {
|
|
2334
|
+
const processedFormData = report
|
|
2335
|
+
? report
|
|
2336
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2337
|
+
setNumberOfRows(data2.rowCount);
|
|
2338
|
+
curReport = {
|
|
2339
|
+
...formData,
|
|
2340
|
+
...processedFormData,
|
|
2341
|
+
itemQuery: data2.itemQuery,
|
|
2342
|
+
rowCount: data2.rowCount,
|
|
2343
|
+
filtersApplied: [],
|
|
2344
|
+
rows: data2.rows,
|
|
2345
|
+
columns: processedFields,
|
|
2346
|
+
};
|
|
2347
|
+
setTempReport(curReport || null);
|
|
2348
|
+
}
|
|
2349
|
+
let dateBucket = undefined;
|
|
2350
|
+
const tempDateRange = dateRangesTemp &&
|
|
2351
|
+
groupByPivot.rowField &&
|
|
2352
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
2353
|
+
if (tempDateRange) {
|
|
2354
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
2355
|
+
}
|
|
2356
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
2357
|
+
// @ts-ignore
|
|
2358
|
+
groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
|
|
2359
|
+
? currentUniqueValues[groupByPivot.columnField]
|
|
2360
|
+
: undefined);
|
|
2156
2361
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
2157
2362
|
setPivotData(pivotedData);
|
|
2158
2363
|
setPivot(groupByPivot);
|
|
2159
2364
|
setRows(data2.rows);
|
|
2365
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
2366
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
2367
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
2368
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
2160
2369
|
setColumns(processedFields);
|
|
2161
2370
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
|
|
2162
2371
|
setFormattedRows(formattedRows);
|
|
@@ -2165,6 +2374,17 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2165
2374
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
2166
2375
|
setRows(data2.rows);
|
|
2167
2376
|
setColumns(processedFields);
|
|
2377
|
+
if (data2.rowCount) {
|
|
2378
|
+
setNumberOfRows(data2.rowCount);
|
|
2379
|
+
setTempReport({
|
|
2380
|
+
...formData,
|
|
2381
|
+
itemQuery: data2.itemQuery,
|
|
2382
|
+
rowCount: data2.rowCount,
|
|
2383
|
+
filtersApplied: [],
|
|
2384
|
+
rows: data2.rows,
|
|
2385
|
+
columns: processedFields,
|
|
2386
|
+
});
|
|
2387
|
+
}
|
|
2168
2388
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
2169
2389
|
setFormattedRows(formattedRows);
|
|
2170
2390
|
}
|
|
@@ -2439,17 +2659,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2439
2659
|
},
|
|
2440
2660
|
// TODOs
|
|
2441
2661
|
selectPivot: (pivot) => {
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
const newAst = { ...baseAst };
|
|
2445
|
-
newAst.orderby = null;
|
|
2446
|
-
setBaseAst(newAst); // trigger refetch
|
|
2447
|
-
setPivot(pivot);
|
|
2448
|
-
const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, rows, undefined, false);
|
|
2449
|
-
setPivotData(pivotedData || []);
|
|
2450
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2451
|
-
setFormattedRows(formattedRows);
|
|
2452
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2662
|
+
return;
|
|
2663
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport ?? report }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2453
2664
|
setPivotRowField(value);
|
|
2454
2665
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
2455
2666
|
setPivot(null);
|
|
@@ -2743,7 +2954,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2743
2954
|
setPivotData(null);
|
|
2744
2955
|
const formattedRows = formatRows(rows, columns, false);
|
|
2745
2956
|
setFormattedRows(formattedRows);
|
|
2746
|
-
}, selectPivot: (pivot) => {
|
|
2957
|
+
}, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
|
|
2747
2958
|
if (!pivot)
|
|
2748
2959
|
return;
|
|
2749
2960
|
const newAst = { ...baseAst };
|
|
@@ -2753,13 +2964,19 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2753
2964
|
pivot['sortDirection'] = 'ASC';
|
|
2754
2965
|
}
|
|
2755
2966
|
setBaseAst(newAst); // trigger refetch
|
|
2967
|
+
let dateBucket = undefined;
|
|
2968
|
+
if (dateRange) {
|
|
2969
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(dateRange);
|
|
2970
|
+
}
|
|
2971
|
+
if (!pivotTable) {
|
|
2972
|
+
pivotTable = await (0, PivotModal_1.generatePivotTable)(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
|
|
2973
|
+
}
|
|
2974
|
+
setPivotData(pivotTable || []);
|
|
2756
2975
|
setPivot(pivot);
|
|
2757
|
-
const
|
|
2758
|
-
setPivotData(pivotedData || []);
|
|
2759
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2976
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
2760
2977
|
setFormattedRows(formattedRows);
|
|
2761
2978
|
setErrorMessage('');
|
|
2762
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2979
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2763
2980
|
setPivotRowField(value);
|
|
2764
2981
|
updatePivot(value, 'rowField');
|
|
2765
2982
|
}, setPivotColumnField: (value) => {
|
|
@@ -2791,10 +3008,18 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2791
3008
|
`.${pivot.rowField}`,
|
|
2792
3009
|
`.${pivot.valueField || 'count'}`,
|
|
2793
3010
|
]
|
|
2794
|
-
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
|
|
3011
|
+
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: async () => {
|
|
2795
3012
|
if (pivot) {
|
|
2796
|
-
|
|
2797
|
-
|
|
3013
|
+
const tempPivot = { ...pivot, sort: false };
|
|
3014
|
+
let dateBucket = undefined;
|
|
3015
|
+
const tempDateRange = dateRanges &&
|
|
3016
|
+
pivot.rowField &&
|
|
3017
|
+
dateRanges[pivot.rowField];
|
|
3018
|
+
if (tempDateRange) {
|
|
3019
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3020
|
+
}
|
|
3021
|
+
setPivot(tempPivot);
|
|
3022
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2798
3023
|
setPivotData(pivotedData || []);
|
|
2799
3024
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2800
3025
|
setFormattedRows(formattedRows);
|
|
@@ -2803,25 +3028,27 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2803
3028
|
}
|
|
2804
3029
|
setBaseAst((0, util_1.deepCopy)(baseAst));
|
|
2805
3030
|
fetchSqlQuery((0, util_1.deepCopy)(baseAst));
|
|
2806
|
-
}, onSave: (column, direction) => {
|
|
3031
|
+
}, onSave: async (column, direction) => {
|
|
2807
3032
|
if (pivot) {
|
|
2808
3033
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2809
3034
|
? 'number'
|
|
2810
3035
|
: pivot.rowFieldType;
|
|
2811
|
-
|
|
2812
|
-
...pivot,
|
|
2813
|
-
sort: true,
|
|
2814
|
-
sortDirection: direction,
|
|
2815
|
-
sortField: column,
|
|
2816
|
-
sortFieldType: sortFieldType,
|
|
2817
|
-
});
|
|
2818
|
-
const pivotedData = (0, PivotModal_1.generatePivotTable)({
|
|
3036
|
+
const tempPivot = {
|
|
2819
3037
|
...pivot,
|
|
2820
3038
|
sort: true,
|
|
2821
3039
|
sortDirection: direction,
|
|
2822
3040
|
sortField: column,
|
|
2823
3041
|
sortFieldType: sortFieldType,
|
|
2824
|
-
}
|
|
3042
|
+
};
|
|
3043
|
+
setPivot(tempPivot);
|
|
3044
|
+
let dateBucket = undefined;
|
|
3045
|
+
const tempDateRange = dateRanges &&
|
|
3046
|
+
pivot.rowField &&
|
|
3047
|
+
dateRanges[pivot.rowField];
|
|
3048
|
+
if (tempDateRange) {
|
|
3049
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3050
|
+
}
|
|
3051
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2825
3052
|
setPivotData(pivotedData || []);
|
|
2826
3053
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2827
3054
|
setFormattedRows(formattedRows);
|
|
@@ -2902,27 +3129,29 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2902
3129
|
`.${pivot.rowField}`,
|
|
2903
3130
|
`.${pivot.valueField || 'count'}`,
|
|
2904
3131
|
]
|
|
2905
|
-
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
|
|
3132
|
+
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
|
|
2906
3133
|
if (column === '')
|
|
2907
3134
|
return;
|
|
2908
3135
|
if (pivot) {
|
|
2909
3136
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2910
3137
|
? 'number'
|
|
2911
3138
|
: pivot.rowFieldType;
|
|
2912
|
-
|
|
3139
|
+
const tempPivot = {
|
|
2913
3140
|
...pivot,
|
|
2914
3141
|
sort: true,
|
|
2915
3142
|
sortDirection: direction,
|
|
2916
3143
|
sortField: column,
|
|
2917
3144
|
sortFieldType: sortFieldType,
|
|
2918
|
-
}
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
3145
|
+
};
|
|
3146
|
+
setPivot(tempPivot);
|
|
3147
|
+
let dateBucket = undefined;
|
|
3148
|
+
const tempDateRange = dateRanges &&
|
|
3149
|
+
pivot.rowField &&
|
|
3150
|
+
dateRanges[pivot.rowField];
|
|
3151
|
+
if (tempDateRange) {
|
|
3152
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3153
|
+
}
|
|
3154
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2926
3155
|
setErrorMessage('');
|
|
2927
3156
|
setPivotData(pivotedData || []);
|
|
2928
3157
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
@@ -3015,14 +3244,16 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3015
3244
|
? askAIInputWidth
|
|
3016
3245
|
: askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
|
|
3017
3246
|
? 'Ask a follow-up question...'
|
|
3018
|
-
: 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading:
|
|
3247
|
+
: 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: tableLoading ||
|
|
3248
|
+
(loading && errorMessage.length === 0) ||
|
|
3249
|
+
initalChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
|
|
3019
3250
|
? pivotData?.columns || emptyPivotColumns()
|
|
3020
3251
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3021
3252
|
return {
|
|
3022
3253
|
label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(c),
|
|
3023
3254
|
field: c,
|
|
3024
3255
|
};
|
|
3025
|
-
}) })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
3256
|
+
}), onPageChange: onPageChange, onSortChange: onSortChange })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
3026
3257
|
display: 'flex',
|
|
3027
3258
|
flexDirection: 'row',
|
|
3028
3259
|
gap: '12px',
|
|
@@ -3038,6 +3269,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3038
3269
|
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { report: report
|
|
3039
3270
|
? {
|
|
3040
3271
|
...report,
|
|
3272
|
+
...tempReport,
|
|
3041
3273
|
pivot: pivot,
|
|
3042
3274
|
yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
|
|
3043
3275
|
columns: report.columns.filter((col) => {
|
|
@@ -3048,6 +3280,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3048
3280
|
queryString: activeQuery,
|
|
3049
3281
|
rows: rows,
|
|
3050
3282
|
}
|
|
3051
|
-
:
|
|
3283
|
+
: tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement }))] }));
|
|
3052
3284
|
}
|
|
3053
3285
|
exports.default = ReportBuilder;
|