@quillsql/react 2.13.24 → 2.13.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Chart.d.ts +0 -1
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +28 -16
- package/dist/cjs/ChartBuilder.d.ts +8 -37
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +402 -189
- package/dist/cjs/ChartEditor.d.ts +1 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +31 -167
- package/dist/cjs/Context.d.ts +13 -2
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +32 -12
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +3 -6
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +7 -3
- package/dist/cjs/ReportBuilder.d.ts +1 -3
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +120 -137
- package/dist/cjs/SQLEditor.d.ts +2 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +47 -24
- package/dist/cjs/components/Chart/BarChart.js +1 -1
- package/dist/cjs/components/Chart/InternalChart.d.ts +25 -0
- package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -0
- package/dist/cjs/components/Chart/InternalChart.js +385 -0
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +3 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +7 -4
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +8 -5
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +3 -3
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +23 -9
- package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +1 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +54 -8
- package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +48 -0
- package/dist/cjs/components/UiComponents.d.ts +3 -1
- 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.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +13 -0
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +6 -1
- package/dist/cjs/hooks/useQuill.js +9 -9
- package/dist/cjs/internals/ReportBuilder/PivotList.js +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +3 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +3 -8
- package/dist/cjs/models/Report.d.ts +9 -2
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/models/Report.js +2 -0
- package/dist/cjs/models/Tables.d.ts +5 -6
- package/dist/cjs/models/Tables.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +1 -0
- 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 +4 -0
- package/dist/cjs/utils/constants.d.ts.map +1 -1
- package/dist/cjs/utils/constants.js +6 -2
- package/dist/cjs/utils/dashboard.d.ts +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +13 -18
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +2 -2
- package/dist/cjs/utils/filterProcessing.d.ts +5 -2
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +5 -2
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +0 -4
- package/dist/cjs/utils/paginationProcessing.d.ts +1 -1
- package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/paginationProcessing.js +1 -4
- package/dist/cjs/utils/pivotConstructor.d.ts +3 -2
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +20 -8
- package/dist/cjs/utils/pivotProcessing.d.ts +5 -2
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.d.ts +1 -1
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +4 -4
- package/dist/cjs/utils/report.d.ts +2 -1
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +23 -24
- package/dist/cjs/utils/tableProcessing.d.ts +18 -5
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +14 -7
- package/dist/cjs/utils/validation.js +1 -1
- package/dist/esm/Chart.d.ts +0 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +28 -16
- package/dist/esm/ChartBuilder.d.ts +8 -37
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +408 -192
- package/dist/esm/ChartEditor.d.ts +1 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +33 -169
- package/dist/esm/Context.d.ts +13 -2
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +32 -12
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +5 -8
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +7 -3
- package/dist/esm/ReportBuilder.d.ts +1 -3
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +120 -137
- package/dist/esm/SQLEditor.d.ts +2 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +48 -25
- package/dist/esm/components/Chart/BarChart.js +1 -1
- package/dist/esm/components/Chart/InternalChart.d.ts +25 -0
- package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -0
- package/dist/esm/components/Chart/InternalChart.js +379 -0
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +4 -2
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +7 -4
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +8 -5
- package/dist/esm/components/Dashboard/DataLoader.d.ts +3 -3
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +23 -9
- package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +1 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +54 -8
- package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +47 -0
- package/dist/esm/components/UiComponents.d.ts +3 -1
- 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.map +1 -1
- package/dist/esm/hooks/useDashboard.js +14 -1
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +6 -1
- package/dist/esm/hooks/useQuill.js +9 -9
- package/dist/esm/internals/ReportBuilder/PivotList.js +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +3 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +3 -8
- package/dist/esm/models/Report.d.ts +9 -2
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/models/Report.js +1 -1
- package/dist/esm/models/Tables.d.ts +5 -6
- package/dist/esm/models/Tables.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +2 -1
- 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 +3 -0
- package/dist/esm/utils/constants.d.ts.map +1 -1
- package/dist/esm/utils/constants.js +6 -2
- package/dist/esm/utils/dashboard.d.ts +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +13 -18
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +2 -2
- package/dist/esm/utils/filterProcessing.d.ts +5 -2
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +5 -2
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +0 -4
- package/dist/esm/utils/paginationProcessing.d.ts +1 -1
- package/dist/esm/utils/paginationProcessing.d.ts.map +1 -1
- package/dist/esm/utils/paginationProcessing.js +1 -4
- package/dist/esm/utils/pivotConstructor.d.ts +3 -2
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +20 -8
- package/dist/esm/utils/pivotProcessing.d.ts +5 -2
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.d.ts +1 -1
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +3 -3
- package/dist/esm/utils/report.d.ts +2 -1
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +24 -25
- package/dist/esm/utils/tableProcessing.d.ts +18 -5
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +15 -8
- package/dist/esm/utils/validation.js +1 -1
- package/package.json +1 -1
package/dist/esm/ChartBuilder.js
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
|
|
3
|
-
import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
|
|
3
|
+
import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, ReportFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
|
|
4
4
|
import { getDataFromCloud } from './utils/dataFetcher';
|
|
5
5
|
import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
|
|
6
6
|
import { PivotCard } from './internals/ReportBuilder/PivotList';
|
|
7
|
-
import { ChartDisplay } from './Chart';
|
|
8
7
|
import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, } from './components/UiComponents';
|
|
9
8
|
import { removeDoubleQuotes, snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
|
|
10
9
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
10
|
+
import { TEMP_REPORT_ID, } from './models/Report';
|
|
11
11
|
import { QuillCard } from './components/QuillCard';
|
|
12
12
|
import { quillFormat } from './utils/valueFormatter';
|
|
13
|
-
import { convertFieldTypeToJSType } from './utils/columnProcessing';
|
|
13
|
+
import { convertFieldTypeToJSType, isStringType, } from './utils/columnProcessing';
|
|
14
14
|
import { getSelectFromAST, getTablesHelper } from './utils/astProcessing';
|
|
15
|
-
import { getDateBucketFromRange } from './utils/dates';
|
|
16
15
|
import { validateReport } from './utils/validation';
|
|
17
16
|
import { QuillChartErrorWithAction } from './components/Chart/ChartError';
|
|
18
|
-
import { convertInternalReportToReport,
|
|
19
|
-
|
|
17
|
+
import { convertInternalReportToReport,
|
|
18
|
+
// fetchReport,
|
|
19
|
+
// fetchReportRowCount,
|
|
20
|
+
saveReport, } from './utils/report';
|
|
20
21
|
import { mergeComparisonRange } from './utils/merge';
|
|
22
|
+
import { ExclamationFilledIcon } from './assets';
|
|
23
|
+
import InternalChart from './components/Chart/InternalChart';
|
|
24
|
+
import { shouldFetchMore, shouldSortInMemory, } from './utils/paginationProcessing';
|
|
25
|
+
import { fetchResultsByQuery, getUniqueValuesByColumns, } from './utils/tableProcessing';
|
|
26
|
+
import { getDateBucketFromRange } from './utils/dates';
|
|
21
27
|
const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
|
|
22
28
|
const CHART_TO_LABELS = {
|
|
23
29
|
column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
@@ -64,7 +70,6 @@ export function createInitialFormData(columns) {
|
|
|
64
70
|
xAxisLabel: '',
|
|
65
71
|
chartType: firstNumberColumn ? 'line' : 'table',
|
|
66
72
|
pivot: null,
|
|
67
|
-
dateField: { table: '', field: '' },
|
|
68
73
|
template: true,
|
|
69
74
|
};
|
|
70
75
|
return formEmptyState;
|
|
@@ -107,9 +112,9 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
|
|
|
107
112
|
...formData,
|
|
108
113
|
dashboardName: formData.dashboardName || '',
|
|
109
114
|
pivot: formData.pivot,
|
|
110
|
-
id:
|
|
115
|
+
id: report?.id ?? TEMP_REPORT_ID,
|
|
111
116
|
order: -1,
|
|
112
|
-
compareRows: report?.compareRows
|
|
117
|
+
compareRows: report?.compareRows,
|
|
113
118
|
filtersApplied: report?.filtersApplied || [],
|
|
114
119
|
queryString: '',
|
|
115
120
|
rows: rows,
|
|
@@ -191,6 +196,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
191
196
|
const [modalHeight, setModalHeight] = useState(200);
|
|
192
197
|
const { isOpen, setIsOpen, title, isHorizontalView } = props;
|
|
193
198
|
const Modal = props.ModalComponent ?? MemoizedModal;
|
|
199
|
+
const [dashboard] = useContext(DashboardContext);
|
|
194
200
|
useEffect(() => {
|
|
195
201
|
function handleResize() {
|
|
196
202
|
const screenSize = window.innerWidth;
|
|
@@ -211,7 +217,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
211
217
|
return (_jsx("div", { style: { height: '100%' }, ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
212
218
|
// For isHorizontalView, use full viewport size minus 80px for padding,
|
|
213
219
|
// otherwise use the default layout method of the modal (contents).
|
|
214
|
-
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
|
|
220
|
+
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: dashboard[props.reportId ?? TEMP_REPORT_ID] ? (_jsx(ChartBuilder, { ...props })) : (_jsx("div", { style: { padding: 20 }, children: _jsx(QuillLoadingComponent, {}) })) }) }));
|
|
215
221
|
}
|
|
216
222
|
/**
|
|
217
223
|
* ### Quill Chart Builder
|
|
@@ -237,45 +243,32 @@ export function ChartBuilderWithModal(props) {
|
|
|
237
243
|
* ### Chart Builder API
|
|
238
244
|
* @see https://docs.quillsql.com/components/chart-builder
|
|
239
245
|
*/
|
|
240
|
-
export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true,
|
|
246
|
+
export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, queryNoDateColumn, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
|
|
247
|
+
// isLoading,
|
|
248
|
+
onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
241
249
|
const [client] = useContext(ClientContext);
|
|
242
250
|
const [theme] = useContext(ThemeContext);
|
|
243
251
|
const [schemaData] = useContext(SchemaDataContext);
|
|
252
|
+
const [dashboard, dispatch] = useContext(DashboardContext);
|
|
253
|
+
const { dashboardConfig } = useContext(DashboardConfigContext);
|
|
254
|
+
const report = useMemo(() => {
|
|
255
|
+
return dashboard[TEMP_REPORT_ID] ?? dashboard[reportId ?? TEMP_REPORT_ID];
|
|
256
|
+
}, [reportId]);
|
|
244
257
|
const [windowWidth, setWindowWidth] = useState(1200);
|
|
258
|
+
const [rows, setRows] = useState(report?.rows ?? []);
|
|
259
|
+
const [itemQuery, setItemQuery] = useState(report?.itemQuery);
|
|
260
|
+
const [rowCount, setRowCount] = useState(report?.rowCount ?? 0);
|
|
261
|
+
const [maxPage, setMaxPage] = useState(0);
|
|
262
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
263
|
+
const [rowCountIsLoading, setRowCountIsLoading] = useState(false);
|
|
245
264
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
246
265
|
const [pivotCardWidth, setPivotCardWidth] = useState(665);
|
|
247
266
|
const [formWidth, setFormWidth] = useState(665);
|
|
248
267
|
const inputRef = useRef(null);
|
|
249
268
|
const selectRef = useRef(null);
|
|
250
|
-
const
|
|
251
|
-
const [processedColumns, setProcessedColumns] = useState(columns);
|
|
252
|
-
const [currentPage, setCurrentPage] = useState(0);
|
|
253
|
-
const parentRef = useRef(null);
|
|
254
|
-
const deleteRef = useRef(null);
|
|
255
|
-
const modalPadding = 20;
|
|
256
|
-
const deleteButtonMargin = -12;
|
|
257
|
-
// Note: Commenting out for now because it was auto-focusing on table page changes
|
|
258
|
-
// If the TextInputComponent is a forwardRef it will have a $$typeof property
|
|
259
|
-
// So we only want to pass the ref if the TextInputComponent is a forwardRef
|
|
260
|
-
// const autofocusRefProp =
|
|
261
|
-
// '$$typeof' in TextInputComponent
|
|
262
|
-
// ? {
|
|
263
|
-
// ref: (input: HTMLInputElement) =>
|
|
264
|
-
// formData.name === '' && !showPivotPopover && input?.focus(),
|
|
265
|
-
// }
|
|
266
|
-
// : {};
|
|
267
|
-
const validationHelper = (formData, dashboard, dateField, tables) => {
|
|
268
|
-
const issues = validateReport(formData, dashboard, dateField || defaultDateField, tables || allTables);
|
|
269
|
-
if (issues.length > 0) {
|
|
270
|
-
setFilterIssues(issues);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
setFilterIssues([]);
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
useEffect(() => {
|
|
269
|
+
const processColumns = (columns) => {
|
|
277
270
|
if (schemaData.schema) {
|
|
278
|
-
const newProcessedColumns = columns
|
|
271
|
+
const newProcessedColumns = columns?.map((col) => {
|
|
279
272
|
if (col.jsType) {
|
|
280
273
|
return col;
|
|
281
274
|
}
|
|
@@ -296,47 +289,39 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
296
289
|
newCol.jsType = convertFieldTypeToJSType(foundColumn.fieldType);
|
|
297
290
|
return newCol;
|
|
298
291
|
});
|
|
299
|
-
|
|
292
|
+
return newProcessedColumns;
|
|
300
293
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
setPivotCardWidth(width);
|
|
323
|
-
// Calculate the form width by adding the width of the delete button
|
|
324
|
-
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
325
|
-
const deleteWidth = deleteSize?.width ?? 0;
|
|
326
|
-
setFormWidth(width + deleteWidth);
|
|
327
|
-
}
|
|
328
|
-
};
|
|
329
|
-
handleResize();
|
|
330
|
-
}, [isOpen]);
|
|
294
|
+
return columns;
|
|
295
|
+
};
|
|
296
|
+
const [processedColumns, setProcessedColumns] = useState(processColumns(report?.columnInternal ?? []));
|
|
297
|
+
const [currentPage, setCurrentPage] = useState(0);
|
|
298
|
+
const parentRef = useRef(null);
|
|
299
|
+
const deleteRef = useRef(null);
|
|
300
|
+
const modalPadding = 20;
|
|
301
|
+
const deleteButtonMargin = -12;
|
|
302
|
+
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
303
|
+
const specificDashboardFilters = useMemo(() => {
|
|
304
|
+
return Object.values(dashboardFilters[report?.dashboardName ?? ''] ?? {}).map((f) => f.filter);
|
|
305
|
+
}, [dashboard.filters, report?.dashboardName]);
|
|
306
|
+
const validationHelper = (formData, dashboard, dateField, tables) => {
|
|
307
|
+
const issues = validateReport(formData, dashboard, dateField || defaultDateField, tables || allTables);
|
|
308
|
+
if (issues.length > 0) {
|
|
309
|
+
setFilterIssues(issues);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
setFilterIssues([]);
|
|
313
|
+
}
|
|
314
|
+
};
|
|
331
315
|
useEffect(() => {
|
|
332
316
|
const handleResize = () => {
|
|
317
|
+
setWindowWidth(window.innerWidth);
|
|
333
318
|
// The pivot card should be the same width as the row of inputs
|
|
334
319
|
// above it (an input, two selects, plus the gaps between them).
|
|
335
320
|
if (inputRef.current && selectRef.current) {
|
|
336
321
|
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
337
322
|
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
338
323
|
const selectWidth = selectSize.width;
|
|
339
|
-
const showDash = showDashboardDropdown && !
|
|
324
|
+
const showDash = showDashboardDropdown && !report?.dashboardName;
|
|
340
325
|
const spaceBetween = selectSize.left - inputSize.right;
|
|
341
326
|
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
342
327
|
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
@@ -352,15 +337,35 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
352
337
|
return () => {
|
|
353
338
|
window.removeEventListener('resize', handleResize);
|
|
354
339
|
};
|
|
355
|
-
}, []);
|
|
340
|
+
}, [isOpen]);
|
|
356
341
|
const [dashboardOptions, setDashboardOptions] = useState([]);
|
|
357
|
-
const
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
342
|
+
const { reportFilters, reportFiltersDispatch, loadFiltersForReport } = useContext(ReportFiltersContext);
|
|
343
|
+
useEffect(() => {
|
|
344
|
+
loadFiltersForReport(report?.id ?? TEMP_REPORT_ID, 'ChartBuilder', specificDashboardFilters, undefined, undefined, canonicalFilterMap, report?.dashboardName);
|
|
345
|
+
return () => {
|
|
346
|
+
reportFiltersDispatch({
|
|
347
|
+
type: 'CLEAR_REPORT_FILTERS',
|
|
348
|
+
id: report?.id ?? TEMP_REPORT_ID,
|
|
349
|
+
});
|
|
350
|
+
// TODO: Currently the behavior of Chart Builder is dependent on whether there is a TEMP_REPORT_ID in context or not
|
|
351
|
+
/* The Chart Builder can essentially be in three states
|
|
352
|
+
1. Creating a new report, all we have is an ephemeral temp report
|
|
353
|
+
2. Editing an existing report, we have a report id and the report is in the dashboard context
|
|
354
|
+
3. Editing the query of an existing report, we have a report id and the new-query report is in context under TEMP_REPORT_ID
|
|
355
|
+
One can imagine this going wrong: somehow the temp report gets set by SQLEditor or ReportBuilder but never cleared
|
|
356
|
+
and now its going to start popping up during state 2 rather than the real report.
|
|
357
|
+
For now we're going on faith that unmounting will always clear the temp report
|
|
358
|
+
but we may want to fiddle with the props to make this more robust
|
|
359
|
+
*/
|
|
360
|
+
dispatch({
|
|
361
|
+
type: 'REMOVE_DASHBOARD_ITEM',
|
|
362
|
+
id: TEMP_REPORT_ID,
|
|
363
|
+
});
|
|
364
|
+
};
|
|
365
|
+
}, []);
|
|
366
|
+
const currentDashboardFilters = useMemo(() => {
|
|
367
|
+
return Object.values(reportFilters[report?.id ?? TEMP_REPORT_ID] ?? {}).map((f) => f.filter);
|
|
368
|
+
}, [reportFilters, report?.id]);
|
|
364
369
|
const [showFilterModal, setShowFilterModal] = useState(false);
|
|
365
370
|
const [filterIssues, setFilterIssues] = useState([]);
|
|
366
371
|
const [showPivotPopover, setShowPivotPopover] = useState(false);
|
|
@@ -371,38 +376,72 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
371
376
|
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
372
377
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
373
378
|
const [pivotError, setPivotError] = useState(undefined);
|
|
379
|
+
const pivotData = report?.pivotRows && report?.pivotColumns
|
|
380
|
+
? { rows: report.pivotRows, columns: report.pivotColumns }
|
|
381
|
+
: undefined;
|
|
382
|
+
const columns = report?.columnInternal ?? [];
|
|
383
|
+
const destinationDashboard = report?.dashboardName;
|
|
384
|
+
const query = report?.queryString;
|
|
374
385
|
const [loadingFormData, setLoadingFormData] = useState(false);
|
|
375
386
|
const [triggeredEditChart, setTriggeredEditChart] = useState(false);
|
|
376
|
-
const [createdPivots, setCreatedPivots] = useState(
|
|
387
|
+
const [createdPivots, setCreatedPivots] = useState(report?.pivot ? [report.pivot] : cp);
|
|
377
388
|
const [recommendedPivots, setRecommendedPivots] = useState(rp);
|
|
378
|
-
const [pivotRowField, setPivotRowField] = useState(pivot?.rowField);
|
|
379
|
-
const [pivotColumnField, setPivotColumnField] = useState(pivot?.columnField);
|
|
380
|
-
const [pivotValueField, setPivotValueField] = useState(pivot?.valueField);
|
|
381
|
-
const [pivotValueField2, setPivotValueField2] = useState(pivot?.valueField2);
|
|
382
|
-
const [pivotAggregation, setPivotAggregation] = useState(pivot?.aggregationType);
|
|
389
|
+
const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
|
|
390
|
+
const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
|
|
391
|
+
const [pivotValueField, setPivotValueField] = useState(report?.pivot?.valueField);
|
|
392
|
+
const [pivotValueField2, setPivotValueField2] = useState(report?.pivot?.valueField2);
|
|
393
|
+
const [pivotAggregation, setPivotAggregation] = useState(report?.pivot?.aggregationType);
|
|
394
|
+
const baseProcessing = {
|
|
395
|
+
page: report?.pagination ?? {
|
|
396
|
+
page: 0,
|
|
397
|
+
rowsPerPage: 10,
|
|
398
|
+
rowsPerRequest: report?.chartType === 'table' ? 50 : 500,
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
const [currentProcessing, setCurrentProcessing] = useState(baseProcessing);
|
|
383
402
|
// initial state is the fields array passed in, but can eventually be changed to be the pivot fields
|
|
384
403
|
const [dateFieldOptions, setDateFieldOptions] = useState([]);
|
|
385
404
|
const [allTables, setAllTables] = useState([]);
|
|
386
405
|
const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
|
|
387
406
|
const [referencedColumns, setReferencedColumns] = useState({});
|
|
407
|
+
const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
|
|
408
|
+
const canonicalFilterMap = useMemo(() => {
|
|
409
|
+
return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
|
|
410
|
+
}, [filterMap]);
|
|
411
|
+
const validFilter = useMemo(() => {
|
|
412
|
+
return currentDashboardFilters.reduce((acc, filter) => {
|
|
413
|
+
if (filter.filterType === 'date_range') {
|
|
414
|
+
acc[filter.label] = true;
|
|
415
|
+
return acc;
|
|
416
|
+
}
|
|
417
|
+
acc[filter.label] =
|
|
418
|
+
!!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
|
|
419
|
+
!!schemaData.schema
|
|
420
|
+
?.find((table) => {
|
|
421
|
+
return (table.displayName === (filterMap[filter.label] ?? filter).table);
|
|
422
|
+
})
|
|
423
|
+
?.columns.find((col) => col.field === (filterMap[filter.label] ?? filter).field);
|
|
424
|
+
return acc;
|
|
425
|
+
}, {});
|
|
426
|
+
}, [currentDashboardFilters, filterMap, allTables]);
|
|
388
427
|
const [defaultDateField, setDefaultDateField] = useState({
|
|
389
428
|
table: dateFieldOptions[0]?.name || '',
|
|
390
429
|
field: dateFieldOptions[0]?.columns[0]?.field || '',
|
|
391
430
|
});
|
|
392
|
-
const firstNumberColumn =
|
|
431
|
+
const firstNumberColumn = report?.columnInternal?.find((col) => numberFormatOptions.includes(col.format));
|
|
393
432
|
const formEmptyState = {
|
|
394
433
|
name: report?.name ?? '',
|
|
395
|
-
dashboardName: dashboardOptions[0]?.label
|
|
396
|
-
columns: columns.map((col) => {
|
|
434
|
+
dashboardName: dashboardOptions[0]?.label ?? '',
|
|
435
|
+
columns: report?.columns.map((col) => {
|
|
397
436
|
return { ...col, label: snakeAndCamelCaseToTitleCase(col.label) };
|
|
398
|
-
}),
|
|
399
|
-
xAxisField: columns?.[0]?.field
|
|
400
|
-
xAxisFormat: columns?.[0]?.format
|
|
437
|
+
}) ?? [],
|
|
438
|
+
xAxisField: report?.columns?.[0]?.field ?? '',
|
|
439
|
+
xAxisFormat: report?.columns?.[0]?.format ?? 'string',
|
|
401
440
|
yAxisFields: [
|
|
402
441
|
{
|
|
403
|
-
field: firstNumberColumn?.field
|
|
442
|
+
field: firstNumberColumn?.field ?? report?.columns?.[0]?.field ?? '',
|
|
404
443
|
label: '',
|
|
405
|
-
format: firstNumberColumn?.format
|
|
444
|
+
format: firstNumberColumn?.format ?? report?.columns?.[0]?.format ?? 'string',
|
|
406
445
|
},
|
|
407
446
|
],
|
|
408
447
|
xAxisLabel: '',
|
|
@@ -461,7 +500,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
461
500
|
xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
|
|
462
501
|
xAxisFormat: isDateField(pivot.rowFieldType || '')
|
|
463
502
|
? 'string'
|
|
464
|
-
: columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
503
|
+
: report?.columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
465
504
|
report?.xAxisFormat ||
|
|
466
505
|
'whole_number',
|
|
467
506
|
xAxisLabel: report?.xAxisLabel || pivot.rowField,
|
|
@@ -474,8 +513,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
474
513
|
: report?.yAxisFields && report?.yAxisFields?.length > 0
|
|
475
514
|
? // @ts-ignore
|
|
476
515
|
report?.yAxisFields[0].format
|
|
477
|
-
: columns.find((col) => col.field === pivot.valueField)
|
|
478
|
-
'whole_number',
|
|
516
|
+
: report?.columns.find((col) => col.field === pivot.valueField)
|
|
517
|
+
?.format || 'whole_number',
|
|
479
518
|
},
|
|
480
519
|
],
|
|
481
520
|
};
|
|
@@ -483,8 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
483
522
|
const formFormDataFromReport = (report) => {
|
|
484
523
|
let pivotData = {};
|
|
485
524
|
let dateField = defaultDateField;
|
|
486
|
-
if (pivot) {
|
|
487
|
-
pivotData = pivotFormData(pivot);
|
|
525
|
+
if (report?.pivot) {
|
|
526
|
+
pivotData = pivotFormData(report.pivot);
|
|
488
527
|
}
|
|
489
528
|
if (report) {
|
|
490
529
|
dateField = report.dateField || defaultDateField;
|
|
@@ -493,7 +532,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
493
532
|
...formEmptyState,
|
|
494
533
|
...report,
|
|
495
534
|
...pivotData,
|
|
496
|
-
...(
|
|
535
|
+
...(report?.dashboardName && { dashboardName: report?.dashboardName }),
|
|
497
536
|
dateField: dateField,
|
|
498
537
|
};
|
|
499
538
|
};
|
|
@@ -502,7 +541,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
502
541
|
if (!rows || !rows.length) {
|
|
503
542
|
return [];
|
|
504
543
|
}
|
|
505
|
-
if (pivot || pivotData) {
|
|
544
|
+
if (report?.pivot || pivotData) {
|
|
506
545
|
return [];
|
|
507
546
|
}
|
|
508
547
|
const columnsObservedInRows = rows[0] ? Object.keys(rows[0]) : [];
|
|
@@ -551,8 +590,6 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
551
590
|
const curDashboard = await updateDashboardFilters(dashboardName);
|
|
552
591
|
setDashboardOptions(dashboardOptions);
|
|
553
592
|
curFormData.dashboardName = dashboardName;
|
|
554
|
-
setDefaultDashboardName(dashboardName ??
|
|
555
|
-
(report ? report?.dashboardName : dashboardOptions[0]?.label));
|
|
556
593
|
const curSchemaData = schemaData.schema;
|
|
557
594
|
if (!query) {
|
|
558
595
|
setLoadingFormData(false);
|
|
@@ -613,34 +650,49 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
613
650
|
}
|
|
614
651
|
getFormData();
|
|
615
652
|
}, []);
|
|
616
|
-
const [selectedPivotTable, setSelectedPivotTable] = useState(pivotData
|
|
653
|
+
const [selectedPivotTable, setSelectedPivotTable] = useState(pivotData);
|
|
654
|
+
const pivotCardTable = useMemo(() => {
|
|
655
|
+
return {
|
|
656
|
+
pivot: formData.pivot,
|
|
657
|
+
rows: selectedPivotTable?.rows ?? [],
|
|
658
|
+
columns: selectedPivotTable?.columns ?? [],
|
|
659
|
+
};
|
|
660
|
+
}, [selectedPivotTable, formData.pivot]);
|
|
617
661
|
const chartData = useMemo(() => {
|
|
618
|
-
const data = createReportFromForm(formData, report, selectedPivotTable, rows,
|
|
619
|
-
return
|
|
662
|
+
const data = createReportFromForm(formData, report, selectedPivotTable, rows, currentDashboardFilters);
|
|
663
|
+
return {
|
|
664
|
+
...data,
|
|
665
|
+
filterMap: canonicalFilterMap,
|
|
666
|
+
};
|
|
620
667
|
}, [formData, selectedPivotTable, report, rows]);
|
|
621
|
-
const fetchPivotData = async (pivot, uniqueValues,
|
|
668
|
+
const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
|
|
669
|
+
const dashboardFilters = filtersEnabled
|
|
670
|
+
? (overrideFilters ?? currentDashboardFilters)
|
|
671
|
+
: undefined;
|
|
622
672
|
if (pivot) {
|
|
623
|
-
// const dateFilter =
|
|
624
|
-
// report && filtersActive
|
|
625
|
-
// ? report.filtersApplied.find((filter: any) => {
|
|
626
|
-
// return filter.filterType === 'date_range';
|
|
627
|
-
// })
|
|
628
|
-
// : undefined;
|
|
629
673
|
let dateBucket = undefined;
|
|
630
|
-
if (
|
|
631
|
-
|
|
674
|
+
if (filtersEnabled) {
|
|
675
|
+
const dateFilter = dashboardFilters?.find((f) => f.filterType === 'date_range');
|
|
676
|
+
dateBucket =
|
|
677
|
+
dateFilter?.startDate && dateFilter?.endDate
|
|
678
|
+
? getDateBucketFromRange({
|
|
679
|
+
start: dateFilter?.startDate,
|
|
680
|
+
end: dateFilter?.endDate,
|
|
681
|
+
})
|
|
682
|
+
: undefined;
|
|
632
683
|
}
|
|
633
684
|
try {
|
|
634
685
|
const pivotTable = await generatePivotTable({
|
|
635
686
|
pivot,
|
|
636
687
|
dateBucket,
|
|
637
|
-
report,
|
|
688
|
+
report: { ...report, ...(tableInfo ?? { itemQuery }) },
|
|
638
689
|
client,
|
|
639
690
|
uniqueValues,
|
|
640
691
|
});
|
|
641
692
|
setSelectedPivotTable(pivotTable);
|
|
642
693
|
}
|
|
643
694
|
catch (e) {
|
|
695
|
+
console.log('error', e);
|
|
644
696
|
if (e instanceof Error) {
|
|
645
697
|
setPivotError(e.message);
|
|
646
698
|
}
|
|
@@ -697,6 +749,129 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
697
749
|
rows,
|
|
698
750
|
formData.pivot,
|
|
699
751
|
]);
|
|
752
|
+
const fetchRowCount = async (processing, overrideFilters) => {
|
|
753
|
+
if (!client || !query) {
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
setRowCountIsLoading(true);
|
|
757
|
+
const tableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, false, true, canonicalFilterMap);
|
|
758
|
+
if (tableInfo.rowCount) {
|
|
759
|
+
setRowCount(tableInfo.rowCount);
|
|
760
|
+
}
|
|
761
|
+
setRowCountIsLoading(false);
|
|
762
|
+
};
|
|
763
|
+
const onDashboardFilterChange = (label, value) => {
|
|
764
|
+
const updatedFilters = currentDashboardFilters.map((filter) => {
|
|
765
|
+
if (filter.label === label) {
|
|
766
|
+
return {
|
|
767
|
+
...filter,
|
|
768
|
+
...value,
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
return filter;
|
|
772
|
+
});
|
|
773
|
+
loadFiltersForReport(report?.id ?? TEMP_REPORT_ID, 'ChartBuilder', updatedFilters, label, undefined, canonicalFilterMap, report?.dashboardName).then(() => {
|
|
774
|
+
setCurrentPage(0);
|
|
775
|
+
setMaxPage(0);
|
|
776
|
+
handleRunQuery(baseProcessing, updatedFilters);
|
|
777
|
+
});
|
|
778
|
+
};
|
|
779
|
+
const mounted = useRef(false);
|
|
780
|
+
useEffect(() => {
|
|
781
|
+
if (!mounted.current) {
|
|
782
|
+
mounted.current = true;
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
setCurrentPage(0);
|
|
786
|
+
setMaxPage(0);
|
|
787
|
+
handleRunQuery(baseProcessing, currentDashboardFilters);
|
|
788
|
+
}, [filtersEnabled]);
|
|
789
|
+
const handleRunQuery = async (processing, overrideFilters) => {
|
|
790
|
+
if (!client || !query) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
try {
|
|
794
|
+
setIsLoading(true);
|
|
795
|
+
const tableInfo = await fetchResultsByQuery(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, true, false, canonicalFilterMap);
|
|
796
|
+
setCurrentProcessing(processing);
|
|
797
|
+
setRows(tableInfo.rows);
|
|
798
|
+
setProcessedColumns(processColumns(tableInfo.columns));
|
|
799
|
+
setItemQuery(tableInfo.itemQuery);
|
|
800
|
+
fetchRowCount(processing, overrideFilters);
|
|
801
|
+
if (formData.pivot) {
|
|
802
|
+
try {
|
|
803
|
+
const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, schemaData.customFields ?? [], overrideFilters);
|
|
804
|
+
fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
|
|
805
|
+
}
|
|
806
|
+
catch (e) {
|
|
807
|
+
console.log('error fetching pivot', e);
|
|
808
|
+
setPivotError(e.message);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
setIsLoading(false);
|
|
812
|
+
}
|
|
813
|
+
catch (e) {
|
|
814
|
+
console.log(e);
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
const onPageChange = (page) => {
|
|
818
|
+
// only fetch if report is valid, else use query task
|
|
819
|
+
if (currentProcessing.page &&
|
|
820
|
+
shouldFetchMore(currentProcessing.page, page, maxPage)) {
|
|
821
|
+
const newPagination = {
|
|
822
|
+
...currentProcessing.page,
|
|
823
|
+
page,
|
|
824
|
+
};
|
|
825
|
+
const updatedProcessing = {
|
|
826
|
+
...currentProcessing,
|
|
827
|
+
page: newPagination,
|
|
828
|
+
};
|
|
829
|
+
setCurrentProcessing(updatedProcessing);
|
|
830
|
+
updateTableRows(updatedProcessing);
|
|
831
|
+
}
|
|
832
|
+
if (page > maxPage) {
|
|
833
|
+
setMaxPage(page);
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
const onSortChange = (sort) => {
|
|
837
|
+
if (shouldSortInMemory(baseProcessing.page, rowCount)) {
|
|
838
|
+
return;
|
|
839
|
+
}
|
|
840
|
+
const updatedProcessing = { ...baseProcessing, sort };
|
|
841
|
+
updateTableRows(updatedProcessing, true);
|
|
842
|
+
setCurrentProcessing(updatedProcessing);
|
|
843
|
+
setCurrentPage(0);
|
|
844
|
+
setMaxPage(0);
|
|
845
|
+
};
|
|
846
|
+
const updateTableRows = async (processing, resetRows = false) => {
|
|
847
|
+
if (!client) {
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
850
|
+
if (!isLoading && report && query) {
|
|
851
|
+
setIsLoading(true);
|
|
852
|
+
try {
|
|
853
|
+
const updatedProcessing = { ...currentProcessing, ...processing };
|
|
854
|
+
const paginatedRows = await fetchResultsByQuery(query, client, updatedProcessing, schemaData.customFields, filtersEnabled ? currentDashboardFilters : undefined, filtersEnabled
|
|
855
|
+
? (report?.dateField ?? formData.dateField)
|
|
856
|
+
: undefined, false, false, canonicalFilterMap);
|
|
857
|
+
if (paginatedRows.error) {
|
|
858
|
+
throw new Error('Error fetching chart');
|
|
859
|
+
}
|
|
860
|
+
let tempRows = [...rows, ...paginatedRows.rows];
|
|
861
|
+
if (resetRows) {
|
|
862
|
+
tempRows = paginatedRows.rows;
|
|
863
|
+
}
|
|
864
|
+
setRows(tempRows);
|
|
865
|
+
setCurrentProcessing(updatedProcessing);
|
|
866
|
+
}
|
|
867
|
+
catch (e) {
|
|
868
|
+
console.log(e);
|
|
869
|
+
}
|
|
870
|
+
finally {
|
|
871
|
+
setIsLoading(false);
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
};
|
|
700
875
|
const handleChange = async (value, fieldName, index) => {
|
|
701
876
|
let updatedForm = { ...formData };
|
|
702
877
|
try {
|
|
@@ -754,7 +929,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
754
929
|
}
|
|
755
930
|
else if (field === 'dateField' &&
|
|
756
931
|
subfield === 'table' &&
|
|
757
|
-
!formData.dateField
|
|
932
|
+
!formData.dateField?.field) {
|
|
758
933
|
const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
|
|
759
934
|
updatedForm.dateField = {
|
|
760
935
|
// @ts-ignore
|
|
@@ -785,7 +960,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
785
960
|
}
|
|
786
961
|
setFormData(updatedForm);
|
|
787
962
|
};
|
|
788
|
-
const handleAddPivot = async (pivot, uniqueValues,
|
|
963
|
+
const handleAddPivot = async (pivot, uniqueValues, pivotData) => {
|
|
789
964
|
const newPivotFormData = pivotFormData(pivot);
|
|
790
965
|
// Only keep the old chart type if the shapes of the pivots are the same
|
|
791
966
|
// since the valid chart types for some pivots might have changed (eg. going
|
|
@@ -802,7 +977,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
802
977
|
});
|
|
803
978
|
}
|
|
804
979
|
else {
|
|
805
|
-
await fetchPivotData(pivot,
|
|
980
|
+
await fetchPivotData(pivot, undefined, uniqueValues);
|
|
806
981
|
}
|
|
807
982
|
setFormData((formData) => ({
|
|
808
983
|
...formData,
|
|
@@ -818,6 +993,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
818
993
|
}
|
|
819
994
|
setFormData({
|
|
820
995
|
...formEmptyState,
|
|
996
|
+
...formData,
|
|
821
997
|
dashboardName: formData.dashboardName,
|
|
822
998
|
pivot: null,
|
|
823
999
|
});
|
|
@@ -893,26 +1069,25 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
893
1069
|
return;
|
|
894
1070
|
}
|
|
895
1071
|
// If the dashboardItem is a template but the editor isn't an admin, create a new dashboardItem and set the template to false
|
|
896
|
-
let dashboardItemId =
|
|
1072
|
+
let dashboardItemId = reportId ? reportId : undefined;
|
|
897
1073
|
if (report && !isAdmin && formData.template) {
|
|
898
1074
|
dashboardItemId = undefined;
|
|
899
1075
|
}
|
|
900
1076
|
const newReport = {
|
|
901
1077
|
...formData,
|
|
1078
|
+
filterMap,
|
|
902
1079
|
columns: formData.columns.filter((col) => !invalidColumns.includes(col)),
|
|
903
1080
|
...(formData.dateField?.table
|
|
904
1081
|
? {}
|
|
905
1082
|
: { dateField: { ...defaultDateField } }),
|
|
906
1083
|
...(formData.dashboardName
|
|
907
1084
|
? {}
|
|
908
|
-
: { dashboardName:
|
|
909
|
-
query: queryNoDateColumn ||
|
|
1085
|
+
: { dashboardName: report?.dashboardName }),
|
|
1086
|
+
query: queryNoDateColumn || report?.queryString || '',
|
|
910
1087
|
pivot: formData.pivot,
|
|
911
1088
|
referencedTables: allTables,
|
|
912
1089
|
referencedColumns,
|
|
913
|
-
template: report && !
|
|
914
|
-
? false
|
|
915
|
-
: formData.template,
|
|
1090
|
+
template: report && !isAdmin && formData.template ? false : formData.template,
|
|
916
1091
|
};
|
|
917
1092
|
const resp = await saveReport({
|
|
918
1093
|
report: newReport,
|
|
@@ -948,7 +1123,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
948
1123
|
// Prevent horizontal view on small screens.
|
|
949
1124
|
isHorizontalView = windowWidth < 1200 ? false : isHorizontalView;
|
|
950
1125
|
if (!schemaData.schema) {
|
|
951
|
-
return _jsx("div", { children: "
|
|
1126
|
+
return _jsx("div", { children: "No schema" });
|
|
952
1127
|
}
|
|
953
1128
|
return (_jsxs("div", { style: {
|
|
954
1129
|
width: '100%',
|
|
@@ -969,70 +1144,45 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
969
1144
|
display: 'flex',
|
|
970
1145
|
flexDirection: 'column',
|
|
971
1146
|
gap: isOpen ? 16 : 20,
|
|
972
|
-
overflowY: '
|
|
1147
|
+
overflowY: 'scroll',
|
|
973
1148
|
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
974
1149
|
...(isHorizontalView && {
|
|
975
1150
|
flexGrow: 1,
|
|
976
1151
|
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
977
1152
|
}),
|
|
978
1153
|
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
979
|
-
}, children: [
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
flexDirection: 'row',
|
|
983
|
-
gap: 4,
|
|
984
|
-
marginTop: -16,
|
|
985
|
-
userSelect: 'none',
|
|
986
|
-
}, onClick: () => {
|
|
987
|
-
onFilterPreviewChange && onFilterPreviewChange(!filtersActive);
|
|
988
|
-
setCurrentPage(0);
|
|
989
|
-
setFiltersActive(!filtersActive);
|
|
990
|
-
}, children: [_jsx(AdjustmentsIcon, { style: {
|
|
991
|
-
color: filtersActive ? '#212121' : '#9e9e9e',
|
|
992
|
-
height: 20,
|
|
993
|
-
width: 20,
|
|
994
|
-
}, strokeWidth: filtersActive ? 1.5 : 1 }), _jsx("div", { style: {
|
|
995
|
-
color: filtersActive ? '#212121' : '#9e9e9e',
|
|
996
|
-
fontSize: 14,
|
|
997
|
-
fontWeight: 300,
|
|
998
|
-
userSelect: 'none',
|
|
999
|
-
}, children: filtersActive
|
|
1000
|
-
? 'Previewing with filters'
|
|
1001
|
-
: 'Previewing without filters' })] })), !isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : (((!isHorizontalView && windowWidth >= 1200) ||
|
|
1002
|
-
formData.chartType !== 'table') && (_jsx(ChartDisplay, { reportId: report?.id, config: chartData, scrollable: true, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
1154
|
+
}, children: [!isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
1155
|
+
onFiltersEnabledChanged(hide);
|
|
1156
|
+
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1003
1157
|
width: '100%',
|
|
1004
|
-
height:
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
|
|
1009
|
-
: `calc(100% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
|
|
1010
|
-
: 400,
|
|
1158
|
+
// height:
|
|
1159
|
+
// formData.chartType === 'metric'
|
|
1160
|
+
// ? 100
|
|
1161
|
+
// : `calc(${filtersEnabled ? 50 : 70}%)`,
|
|
1011
1162
|
...(isHorizontalView && { flexGrow: 1 }),
|
|
1012
|
-
}, onClickChartElement: onClickChartElement }))),
|
|
1163
|
+
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }))),
|
|
1013
1164
|
// Make sure to display non-pivoted table when using pivot chart
|
|
1014
|
-
|
|
1165
|
+
isAdmin &&
|
|
1015
1166
|
(isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsx("div", { style: {
|
|
1016
1167
|
width: '100%',
|
|
1017
|
-
height:
|
|
1018
|
-
|
|
1019
|
-
|
|
1168
|
+
// height:
|
|
1169
|
+
// isHorizontalView || !isOpen
|
|
1170
|
+
// ? `calc(${filtersEnabled ? 30 : 50}%)`
|
|
1171
|
+
// : 400,
|
|
1020
1172
|
flexGrow: 1,
|
|
1021
1173
|
}, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
|
|
1022
|
-
onPageChange
|
|
1023
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1174
|
+
onPageChange(page);
|
|
1024
1175
|
setCurrentPage(page);
|
|
1025
1176
|
}, onSortChange: (sort) => {
|
|
1026
|
-
onSortChange && onSortChange(sort
|
|
1177
|
+
onSortChange && onSortChange(sort);
|
|
1027
1178
|
}, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1028
1179
|
? selectedPivotTable.columns
|
|
1029
1180
|
: formData.columns, onPageChange: (page) => {
|
|
1030
|
-
onPageChange
|
|
1031
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1181
|
+
onPageChange(page);
|
|
1032
1182
|
setCurrentPage(page);
|
|
1033
1183
|
}, onSortChange: (sort) => {
|
|
1034
|
-
onSortChange && onSortChange(sort
|
|
1035
|
-
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1184
|
+
onSortChange && onSortChange(sort);
|
|
1185
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1036
1186
|
display: 'flex',
|
|
1037
1187
|
flexDirection: 'column',
|
|
1038
1188
|
gap: 20,
|
|
@@ -1069,11 +1219,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1069
1219
|
// marginTop: 6,
|
|
1070
1220
|
display: 'flex',
|
|
1071
1221
|
flexDirection: 'column',
|
|
1072
|
-
}, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotValueField2: pivotValueField2, setPivotValueField2: setPivotValueField2, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processedColumns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, uniqueValuesIsLoading: initialUniqueValuesIsLoading, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled, report: report }) }), formData.pivot && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: {
|
|
1073
|
-
pivot: formData.pivot,
|
|
1074
|
-
rows: selectedPivotTable?.rows ?? [],
|
|
1075
|
-
columns: selectedPivotTable?.columns ?? [],
|
|
1076
|
-
}, theme: theme, index: 0, onSelectPivot: () => {
|
|
1222
|
+
}, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotValueField2: pivotValueField2, setPivotValueField2: setPivotValueField2, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processedColumns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, uniqueValuesIsLoading: initialUniqueValuesIsLoading, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled, report: report }) }), formData.pivot && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: pivotCardTable, theme: theme, index: 0, onSelectPivot: () => {
|
|
1077
1223
|
setIsEdittingPivot(true);
|
|
1078
1224
|
setShowPivotPopover(true);
|
|
1079
1225
|
setPivotRowField(formData.pivot?.rowField);
|
|
@@ -1082,7 +1228,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1082
1228
|
setPivotValueField2(formData.pivot?.valueField2);
|
|
1083
1229
|
setPivotAggregation(formData.pivot?.aggregationType);
|
|
1084
1230
|
setPivotPopUpTitle('Edit pivot');
|
|
1085
|
-
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [
|
|
1231
|
+
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [windowWidth < 1200 && _jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
1232
|
+
onFiltersEnabledChanged(hide);
|
|
1233
|
+
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1234
|
+
width: '100%',
|
|
1235
|
+
height: 500,
|
|
1236
|
+
flexGrow: 1,
|
|
1237
|
+
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
|
|
1086
1238
|
display: 'flex',
|
|
1087
1239
|
flexDirection: 'column',
|
|
1088
1240
|
}, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
@@ -1096,11 +1248,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1096
1248
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
1097
1249
|
isDateField(formData.pivot.rowFieldType || '')
|
|
1098
1250
|
? [{ value: 'pivot_date', label: 'date' }]
|
|
1099
|
-
: formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields
|
|
1100
|
-
// .filter((yAxisField: YAxisField) => {
|
|
1101
|
-
// return !yAxisField.field.startsWith('comparison_');
|
|
1102
|
-
// })
|
|
1103
|
-
.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
|
|
1251
|
+
: formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
|
|
1104
1252
|
? formData.pivot.valueField || 'count'
|
|
1105
1253
|
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
1106
1254
|
? [
|
|
@@ -1126,25 +1274,23 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1126
1274
|
: ''
|
|
1127
1275
|
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
1128
1276
|
? NUMBER_OPTIONS
|
|
1129
|
-
: formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })),
|
|
1277
|
+
: formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), isAdmin && windowWidth < 1200 && (_jsx("div", { style: {
|
|
1130
1278
|
width: '100%',
|
|
1131
1279
|
height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
|
|
1132
1280
|
flexGrow: 1,
|
|
1133
1281
|
}, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
|
|
1134
|
-
onPageChange
|
|
1135
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1282
|
+
onPageChange(page);
|
|
1136
1283
|
setCurrentPage(page);
|
|
1137
1284
|
}, onSortChange: (sort) => {
|
|
1138
|
-
onSortChange && onSortChange(sort
|
|
1285
|
+
onSortChange && onSortChange(sort);
|
|
1139
1286
|
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1140
1287
|
? selectedPivotTable.columns
|
|
1141
1288
|
: formData.columns, onPageChange: (page) => {
|
|
1142
|
-
onPageChange
|
|
1143
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1289
|
+
onPageChange(page);
|
|
1144
1290
|
setCurrentPage(page);
|
|
1145
1291
|
}, onSortChange: (sort) => {
|
|
1146
|
-
onSortChange && onSortChange(sort
|
|
1147
|
-
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })),
|
|
1292
|
+
onSortChange && onSortChange(sort);
|
|
1293
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), isAdmin && (_jsxs("div", { children: [_jsxs("div", { style: {
|
|
1148
1294
|
display: 'flex',
|
|
1149
1295
|
flexDirection: 'column',
|
|
1150
1296
|
}, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
@@ -1182,11 +1328,20 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1182
1328
|
(formData.pivot &&
|
|
1183
1329
|
selectedPivotTable &&
|
|
1184
1330
|
selectedPivotTable.columns &&
|
|
1185
|
-
formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })),
|
|
1331
|
+
formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), (specificDashboardFilters.length > 0 ||
|
|
1332
|
+
(isAdmin &&
|
|
1333
|
+
formData.dateField &&
|
|
1334
|
+
dashboardConfig[formData.dashboardName ?? '']?.config
|
|
1335
|
+
.dateFilter?.label)) && (_jsxs("div", { style: {
|
|
1186
1336
|
display: 'flex',
|
|
1187
1337
|
flexDirection: 'column',
|
|
1188
1338
|
gap: 6,
|
|
1189
|
-
}, children: [_jsx(HeaderComponent, { label: "
|
|
1339
|
+
}, children: [_jsx(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
|
|
1340
|
+
formData.dateField &&
|
|
1341
|
+
dashboardConfig[formData.dashboardName ?? destinationDashboard ?? '']?.config.dateFilter?.label && (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.dateFilter.' +
|
|
1342
|
+
(dashboardConfig[formData.dashboardName ?? '']
|
|
1343
|
+
?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
|
|
1344
|
+
?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
|
|
1190
1345
|
label: elem.name,
|
|
1191
1346
|
value: elem.name,
|
|
1192
1347
|
})), width: 200 }) }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Field", value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
|
|
@@ -1194,7 +1349,67 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1194
1349
|
?.columns?.map((elem) => ({
|
|
1195
1350
|
label: elem.field,
|
|
1196
1351
|
value: elem.field,
|
|
1197
|
-
})) || [], width: 200 }) })
|
|
1352
|
+
})) || [], width: 200 }) }), (!formData.dateField?.table ||
|
|
1353
|
+
!formData.dateField?.field) && (_jsx("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
|
|
1354
|
+
color: '#dc143c',
|
|
1355
|
+
} }) }))] })), specificDashboardFilters.length > 0 && (_jsx("div", { style: {
|
|
1356
|
+
display: 'flex',
|
|
1357
|
+
flexDirection: 'column',
|
|
1358
|
+
gap: 6,
|
|
1359
|
+
}, children: specificDashboardFilters
|
|
1360
|
+
.filter((f) => {
|
|
1361
|
+
return f.filterType !== 'date_range';
|
|
1362
|
+
})
|
|
1363
|
+
.map((filter, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
|
|
1364
|
+
!(isAdmin &&
|
|
1365
|
+
formData.dateField &&
|
|
1366
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1367
|
+
?.config.dateFilter?.label)
|
|
1368
|
+
? 'Filter'
|
|
1369
|
+
: '', disabled: true }), _jsx(SelectComponent, { label: index === 0 &&
|
|
1370
|
+
!(isAdmin &&
|
|
1371
|
+
formData.dateField &&
|
|
1372
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1373
|
+
?.config.dateFilter?.label)
|
|
1374
|
+
? 'Virtual Table'
|
|
1375
|
+
: '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
|
|
1376
|
+
...filterMap,
|
|
1377
|
+
[filter.label]: {
|
|
1378
|
+
table: e.target.value,
|
|
1379
|
+
field: schemaData.schema
|
|
1380
|
+
.find((t) => t.name == e.target.value)
|
|
1381
|
+
?.columns.find((elem) => elem.field ===
|
|
1382
|
+
(filterMap[filter.label]?.field ??
|
|
1383
|
+
filter.field))?.field ?? '',
|
|
1384
|
+
},
|
|
1385
|
+
}), options: allTables.map((elem) => ({
|
|
1386
|
+
label: elem,
|
|
1387
|
+
value: elem,
|
|
1388
|
+
})), width: 200 }), _jsx(SelectComponent, { label: index === 0 &&
|
|
1389
|
+
!(isAdmin &&
|
|
1390
|
+
formData.dateField &&
|
|
1391
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1392
|
+
?.config.dateFilter?.label)
|
|
1393
|
+
? 'Field'
|
|
1394
|
+
: '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
|
|
1395
|
+
...filterMap,
|
|
1396
|
+
[filter.label]: {
|
|
1397
|
+
table: filterMap[filter.label]?.table ??
|
|
1398
|
+
filter.table,
|
|
1399
|
+
field: e.target.value,
|
|
1400
|
+
},
|
|
1401
|
+
}), options: schemaData.schema
|
|
1402
|
+
.find((t) => t.name ==
|
|
1403
|
+
(filterMap[filter.label]?.table ??
|
|
1404
|
+
filter.table) &&
|
|
1405
|
+
allTables.includes(t.name))
|
|
1406
|
+
?.columns.filter((column) => isStringType(column.fieldType))
|
|
1407
|
+
.map((elem) => ({
|
|
1408
|
+
label: elem.label,
|
|
1409
|
+
value: elem.field,
|
|
1410
|
+
})) ?? [], width: 200 }), !validFilter[filter.label] && (_jsx("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
|
|
1411
|
+
color: '#dc143c',
|
|
1412
|
+
} }) }))] }, filter.label))) }))] })), isAdmin && !client?.multiTenancyDisabled && (_jsxs("div", { style: {
|
|
1198
1413
|
display: 'flex',
|
|
1199
1414
|
flexDirection: 'column',
|
|
1200
1415
|
gap: 12,
|
|
@@ -1224,7 +1439,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
1224
1439
|
}, disabled: formData.name === '' ||
|
|
1225
1440
|
formData.dashboardName === '' ||
|
|
1226
1441
|
formData.chartType === '' ||
|
|
1227
|
-
filterIssues.length !== 0
|
|
1442
|
+
filterIssues.length !== 0 ||
|
|
1443
|
+
Object.values(validFilter).includes(false), label: buttonLabel
|
|
1228
1444
|
? buttonLabel
|
|
1229
1445
|
: report
|
|
1230
1446
|
? 'Save changes'
|