@quillsql/react 2.12.28 → 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 +10 -8
- package/dist/cjs/ChartBuilder.d.ts +35 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +38 -4
- 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.map +1 -1
- package/dist/cjs/Dashboard.js +76 -49
- package/dist/cjs/ReportBuilder.d.ts +9 -0
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +330 -100
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +98 -29
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +8 -8
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +20 -16
- 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.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +56 -57
- 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/dashboard.js +1 -1
- 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 +9 -4
- package/dist/cjs/utils/dates.d.ts +1 -0
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +12 -3
- 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.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +58 -5
- package/dist/cjs/utils/queryConstructor.d.ts +4 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +118 -57
- 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 +1 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +42 -5
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +10 -8
- package/dist/esm/ChartBuilder.d.ts +35 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +36 -3
- 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.map +1 -1
- package/dist/esm/Dashboard.js +77 -50
- package/dist/esm/ReportBuilder.d.ts +9 -0
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +333 -103
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +99 -30
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +8 -8
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +20 -16
- 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.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +57 -58
- 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/dashboard.js +1 -1
- 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 +9 -4
- package/dist/esm/utils/dates.d.ts +1 -0
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +10 -2
- 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.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +58 -5
- package/dist/esm/utils/queryConstructor.d.ts +4 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +115 -56
- 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 +1 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +41 -5
- 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
|
@@ -8,7 +8,7 @@ import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
|
8
8
|
import { getQuarter } from 'date-fns';
|
|
9
9
|
import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
|
|
10
10
|
import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
11
|
-
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
11
|
+
import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
|
|
12
12
|
import { QuillTextInput } from './components/UiComponents';
|
|
13
13
|
import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, TagWrapper, EditPopover, AddFilterPopover, QuillLimitPopover, } from './components/ReportBuilder/ui';
|
|
14
14
|
import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
|
|
@@ -19,7 +19,7 @@ import { hashCode } from './utils/crypto';
|
|
|
19
19
|
import { DATE_FMT, DAY_OF_WEEK, defaultAST, defaultBoolComparison, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, MONTH_OF_YEAR, } from './components/ReportBuilder/constants';
|
|
20
20
|
import AddColumnModal from './components/ReportBuilder/AddColumnModal';
|
|
21
21
|
import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSortPopover';
|
|
22
|
-
import { PivotModal,
|
|
22
|
+
import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
|
|
23
23
|
import { snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
|
|
24
24
|
import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
|
|
25
25
|
import { updateFirstChildWidth } from './utils/width';
|
|
@@ -28,13 +28,15 @@ import { QuillCard } from './components/QuillCard';
|
|
|
28
28
|
import { getData } from './utils/dataFetcher';
|
|
29
29
|
import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
30
30
|
import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
|
|
31
|
-
import { getUniqueValuesByColumns } from './utils/tableProcessing';
|
|
31
|
+
import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, } from './utils/tableProcessing';
|
|
32
32
|
import { useQuill } from './hooks/useQuill';
|
|
33
33
|
import { getDataFromCloud } from './utils/dataFetcher';
|
|
34
34
|
import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
|
|
35
35
|
import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
|
|
36
36
|
import PivotForm from './internals/ReportBuilder/PivotForm';
|
|
37
37
|
import { getSchemaInfoWithCustomFields } from './utils/schema';
|
|
38
|
+
import { MAX_COLUMN_ROWS_LIMIT } from './utils/constants';
|
|
39
|
+
import { getDateBucketFromRange } from './utils/dates';
|
|
38
40
|
export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
39
41
|
'https://quill-344421.uc.r.appspot.com';
|
|
40
42
|
/**
|
|
@@ -91,6 +93,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
91
93
|
const [rows, setRows] = useState([]);
|
|
92
94
|
const [formattedRows, setFormattedRows] = useState([]);
|
|
93
95
|
const [columns, setColumns] = useState([]);
|
|
96
|
+
const [tempReport, setTempReport] = useState({});
|
|
94
97
|
const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
|
|
95
98
|
const [editPopoverKey, setEditPopoverKey] = useState(null);
|
|
96
99
|
const [uniqueValues, setUniqueValues] = useState({});
|
|
@@ -116,19 +119,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
116
119
|
const [pivotColumnField, setPivotColumnField] = useState(undefined);
|
|
117
120
|
const [pivotValueField, setPivotValueField] = useState(undefined);
|
|
118
121
|
const [pivotAggregation, setPivotAggregation] = useState(undefined);
|
|
122
|
+
const [dateRanges, setDateRanges] = useState(null);
|
|
119
123
|
// eslint-disable-next-line no-unused-vars
|
|
120
124
|
const [client, _setClient] = useContext(ClientContext);
|
|
121
125
|
// JANK: This is temp and stupid
|
|
122
126
|
const [overrideRecommendations, setOverrideRecommendations] = useState(true);
|
|
123
127
|
const [customFields, setCustomFields] = useContext(CustomFieldContext);
|
|
124
128
|
useEffect(() => {
|
|
129
|
+
if (!client) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
125
132
|
if (client.publicKey === '663416663aa9bc716e59a89d') {
|
|
126
133
|
setOverrideRecommendations(false);
|
|
127
134
|
}
|
|
128
135
|
if (!loadingSchema) {
|
|
129
136
|
fetchSchema();
|
|
130
137
|
}
|
|
131
|
-
}, [client
|
|
138
|
+
}, [client]);
|
|
132
139
|
useEffect(() => {
|
|
133
140
|
updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
134
141
|
updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
@@ -146,8 +153,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
146
153
|
window.removeEventListener('resize', handleResize);
|
|
147
154
|
};
|
|
148
155
|
}, []);
|
|
149
|
-
const updatePivot = (changeField, fieldKey) => {
|
|
156
|
+
const updatePivot = async (changeField, fieldKey) => {
|
|
150
157
|
const newPivot = pivot;
|
|
158
|
+
setTableLoading(true);
|
|
151
159
|
// @ts-ignore
|
|
152
160
|
newPivot[fieldKey] = changeField;
|
|
153
161
|
if (fieldKey === 'rowField') {
|
|
@@ -165,11 +173,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
165
173
|
newPivot.sort = undefined;
|
|
166
174
|
}
|
|
167
175
|
}
|
|
168
|
-
|
|
169
|
-
const
|
|
176
|
+
let dateBucket = undefined;
|
|
177
|
+
const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
|
|
178
|
+
if (tempDateRange) {
|
|
179
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
180
|
+
}
|
|
181
|
+
const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
170
182
|
setPivotData(pivotedData || []);
|
|
171
183
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
184
|
+
setPivot(newPivot);
|
|
172
185
|
setFormattedRows(formattedRows);
|
|
186
|
+
setTableLoading(false);
|
|
173
187
|
};
|
|
174
188
|
const enforceOrderOnColumns = (columnNames) => {
|
|
175
189
|
if (pivot) {
|
|
@@ -214,10 +228,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
214
228
|
}, 0);
|
|
215
229
|
};
|
|
216
230
|
useEffect(() => {
|
|
231
|
+
if (!client) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
217
234
|
if (!initialLoad && client.publicKey) {
|
|
218
235
|
clearAllState();
|
|
219
236
|
}
|
|
220
|
-
}, [client
|
|
237
|
+
}, [client]);
|
|
221
238
|
useEffect(() => {
|
|
222
239
|
if (activePath !== null) {
|
|
223
240
|
// update the modal with the new subtree
|
|
@@ -354,6 +371,34 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
354
371
|
console.error(error);
|
|
355
372
|
}
|
|
356
373
|
};
|
|
374
|
+
const getUniqueStringValues = async (columns, tableName) => {
|
|
375
|
+
const convertedStringColumns = columns
|
|
376
|
+
.filter((column) => {
|
|
377
|
+
return isTextColumnType(column.fieldType);
|
|
378
|
+
})
|
|
379
|
+
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
380
|
+
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
381
|
+
const smallStringColumns = await getCountsByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
|
|
382
|
+
const smallStringNames = smallStringColumns.map((column) => column.field);
|
|
383
|
+
const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
384
|
+
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
385
|
+
joinedUniqueValues[tableName] = newUniqueValues;
|
|
386
|
+
return joinedUniqueValues;
|
|
387
|
+
};
|
|
388
|
+
const getDateRanges = async (columns, tableName) => {
|
|
389
|
+
const dateColumns = columns.filter((column) => {
|
|
390
|
+
return column.fieldType === 'date';
|
|
391
|
+
});
|
|
392
|
+
if (dateColumns.length === 0) {
|
|
393
|
+
return {};
|
|
394
|
+
}
|
|
395
|
+
const dateColumnNames = dateColumns.map((column) => {
|
|
396
|
+
//@ts-ignore
|
|
397
|
+
return column.field || column.name;
|
|
398
|
+
});
|
|
399
|
+
const dateRanges = await getDateRangeByColumns(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
|
|
400
|
+
return dateRanges;
|
|
401
|
+
};
|
|
357
402
|
// It's just like getColumnsInPivot but we expand the columnField
|
|
358
403
|
// if there is one to include all the variants just like it would
|
|
359
404
|
// show up in the table. (eg. category -> ...[Fuel, Food, Other])
|
|
@@ -380,18 +425,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
380
425
|
setLoading(true);
|
|
381
426
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
|
|
382
427
|
if (tableInfo) {
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
})
|
|
387
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
388
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
389
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
|
|
390
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
391
|
-
joinedUniqueValues[initialTableName] = newUniqueValues;
|
|
392
|
-
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
393
|
-
setUniqueValues(joinedUniqueValues);
|
|
428
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
|
|
429
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
430
|
+
setUniqueValues(newUniqueValues);
|
|
394
431
|
}
|
|
432
|
+
const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
|
|
433
|
+
setDateRanges(dateRangesTemp);
|
|
395
434
|
}
|
|
396
435
|
const columnsForTable = tables
|
|
397
436
|
.find((t) => t.name === initialTableName)
|
|
@@ -483,17 +522,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
483
522
|
setBaseAst(newAst);
|
|
484
523
|
const initialRows = await fetchUponChange(newAst, undefined);
|
|
485
524
|
const tableInfo = schemaInfo.find((table) => table.name === tableName);
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
494
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
495
|
-
joinedUniqueValues[tableName] = newUniqueValues;
|
|
496
|
-
setUniqueValues(joinedUniqueValues);
|
|
525
|
+
let newUniqueValues = undefined;
|
|
526
|
+
let dateRangesTemp = undefined;
|
|
527
|
+
if (tableName) {
|
|
528
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
|
|
529
|
+
setUniqueValues(newUniqueValues);
|
|
530
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
|
|
531
|
+
setDateRanges(dateRangesTemp);
|
|
497
532
|
}
|
|
498
533
|
if (groupByPivot) {
|
|
499
534
|
// @ts-ignore
|
|
@@ -505,9 +540,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
505
540
|
// @ts-ignore
|
|
506
541
|
setPivotValueField(groupByPivot.valueField);
|
|
507
542
|
setPivot(groupByPivot);
|
|
508
|
-
|
|
543
|
+
let dateBucket = undefined;
|
|
544
|
+
const tempDateRange = dateRangesTemp &&
|
|
545
|
+
groupByPivot.rowField &&
|
|
546
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
547
|
+
if (tempDateRange) {
|
|
548
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
549
|
+
}
|
|
550
|
+
const pivotedData = await generatePivotTable(
|
|
509
551
|
// @ts-ignore
|
|
510
|
-
groupByPivot, initialRows, undefined,
|
|
552
|
+
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
511
553
|
setPivotData(pivotedData || []);
|
|
512
554
|
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
513
555
|
// @ts-ignore
|
|
@@ -915,6 +957,89 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
915
957
|
return [{ label: snakeAndCamelCaseToTitleCase(pivot.valueField) }];
|
|
916
958
|
}
|
|
917
959
|
};
|
|
960
|
+
const [previousPage, setPreviousPage] = useState(0);
|
|
961
|
+
const [currentProcessing, setCurrentProcessing] = useState({
|
|
962
|
+
page: { currentPage: 0, rowsPerPage: 20 },
|
|
963
|
+
});
|
|
964
|
+
const [numberOfRows, setNumberOfRows] = useState(0);
|
|
965
|
+
const [tableLoading, setTableLoading] = useState(false);
|
|
966
|
+
const onPageChange = (page) => {
|
|
967
|
+
if (pivot) {
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
970
|
+
if ((previousPage < page.currentPage &&
|
|
971
|
+
(page.currentPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0) ||
|
|
972
|
+
(previousPage > page.currentPage &&
|
|
973
|
+
(previousPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0)) {
|
|
974
|
+
handleRunQuery({ ...currentProcessing, page });
|
|
975
|
+
}
|
|
976
|
+
setPreviousPage(page.currentPage);
|
|
977
|
+
};
|
|
978
|
+
const onSortChange = (sort) => {
|
|
979
|
+
if (pivot) {
|
|
980
|
+
return;
|
|
981
|
+
}
|
|
982
|
+
handleRunQuery({ sort, page: { currentPage: 0, rowsPerPage: 20 } });
|
|
983
|
+
setPreviousPage(0);
|
|
984
|
+
};
|
|
985
|
+
const handleRunQuery = async (processing) => {
|
|
986
|
+
try {
|
|
987
|
+
setErrorMessage('');
|
|
988
|
+
setTableLoading(true);
|
|
989
|
+
const hostedBody = {
|
|
990
|
+
metadata: {
|
|
991
|
+
query: activeQuery,
|
|
992
|
+
task: 'query',
|
|
993
|
+
orgId: client.customerId || '*',
|
|
994
|
+
clientId: client.publicKey,
|
|
995
|
+
databaseType: client?.databaseType,
|
|
996
|
+
getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
|
|
997
|
+
customFieldsByTable: customFields,
|
|
998
|
+
additionalProcessing: processing,
|
|
999
|
+
useUpdatedDataGathering: true,
|
|
1000
|
+
},
|
|
1001
|
+
};
|
|
1002
|
+
const cloudBody = { activeQuery };
|
|
1003
|
+
const resp = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1004
|
+
if (resp && resp.errorMessage) {
|
|
1005
|
+
setTableLoading(false);
|
|
1006
|
+
setErrorMessage('Failed to run SQL query: ' + resp.errorMessage);
|
|
1007
|
+
setRows([]);
|
|
1008
|
+
setColumns([]);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
if (resp.rowCount) {
|
|
1012
|
+
setNumberOfRows(resp.rowCount);
|
|
1013
|
+
}
|
|
1014
|
+
setErrorMessage('');
|
|
1015
|
+
setCurrentProcessing(processing);
|
|
1016
|
+
if (resp.rows.length === 0) {
|
|
1017
|
+
setErrorMessage('No data found');
|
|
1018
|
+
}
|
|
1019
|
+
const temp_rows = resp.rows && resp.rows.length ? resp.rows : [];
|
|
1020
|
+
const processedFields = resp.fields.map((elem) => convertPostgresColumn(elem));
|
|
1021
|
+
setRows(temp_rows);
|
|
1022
|
+
// setNumberOfRows(resp.compareRows[0]?.count || temp_rows.length);
|
|
1023
|
+
setFormattedRows(temp_rows.map((row) => {
|
|
1024
|
+
return processedFields.reduce((formattedRow, column) => {
|
|
1025
|
+
// Apply the format function to each field in the row
|
|
1026
|
+
const formattedValue = quillFormat({
|
|
1027
|
+
value: row[column.field],
|
|
1028
|
+
format: column.format,
|
|
1029
|
+
});
|
|
1030
|
+
formattedRow[column.field] = formattedValue;
|
|
1031
|
+
return formattedRow;
|
|
1032
|
+
}, {});
|
|
1033
|
+
}));
|
|
1034
|
+
setColumns(processedFields);
|
|
1035
|
+
setTableLoading(false);
|
|
1036
|
+
}
|
|
1037
|
+
catch (e) {
|
|
1038
|
+
setTableLoading(false);
|
|
1039
|
+
console.log('ERROR: ', e);
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
};
|
|
918
1043
|
/**
|
|
919
1044
|
* Render form fields based on the type of the node
|
|
920
1045
|
* @param node the AST or subtree to render recursively
|
|
@@ -1780,7 +1905,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1780
1905
|
task: 'patterns',
|
|
1781
1906
|
getCustomFields: false,
|
|
1782
1907
|
customFields,
|
|
1783
|
-
|
|
1908
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
1909
|
+
useUpdatedDataGathering: true,
|
|
1784
1910
|
},
|
|
1785
1911
|
};
|
|
1786
1912
|
const cloudBody = {};
|
|
@@ -1789,23 +1915,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1789
1915
|
throw new Error(data2.errorMessage);
|
|
1790
1916
|
}
|
|
1791
1917
|
rows = data2.rows;
|
|
1918
|
+
if (data2.rowCount) {
|
|
1919
|
+
setNumberOfRows(data2.rowCount);
|
|
1920
|
+
}
|
|
1792
1921
|
const tables = getTableNames(baseAst);
|
|
1793
1922
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1923
|
+
let newUniqueValues = uniqueValues;
|
|
1924
|
+
let dateRangesTemp = dateRanges;
|
|
1925
|
+
let curReport = undefined;
|
|
1794
1926
|
if (table !== currentTable) {
|
|
1795
1927
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1796
1928
|
if (tableInfo) {
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
})
|
|
1801
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
1802
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1803
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1804
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
1805
|
-
joinedUniqueValues[table] = newUniqueValues;
|
|
1806
|
-
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
1807
|
-
setUniqueValues(joinedUniqueValues);
|
|
1929
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
1930
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
1931
|
+
setUniqueValues(newUniqueValues);
|
|
1808
1932
|
}
|
|
1933
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
1934
|
+
setDateRanges(dateRangesTemp || {});
|
|
1809
1935
|
}
|
|
1810
1936
|
setCurrentTable(table);
|
|
1811
1937
|
}
|
|
@@ -1818,6 +1944,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1818
1944
|
setPivotData(null);
|
|
1819
1945
|
setRows(data2.rows);
|
|
1820
1946
|
setColumns(processedFields);
|
|
1947
|
+
if (data2.rowCount) {
|
|
1948
|
+
const processedFormData = report
|
|
1949
|
+
? report
|
|
1950
|
+
: createInitialFormData(processedFields);
|
|
1951
|
+
setNumberOfRows(data2.rowCount);
|
|
1952
|
+
curReport = {
|
|
1953
|
+
...formData,
|
|
1954
|
+
...processedFormData,
|
|
1955
|
+
itemQuery: data2.itemQuery,
|
|
1956
|
+
rowCount: data2.rowCount,
|
|
1957
|
+
filtersApplied: [],
|
|
1958
|
+
rows: data2.rows,
|
|
1959
|
+
columns: processedFields,
|
|
1960
|
+
};
|
|
1961
|
+
setTempReport(curReport);
|
|
1962
|
+
}
|
|
1821
1963
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
1822
1964
|
setFormattedRows(formattedRows);
|
|
1823
1965
|
return;
|
|
@@ -1829,12 +1971,36 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1829
1971
|
return acc;
|
|
1830
1972
|
}, {});
|
|
1831
1973
|
uniqueFormatted[pivot.columnField] = uniqueRecords;
|
|
1832
|
-
|
|
1974
|
+
let dateBucket = undefined;
|
|
1975
|
+
const tempDateRange = dateRangesTemp &&
|
|
1976
|
+
pivot.rowField &&
|
|
1977
|
+
dateRangesTemp[pivot.rowField];
|
|
1978
|
+
if (tempDateRange) {
|
|
1979
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
1980
|
+
}
|
|
1981
|
+
const pivotedData = await generatePivotTable(
|
|
1982
|
+
// @ts-ignore
|
|
1983
|
+
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, uniqueFormatted[pivot.columnField]);
|
|
1833
1984
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1834
1985
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1835
1986
|
setPivotData(pivotedData);
|
|
1836
1987
|
setRows(data2.rows);
|
|
1837
1988
|
setColumns(processedFields);
|
|
1989
|
+
if (data2.rowCount) {
|
|
1990
|
+
const processedFormData = report
|
|
1991
|
+
? report
|
|
1992
|
+
: createInitialFormData(processedFields);
|
|
1993
|
+
setNumberOfRows(data2.rowCount);
|
|
1994
|
+
setTempReport({
|
|
1995
|
+
...formData,
|
|
1996
|
+
...processedFormData,
|
|
1997
|
+
itemQuery: data2.itemQuery,
|
|
1998
|
+
rowCount: data2.rowCount,
|
|
1999
|
+
filtersApplied: [],
|
|
2000
|
+
rows: data2.rows,
|
|
2001
|
+
columns: processedFields,
|
|
2002
|
+
});
|
|
2003
|
+
}
|
|
1838
2004
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
|
|
1839
2005
|
setSelectedColumns(processedFields.map((column) => {
|
|
1840
2006
|
return `${table}.${column.field}`;
|
|
@@ -1845,6 +2011,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1845
2011
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1846
2012
|
setRows(data2.rows);
|
|
1847
2013
|
setColumns(processedFields);
|
|
2014
|
+
if (data2.rowCount) {
|
|
2015
|
+
const processedFormData = report
|
|
2016
|
+
? report
|
|
2017
|
+
: createInitialFormData(processedFields);
|
|
2018
|
+
setNumberOfRows(data2.rowCount);
|
|
2019
|
+
setTempReport({
|
|
2020
|
+
...formData,
|
|
2021
|
+
...processedFormData,
|
|
2022
|
+
itemQuery: data2.itemQuery,
|
|
2023
|
+
rowCount: data2.rowCount,
|
|
2024
|
+
filtersApplied: [],
|
|
2025
|
+
rows: data2.rows,
|
|
2026
|
+
columns: processedFields,
|
|
2027
|
+
});
|
|
2028
|
+
}
|
|
1848
2029
|
setSelectedColumns(processedFields.map((column) => {
|
|
1849
2030
|
return `${table}.${column.field}`;
|
|
1850
2031
|
}));
|
|
@@ -2079,7 +2260,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2079
2260
|
publicKey: client.publicKey,
|
|
2080
2261
|
orgId: client.customerId,
|
|
2081
2262
|
task: 'patterns',
|
|
2082
|
-
|
|
2263
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2264
|
+
useUpdatedDataGathering: true,
|
|
2265
|
+
pivot: groupByPivot,
|
|
2083
2266
|
},
|
|
2084
2267
|
};
|
|
2085
2268
|
const cloudBody = {};
|
|
@@ -2088,20 +2271,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2088
2271
|
throw new Error('Error querying data from patterns');
|
|
2089
2272
|
}
|
|
2090
2273
|
let currentUniqueValues = uniqueValues;
|
|
2274
|
+
let dateRangesTemp = dateRanges;
|
|
2091
2275
|
if (table !== currentTable) {
|
|
2092
2276
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
2093
2277
|
if (tableInfo) {
|
|
2094
|
-
const
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
})
|
|
2098
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
2099
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2100
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2101
|
-
currentUniqueValues[table] = newUniqueValues;
|
|
2102
|
-
if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
|
|
2103
|
-
setUniqueValues(currentUniqueValues);
|
|
2278
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2279
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
2280
|
+
setUniqueValues(newUniqueValues);
|
|
2104
2281
|
}
|
|
2282
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2283
|
+
setDateRanges(dateRangesTemp);
|
|
2105
2284
|
}
|
|
2106
2285
|
setCurrentTable(table);
|
|
2107
2286
|
}
|
|
@@ -2144,15 +2323,43 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2144
2323
|
errored = true;
|
|
2145
2324
|
}
|
|
2146
2325
|
if (groupByPivot && possiblePivot) {
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2326
|
+
let curReport = report ? report : undefined;
|
|
2327
|
+
if (data2.rowCount) {
|
|
2328
|
+
const processedFormData = report
|
|
2329
|
+
? report
|
|
2330
|
+
: createInitialFormData(processedFields);
|
|
2331
|
+
setNumberOfRows(data2.rowCount);
|
|
2332
|
+
curReport = {
|
|
2333
|
+
...formData,
|
|
2334
|
+
...processedFormData,
|
|
2335
|
+
itemQuery: data2.itemQuery,
|
|
2336
|
+
rowCount: data2.rowCount,
|
|
2337
|
+
filtersApplied: [],
|
|
2338
|
+
rows: data2.rows,
|
|
2339
|
+
columns: processedFields,
|
|
2340
|
+
};
|
|
2341
|
+
setTempReport(curReport || null);
|
|
2342
|
+
}
|
|
2343
|
+
let dateBucket = undefined;
|
|
2344
|
+
const tempDateRange = dateRangesTemp &&
|
|
2345
|
+
groupByPivot.rowField &&
|
|
2346
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
2347
|
+
if (tempDateRange) {
|
|
2348
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
2349
|
+
}
|
|
2350
|
+
const pivotedData = await generatePivotTable(
|
|
2351
|
+
// @ts-ignore
|
|
2352
|
+
groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
|
|
2353
|
+
? currentUniqueValues[groupByPivot.columnField]
|
|
2354
|
+
: undefined);
|
|
2152
2355
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
2153
2356
|
setPivotData(pivotedData);
|
|
2154
2357
|
setPivot(groupByPivot);
|
|
2155
2358
|
setRows(data2.rows);
|
|
2359
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
2360
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
2361
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
2362
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
2156
2363
|
setColumns(processedFields);
|
|
2157
2364
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
|
|
2158
2365
|
setFormattedRows(formattedRows);
|
|
@@ -2161,6 +2368,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2161
2368
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
2162
2369
|
setRows(data2.rows);
|
|
2163
2370
|
setColumns(processedFields);
|
|
2371
|
+
if (data2.rowCount) {
|
|
2372
|
+
setNumberOfRows(data2.rowCount);
|
|
2373
|
+
setTempReport({
|
|
2374
|
+
...formData,
|
|
2375
|
+
itemQuery: data2.itemQuery,
|
|
2376
|
+
rowCount: data2.rowCount,
|
|
2377
|
+
filtersApplied: [],
|
|
2378
|
+
rows: data2.rows,
|
|
2379
|
+
columns: processedFields,
|
|
2380
|
+
});
|
|
2381
|
+
}
|
|
2164
2382
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
2165
2383
|
setFormattedRows(formattedRows);
|
|
2166
2384
|
}
|
|
@@ -2435,17 +2653,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2435
2653
|
},
|
|
2436
2654
|
// TODOs
|
|
2437
2655
|
selectPivot: (pivot) => {
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
const newAst = { ...baseAst };
|
|
2441
|
-
newAst.orderby = null;
|
|
2442
|
-
setBaseAst(newAst); // trigger refetch
|
|
2443
|
-
setPivot(pivot);
|
|
2444
|
-
const pivotedData = generatePivotTableInMemory(pivot, rows, undefined, false);
|
|
2445
|
-
setPivotData(pivotedData || []);
|
|
2446
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2447
|
-
setFormattedRows(formattedRows);
|
|
2448
|
-
}, 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 && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2656
|
+
return;
|
|
2657
|
+
}, 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 && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2449
2658
|
setPivotRowField(value);
|
|
2450
2659
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
2451
2660
|
setPivot(null);
|
|
@@ -2739,7 +2948,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2739
2948
|
setPivotData(null);
|
|
2740
2949
|
const formattedRows = formatRows(rows, columns, false);
|
|
2741
2950
|
setFormattedRows(formattedRows);
|
|
2742
|
-
}, selectPivot: (pivot) => {
|
|
2951
|
+
}, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
|
|
2743
2952
|
if (!pivot)
|
|
2744
2953
|
return;
|
|
2745
2954
|
const newAst = { ...baseAst };
|
|
@@ -2749,13 +2958,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2749
2958
|
pivot['sortDirection'] = 'ASC';
|
|
2750
2959
|
}
|
|
2751
2960
|
setBaseAst(newAst); // trigger refetch
|
|
2961
|
+
let dateBucket = undefined;
|
|
2962
|
+
if (dateRange) {
|
|
2963
|
+
dateBucket = getDateBucketFromRange(dateRange);
|
|
2964
|
+
}
|
|
2965
|
+
if (!pivotTable) {
|
|
2966
|
+
pivotTable = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
|
|
2967
|
+
}
|
|
2968
|
+
setPivotData(pivotTable || []);
|
|
2752
2969
|
setPivot(pivot);
|
|
2753
|
-
const
|
|
2754
|
-
setPivotData(pivotedData || []);
|
|
2755
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2970
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
2756
2971
|
setFormattedRows(formattedRows);
|
|
2757
2972
|
setErrorMessage('');
|
|
2758
|
-
}, 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 && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2973
|
+
}, 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 && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2759
2974
|
setPivotRowField(value);
|
|
2760
2975
|
updatePivot(value, 'rowField');
|
|
2761
2976
|
}, setPivotColumnField: (value) => {
|
|
@@ -2787,10 +3002,18 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2787
3002
|
`.${pivot.rowField}`,
|
|
2788
3003
|
`.${pivot.valueField || 'count'}`,
|
|
2789
3004
|
]
|
|
2790
|
-
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
3005
|
+
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
|
|
2791
3006
|
if (pivot) {
|
|
2792
|
-
|
|
2793
|
-
|
|
3007
|
+
const tempPivot = { ...pivot, sort: false };
|
|
3008
|
+
let dateBucket = undefined;
|
|
3009
|
+
const tempDateRange = dateRanges &&
|
|
3010
|
+
pivot.rowField &&
|
|
3011
|
+
dateRanges[pivot.rowField];
|
|
3012
|
+
if (tempDateRange) {
|
|
3013
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3014
|
+
}
|
|
3015
|
+
setPivot(tempPivot);
|
|
3016
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2794
3017
|
setPivotData(pivotedData || []);
|
|
2795
3018
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2796
3019
|
setFormattedRows(formattedRows);
|
|
@@ -2799,25 +3022,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2799
3022
|
}
|
|
2800
3023
|
setBaseAst(deepCopy(baseAst));
|
|
2801
3024
|
fetchSqlQuery(deepCopy(baseAst));
|
|
2802
|
-
}, onSave: (column, direction) => {
|
|
3025
|
+
}, onSave: async (column, direction) => {
|
|
2803
3026
|
if (pivot) {
|
|
2804
3027
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2805
3028
|
? 'number'
|
|
2806
3029
|
: pivot.rowFieldType;
|
|
2807
|
-
|
|
2808
|
-
...pivot,
|
|
2809
|
-
sort: true,
|
|
2810
|
-
sortDirection: direction,
|
|
2811
|
-
sortField: column,
|
|
2812
|
-
sortFieldType: sortFieldType,
|
|
2813
|
-
});
|
|
2814
|
-
const pivotedData = generatePivotTableInMemory({
|
|
3030
|
+
const tempPivot = {
|
|
2815
3031
|
...pivot,
|
|
2816
3032
|
sort: true,
|
|
2817
3033
|
sortDirection: direction,
|
|
2818
3034
|
sortField: column,
|
|
2819
3035
|
sortFieldType: sortFieldType,
|
|
2820
|
-
}
|
|
3036
|
+
};
|
|
3037
|
+
setPivot(tempPivot);
|
|
3038
|
+
let dateBucket = undefined;
|
|
3039
|
+
const tempDateRange = dateRanges &&
|
|
3040
|
+
pivot.rowField &&
|
|
3041
|
+
dateRanges[pivot.rowField];
|
|
3042
|
+
if (tempDateRange) {
|
|
3043
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3044
|
+
}
|
|
3045
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2821
3046
|
setPivotData(pivotedData || []);
|
|
2822
3047
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2823
3048
|
setFormattedRows(formattedRows);
|
|
@@ -2898,27 +3123,29 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2898
3123
|
`.${pivot.rowField}`,
|
|
2899
3124
|
`.${pivot.valueField || 'count'}`,
|
|
2900
3125
|
]
|
|
2901
|
-
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
|
|
3126
|
+
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
|
|
2902
3127
|
if (column === '')
|
|
2903
3128
|
return;
|
|
2904
3129
|
if (pivot) {
|
|
2905
3130
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2906
3131
|
? 'number'
|
|
2907
3132
|
: pivot.rowFieldType;
|
|
2908
|
-
|
|
3133
|
+
const tempPivot = {
|
|
2909
3134
|
...pivot,
|
|
2910
3135
|
sort: true,
|
|
2911
3136
|
sortDirection: direction,
|
|
2912
3137
|
sortField: column,
|
|
2913
3138
|
sortFieldType: sortFieldType,
|
|
2914
|
-
}
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
3139
|
+
};
|
|
3140
|
+
setPivot(tempPivot);
|
|
3141
|
+
let dateBucket = undefined;
|
|
3142
|
+
const tempDateRange = dateRanges &&
|
|
3143
|
+
pivot.rowField &&
|
|
3144
|
+
dateRanges[pivot.rowField];
|
|
3145
|
+
if (tempDateRange) {
|
|
3146
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3147
|
+
}
|
|
3148
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2922
3149
|
setErrorMessage('');
|
|
2923
3150
|
setPivotData(pivotedData || []);
|
|
2924
3151
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
@@ -3011,14 +3238,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3011
3238
|
? askAIInputWidth
|
|
3012
3239
|
: askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
|
|
3013
3240
|
? 'Ask a follow-up question...'
|
|
3014
|
-
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading:
|
|
3241
|
+
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: tableLoading ||
|
|
3242
|
+
(loading && errorMessage.length === 0) ||
|
|
3243
|
+
initalChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
|
|
3015
3244
|
? pivotData?.columns || emptyPivotColumns()
|
|
3016
3245
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3017
3246
|
return {
|
|
3018
3247
|
label: snakeAndCamelCaseToTitleCase(c),
|
|
3019
3248
|
field: c,
|
|
3020
3249
|
};
|
|
3021
|
-
}) })), _jsxs("div", { style: {
|
|
3250
|
+
}), onPageChange: onPageChange, onSortChange: onSortChange })), _jsxs("div", { style: {
|
|
3022
3251
|
display: 'flex',
|
|
3023
3252
|
flexDirection: 'row',
|
|
3024
3253
|
gap: '12px',
|
|
@@ -3034,6 +3263,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3034
3263
|
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3035
3264
|
? {
|
|
3036
3265
|
...report,
|
|
3266
|
+
...tempReport,
|
|
3037
3267
|
pivot: pivot,
|
|
3038
3268
|
yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
|
|
3039
3269
|
columns: report.columns.filter((col) => {
|
|
@@ -3044,5 +3274,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3044
3274
|
queryString: activeQuery,
|
|
3045
3275
|
rows: rows,
|
|
3046
3276
|
}
|
|
3047
|
-
:
|
|
3277
|
+
: 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 }))] }));
|
|
3048
3278
|
}
|