@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/cjs/ChartBuilder.js
CHANGED
|
@@ -14,20 +14,23 @@ const Context_1 = require("./Context");
|
|
|
14
14
|
const dataFetcher_1 = require("./utils/dataFetcher");
|
|
15
15
|
const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
|
|
16
16
|
const PivotList_1 = require("./internals/ReportBuilder/PivotList");
|
|
17
|
-
const Chart_1 = require("./Chart");
|
|
18
17
|
const UiComponents_1 = require("./components/UiComponents");
|
|
19
18
|
const textProcessing_1 = require("./utils/textProcessing");
|
|
20
19
|
const QuillSelect_1 = require("./components/QuillSelect");
|
|
20
|
+
const Report_1 = require("./models/Report");
|
|
21
21
|
const QuillCard_1 = require("./components/QuillCard");
|
|
22
22
|
const valueFormatter_1 = require("./utils/valueFormatter");
|
|
23
23
|
const columnProcessing_1 = require("./utils/columnProcessing");
|
|
24
24
|
const astProcessing_1 = require("./utils/astProcessing");
|
|
25
|
-
const dates_1 = require("./utils/dates");
|
|
26
25
|
const validation_1 = require("./utils/validation");
|
|
27
26
|
const ChartError_1 = require("./components/Chart/ChartError");
|
|
28
27
|
const report_1 = require("./utils/report");
|
|
29
|
-
const AdjustmentsIcon_1 = __importDefault(require("./assets/AdjustmentsIcon"));
|
|
30
28
|
const merge_1 = require("./utils/merge");
|
|
29
|
+
const assets_1 = require("./assets");
|
|
30
|
+
const InternalChart_1 = __importDefault(require("./components/Chart/InternalChart"));
|
|
31
|
+
const paginationProcessing_1 = require("./utils/paginationProcessing");
|
|
32
|
+
const tableProcessing_1 = require("./utils/tableProcessing");
|
|
33
|
+
const dates_1 = require("./utils/dates");
|
|
31
34
|
const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
|
|
32
35
|
const CHART_TO_LABELS = {
|
|
33
36
|
column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
@@ -74,7 +77,6 @@ function createInitialFormData(columns) {
|
|
|
74
77
|
xAxisLabel: '',
|
|
75
78
|
chartType: firstNumberColumn ? 'line' : 'table',
|
|
76
79
|
pivot: null,
|
|
77
|
-
dateField: { table: '', field: '' },
|
|
78
80
|
template: true,
|
|
79
81
|
};
|
|
80
82
|
return formEmptyState;
|
|
@@ -117,9 +119,9 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
|
|
|
117
119
|
...formData,
|
|
118
120
|
dashboardName: formData.dashboardName || '',
|
|
119
121
|
pivot: formData.pivot,
|
|
120
|
-
id:
|
|
122
|
+
id: report?.id ?? Report_1.TEMP_REPORT_ID,
|
|
121
123
|
order: -1,
|
|
122
|
-
compareRows: report?.compareRows
|
|
124
|
+
compareRows: report?.compareRows,
|
|
123
125
|
filtersApplied: report?.filtersApplied || [],
|
|
124
126
|
queryString: '',
|
|
125
127
|
rows: rows,
|
|
@@ -201,6 +203,7 @@ function ChartBuilderWithModal(props) {
|
|
|
201
203
|
const [modalHeight, setModalHeight] = (0, react_1.useState)(200);
|
|
202
204
|
const { isOpen, setIsOpen, title, isHorizontalView } = props;
|
|
203
205
|
const Modal = props.ModalComponent ?? UiComponents_1.MemoizedModal;
|
|
206
|
+
const [dashboard] = (0, react_1.useContext)(Context_1.DashboardContext);
|
|
204
207
|
(0, react_1.useEffect)(() => {
|
|
205
208
|
function handleResize() {
|
|
206
209
|
const screenSize = window.innerWidth;
|
|
@@ -221,7 +224,7 @@ function ChartBuilderWithModal(props) {
|
|
|
221
224
|
return ((0, jsx_runtime_1.jsx)("div", { style: { height: '100%' }, ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
222
225
|
// For isHorizontalView, use full viewport size minus 80px for padding,
|
|
223
226
|
// otherwise use the default layout method of the modal (contents).
|
|
224
|
-
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }) }));
|
|
227
|
+
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: dashboard[props.reportId ?? Report_1.TEMP_REPORT_ID] ? ((0, jsx_runtime_1.jsx)(ChartBuilder, { ...props })) : ((0, jsx_runtime_1.jsx)("div", { style: { padding: 20 }, children: (0, jsx_runtime_1.jsx)(UiComponents_1.QuillLoadingComponent, {}) })) }) }));
|
|
225
228
|
}
|
|
226
229
|
/**
|
|
227
230
|
* ### Quill Chart Builder
|
|
@@ -247,45 +250,32 @@ function ChartBuilderWithModal(props) {
|
|
|
247
250
|
* ### Chart Builder API
|
|
248
251
|
* @see https://docs.quillsql.com/components/chart-builder
|
|
249
252
|
*/
|
|
250
|
-
function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent = UiComponents_1.MemoizedModal, LoadingComponent = UiComponents_1.QuillLoadingComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.QuillChartBuilderFormContainer, ErrorComponent = ChartError_1.QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true,
|
|
253
|
+
function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent = UiComponents_1.MemoizedModal, LoadingComponent = UiComponents_1.QuillLoadingComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.QuillChartBuilderFormContainer, ErrorComponent = ChartError_1.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,
|
|
254
|
+
// isLoading,
|
|
255
|
+
onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
251
256
|
const [client] = (0, react_1.useContext)(Context_1.ClientContext);
|
|
252
257
|
const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
|
|
253
258
|
const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
|
|
259
|
+
const [dashboard, dispatch] = (0, react_1.useContext)(Context_1.DashboardContext);
|
|
260
|
+
const { dashboardConfig } = (0, react_1.useContext)(Context_1.DashboardConfigContext);
|
|
261
|
+
const report = (0, react_1.useMemo)(() => {
|
|
262
|
+
return dashboard[Report_1.TEMP_REPORT_ID] ?? dashboard[reportId ?? Report_1.TEMP_REPORT_ID];
|
|
263
|
+
}, [reportId]);
|
|
254
264
|
const [windowWidth, setWindowWidth] = (0, react_1.useState)(1200);
|
|
265
|
+
const [rows, setRows] = (0, react_1.useState)(report?.rows ?? []);
|
|
266
|
+
const [itemQuery, setItemQuery] = (0, react_1.useState)(report?.itemQuery);
|
|
267
|
+
const [rowCount, setRowCount] = (0, react_1.useState)(report?.rowCount ?? 0);
|
|
268
|
+
const [maxPage, setMaxPage] = (0, react_1.useState)(0);
|
|
269
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(false);
|
|
270
|
+
const [rowCountIsLoading, setRowCountIsLoading] = (0, react_1.useState)(false);
|
|
255
271
|
const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
|
|
256
272
|
const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(665);
|
|
257
273
|
const [formWidth, setFormWidth] = (0, react_1.useState)(665);
|
|
258
274
|
const inputRef = (0, react_1.useRef)(null);
|
|
259
275
|
const selectRef = (0, react_1.useRef)(null);
|
|
260
|
-
const
|
|
261
|
-
const [processedColumns, setProcessedColumns] = (0, react_1.useState)(columns);
|
|
262
|
-
const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
|
|
263
|
-
const parentRef = (0, react_1.useRef)(null);
|
|
264
|
-
const deleteRef = (0, react_1.useRef)(null);
|
|
265
|
-
const modalPadding = 20;
|
|
266
|
-
const deleteButtonMargin = -12;
|
|
267
|
-
// Note: Commenting out for now because it was auto-focusing on table page changes
|
|
268
|
-
// If the TextInputComponent is a forwardRef it will have a $$typeof property
|
|
269
|
-
// So we only want to pass the ref if the TextInputComponent is a forwardRef
|
|
270
|
-
// const autofocusRefProp =
|
|
271
|
-
// '$$typeof' in TextInputComponent
|
|
272
|
-
// ? {
|
|
273
|
-
// ref: (input: HTMLInputElement) =>
|
|
274
|
-
// formData.name === '' && !showPivotPopover && input?.focus(),
|
|
275
|
-
// }
|
|
276
|
-
// : {};
|
|
277
|
-
const validationHelper = (formData, dashboard, dateField, tables) => {
|
|
278
|
-
const issues = (0, validation_1.validateReport)(formData, dashboard, dateField || defaultDateField, tables || allTables);
|
|
279
|
-
if (issues.length > 0) {
|
|
280
|
-
setFilterIssues(issues);
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
setFilterIssues([]);
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
(0, react_1.useEffect)(() => {
|
|
276
|
+
const processColumns = (columns) => {
|
|
287
277
|
if (schemaData.schema) {
|
|
288
|
-
const newProcessedColumns = columns
|
|
278
|
+
const newProcessedColumns = columns?.map((col) => {
|
|
289
279
|
if (col.jsType) {
|
|
290
280
|
return col;
|
|
291
281
|
}
|
|
@@ -306,47 +296,39 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
306
296
|
newCol.jsType = (0, columnProcessing_1.convertFieldTypeToJSType)(foundColumn.fieldType);
|
|
307
297
|
return newCol;
|
|
308
298
|
});
|
|
309
|
-
|
|
299
|
+
return newProcessedColumns;
|
|
310
300
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
},
|
|
320
|
-
(0, react_1.
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
setPivotCardWidth(width);
|
|
333
|
-
// Calculate the form width by adding the width of the delete button
|
|
334
|
-
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
335
|
-
const deleteWidth = deleteSize?.width ?? 0;
|
|
336
|
-
setFormWidth(width + deleteWidth);
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
handleResize();
|
|
340
|
-
}, [isOpen]);
|
|
301
|
+
return columns;
|
|
302
|
+
};
|
|
303
|
+
const [processedColumns, setProcessedColumns] = (0, react_1.useState)(processColumns(report?.columnInternal ?? []));
|
|
304
|
+
const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
|
|
305
|
+
const parentRef = (0, react_1.useRef)(null);
|
|
306
|
+
const deleteRef = (0, react_1.useRef)(null);
|
|
307
|
+
const modalPadding = 20;
|
|
308
|
+
const deleteButtonMargin = -12;
|
|
309
|
+
const { dashboardFilters } = (0, react_1.useContext)(Context_1.DashboardFiltersContext);
|
|
310
|
+
const specificDashboardFilters = (0, react_1.useMemo)(() => {
|
|
311
|
+
return Object.values(dashboardFilters[report?.dashboardName ?? ''] ?? {}).map((f) => f.filter);
|
|
312
|
+
}, [dashboard.filters, report?.dashboardName]);
|
|
313
|
+
const validationHelper = (formData, dashboard, dateField, tables) => {
|
|
314
|
+
const issues = (0, validation_1.validateReport)(formData, dashboard, dateField || defaultDateField, tables || allTables);
|
|
315
|
+
if (issues.length > 0) {
|
|
316
|
+
setFilterIssues(issues);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
setFilterIssues([]);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
341
322
|
(0, react_1.useEffect)(() => {
|
|
342
323
|
const handleResize = () => {
|
|
324
|
+
setWindowWidth(window.innerWidth);
|
|
343
325
|
// The pivot card should be the same width as the row of inputs
|
|
344
326
|
// above it (an input, two selects, plus the gaps between them).
|
|
345
327
|
if (inputRef.current && selectRef.current) {
|
|
346
328
|
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
347
329
|
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
348
330
|
const selectWidth = selectSize.width;
|
|
349
|
-
const showDash = showDashboardDropdown && !
|
|
331
|
+
const showDash = showDashboardDropdown && !report?.dashboardName;
|
|
350
332
|
const spaceBetween = selectSize.left - inputSize.right;
|
|
351
333
|
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
352
334
|
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
@@ -362,15 +344,35 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
362
344
|
return () => {
|
|
363
345
|
window.removeEventListener('resize', handleResize);
|
|
364
346
|
};
|
|
365
|
-
}, []);
|
|
347
|
+
}, [isOpen]);
|
|
366
348
|
const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
|
|
367
|
-
const
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
349
|
+
const { reportFilters, reportFiltersDispatch, loadFiltersForReport } = (0, react_1.useContext)(Context_1.ReportFiltersContext);
|
|
350
|
+
(0, react_1.useEffect)(() => {
|
|
351
|
+
loadFiltersForReport(report?.id ?? Report_1.TEMP_REPORT_ID, 'ChartBuilder', specificDashboardFilters, undefined, undefined, canonicalFilterMap, report?.dashboardName);
|
|
352
|
+
return () => {
|
|
353
|
+
reportFiltersDispatch({
|
|
354
|
+
type: 'CLEAR_REPORT_FILTERS',
|
|
355
|
+
id: report?.id ?? Report_1.TEMP_REPORT_ID,
|
|
356
|
+
});
|
|
357
|
+
// TODO: Currently the behavior of Chart Builder is dependent on whether there is a TEMP_REPORT_ID in context or not
|
|
358
|
+
/* The Chart Builder can essentially be in three states
|
|
359
|
+
1. Creating a new report, all we have is an ephemeral temp report
|
|
360
|
+
2. Editing an existing report, we have a report id and the report is in the dashboard context
|
|
361
|
+
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
|
|
362
|
+
One can imagine this going wrong: somehow the temp report gets set by SQLEditor or ReportBuilder but never cleared
|
|
363
|
+
and now its going to start popping up during state 2 rather than the real report.
|
|
364
|
+
For now we're going on faith that unmounting will always clear the temp report
|
|
365
|
+
but we may want to fiddle with the props to make this more robust
|
|
366
|
+
*/
|
|
367
|
+
dispatch({
|
|
368
|
+
type: 'REMOVE_DASHBOARD_ITEM',
|
|
369
|
+
id: Report_1.TEMP_REPORT_ID,
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
}, []);
|
|
373
|
+
const currentDashboardFilters = (0, react_1.useMemo)(() => {
|
|
374
|
+
return Object.values(reportFilters[report?.id ?? Report_1.TEMP_REPORT_ID] ?? {}).map((f) => f.filter);
|
|
375
|
+
}, [reportFilters, report?.id]);
|
|
374
376
|
const [showFilterModal, setShowFilterModal] = (0, react_1.useState)(false);
|
|
375
377
|
const [filterIssues, setFilterIssues] = (0, react_1.useState)([]);
|
|
376
378
|
const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
|
|
@@ -381,38 +383,72 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
381
383
|
const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
|
|
382
384
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
383
385
|
const [pivotError, setPivotError] = (0, react_1.useState)(undefined);
|
|
386
|
+
const pivotData = report?.pivotRows && report?.pivotColumns
|
|
387
|
+
? { rows: report.pivotRows, columns: report.pivotColumns }
|
|
388
|
+
: undefined;
|
|
389
|
+
const columns = report?.columnInternal ?? [];
|
|
390
|
+
const destinationDashboard = report?.dashboardName;
|
|
391
|
+
const query = report?.queryString;
|
|
384
392
|
const [loadingFormData, setLoadingFormData] = (0, react_1.useState)(false);
|
|
385
393
|
const [triggeredEditChart, setTriggeredEditChart] = (0, react_1.useState)(false);
|
|
386
|
-
const [createdPivots, setCreatedPivots] = (0, react_1.useState)(
|
|
394
|
+
const [createdPivots, setCreatedPivots] = (0, react_1.useState)(report?.pivot ? [report.pivot] : cp);
|
|
387
395
|
const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)(rp);
|
|
388
|
-
const [pivotRowField, setPivotRowField] = (0, react_1.useState)(pivot?.rowField);
|
|
389
|
-
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(pivot?.columnField);
|
|
390
|
-
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(pivot?.valueField);
|
|
391
|
-
const [pivotValueField2, setPivotValueField2] = (0, react_1.useState)(pivot?.valueField2);
|
|
392
|
-
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(pivot?.aggregationType);
|
|
396
|
+
const [pivotRowField, setPivotRowField] = (0, react_1.useState)(report?.pivot?.rowField);
|
|
397
|
+
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(report?.pivot?.columnField);
|
|
398
|
+
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(report?.pivot?.valueField);
|
|
399
|
+
const [pivotValueField2, setPivotValueField2] = (0, react_1.useState)(report?.pivot?.valueField2);
|
|
400
|
+
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(report?.pivot?.aggregationType);
|
|
401
|
+
const baseProcessing = {
|
|
402
|
+
page: report?.pagination ?? {
|
|
403
|
+
page: 0,
|
|
404
|
+
rowsPerPage: 10,
|
|
405
|
+
rowsPerRequest: report?.chartType === 'table' ? 50 : 500,
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)(baseProcessing);
|
|
393
409
|
// initial state is the fields array passed in, but can eventually be changed to be the pivot fields
|
|
394
410
|
const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
|
|
395
411
|
const [allTables, setAllTables] = (0, react_1.useState)([]);
|
|
396
412
|
const [customFieldTableRef, setCustomFieldTableRef] = (0, react_1.useState)(false);
|
|
397
413
|
const [referencedColumns, setReferencedColumns] = (0, react_1.useState)({});
|
|
414
|
+
const [filterMap, setFilterMap] = (0, react_1.useState)(report?.filterMap ?? {});
|
|
415
|
+
const canonicalFilterMap = (0, react_1.useMemo)(() => {
|
|
416
|
+
return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
|
|
417
|
+
}, [filterMap]);
|
|
418
|
+
const validFilter = (0, react_1.useMemo)(() => {
|
|
419
|
+
return currentDashboardFilters.reduce((acc, filter) => {
|
|
420
|
+
if (filter.filterType === 'date_range') {
|
|
421
|
+
acc[filter.label] = true;
|
|
422
|
+
return acc;
|
|
423
|
+
}
|
|
424
|
+
acc[filter.label] =
|
|
425
|
+
!!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
|
|
426
|
+
!!schemaData.schema
|
|
427
|
+
?.find((table) => {
|
|
428
|
+
return (table.displayName === (filterMap[filter.label] ?? filter).table);
|
|
429
|
+
})
|
|
430
|
+
?.columns.find((col) => col.field === (filterMap[filter.label] ?? filter).field);
|
|
431
|
+
return acc;
|
|
432
|
+
}, {});
|
|
433
|
+
}, [currentDashboardFilters, filterMap, allTables]);
|
|
398
434
|
const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
|
|
399
435
|
table: dateFieldOptions[0]?.name || '',
|
|
400
436
|
field: dateFieldOptions[0]?.columns[0]?.field || '',
|
|
401
437
|
});
|
|
402
|
-
const firstNumberColumn =
|
|
438
|
+
const firstNumberColumn = report?.columnInternal?.find((col) => exports.numberFormatOptions.includes(col.format));
|
|
403
439
|
const formEmptyState = {
|
|
404
440
|
name: report?.name ?? '',
|
|
405
|
-
dashboardName: dashboardOptions[0]?.label
|
|
406
|
-
columns: columns.map((col) => {
|
|
441
|
+
dashboardName: dashboardOptions[0]?.label ?? '',
|
|
442
|
+
columns: report?.columns.map((col) => {
|
|
407
443
|
return { ...col, label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(col.label) };
|
|
408
|
-
}),
|
|
409
|
-
xAxisField: columns?.[0]?.field
|
|
410
|
-
xAxisFormat: columns?.[0]?.format
|
|
444
|
+
}) ?? [],
|
|
445
|
+
xAxisField: report?.columns?.[0]?.field ?? '',
|
|
446
|
+
xAxisFormat: report?.columns?.[0]?.format ?? 'string',
|
|
411
447
|
yAxisFields: [
|
|
412
448
|
{
|
|
413
|
-
field: firstNumberColumn?.field
|
|
449
|
+
field: firstNumberColumn?.field ?? report?.columns?.[0]?.field ?? '',
|
|
414
450
|
label: '',
|
|
415
|
-
format: firstNumberColumn?.format
|
|
451
|
+
format: firstNumberColumn?.format ?? report?.columns?.[0]?.format ?? 'string',
|
|
416
452
|
},
|
|
417
453
|
],
|
|
418
454
|
xAxisLabel: '',
|
|
@@ -471,7 +507,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
471
507
|
xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
|
|
472
508
|
xAxisFormat: (0, PivotModal_1.isDateField)(pivot.rowFieldType || '')
|
|
473
509
|
? 'string'
|
|
474
|
-
: columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
510
|
+
: report?.columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
475
511
|
report?.xAxisFormat ||
|
|
476
512
|
'whole_number',
|
|
477
513
|
xAxisLabel: report?.xAxisLabel || pivot.rowField,
|
|
@@ -484,8 +520,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
484
520
|
: report?.yAxisFields && report?.yAxisFields?.length > 0
|
|
485
521
|
? // @ts-ignore
|
|
486
522
|
report?.yAxisFields[0].format
|
|
487
|
-
: columns.find((col) => col.field === pivot.valueField)
|
|
488
|
-
'whole_number',
|
|
523
|
+
: report?.columns.find((col) => col.field === pivot.valueField)
|
|
524
|
+
?.format || 'whole_number',
|
|
489
525
|
},
|
|
490
526
|
],
|
|
491
527
|
};
|
|
@@ -493,8 +529,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
493
529
|
const formFormDataFromReport = (report) => {
|
|
494
530
|
let pivotData = {};
|
|
495
531
|
let dateField = defaultDateField;
|
|
496
|
-
if (pivot) {
|
|
497
|
-
pivotData = pivotFormData(pivot);
|
|
532
|
+
if (report?.pivot) {
|
|
533
|
+
pivotData = pivotFormData(report.pivot);
|
|
498
534
|
}
|
|
499
535
|
if (report) {
|
|
500
536
|
dateField = report.dateField || defaultDateField;
|
|
@@ -503,7 +539,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
503
539
|
...formEmptyState,
|
|
504
540
|
...report,
|
|
505
541
|
...pivotData,
|
|
506
|
-
...(
|
|
542
|
+
...(report?.dashboardName && { dashboardName: report?.dashboardName }),
|
|
507
543
|
dateField: dateField,
|
|
508
544
|
};
|
|
509
545
|
};
|
|
@@ -512,7 +548,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
512
548
|
if (!rows || !rows.length) {
|
|
513
549
|
return [];
|
|
514
550
|
}
|
|
515
|
-
if (pivot || pivotData) {
|
|
551
|
+
if (report?.pivot || pivotData) {
|
|
516
552
|
return [];
|
|
517
553
|
}
|
|
518
554
|
const columnsObservedInRows = rows[0] ? Object.keys(rows[0]) : [];
|
|
@@ -561,8 +597,6 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
561
597
|
const curDashboard = await updateDashboardFilters(dashboardName);
|
|
562
598
|
setDashboardOptions(dashboardOptions);
|
|
563
599
|
curFormData.dashboardName = dashboardName;
|
|
564
|
-
setDefaultDashboardName(dashboardName ??
|
|
565
|
-
(report ? report?.dashboardName : dashboardOptions[0]?.label));
|
|
566
600
|
const curSchemaData = schemaData.schema;
|
|
567
601
|
if (!query) {
|
|
568
602
|
setLoadingFormData(false);
|
|
@@ -623,34 +657,49 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
623
657
|
}
|
|
624
658
|
getFormData();
|
|
625
659
|
}, []);
|
|
626
|
-
const [selectedPivotTable, setSelectedPivotTable] = (0, react_1.useState)(pivotData
|
|
660
|
+
const [selectedPivotTable, setSelectedPivotTable] = (0, react_1.useState)(pivotData);
|
|
661
|
+
const pivotCardTable = (0, react_1.useMemo)(() => {
|
|
662
|
+
return {
|
|
663
|
+
pivot: formData.pivot,
|
|
664
|
+
rows: selectedPivotTable?.rows ?? [],
|
|
665
|
+
columns: selectedPivotTable?.columns ?? [],
|
|
666
|
+
};
|
|
667
|
+
}, [selectedPivotTable, formData.pivot]);
|
|
627
668
|
const chartData = (0, react_1.useMemo)(() => {
|
|
628
|
-
const data = createReportFromForm(formData, report, selectedPivotTable, rows,
|
|
629
|
-
return
|
|
669
|
+
const data = createReportFromForm(formData, report, selectedPivotTable, rows, currentDashboardFilters);
|
|
670
|
+
return {
|
|
671
|
+
...data,
|
|
672
|
+
filterMap: canonicalFilterMap,
|
|
673
|
+
};
|
|
630
674
|
}, [formData, selectedPivotTable, report, rows]);
|
|
631
|
-
const fetchPivotData = async (pivot, uniqueValues,
|
|
675
|
+
const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
|
|
676
|
+
const dashboardFilters = filtersEnabled
|
|
677
|
+
? (overrideFilters ?? currentDashboardFilters)
|
|
678
|
+
: undefined;
|
|
632
679
|
if (pivot) {
|
|
633
|
-
// const dateFilter =
|
|
634
|
-
// report && filtersActive
|
|
635
|
-
// ? report.filtersApplied.find((filter: any) => {
|
|
636
|
-
// return filter.filterType === 'date_range';
|
|
637
|
-
// })
|
|
638
|
-
// : undefined;
|
|
639
680
|
let dateBucket = undefined;
|
|
640
|
-
if (
|
|
641
|
-
|
|
681
|
+
if (filtersEnabled) {
|
|
682
|
+
const dateFilter = dashboardFilters?.find((f) => f.filterType === 'date_range');
|
|
683
|
+
dateBucket =
|
|
684
|
+
dateFilter?.startDate && dateFilter?.endDate
|
|
685
|
+
? (0, dates_1.getDateBucketFromRange)({
|
|
686
|
+
start: dateFilter?.startDate,
|
|
687
|
+
end: dateFilter?.endDate,
|
|
688
|
+
})
|
|
689
|
+
: undefined;
|
|
642
690
|
}
|
|
643
691
|
try {
|
|
644
692
|
const pivotTable = await (0, PivotModal_1.generatePivotTable)({
|
|
645
693
|
pivot,
|
|
646
694
|
dateBucket,
|
|
647
|
-
report,
|
|
695
|
+
report: { ...report, ...(tableInfo ?? { itemQuery }) },
|
|
648
696
|
client,
|
|
649
697
|
uniqueValues,
|
|
650
698
|
});
|
|
651
699
|
setSelectedPivotTable(pivotTable);
|
|
652
700
|
}
|
|
653
701
|
catch (e) {
|
|
702
|
+
console.log('error', e);
|
|
654
703
|
if (e instanceof Error) {
|
|
655
704
|
setPivotError(e.message);
|
|
656
705
|
}
|
|
@@ -707,6 +756,129 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
707
756
|
rows,
|
|
708
757
|
formData.pivot,
|
|
709
758
|
]);
|
|
759
|
+
const fetchRowCount = async (processing, overrideFilters) => {
|
|
760
|
+
if (!client || !query) {
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
setRowCountIsLoading(true);
|
|
764
|
+
const tableInfo = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, false, true, canonicalFilterMap);
|
|
765
|
+
if (tableInfo.rowCount) {
|
|
766
|
+
setRowCount(tableInfo.rowCount);
|
|
767
|
+
}
|
|
768
|
+
setRowCountIsLoading(false);
|
|
769
|
+
};
|
|
770
|
+
const onDashboardFilterChange = (label, value) => {
|
|
771
|
+
const updatedFilters = currentDashboardFilters.map((filter) => {
|
|
772
|
+
if (filter.label === label) {
|
|
773
|
+
return {
|
|
774
|
+
...filter,
|
|
775
|
+
...value,
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
return filter;
|
|
779
|
+
});
|
|
780
|
+
loadFiltersForReport(report?.id ?? Report_1.TEMP_REPORT_ID, 'ChartBuilder', updatedFilters, label, undefined, canonicalFilterMap, report?.dashboardName).then(() => {
|
|
781
|
+
setCurrentPage(0);
|
|
782
|
+
setMaxPage(0);
|
|
783
|
+
handleRunQuery(baseProcessing, updatedFilters);
|
|
784
|
+
});
|
|
785
|
+
};
|
|
786
|
+
const mounted = (0, react_1.useRef)(false);
|
|
787
|
+
(0, react_1.useEffect)(() => {
|
|
788
|
+
if (!mounted.current) {
|
|
789
|
+
mounted.current = true;
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
setCurrentPage(0);
|
|
793
|
+
setMaxPage(0);
|
|
794
|
+
handleRunQuery(baseProcessing, currentDashboardFilters);
|
|
795
|
+
}, [filtersEnabled]);
|
|
796
|
+
const handleRunQuery = async (processing, overrideFilters) => {
|
|
797
|
+
if (!client || !query) {
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
try {
|
|
801
|
+
setIsLoading(true);
|
|
802
|
+
const tableInfo = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, processing, schemaData.customFields, filtersEnabled ? overrideFilters : undefined, filtersEnabled ? (report?.dateField ?? formData.dateField) : undefined, true, false, canonicalFilterMap);
|
|
803
|
+
setCurrentProcessing(processing);
|
|
804
|
+
setRows(tableInfo.rows);
|
|
805
|
+
setProcessedColumns(processColumns(tableInfo.columns));
|
|
806
|
+
setItemQuery(tableInfo.itemQuery);
|
|
807
|
+
fetchRowCount(processing, overrideFilters);
|
|
808
|
+
if (formData.pivot) {
|
|
809
|
+
try {
|
|
810
|
+
const uniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, schemaData.customFields ?? [], overrideFilters);
|
|
811
|
+
fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
|
|
812
|
+
}
|
|
813
|
+
catch (e) {
|
|
814
|
+
console.log('error fetching pivot', e);
|
|
815
|
+
setPivotError(e.message);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
setIsLoading(false);
|
|
819
|
+
}
|
|
820
|
+
catch (e) {
|
|
821
|
+
console.log(e);
|
|
822
|
+
}
|
|
823
|
+
};
|
|
824
|
+
const onPageChange = (page) => {
|
|
825
|
+
// only fetch if report is valid, else use query task
|
|
826
|
+
if (currentProcessing.page &&
|
|
827
|
+
(0, paginationProcessing_1.shouldFetchMore)(currentProcessing.page, page, maxPage)) {
|
|
828
|
+
const newPagination = {
|
|
829
|
+
...currentProcessing.page,
|
|
830
|
+
page,
|
|
831
|
+
};
|
|
832
|
+
const updatedProcessing = {
|
|
833
|
+
...currentProcessing,
|
|
834
|
+
page: newPagination,
|
|
835
|
+
};
|
|
836
|
+
setCurrentProcessing(updatedProcessing);
|
|
837
|
+
updateTableRows(updatedProcessing);
|
|
838
|
+
}
|
|
839
|
+
if (page > maxPage) {
|
|
840
|
+
setMaxPage(page);
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
const onSortChange = (sort) => {
|
|
844
|
+
if ((0, paginationProcessing_1.shouldSortInMemory)(baseProcessing.page, rowCount)) {
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
const updatedProcessing = { ...baseProcessing, sort };
|
|
848
|
+
updateTableRows(updatedProcessing, true);
|
|
849
|
+
setCurrentProcessing(updatedProcessing);
|
|
850
|
+
setCurrentPage(0);
|
|
851
|
+
setMaxPage(0);
|
|
852
|
+
};
|
|
853
|
+
const updateTableRows = async (processing, resetRows = false) => {
|
|
854
|
+
if (!client) {
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
if (!isLoading && report && query) {
|
|
858
|
+
setIsLoading(true);
|
|
859
|
+
try {
|
|
860
|
+
const updatedProcessing = { ...currentProcessing, ...processing };
|
|
861
|
+
const paginatedRows = await (0, tableProcessing_1.fetchResultsByQuery)(query, client, updatedProcessing, schemaData.customFields, filtersEnabled ? currentDashboardFilters : undefined, filtersEnabled
|
|
862
|
+
? (report?.dateField ?? formData.dateField)
|
|
863
|
+
: undefined, false, false, canonicalFilterMap);
|
|
864
|
+
if (paginatedRows.error) {
|
|
865
|
+
throw new Error('Error fetching chart');
|
|
866
|
+
}
|
|
867
|
+
let tempRows = [...rows, ...paginatedRows.rows];
|
|
868
|
+
if (resetRows) {
|
|
869
|
+
tempRows = paginatedRows.rows;
|
|
870
|
+
}
|
|
871
|
+
setRows(tempRows);
|
|
872
|
+
setCurrentProcessing(updatedProcessing);
|
|
873
|
+
}
|
|
874
|
+
catch (e) {
|
|
875
|
+
console.log(e);
|
|
876
|
+
}
|
|
877
|
+
finally {
|
|
878
|
+
setIsLoading(false);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
};
|
|
710
882
|
const handleChange = async (value, fieldName, index) => {
|
|
711
883
|
let updatedForm = { ...formData };
|
|
712
884
|
try {
|
|
@@ -764,7 +936,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
764
936
|
}
|
|
765
937
|
else if (field === 'dateField' &&
|
|
766
938
|
subfield === 'table' &&
|
|
767
|
-
!formData.dateField
|
|
939
|
+
!formData.dateField?.field) {
|
|
768
940
|
const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
|
|
769
941
|
updatedForm.dateField = {
|
|
770
942
|
// @ts-ignore
|
|
@@ -795,7 +967,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
795
967
|
}
|
|
796
968
|
setFormData(updatedForm);
|
|
797
969
|
};
|
|
798
|
-
const handleAddPivot = async (pivot, uniqueValues,
|
|
970
|
+
const handleAddPivot = async (pivot, uniqueValues, pivotData) => {
|
|
799
971
|
const newPivotFormData = pivotFormData(pivot);
|
|
800
972
|
// Only keep the old chart type if the shapes of the pivots are the same
|
|
801
973
|
// since the valid chart types for some pivots might have changed (eg. going
|
|
@@ -812,7 +984,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
812
984
|
});
|
|
813
985
|
}
|
|
814
986
|
else {
|
|
815
|
-
await fetchPivotData(pivot,
|
|
987
|
+
await fetchPivotData(pivot, undefined, uniqueValues);
|
|
816
988
|
}
|
|
817
989
|
setFormData((formData) => ({
|
|
818
990
|
...formData,
|
|
@@ -828,6 +1000,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
828
1000
|
}
|
|
829
1001
|
setFormData({
|
|
830
1002
|
...formEmptyState,
|
|
1003
|
+
...formData,
|
|
831
1004
|
dashboardName: formData.dashboardName,
|
|
832
1005
|
pivot: null,
|
|
833
1006
|
});
|
|
@@ -903,26 +1076,25 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
903
1076
|
return;
|
|
904
1077
|
}
|
|
905
1078
|
// If the dashboardItem is a template but the editor isn't an admin, create a new dashboardItem and set the template to false
|
|
906
|
-
let dashboardItemId =
|
|
1079
|
+
let dashboardItemId = reportId ? reportId : undefined;
|
|
907
1080
|
if (report && !isAdmin && formData.template) {
|
|
908
1081
|
dashboardItemId = undefined;
|
|
909
1082
|
}
|
|
910
1083
|
const newReport = {
|
|
911
1084
|
...formData,
|
|
1085
|
+
filterMap,
|
|
912
1086
|
columns: formData.columns.filter((col) => !invalidColumns.includes(col)),
|
|
913
1087
|
...(formData.dateField?.table
|
|
914
1088
|
? {}
|
|
915
1089
|
: { dateField: { ...defaultDateField } }),
|
|
916
1090
|
...(formData.dashboardName
|
|
917
1091
|
? {}
|
|
918
|
-
: { dashboardName:
|
|
919
|
-
query: queryNoDateColumn ||
|
|
1092
|
+
: { dashboardName: report?.dashboardName }),
|
|
1093
|
+
query: queryNoDateColumn || report?.queryString || '',
|
|
920
1094
|
pivot: formData.pivot,
|
|
921
1095
|
referencedTables: allTables,
|
|
922
1096
|
referencedColumns,
|
|
923
|
-
template: report && !
|
|
924
|
-
? false
|
|
925
|
-
: formData.template,
|
|
1097
|
+
template: report && !isAdmin && formData.template ? false : formData.template,
|
|
926
1098
|
};
|
|
927
1099
|
const resp = await (0, report_1.saveReport)({
|
|
928
1100
|
report: newReport,
|
|
@@ -958,7 +1130,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
958
1130
|
// Prevent horizontal view on small screens.
|
|
959
1131
|
isHorizontalView = windowWidth < 1200 ? false : isHorizontalView;
|
|
960
1132
|
if (!schemaData.schema) {
|
|
961
|
-
return (0, jsx_runtime_1.jsx)("div", { children: "
|
|
1133
|
+
return (0, jsx_runtime_1.jsx)("div", { children: "No schema" });
|
|
962
1134
|
}
|
|
963
1135
|
return ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
964
1136
|
width: '100%',
|
|
@@ -979,70 +1151,45 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
979
1151
|
display: 'flex',
|
|
980
1152
|
flexDirection: 'column',
|
|
981
1153
|
gap: isOpen ? 16 : 20,
|
|
982
|
-
overflowY: '
|
|
1154
|
+
overflowY: 'scroll',
|
|
983
1155
|
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
984
1156
|
...(isHorizontalView && {
|
|
985
1157
|
flexGrow: 1,
|
|
986
1158
|
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
987
1159
|
}),
|
|
988
1160
|
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
989
|
-
}, children: [
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
flexDirection: 'row',
|
|
993
|
-
gap: 4,
|
|
994
|
-
marginTop: -16,
|
|
995
|
-
userSelect: 'none',
|
|
996
|
-
}, onClick: () => {
|
|
997
|
-
onFilterPreviewChange && onFilterPreviewChange(!filtersActive);
|
|
998
|
-
setCurrentPage(0);
|
|
999
|
-
setFiltersActive(!filtersActive);
|
|
1000
|
-
}, children: [(0, jsx_runtime_1.jsx)(AdjustmentsIcon_1.default, { style: {
|
|
1001
|
-
color: filtersActive ? '#212121' : '#9e9e9e',
|
|
1002
|
-
height: 20,
|
|
1003
|
-
width: 20,
|
|
1004
|
-
}, strokeWidth: filtersActive ? 1.5 : 1 }), (0, jsx_runtime_1.jsx)("div", { style: {
|
|
1005
|
-
color: filtersActive ? '#212121' : '#9e9e9e',
|
|
1006
|
-
fontSize: 14,
|
|
1007
|
-
fontWeight: 300,
|
|
1008
|
-
userSelect: 'none',
|
|
1009
|
-
}, children: filtersActive
|
|
1010
|
-
? 'Previewing with filters'
|
|
1011
|
-
: 'Previewing without filters' })] })), !isEditingMode && (report?.adminError || report?.error) ? ((0, jsx_runtime_1.jsx)(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : (((!isHorizontalView && windowWidth >= 1200) ||
|
|
1012
|
-
formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.ChartDisplay, { reportId: report?.id, config: chartData, scrollable: true, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
1161
|
+
}, children: [!isEditingMode && (report?.adminError || report?.error) ? ((0, jsx_runtime_1.jsx)(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth < 1200)) && ((0, jsx_runtime_1.jsx)(InternalChart_1.default, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
1162
|
+
onFiltersEnabledChanged(hide);
|
|
1163
|
+
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1013
1164
|
width: '100%',
|
|
1014
|
-
height:
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
? `calc(50% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
|
|
1019
|
-
: `calc(100% - ${isOpen && onFilterPreviewChange ? '30' : '10'}px)`
|
|
1020
|
-
: 400,
|
|
1165
|
+
// height:
|
|
1166
|
+
// formData.chartType === 'metric'
|
|
1167
|
+
// ? 100
|
|
1168
|
+
// : `calc(${filtersEnabled ? 50 : 70}%)`,
|
|
1021
1169
|
...(isHorizontalView && { flexGrow: 1 }),
|
|
1022
|
-
}, onClickChartElement: onClickChartElement }))),
|
|
1170
|
+
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }))),
|
|
1023
1171
|
// Make sure to display non-pivoted table when using pivot chart
|
|
1024
|
-
|
|
1172
|
+
isAdmin &&
|
|
1025
1173
|
(isHorizontalView || (!isOpen && windowWidth < 1200)) && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1026
1174
|
width: '100%',
|
|
1027
|
-
height:
|
|
1028
|
-
|
|
1029
|
-
|
|
1175
|
+
// height:
|
|
1176
|
+
// isHorizontalView || !isOpen
|
|
1177
|
+
// ? `calc(${filtersEnabled ? 30 : 50}%)`
|
|
1178
|
+
// : 400,
|
|
1030
1179
|
flexGrow: 1,
|
|
1031
1180
|
}, children: formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
|
|
1032
|
-
onPageChange
|
|
1033
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1181
|
+
onPageChange(page);
|
|
1034
1182
|
setCurrentPage(page);
|
|
1035
1183
|
}, onSortChange: (sort) => {
|
|
1036
|
-
onSortChange && onSortChange(sort
|
|
1184
|
+
onSortChange && onSortChange(sort);
|
|
1037
1185
|
}, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1038
1186
|
? selectedPivotTable.columns
|
|
1039
1187
|
: formData.columns, onPageChange: (page) => {
|
|
1040
|
-
onPageChange
|
|
1041
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1188
|
+
onPageChange(page);
|
|
1042
1189
|
setCurrentPage(page);
|
|
1043
1190
|
}, onSortChange: (sort) => {
|
|
1044
|
-
onSortChange && onSortChange(sort
|
|
1045
|
-
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1191
|
+
onSortChange && onSortChange(sort);
|
|
1192
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1046
1193
|
display: 'flex',
|
|
1047
1194
|
flexDirection: 'column',
|
|
1048
1195
|
gap: 20,
|
|
@@ -1079,11 +1226,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1079
1226
|
// marginTop: 6,
|
|
1080
1227
|
display: 'flex',
|
|
1081
1228
|
flexDirection: 'column',
|
|
1082
|
-
}, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
|
|
1083
|
-
pivot: formData.pivot,
|
|
1084
|
-
rows: selectedPivotTable?.rows ?? [],
|
|
1085
|
-
columns: selectedPivotTable?.columns ?? [],
|
|
1086
|
-
}, theme: theme, index: 0, onSelectPivot: () => {
|
|
1229
|
+
}, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: pivotCardTable, theme: theme, index: 0, onSelectPivot: () => {
|
|
1087
1230
|
setIsEdittingPivot(true);
|
|
1088
1231
|
setShowPivotPopover(true);
|
|
1089
1232
|
setPivotRowField(formData.pivot?.rowField);
|
|
@@ -1092,7 +1235,13 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1092
1235
|
setPivotValueField2(formData.pivot?.valueField2);
|
|
1093
1236
|
setPivotAggregation(formData.pivot?.aggregationType);
|
|
1094
1237
|
setPivotPopUpTitle('Edit pivot');
|
|
1095
|
-
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [
|
|
1238
|
+
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [windowWidth < 1200 && (0, jsx_runtime_1.jsx)(InternalChart_1.default, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
1239
|
+
onFiltersEnabledChanged(hide);
|
|
1240
|
+
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1241
|
+
width: '100%',
|
|
1242
|
+
height: 500,
|
|
1243
|
+
flexGrow: 1,
|
|
1244
|
+
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange }), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1096
1245
|
display: 'flex',
|
|
1097
1246
|
flexDirection: 'column',
|
|
1098
1247
|
}, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
@@ -1106,11 +1255,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1106
1255
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
1107
1256
|
(0, PivotModal_1.isDateField)(formData.pivot.rowFieldType || '')
|
|
1108
1257
|
? [{ value: 'pivot_date', label: 'date' }]
|
|
1109
|
-
: formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields
|
|
1110
|
-
// .filter((yAxisField: YAxisField) => {
|
|
1111
|
-
// return !yAxisField.field.startsWith('comparison_');
|
|
1112
|
-
// })
|
|
1113
|
-
.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
|
|
1258
|
+
: formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
|
|
1114
1259
|
? formData.pivot.valueField || 'count'
|
|
1115
1260
|
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
1116
1261
|
? [
|
|
@@ -1136,25 +1281,23 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1136
1281
|
: ''
|
|
1137
1282
|
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
1138
1283
|
? NUMBER_OPTIONS
|
|
1139
|
-
: formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })),
|
|
1284
|
+
: formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), isAdmin && windowWidth < 1200 && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1140
1285
|
width: '100%',
|
|
1141
1286
|
height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
|
|
1142
1287
|
flexGrow: 1,
|
|
1143
1288
|
}, children: formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
|
|
1144
|
-
onPageChange
|
|
1145
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1289
|
+
onPageChange(page);
|
|
1146
1290
|
setCurrentPage(page);
|
|
1147
1291
|
}, onSortChange: (sort) => {
|
|
1148
|
-
onSortChange && onSortChange(sort
|
|
1292
|
+
onSortChange && onSortChange(sort);
|
|
1149
1293
|
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1150
1294
|
? selectedPivotTable.columns
|
|
1151
1295
|
: formData.columns, onPageChange: (page) => {
|
|
1152
|
-
onPageChange
|
|
1153
|
-
onPageChange(page, filtersActive, 'ChartBuilder');
|
|
1296
|
+
onPageChange(page);
|
|
1154
1297
|
setCurrentPage(page);
|
|
1155
1298
|
}, onSortChange: (sort) => {
|
|
1156
|
-
onSortChange && onSortChange(sort
|
|
1157
|
-
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })),
|
|
1299
|
+
onSortChange && onSortChange(sort);
|
|
1300
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? formattedRows.length : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), isAdmin && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
|
|
1158
1301
|
display: 'flex',
|
|
1159
1302
|
flexDirection: 'column',
|
|
1160
1303
|
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
@@ -1192,11 +1335,20 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1192
1335
|
(formData.pivot &&
|
|
1193
1336
|
selectedPivotTable &&
|
|
1194
1337
|
selectedPivotTable.columns &&
|
|
1195
|
-
formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })),
|
|
1338
|
+
formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), (specificDashboardFilters.length > 0 ||
|
|
1339
|
+
(isAdmin &&
|
|
1340
|
+
formData.dateField &&
|
|
1341
|
+
dashboardConfig[formData.dashboardName ?? '']?.config
|
|
1342
|
+
.dateFilter?.label)) && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
1196
1343
|
display: 'flex',
|
|
1197
1344
|
flexDirection: 'column',
|
|
1198
1345
|
gap: 6,
|
|
1199
|
-
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "
|
|
1346
|
+
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
|
|
1347
|
+
formData.dateField &&
|
|
1348
|
+
dashboardConfig[formData.dashboardName ?? destinationDashboard ?? '']?.config.dateFilter?.label && ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'filterMap.dateFilter.' +
|
|
1349
|
+
(dashboardConfig[formData.dashboardName ?? '']
|
|
1350
|
+
?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
|
|
1351
|
+
?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
|
|
1200
1352
|
label: elem.name,
|
|
1201
1353
|
value: elem.name,
|
|
1202
1354
|
})), width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Field", value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
|
|
@@ -1204,7 +1356,67 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1204
1356
|
?.columns?.map((elem) => ({
|
|
1205
1357
|
label: elem.field,
|
|
1206
1358
|
value: elem.field,
|
|
1207
|
-
})) || [], width: 200 }) })
|
|
1359
|
+
})) || [], width: 200 }) }), (!formData.dateField?.table ||
|
|
1360
|
+
!formData.dateField?.field) && ((0, jsx_runtime_1.jsx)("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: (0, jsx_runtime_1.jsx)(assets_1.ExclamationFilledIcon, { height: 28, width: 28, style: {
|
|
1361
|
+
color: '#dc143c',
|
|
1362
|
+
} }) }))] })), specificDashboardFilters.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1363
|
+
display: 'flex',
|
|
1364
|
+
flexDirection: 'column',
|
|
1365
|
+
gap: 6,
|
|
1366
|
+
}, children: specificDashboardFilters
|
|
1367
|
+
.filter((f) => {
|
|
1368
|
+
return f.filterType !== 'date_range';
|
|
1369
|
+
})
|
|
1370
|
+
.map((filter, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
|
|
1371
|
+
!(isAdmin &&
|
|
1372
|
+
formData.dateField &&
|
|
1373
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1374
|
+
?.config.dateFilter?.label)
|
|
1375
|
+
? 'Filter'
|
|
1376
|
+
: '', disabled: true }), (0, jsx_runtime_1.jsx)(SelectComponent, { label: index === 0 &&
|
|
1377
|
+
!(isAdmin &&
|
|
1378
|
+
formData.dateField &&
|
|
1379
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1380
|
+
?.config.dateFilter?.label)
|
|
1381
|
+
? 'Virtual Table'
|
|
1382
|
+
: '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
|
|
1383
|
+
...filterMap,
|
|
1384
|
+
[filter.label]: {
|
|
1385
|
+
table: e.target.value,
|
|
1386
|
+
field: schemaData.schema
|
|
1387
|
+
.find((t) => t.name == e.target.value)
|
|
1388
|
+
?.columns.find((elem) => elem.field ===
|
|
1389
|
+
(filterMap[filter.label]?.field ??
|
|
1390
|
+
filter.field))?.field ?? '',
|
|
1391
|
+
},
|
|
1392
|
+
}), options: allTables.map((elem) => ({
|
|
1393
|
+
label: elem,
|
|
1394
|
+
value: elem,
|
|
1395
|
+
})), width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { label: index === 0 &&
|
|
1396
|
+
!(isAdmin &&
|
|
1397
|
+
formData.dateField &&
|
|
1398
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1399
|
+
?.config.dateFilter?.label)
|
|
1400
|
+
? 'Field'
|
|
1401
|
+
: '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
|
|
1402
|
+
...filterMap,
|
|
1403
|
+
[filter.label]: {
|
|
1404
|
+
table: filterMap[filter.label]?.table ??
|
|
1405
|
+
filter.table,
|
|
1406
|
+
field: e.target.value,
|
|
1407
|
+
},
|
|
1408
|
+
}), options: schemaData.schema
|
|
1409
|
+
.find((t) => t.name ==
|
|
1410
|
+
(filterMap[filter.label]?.table ??
|
|
1411
|
+
filter.table) &&
|
|
1412
|
+
allTables.includes(t.name))
|
|
1413
|
+
?.columns.filter((column) => (0, columnProcessing_1.isStringType)(column.fieldType))
|
|
1414
|
+
.map((elem) => ({
|
|
1415
|
+
label: elem.label,
|
|
1416
|
+
value: elem.field,
|
|
1417
|
+
})) ?? [], width: 200 }), !validFilter[filter.label] && ((0, jsx_runtime_1.jsx)("div", { style: { marginBottom: 8, marginTop: 'auto' }, children: (0, jsx_runtime_1.jsx)(assets_1.ExclamationFilledIcon, { height: 28, width: 28, style: {
|
|
1418
|
+
color: '#dc143c',
|
|
1419
|
+
} }) }))] }, filter.label))) }))] })), isAdmin && !client?.multiTenancyDisabled && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
1208
1420
|
display: 'flex',
|
|
1209
1421
|
flexDirection: 'column',
|
|
1210
1422
|
gap: 12,
|
|
@@ -1234,7 +1446,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
1234
1446
|
}, disabled: formData.name === '' ||
|
|
1235
1447
|
formData.dashboardName === '' ||
|
|
1236
1448
|
formData.chartType === '' ||
|
|
1237
|
-
filterIssues.length !== 0
|
|
1449
|
+
filterIssues.length !== 0 ||
|
|
1450
|
+
Object.values(validFilter).includes(false), label: buttonLabel
|
|
1238
1451
|
? buttonLabel
|
|
1239
1452
|
: report
|
|
1240
1453
|
? 'Save changes'
|