@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
|
@@ -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';
|
|
@@ -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
|
/**
|
|
@@ -68,7 +70,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
|
|
|
68
70
|
* ### Report Builder API
|
|
69
71
|
* @see https://docs.quillsql.com/components/report-builder
|
|
70
72
|
*/
|
|
71
|
-
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement }) {
|
|
73
|
+
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
|
|
72
74
|
const { data: report } = useQuill(reportId || '');
|
|
73
75
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
74
76
|
const [errorMessage, setErrorMessage] = useState('');
|
|
@@ -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,6 +1905,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1780
1905
|
task: 'patterns',
|
|
1781
1906
|
getCustomFields: false,
|
|
1782
1907
|
customFields,
|
|
1908
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
1909
|
+
useUpdatedDataGathering: true,
|
|
1783
1910
|
},
|
|
1784
1911
|
};
|
|
1785
1912
|
const cloudBody = {};
|
|
@@ -1788,23 +1915,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1788
1915
|
throw new Error(data2.errorMessage);
|
|
1789
1916
|
}
|
|
1790
1917
|
rows = data2.rows;
|
|
1918
|
+
if (data2.rowCount) {
|
|
1919
|
+
setNumberOfRows(data2.rowCount);
|
|
1920
|
+
}
|
|
1791
1921
|
const tables = getTableNames(baseAst);
|
|
1792
1922
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1923
|
+
let newUniqueValues = uniqueValues;
|
|
1924
|
+
let dateRangesTemp = dateRanges;
|
|
1925
|
+
let curReport = undefined;
|
|
1793
1926
|
if (table !== currentTable) {
|
|
1794
1927
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1795
1928
|
if (tableInfo) {
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
})
|
|
1800
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
1801
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1802
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1803
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
1804
|
-
joinedUniqueValues[table] = newUniqueValues;
|
|
1805
|
-
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
1806
|
-
setUniqueValues(joinedUniqueValues);
|
|
1929
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
1930
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
1931
|
+
setUniqueValues(newUniqueValues);
|
|
1807
1932
|
}
|
|
1933
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
1934
|
+
setDateRanges(dateRangesTemp || {});
|
|
1808
1935
|
}
|
|
1809
1936
|
setCurrentTable(table);
|
|
1810
1937
|
}
|
|
@@ -1817,6 +1944,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1817
1944
|
setPivotData(null);
|
|
1818
1945
|
setRows(data2.rows);
|
|
1819
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
|
+
}
|
|
1820
1963
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
1821
1964
|
setFormattedRows(formattedRows);
|
|
1822
1965
|
return;
|
|
@@ -1828,12 +1971,36 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1828
1971
|
return acc;
|
|
1829
1972
|
}, {});
|
|
1830
1973
|
uniqueFormatted[pivot.columnField] = uniqueRecords;
|
|
1831
|
-
|
|
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]);
|
|
1832
1984
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1833
1985
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1834
1986
|
setPivotData(pivotedData);
|
|
1835
1987
|
setRows(data2.rows);
|
|
1836
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
|
+
}
|
|
1837
2004
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
|
|
1838
2005
|
setSelectedColumns(processedFields.map((column) => {
|
|
1839
2006
|
return `${table}.${column.field}`;
|
|
@@ -1844,6 +2011,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1844
2011
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1845
2012
|
setRows(data2.rows);
|
|
1846
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
|
+
}
|
|
1847
2029
|
setSelectedColumns(processedFields.map((column) => {
|
|
1848
2030
|
return `${table}.${column.field}`;
|
|
1849
2031
|
}));
|
|
@@ -2078,6 +2260,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2078
2260
|
publicKey: client.publicKey,
|
|
2079
2261
|
orgId: client.customerId,
|
|
2080
2262
|
task: 'patterns',
|
|
2263
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2264
|
+
useUpdatedDataGathering: true,
|
|
2265
|
+
pivot: groupByPivot,
|
|
2081
2266
|
},
|
|
2082
2267
|
};
|
|
2083
2268
|
const cloudBody = {};
|
|
@@ -2086,20 +2271,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2086
2271
|
throw new Error('Error querying data from patterns');
|
|
2087
2272
|
}
|
|
2088
2273
|
let currentUniqueValues = uniqueValues;
|
|
2274
|
+
let dateRangesTemp = dateRanges;
|
|
2089
2275
|
if (table !== currentTable) {
|
|
2090
2276
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
2091
2277
|
if (tableInfo) {
|
|
2092
|
-
const
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
})
|
|
2096
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
2097
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2098
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2099
|
-
currentUniqueValues[table] = newUniqueValues;
|
|
2100
|
-
if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
|
|
2101
|
-
setUniqueValues(currentUniqueValues);
|
|
2278
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2279
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
2280
|
+
setUniqueValues(newUniqueValues);
|
|
2102
2281
|
}
|
|
2282
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2283
|
+
setDateRanges(dateRangesTemp);
|
|
2103
2284
|
}
|
|
2104
2285
|
setCurrentTable(table);
|
|
2105
2286
|
}
|
|
@@ -2142,15 +2323,43 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2142
2323
|
errored = true;
|
|
2143
2324
|
}
|
|
2144
2325
|
if (groupByPivot && possiblePivot) {
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
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);
|
|
2150
2355
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
2151
2356
|
setPivotData(pivotedData);
|
|
2152
2357
|
setPivot(groupByPivot);
|
|
2153
2358
|
setRows(data2.rows);
|
|
2359
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
2360
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
2361
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
2362
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
2154
2363
|
setColumns(processedFields);
|
|
2155
2364
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
|
|
2156
2365
|
setFormattedRows(formattedRows);
|
|
@@ -2159,6 +2368,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2159
2368
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
2160
2369
|
setRows(data2.rows);
|
|
2161
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
|
+
}
|
|
2162
2382
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
2163
2383
|
setFormattedRows(formattedRows);
|
|
2164
2384
|
}
|
|
@@ -2433,17 +2653,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2433
2653
|
},
|
|
2434
2654
|
// TODOs
|
|
2435
2655
|
selectPivot: (pivot) => {
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
const newAst = { ...baseAst };
|
|
2439
|
-
newAst.orderby = null;
|
|
2440
|
-
setBaseAst(newAst); // trigger refetch
|
|
2441
|
-
setPivot(pivot);
|
|
2442
|
-
const pivotedData = generatePivotTable(pivot, rows, undefined, false);
|
|
2443
|
-
setPivotData(pivotedData || []);
|
|
2444
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2445
|
-
setFormattedRows(formattedRows);
|
|
2446
|
-
}, 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) => {
|
|
2447
2658
|
setPivotRowField(value);
|
|
2448
2659
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
2449
2660
|
setPivot(null);
|
|
@@ -2737,7 +2948,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2737
2948
|
setPivotData(null);
|
|
2738
2949
|
const formattedRows = formatRows(rows, columns, false);
|
|
2739
2950
|
setFormattedRows(formattedRows);
|
|
2740
|
-
}, selectPivot: (pivot) => {
|
|
2951
|
+
}, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
|
|
2741
2952
|
if (!pivot)
|
|
2742
2953
|
return;
|
|
2743
2954
|
const newAst = { ...baseAst };
|
|
@@ -2747,13 +2958,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2747
2958
|
pivot['sortDirection'] = 'ASC';
|
|
2748
2959
|
}
|
|
2749
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 || []);
|
|
2750
2969
|
setPivot(pivot);
|
|
2751
|
-
const
|
|
2752
|
-
setPivotData(pivotedData || []);
|
|
2753
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2970
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
2754
2971
|
setFormattedRows(formattedRows);
|
|
2755
2972
|
setErrorMessage('');
|
|
2756
|
-
}, 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) => {
|
|
2757
2974
|
setPivotRowField(value);
|
|
2758
2975
|
updatePivot(value, 'rowField');
|
|
2759
2976
|
}, setPivotColumnField: (value) => {
|
|
@@ -2785,10 +3002,18 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2785
3002
|
`.${pivot.rowField}`,
|
|
2786
3003
|
`.${pivot.valueField || 'count'}`,
|
|
2787
3004
|
]
|
|
2788
|
-
: 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 () => {
|
|
2789
3006
|
if (pivot) {
|
|
2790
|
-
|
|
2791
|
-
|
|
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]);
|
|
2792
3017
|
setPivotData(pivotedData || []);
|
|
2793
3018
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2794
3019
|
setFormattedRows(formattedRows);
|
|
@@ -2797,25 +3022,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2797
3022
|
}
|
|
2798
3023
|
setBaseAst(deepCopy(baseAst));
|
|
2799
3024
|
fetchSqlQuery(deepCopy(baseAst));
|
|
2800
|
-
}, onSave: (column, direction) => {
|
|
3025
|
+
}, onSave: async (column, direction) => {
|
|
2801
3026
|
if (pivot) {
|
|
2802
3027
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2803
3028
|
? 'number'
|
|
2804
3029
|
: pivot.rowFieldType;
|
|
2805
|
-
|
|
2806
|
-
...pivot,
|
|
2807
|
-
sort: true,
|
|
2808
|
-
sortDirection: direction,
|
|
2809
|
-
sortField: column,
|
|
2810
|
-
sortFieldType: sortFieldType,
|
|
2811
|
-
});
|
|
2812
|
-
const pivotedData = generatePivotTable({
|
|
3030
|
+
const tempPivot = {
|
|
2813
3031
|
...pivot,
|
|
2814
3032
|
sort: true,
|
|
2815
3033
|
sortDirection: direction,
|
|
2816
3034
|
sortField: column,
|
|
2817
3035
|
sortFieldType: sortFieldType,
|
|
2818
|
-
}
|
|
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]);
|
|
2819
3046
|
setPivotData(pivotedData || []);
|
|
2820
3047
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2821
3048
|
setFormattedRows(formattedRows);
|
|
@@ -2896,27 +3123,29 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2896
3123
|
`.${pivot.rowField}`,
|
|
2897
3124
|
`.${pivot.valueField || 'count'}`,
|
|
2898
3125
|
]
|
|
2899
|
-
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
|
|
3126
|
+
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
|
|
2900
3127
|
if (column === '')
|
|
2901
3128
|
return;
|
|
2902
3129
|
if (pivot) {
|
|
2903
3130
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2904
3131
|
? 'number'
|
|
2905
3132
|
: pivot.rowFieldType;
|
|
2906
|
-
|
|
3133
|
+
const tempPivot = {
|
|
2907
3134
|
...pivot,
|
|
2908
3135
|
sort: true,
|
|
2909
3136
|
sortDirection: direction,
|
|
2910
3137
|
sortField: column,
|
|
2911
3138
|
sortFieldType: sortFieldType,
|
|
2912
|
-
}
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
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]);
|
|
2920
3149
|
setErrorMessage('');
|
|
2921
3150
|
setPivotData(pivotedData || []);
|
|
2922
3151
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
@@ -3009,14 +3238,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3009
3238
|
? askAIInputWidth
|
|
3010
3239
|
: askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
|
|
3011
3240
|
? 'Ask a follow-up question...'
|
|
3012
|
-
: '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
|
|
3013
3244
|
? pivotData?.columns || emptyPivotColumns()
|
|
3014
3245
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3015
3246
|
return {
|
|
3016
3247
|
label: snakeAndCamelCaseToTitleCase(c),
|
|
3017
3248
|
field: c,
|
|
3018
3249
|
};
|
|
3019
|
-
}) })), _jsxs("div", { style: {
|
|
3250
|
+
}), onPageChange: onPageChange, onSortChange: onSortChange })), _jsxs("div", { style: {
|
|
3020
3251
|
display: 'flex',
|
|
3021
3252
|
flexDirection: 'row',
|
|
3022
3253
|
gap: '12px',
|
|
@@ -3032,6 +3263,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3032
3263
|
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3033
3264
|
? {
|
|
3034
3265
|
...report,
|
|
3266
|
+
...tempReport,
|
|
3035
3267
|
pivot: pivot,
|
|
3036
3268
|
yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
|
|
3037
3269
|
columns: report.columns.filter((col) => {
|
|
@@ -3042,5 +3274,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3042
3274
|
queryString: activeQuery,
|
|
3043
3275
|
rows: rows,
|
|
3044
3276
|
}
|
|
3045
|
-
:
|
|
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 }))] }));
|
|
3046
3278
|
}
|