@quillsql/react 2.11.23 → 2.11.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +32 -16
- package/dist/cjs/ChartBuilder.d.ts +55 -2
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +223 -206
- package/dist/cjs/ChartEditor.d.ts +49 -2
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +3 -3
- package/dist/cjs/Dashboard.d.ts +5 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +42 -18
- 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 +4 -3
- package/dist/cjs/ReportBuilder.d.ts +57 -2
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +969 -684
- package/dist/cjs/SQLEditor.d.ts +83 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +10 -2
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +8 -6
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarList.js +0 -153
- package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +13 -7
- package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
- package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +32 -31
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +11 -12
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +13 -2
- package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/constants.js +14 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +14 -3
- package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +19 -27
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +54 -28
- package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +3 -0
- package/dist/cjs/components/UiComponents.d.ts +34 -4
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +165 -68
- package/dist/cjs/hooks/useQuill.d.ts +1 -0
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
- package/dist/cjs/utils/axisFormatter.js +3 -3
- package/dist/cjs/utils/getDomain.d.ts.map +1 -1
- package/dist/cjs/utils/getDomain.js +3 -0
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +2 -0
- package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/pivotProcessing.js +177 -0
- package/dist/cjs/utils/queryConstructor.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
- package/dist/cjs/utils/queryConstructor.js +11 -0
- package/dist/cjs/utils/tableProcessing.d.ts +7 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/tableProcessing.js +84 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +40 -8
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +33 -17
- package/dist/esm/ChartBuilder.d.ts +55 -2
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +225 -208
- package/dist/esm/ChartEditor.d.ts +49 -2
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +4 -4
- package/dist/esm/Dashboard.d.ts +5 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +21 -20
- 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 +4 -3
- package/dist/esm/ReportBuilder.d.ts +57 -2
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +971 -687
- package/dist/esm/SQLEditor.d.ts +83 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +11 -3
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +8 -6
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarList.js +0 -153
- package/dist/esm/components/Chart/ChartError.d.ts +1 -1
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +13 -7
- package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +6 -7
- package/dist/esm/components/Chart/LineChart.d.ts +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +32 -31
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
- package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +82 -0
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +11 -12
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
- package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +11 -1
- package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
- package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/constants.js +13 -0
- package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +14 -3
- package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +19 -27
- package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +55 -29
- package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +3 -0
- package/dist/esm/components/UiComponents.d.ts +34 -4
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +155 -66
- package/dist/esm/hooks/useQuill.d.ts +1 -0
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
- package/dist/esm/utils/axisFormatter.js +3 -3
- package/dist/esm/utils/getDomain.d.ts.map +1 -1
- package/dist/esm/utils/getDomain.js +3 -0
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +2 -0
- package/dist/esm/utils/pivotProcessing.d.ts +20 -0
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
- package/dist/esm/utils/pivotProcessing.js +170 -0
- package/dist/esm/utils/queryConstructor.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.js +7 -0
- package/dist/esm/utils/tableProcessing.d.ts +7 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
- package/dist/esm/utils/tableProcessing.js +80 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +41 -9
- package/package.json +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
package/dist/esm/ChartBuilder.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/* eslint-disable no-unused-vars */
|
|
3
3
|
import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
|
|
4
4
|
import { ClientContext, DashboardContext, DashboardFiltersContext, SchemaContext, ThemeContext, } from './Context';
|
|
@@ -7,7 +7,7 @@ import { getPostgresBasicType } from './components/ReportBuilder/util';
|
|
|
7
7
|
import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
|
|
8
8
|
import { PivotCard } from './internals/ReportBuilder/PivotList';
|
|
9
9
|
import Chart from './Chart';
|
|
10
|
-
import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, } from './components/UiComponents';
|
|
10
|
+
import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, } from './components/UiComponents';
|
|
11
11
|
import { mergeComparisonRange } from './utils/merge';
|
|
12
12
|
import { removeDoubleQuotes, snakeCaseToTitleCase, } from './utils/textProcessing';
|
|
13
13
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
@@ -176,7 +176,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
176
176
|
setModalWidth(window.innerWidth - 80);
|
|
177
177
|
}
|
|
178
178
|
else {
|
|
179
|
-
setModalWidth(
|
|
179
|
+
setModalWidth(undefined); // use dynamic width of contents
|
|
180
180
|
}
|
|
181
181
|
setModalHeight(window.innerHeight - 80);
|
|
182
182
|
}
|
|
@@ -186,7 +186,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
186
186
|
window.removeEventListener('resize', handleResize);
|
|
187
187
|
};
|
|
188
188
|
}, []);
|
|
189
|
-
return (_jsx("div", { ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
189
|
+
return (_jsx("div", { style: { height: '100%' }, ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
190
190
|
// For isHorizontalView, use full viewport size minus 80px for padding,
|
|
191
191
|
// otherwise use the default layout method of the modal (contents).
|
|
192
192
|
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
|
|
@@ -215,14 +215,17 @@ export function ChartBuilderWithModal(props) {
|
|
|
215
215
|
* ### Chart Builder API
|
|
216
216
|
* @see https://docs.quillsql.com/components/chart-builder
|
|
217
217
|
*/
|
|
218
|
-
export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent, isOpen, isHorizontalView = true, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, }) {
|
|
218
|
+
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, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, isOpen, isHorizontalView = true, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, pivotRecommendationsEnabled = true, }) {
|
|
219
219
|
const dateRange = dr || [null, null, null];
|
|
220
220
|
const [client] = useContext(ClientContext);
|
|
221
221
|
const [theme] = useContext(ThemeContext);
|
|
222
222
|
const [schema, setSchema] = useContext(SchemaContext);
|
|
223
223
|
const [windowWidth, setWindowWidth] = useState(1200);
|
|
224
224
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
225
|
-
const [
|
|
225
|
+
const [pivotCardWidth, setPivotCardWidth] = useState(665);
|
|
226
|
+
const [formWidth, setFormWidth] = useState(665);
|
|
227
|
+
const inputRef = useRef(null);
|
|
228
|
+
const selectRef = useRef(null);
|
|
226
229
|
const { dispatch } = useContext(DashboardContext);
|
|
227
230
|
const fields = fieldsProp?.map((field) => ({
|
|
228
231
|
field: field.name,
|
|
@@ -232,9 +235,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
232
235
|
})) || [];
|
|
233
236
|
const parentRef = useRef(null);
|
|
234
237
|
const deleteRef = useRef(null);
|
|
235
|
-
const pivotCardContainer = useRef(null);
|
|
236
238
|
const modalPadding = 20;
|
|
237
|
-
const deleteButtonMargin = -
|
|
239
|
+
const deleteButtonMargin = -12;
|
|
238
240
|
useEffect(() => {
|
|
239
241
|
const handleResize = () => setWindowWidth(window.innerWidth);
|
|
240
242
|
handleResize();
|
|
@@ -244,58 +246,51 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
244
246
|
};
|
|
245
247
|
}, []);
|
|
246
248
|
useEffect(() => {
|
|
247
|
-
const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ??
|
|
248
|
-
240 - 40 ??
|
|
249
|
-
'calc(100% - 40px)';
|
|
250
249
|
const handleResize = () => {
|
|
251
|
-
|
|
252
|
-
|
|
250
|
+
// The pivot card should be the same width as the row of inputs
|
|
251
|
+
// above it (an input, two selects, plus the gaps between them).
|
|
252
|
+
if (inputRef.current && selectRef.current) {
|
|
253
|
+
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
254
|
+
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
255
|
+
const selectWidth = selectSize.width;
|
|
256
|
+
const showDash = showDashboardDropdown && !destinationDashboard;
|
|
257
|
+
const spaceBetween = selectSize.left - inputSize.right;
|
|
258
|
+
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
259
|
+
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
260
|
+
setPivotCardWidth(width);
|
|
261
|
+
// Calculate the form width by adding the width of the delete button
|
|
262
|
+
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
263
|
+
const deleteWidth = deleteSize?.width ?? 0;
|
|
264
|
+
setFormWidth(width + deleteWidth);
|
|
253
265
|
}
|
|
254
266
|
};
|
|
255
267
|
handleResize();
|
|
256
|
-
|
|
257
|
-
return () => {
|
|
258
|
-
window.removeEventListener('resize', handleResize);
|
|
259
|
-
};
|
|
260
|
-
}, [pivotCardContainer]);
|
|
261
|
-
// get schema
|
|
268
|
+
}, [isOpen]);
|
|
262
269
|
useEffect(() => {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}),
|
|
280
|
-
});
|
|
281
|
-
const results = await response.json();
|
|
282
|
-
if (isSubscribed) {
|
|
283
|
-
if (results.data?.data) {
|
|
284
|
-
setSchema(results.data.data.tables);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
setSchema(results.data.tables);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
270
|
+
const handleResize = () => {
|
|
271
|
+
// The pivot card should be the same width as the row of inputs
|
|
272
|
+
// above it (an input, two selects, plus the gaps between them).
|
|
273
|
+
if (inputRef.current && selectRef.current) {
|
|
274
|
+
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
275
|
+
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
276
|
+
const selectWidth = selectSize.width;
|
|
277
|
+
const showDash = showDashboardDropdown && !destinationDashboard;
|
|
278
|
+
const spaceBetween = selectSize.left - inputSize.right;
|
|
279
|
+
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
280
|
+
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
281
|
+
setPivotCardWidth(width);
|
|
282
|
+
// Calculate the form width by adding the width of the delete button
|
|
283
|
+
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
284
|
+
const deleteWidth = deleteSize?.width ?? 0;
|
|
285
|
+
setFormWidth(width + deleteWidth);
|
|
290
286
|
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
}
|
|
287
|
+
};
|
|
288
|
+
handleResize();
|
|
289
|
+
window.addEventListener('resize', handleResize);
|
|
295
290
|
return () => {
|
|
296
|
-
|
|
291
|
+
window.removeEventListener('resize', handleResize);
|
|
297
292
|
};
|
|
298
|
-
}, [
|
|
293
|
+
}, []);
|
|
299
294
|
// get dashboards
|
|
300
295
|
const [dashboardOptions, setDashboardOptions] = useState([]);
|
|
301
296
|
const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || dashboardItem?.dashboardName || '');
|
|
@@ -311,17 +306,18 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
311
306
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
312
307
|
const [tableName, setTableName] = useState(undefined);
|
|
313
308
|
const selectedTable = schema?.find((t) => t.displayName === tableName);
|
|
314
|
-
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add
|
|
309
|
+
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
315
310
|
const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
|
|
316
311
|
const [recommendedPivots, setRecommendedPivots] = useState(rp);
|
|
317
|
-
const [pivotRowField, setPivotRowField] = useState(
|
|
318
|
-
const [pivotColumnField, setPivotColumnField] = useState(
|
|
319
|
-
const [pivotValueField, setPivotValueField] = useState(
|
|
320
|
-
const [pivotAggregation, setPivotAggregation] = useState(
|
|
312
|
+
const [pivotRowField, setPivotRowField] = useState(pivot?.rowField);
|
|
313
|
+
const [pivotColumnField, setPivotColumnField] = useState(pivot?.columnField);
|
|
314
|
+
const [pivotValueField, setPivotValueField] = useState(pivot?.valueField);
|
|
315
|
+
const [pivotAggregation, setPivotAggregation] = useState(pivot?.aggregationType);
|
|
321
316
|
// initial state is the fields array passed in, but can eventually be changed to be the pivot fields
|
|
322
317
|
const [fieldOptions, setFieldOptions] = useState(fields);
|
|
323
318
|
const [dateFieldOptions, setDateFieldOptions] = useState([]);
|
|
324
319
|
const [allTables, setAllTables] = useState([]);
|
|
320
|
+
const [uniqueValues, setUniqueValues] = useState(undefined);
|
|
325
321
|
const [defaultDateField, setDefaultDateField] = useState({
|
|
326
322
|
table: dateFieldOptions[0]?.name || '',
|
|
327
323
|
field: dateFieldOptions[0]?.columns[0]?.name || '',
|
|
@@ -349,7 +345,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
349
345
|
template: false,
|
|
350
346
|
};
|
|
351
347
|
const updateDashboardFilters = async (dashboardName) => {
|
|
352
|
-
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
348
|
+
const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
|
|
353
349
|
if (queryEndpoint) {
|
|
354
350
|
const response = await fetch(queryEndpoint, {
|
|
355
351
|
method: 'POST',
|
|
@@ -359,7 +355,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
359
355
|
},
|
|
360
356
|
body: JSON.stringify({
|
|
361
357
|
metadata: {
|
|
362
|
-
orgId: '*',
|
|
358
|
+
orgId: customerId || '*',
|
|
363
359
|
task: 'config',
|
|
364
360
|
name: dashboardName,
|
|
365
361
|
clientId: publicKey,
|
|
@@ -376,10 +372,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
376
372
|
};
|
|
377
373
|
const pivotFormData = (pivot) => {
|
|
378
374
|
const yAxisField = pivot.columnField || pivot.valueField;
|
|
375
|
+
const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
|
|
376
|
+
? dashboardItem.yAxisFields[0].label
|
|
377
|
+
: pivot.valueField;
|
|
379
378
|
// date labels for pivots should be treated like strings since they are
|
|
380
379
|
// formatted in generatePivotTable
|
|
381
380
|
const yAxisIsDate = pivot.columnField
|
|
382
|
-
? isDateField(pivot.columnFieldType)
|
|
381
|
+
? isDateField(pivot.columnFieldType || '')
|
|
383
382
|
: false;
|
|
384
383
|
const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
|
|
385
384
|
return {
|
|
@@ -390,21 +389,28 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
390
389
|
? 'string'
|
|
391
390
|
: columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
392
391
|
'whole_number',
|
|
393
|
-
xAxisLabel:
|
|
392
|
+
xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
|
|
394
393
|
yAxisFields: [
|
|
395
394
|
{
|
|
396
395
|
field: yAxisField,
|
|
397
|
-
label:
|
|
396
|
+
label: yAxisLabel,
|
|
398
397
|
format: yAxisIsDate
|
|
399
398
|
? 'string'
|
|
400
|
-
:
|
|
401
|
-
|
|
399
|
+
: dashboardItem?.yAxisFields?.length > 0
|
|
400
|
+
? dashboardItem?.yAxisFields[0].format
|
|
401
|
+
: columns.find((col) => col.field === pivot.valueField)?.format ||
|
|
402
|
+
'whole_number',
|
|
402
403
|
},
|
|
403
404
|
],
|
|
404
405
|
};
|
|
405
406
|
};
|
|
406
407
|
const [formData, setFormData] = useState(pivot
|
|
407
|
-
? {
|
|
408
|
+
? {
|
|
409
|
+
...formEmptyState,
|
|
410
|
+
...dashboardItem,
|
|
411
|
+
...pivotFormData(pivot),
|
|
412
|
+
...(destinationDashboard && { dashboardName: destinationDashboard }),
|
|
413
|
+
}
|
|
408
414
|
: dashboardItem || formEmptyState);
|
|
409
415
|
useEffect(() => {
|
|
410
416
|
async function getFormData() {
|
|
@@ -413,27 +419,46 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
413
419
|
const dashboardOptions = resp.dashboardNames
|
|
414
420
|
.filter((elem) => elem !== null)
|
|
415
421
|
.map((key) => ({ label: key, value: key }));
|
|
416
|
-
await updateDashboardFilters(dashboardItem
|
|
422
|
+
await updateDashboardFilters(destinationDashboard ?? dashboardItem
|
|
417
423
|
? dashboardItem.dashboardName
|
|
418
424
|
: dashboardOptions[0]?.label);
|
|
419
425
|
setDashboardOptions(dashboardOptions);
|
|
420
|
-
const dashboardName = dashboardItem
|
|
426
|
+
const dashboardName = destinationDashboard ?? dashboardItem
|
|
421
427
|
? dashboardItem?.dashboardName
|
|
422
428
|
: dashboardOptions[0]?.label;
|
|
423
429
|
curFormData.dashboardName = dashboardName;
|
|
424
|
-
setDefaultDashboardName(dashboardItem
|
|
430
|
+
setDefaultDashboardName(destinationDashboard ?? dashboardItem
|
|
425
431
|
? dashboardItem?.dashboardName
|
|
426
432
|
: dashboardOptions[0]?.label);
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
+
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
434
|
+
const response = await fetch(`${queryEndpoint}`, {
|
|
435
|
+
method: 'POST',
|
|
436
|
+
headers: {
|
|
437
|
+
...queryHeaders,
|
|
438
|
+
'Content-Type': 'application/json',
|
|
439
|
+
},
|
|
440
|
+
body: JSON.stringify({
|
|
441
|
+
metadata: {
|
|
442
|
+
clientId: publicKey,
|
|
443
|
+
publicKey: publicKey,
|
|
444
|
+
task: 'schema',
|
|
445
|
+
},
|
|
446
|
+
}),
|
|
447
|
+
});
|
|
448
|
+
const schemaInfo = await response.json();
|
|
449
|
+
let schemaData = schemaInfo.data?.data;
|
|
450
|
+
if (schemaInfo.data?.data) {
|
|
451
|
+
schemaData = schemaInfo.data.data.tables;
|
|
452
|
+
setSchema(schemaInfo.data.data.tables);
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
schemaData = schemaInfo.data.tables;
|
|
456
|
+
setSchema(schemaInfo.data.tables);
|
|
457
|
+
}
|
|
433
458
|
if (!query) {
|
|
434
459
|
return;
|
|
435
460
|
}
|
|
436
|
-
const result = await getReferencedTables(client, query,
|
|
461
|
+
const result = await getReferencedTables(client, query, schemaData, true);
|
|
437
462
|
setDateFieldOptions(result);
|
|
438
463
|
if (result[0] && result[0].columns[0]) {
|
|
439
464
|
setDefaultDateField({
|
|
@@ -441,7 +466,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
441
466
|
field: result[0].columns[0].name,
|
|
442
467
|
});
|
|
443
468
|
}
|
|
444
|
-
const allReferencedFields = await getReferencedTables(client, query,
|
|
469
|
+
const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
|
|
445
470
|
setAllTables(allReferencedFields.map((table) => table.name));
|
|
446
471
|
setTableName(result[0]?.name);
|
|
447
472
|
const dateField = {
|
|
@@ -453,6 +478,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
453
478
|
curFormData.dateField = dateField;
|
|
454
479
|
setFormData({
|
|
455
480
|
...curFormData,
|
|
481
|
+
dashboardName: dashboardItem
|
|
482
|
+
? dashboardItem?.dashboardName
|
|
483
|
+
: dashboardOptions[0]?.label,
|
|
456
484
|
});
|
|
457
485
|
}
|
|
458
486
|
getFormData();
|
|
@@ -494,6 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
494
522
|
});
|
|
495
523
|
}
|
|
496
524
|
else {
|
|
525
|
+
if (!rows)
|
|
526
|
+
return [];
|
|
497
527
|
return rows.map((row) => {
|
|
498
528
|
return formData.columns.reduce((formattedRow, column) => {
|
|
499
529
|
// Apply the format function to each field in the row
|
|
@@ -590,16 +620,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
590
620
|
}
|
|
591
621
|
};
|
|
592
622
|
const handleAddPivot = (pivot) => {
|
|
623
|
+
const newPivotFormData = pivotFormData(pivot);
|
|
624
|
+
// Only keep the old chart type if the shapes of the pivots are the same
|
|
625
|
+
// since the valid chart types for some pivots might have changed (eg. going
|
|
626
|
+
// from a 1D pivot to a 2D pivot would make bar lists not an option).
|
|
627
|
+
// They don't have to have the same value, just same 'truthiness'.
|
|
628
|
+
const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
|
|
629
|
+
Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
|
|
630
|
+
const isNewChartType = formData.chartType !== newPivotFormData.chartType;
|
|
631
|
+
const keepOldChartType = isNewChartType && isPivotSameShape;
|
|
593
632
|
setFormData((formData) => ({
|
|
594
633
|
...formData,
|
|
595
|
-
...
|
|
634
|
+
...newPivotFormData,
|
|
635
|
+
...(keepOldChartType && { chartType: formData.chartType }),
|
|
596
636
|
}));
|
|
597
637
|
};
|
|
598
638
|
const handleDeletePivot = () => {
|
|
599
639
|
if (!formData.pivot) {
|
|
600
640
|
return;
|
|
601
641
|
}
|
|
602
|
-
setFormData({
|
|
642
|
+
setFormData({
|
|
643
|
+
...formEmptyState,
|
|
644
|
+
dashboardName: formData.dashboardName,
|
|
645
|
+
pivot: null,
|
|
646
|
+
});
|
|
603
647
|
};
|
|
604
648
|
const handleAddField = (fieldName) => {
|
|
605
649
|
if (fieldName === 'columns') {
|
|
@@ -760,7 +804,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
760
804
|
setIsOpen(false);
|
|
761
805
|
setIsSubmitting(false);
|
|
762
806
|
if (onAddToDashboardComplete) {
|
|
763
|
-
onAddToDashboardComplete(
|
|
807
|
+
onAddToDashboardComplete({
|
|
808
|
+
...resp,
|
|
809
|
+
rows,
|
|
810
|
+
fieldOptions,
|
|
811
|
+
filtersApplied: dashboardFilters,
|
|
812
|
+
});
|
|
764
813
|
}
|
|
765
814
|
};
|
|
766
815
|
// Prevent horizontal view on small screens.
|
|
@@ -787,13 +836,14 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
787
836
|
display: 'flex',
|
|
788
837
|
flexDirection: 'column',
|
|
789
838
|
gap: '20px',
|
|
790
|
-
height: '100%',
|
|
839
|
+
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
791
840
|
...(isHorizontalView && {
|
|
792
841
|
flexGrow: 1,
|
|
793
|
-
maxWidth: !isOpen ? '100%' :
|
|
842
|
+
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
794
843
|
}),
|
|
844
|
+
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
795
845
|
}, children: [((!isHorizontalView && windowWidth >= 1200) ||
|
|
796
|
-
formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
|
|
846
|
+
formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
797
847
|
width: '100%',
|
|
798
848
|
height: formData.chartType === 'metric'
|
|
799
849
|
? 100
|
|
@@ -812,40 +862,37 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
812
862
|
: formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
813
863
|
display: 'flex',
|
|
814
864
|
flexDirection: 'column',
|
|
815
|
-
height: '100%',
|
|
816
865
|
gap: 20,
|
|
817
866
|
...(isHorizontalView && {
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
867
|
+
height: '100%',
|
|
868
|
+
minWidth: formWidth,
|
|
869
|
+
maxWidth: formWidth,
|
|
870
|
+
width: formWidth,
|
|
821
871
|
}),
|
|
822
872
|
...(windowWidth < 1200 && {
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
873
|
+
width: formWidth,
|
|
874
|
+
paddingTop: modalPadding,
|
|
875
|
+
paddingBottom: modalPadding,
|
|
876
|
+
}),
|
|
877
|
+
}, children: [_jsxs(FormContainer, { children: [_jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(TextInputComponent, { id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboard && (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
|
|
878
|
+
handleChange(e.target.value, 'dashboardName');
|
|
879
|
+
await updateDashboardFilters(e.target.value);
|
|
880
|
+
}, options: dashboardOptions.map((elem) => ({
|
|
881
|
+
label: elem.label,
|
|
882
|
+
value: elem.label,
|
|
883
|
+
})), width: 200 }) })), _jsx("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
|
|
884
|
+
// filter out metric for all pivots
|
|
885
|
+
// filter out bar and pie for row and column pivot
|
|
886
|
+
options: getChartTypeOptions(formData), width: 200 }) })] }), _jsxs("div", { style: {
|
|
835
887
|
display: 'flex',
|
|
836
888
|
flexDirection: 'column',
|
|
837
|
-
gap:
|
|
838
|
-
marginTop: 6,
|
|
889
|
+
gap: 6,
|
|
839
890
|
}, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
|
|
840
891
|
maxWidth: 200,
|
|
841
892
|
// marginTop: 6,
|
|
842
893
|
display: 'flex',
|
|
843
894
|
flexDirection: 'column',
|
|
844
|
-
}, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, 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, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot }) }), formData.pivot && (_jsx("div", {
|
|
845
|
-
width: !isHorizontalView
|
|
846
|
-
? divWidth
|
|
847
|
-
: 'calc(100% - 40px)',
|
|
848
|
-
}, children: _jsx(PivotCard, { pivotTable: {
|
|
895
|
+
}, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, 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, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled }) }), formData.pivot && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: {
|
|
849
896
|
pivot: formData.pivot,
|
|
850
897
|
rows: selectedPivotTable?.rows,
|
|
851
898
|
columns: selectedPivotTable?.columns,
|
|
@@ -856,127 +903,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
856
903
|
setPivotColumnField(formData.pivot?.columnField);
|
|
857
904
|
setPivotValueField(formData.pivot?.valueField);
|
|
858
905
|
setPivotAggregation(formData.pivot?.aggregationType);
|
|
859
|
-
setPivotPopUpTitle('Edit
|
|
860
|
-
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }),
|
|
906
|
+
setPivotPopUpTitle('Edit pivot');
|
|
907
|
+
}, 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: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
|
|
861
908
|
display: 'flex',
|
|
862
909
|
flexDirection: 'column',
|
|
863
|
-
|
|
864
|
-
marginTop: 6,
|
|
865
|
-
}, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs("div", { style: {
|
|
866
|
-
display: 'flex',
|
|
867
|
-
flexDirection: 'row',
|
|
868
|
-
gap: 12,
|
|
869
|
-
}, children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
910
|
+
}, 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
|
|
870
911
|
? getPivotMetricOptions(formData.pivot)
|
|
871
912
|
: fieldOptions.map((elem) => ({
|
|
872
913
|
label: elem.field,
|
|
873
914
|
value: elem.field,
|
|
874
|
-
})), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
|
|
875
|
-
? formData.pivot.rowField
|
|
876
|
-
: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), _jsx(SelectComponent, { value: formData.pivot &&
|
|
915
|
+
})), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), _jsx(SelectComponent, { value: formData.pivot &&
|
|
877
916
|
isDateField(formData.pivot.rowFieldType)
|
|
878
917
|
? 'pivot_date'
|
|
879
918
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
880
919
|
isDateField(formData.pivot.rowFieldType)
|
|
881
920
|
? [{ value: 'pivot_date', label: 'date' }]
|
|
882
|
-
: formatOptions, width: 200 })] }
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
.
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
})
|
|
910
|
-
? // @ts-ignore
|
|
911
|
-
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
912
|
-
: 'whole_number'
|
|
913
|
-
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
914
|
-
? NUMBER_OPTIONS
|
|
915
|
-
: 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 && (_jsxs(_Fragment, { children: [_jsx("br", {}), _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), _jsx("br", {})] })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
|
|
921
|
+
: 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
|
|
922
|
+
? formData.pivot.valueField || 'count'
|
|
923
|
+
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
924
|
+
? [
|
|
925
|
+
{
|
|
926
|
+
label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
|
|
927
|
+
value: formData.pivot.valueField ||
|
|
928
|
+
'count',
|
|
929
|
+
},
|
|
930
|
+
]
|
|
931
|
+
: fieldOptions
|
|
932
|
+
.filter((elem) => {
|
|
933
|
+
return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
|
|
934
|
+
})
|
|
935
|
+
.map((elem) => ({
|
|
936
|
+
label: elem.field,
|
|
937
|
+
value: elem.field,
|
|
938
|
+
})), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-y-axis-label", width: 200, value: yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'yAxisFields.label', index) }), _jsx(SelectComponent, { value: formData.pivot
|
|
939
|
+
? NUMBER_OPTIONS.find((option) => {
|
|
940
|
+
return (option.value === yAxisField.format);
|
|
941
|
+
})
|
|
942
|
+
? // @ts-ignore
|
|
943
|
+
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
944
|
+
: ''
|
|
945
|
+
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
946
|
+
? NUMBER_OPTIONS
|
|
947
|
+
: 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 +" }) }))] })] }))] })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
|
|
916
948
|
display: 'flex',
|
|
917
949
|
flexDirection: 'column',
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
950
|
-
: formData.columns.map((column, index) => (_jsxs("div", { style: {
|
|
951
|
-
display: 'flex',
|
|
952
|
-
flexDirection: 'row',
|
|
953
|
-
gap: 12,
|
|
954
|
-
}, children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
|
|
955
|
-
label: elem.field,
|
|
956
|
-
value: elem.field,
|
|
957
|
-
})), width: 200 }), _jsx(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), _jsx("br", {}), _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), _jsx("br", {}), _jsx("br", {})] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
|
|
950
|
+
}, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
951
|
+
selectedPivotTable &&
|
|
952
|
+
selectedPivotTable.columns &&
|
|
953
|
+
formData.chartType === 'table'
|
|
954
|
+
? // THIS CASE IF FOR PIVOT TABLES ONLY
|
|
955
|
+
selectedPivotTable.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
|
|
956
|
+
label: elem.label,
|
|
957
|
+
value: elem.label,
|
|
958
|
+
})), width: 200 }), _jsx(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), _jsx(SelectComponent, { value:
|
|
959
|
+
// The first index use rowField for the rest of them use value fields
|
|
960
|
+
formData.pivot &&
|
|
961
|
+
column.field === formData.pivot.rowField
|
|
962
|
+
? formData.pivot &&
|
|
963
|
+
isDateField(formData.pivot.rowFieldType)
|
|
964
|
+
? 'pivot_date'
|
|
965
|
+
: 'string'
|
|
966
|
+
: formData.pivot?.valueFieldType ||
|
|
967
|
+
'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
|
|
968
|
+
? isDateField(formData.pivot.rowFieldType)
|
|
969
|
+
? [{ label: 'date', value: 'pivot_date' }]
|
|
970
|
+
: [{ label: 'string', value: 'string' }]
|
|
971
|
+
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
972
|
+
: formData.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: columns.map((elem) => ({
|
|
973
|
+
label: elem.field,
|
|
974
|
+
value: elem.field,
|
|
975
|
+
})), width: 200 }), _jsx(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), _jsx("div", { children: !(
|
|
976
|
+
// hide when pivoted and chartType === 'table'
|
|
977
|
+
(formData.pivot &&
|
|
978
|
+
selectedPivotTable &&
|
|
979
|
+
selectedPivotTable.columns &&
|
|
980
|
+
formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
|
|
958
981
|
display: 'flex',
|
|
959
982
|
flexDirection: 'column',
|
|
960
983
|
gap: 6,
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
?.find((elem) => elem.name === formData.dateField?.table)
|
|
971
|
-
?.columns?.map((elem) => ({
|
|
972
|
-
label: elem.name,
|
|
973
|
-
value: elem.name,
|
|
974
|
-
})) || [], width: 200 })] })] }), _jsx("br", {})] })), showAccessControlOptions && (_jsxs("div", { style: {
|
|
984
|
+
}, children: [_jsx(HeaderComponent, { label: "Date field" }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
|
|
985
|
+
label: elem.name,
|
|
986
|
+
value: elem.name,
|
|
987
|
+
})), 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
|
|
988
|
+
?.find((elem) => elem.name === formData.dateField?.table)
|
|
989
|
+
?.columns?.map((elem) => ({
|
|
990
|
+
label: elem.name,
|
|
991
|
+
value: elem.name,
|
|
992
|
+
})) || [], width: 200 }) })] })] })), showAccessControlOptions && (_jsxs("div", { style: {
|
|
975
993
|
display: 'flex',
|
|
976
994
|
flexDirection: 'column',
|
|
977
995
|
gap: 12,
|
|
978
|
-
|
|
979
|
-
}, children: [_jsx(HeaderComponent, { label: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), _jsxs("div", { style: {
|
|
996
|
+
}, children: [_jsx(HeaderComponent, { label: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template || !organizationName, theme: theme, organizationName: organizationName })] }))] }), _jsxs("div", { style: {
|
|
980
997
|
display: 'flex',
|
|
981
998
|
flexDirection: 'row',
|
|
982
999
|
justifyContent: 'flex-end',
|
|
@@ -1060,7 +1077,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
|
|
|
1060
1077
|
padding: '20px',
|
|
1061
1078
|
boxSizing: 'border-box',
|
|
1062
1079
|
overflow: 'scroll',
|
|
1063
|
-
}, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("
|
|
1080
|
+
}, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("div", { style: {
|
|
1064
1081
|
display: 'flex',
|
|
1065
1082
|
flexDirection: 'row',
|
|
1066
1083
|
gap: '12px',
|