@quillsql/react 2.11.23 → 2.11.25
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 +16 -0
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +34 -18
- package/dist/cjs/ChartBuilder.d.ts +55 -2
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +232 -212
- 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 +962 -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 +6 -2
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +35 -34
- 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 +442 -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 +16 -0
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +35 -19
- package/dist/esm/ChartBuilder.d.ts +55 -2
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +234 -214
- 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 +964 -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 +6 -2
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +35 -34
- 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 +443 -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,49 @@ 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(
|
|
417
|
-
|
|
418
|
-
|
|
422
|
+
await updateDashboardFilters(destinationDashboard ??
|
|
423
|
+
(dashboardItem
|
|
424
|
+
? dashboardItem?.dashboardName
|
|
425
|
+
: dashboardOptions[0]?.label));
|
|
419
426
|
setDashboardOptions(dashboardOptions);
|
|
420
|
-
const dashboardName =
|
|
421
|
-
|
|
422
|
-
|
|
427
|
+
const dashboardName = destinationDashboard ??
|
|
428
|
+
(dashboardItem
|
|
429
|
+
? dashboardItem?.dashboardName
|
|
430
|
+
: dashboardOptions[0]?.label);
|
|
423
431
|
curFormData.dashboardName = dashboardName;
|
|
424
|
-
setDefaultDashboardName(
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
432
|
+
setDefaultDashboardName(destinationDashboard ??
|
|
433
|
+
(dashboardItem
|
|
434
|
+
? dashboardItem?.dashboardName
|
|
435
|
+
: dashboardOptions[0]?.label));
|
|
436
|
+
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
437
|
+
const response = await fetch(`${queryEndpoint}`, {
|
|
438
|
+
method: 'POST',
|
|
439
|
+
headers: {
|
|
440
|
+
...queryHeaders,
|
|
441
|
+
'Content-Type': 'application/json',
|
|
442
|
+
},
|
|
443
|
+
body: JSON.stringify({
|
|
444
|
+
metadata: {
|
|
445
|
+
clientId: publicKey,
|
|
446
|
+
publicKey: publicKey,
|
|
447
|
+
task: 'schema',
|
|
448
|
+
},
|
|
449
|
+
}),
|
|
450
|
+
});
|
|
451
|
+
const schemaInfo = await response.json();
|
|
452
|
+
let schemaData = schemaInfo.data?.data;
|
|
453
|
+
if (schemaInfo.data?.data) {
|
|
454
|
+
schemaData = schemaInfo.data.data.tables;
|
|
455
|
+
setSchema(schemaInfo.data.data.tables);
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
schemaData = schemaInfo.data.tables;
|
|
459
|
+
setSchema(schemaInfo.data.tables);
|
|
460
|
+
}
|
|
433
461
|
if (!query) {
|
|
434
462
|
return;
|
|
435
463
|
}
|
|
436
|
-
const result = await getReferencedTables(client, query,
|
|
464
|
+
const result = await getReferencedTables(client, query, schemaData, true);
|
|
437
465
|
setDateFieldOptions(result);
|
|
438
466
|
if (result[0] && result[0].columns[0]) {
|
|
439
467
|
setDefaultDateField({
|
|
@@ -441,7 +469,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
441
469
|
field: result[0].columns[0].name,
|
|
442
470
|
});
|
|
443
471
|
}
|
|
444
|
-
const allReferencedFields = await getReferencedTables(client, query,
|
|
472
|
+
const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
|
|
445
473
|
setAllTables(allReferencedFields.map((table) => table.name));
|
|
446
474
|
setTableName(result[0]?.name);
|
|
447
475
|
const dateField = {
|
|
@@ -453,6 +481,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
453
481
|
curFormData.dateField = dateField;
|
|
454
482
|
setFormData({
|
|
455
483
|
...curFormData,
|
|
484
|
+
dashboardName: dashboardItem
|
|
485
|
+
? dashboardItem?.dashboardName
|
|
486
|
+
: dashboardOptions[0]?.label,
|
|
456
487
|
});
|
|
457
488
|
}
|
|
458
489
|
getFormData();
|
|
@@ -494,6 +525,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
494
525
|
});
|
|
495
526
|
}
|
|
496
527
|
else {
|
|
528
|
+
if (!rows)
|
|
529
|
+
return [];
|
|
497
530
|
return rows.map((row) => {
|
|
498
531
|
return formData.columns.reduce((formattedRow, column) => {
|
|
499
532
|
// Apply the format function to each field in the row
|
|
@@ -590,16 +623,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
590
623
|
}
|
|
591
624
|
};
|
|
592
625
|
const handleAddPivot = (pivot) => {
|
|
626
|
+
const newPivotFormData = pivotFormData(pivot);
|
|
627
|
+
// Only keep the old chart type if the shapes of the pivots are the same
|
|
628
|
+
// since the valid chart types for some pivots might have changed (eg. going
|
|
629
|
+
// from a 1D pivot to a 2D pivot would make bar lists not an option).
|
|
630
|
+
// They don't have to have the same value, just same 'truthiness'.
|
|
631
|
+
const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
|
|
632
|
+
Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
|
|
633
|
+
const isNewChartType = formData.chartType !== newPivotFormData.chartType;
|
|
634
|
+
const keepOldChartType = isNewChartType && isPivotSameShape;
|
|
593
635
|
setFormData((formData) => ({
|
|
594
636
|
...formData,
|
|
595
|
-
...
|
|
637
|
+
...newPivotFormData,
|
|
638
|
+
...(keepOldChartType && { chartType: formData.chartType }),
|
|
596
639
|
}));
|
|
597
640
|
};
|
|
598
641
|
const handleDeletePivot = () => {
|
|
599
642
|
if (!formData.pivot) {
|
|
600
643
|
return;
|
|
601
644
|
}
|
|
602
|
-
setFormData({
|
|
645
|
+
setFormData({
|
|
646
|
+
...formEmptyState,
|
|
647
|
+
dashboardName: formData.dashboardName,
|
|
648
|
+
pivot: null,
|
|
649
|
+
});
|
|
603
650
|
};
|
|
604
651
|
const handleAddField = (fieldName) => {
|
|
605
652
|
if (fieldName === 'columns') {
|
|
@@ -760,7 +807,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
760
807
|
setIsOpen(false);
|
|
761
808
|
setIsSubmitting(false);
|
|
762
809
|
if (onAddToDashboardComplete) {
|
|
763
|
-
onAddToDashboardComplete(
|
|
810
|
+
onAddToDashboardComplete({
|
|
811
|
+
...resp,
|
|
812
|
+
rows,
|
|
813
|
+
fieldOptions,
|
|
814
|
+
filtersApplied: dashboardFilters,
|
|
815
|
+
});
|
|
764
816
|
}
|
|
765
817
|
};
|
|
766
818
|
// Prevent horizontal view on small screens.
|
|
@@ -787,13 +839,14 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
787
839
|
display: 'flex',
|
|
788
840
|
flexDirection: 'column',
|
|
789
841
|
gap: '20px',
|
|
790
|
-
height: '100%',
|
|
842
|
+
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
791
843
|
...(isHorizontalView && {
|
|
792
844
|
flexGrow: 1,
|
|
793
|
-
maxWidth: !isOpen ? '100%' :
|
|
845
|
+
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
794
846
|
}),
|
|
847
|
+
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
795
848
|
}, children: [((!isHorizontalView && windowWidth >= 1200) ||
|
|
796
|
-
formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
|
|
849
|
+
formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
797
850
|
width: '100%',
|
|
798
851
|
height: formData.chartType === 'metric'
|
|
799
852
|
? 100
|
|
@@ -812,40 +865,37 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
812
865
|
: formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
813
866
|
display: 'flex',
|
|
814
867
|
flexDirection: 'column',
|
|
815
|
-
height: '100%',
|
|
816
868
|
gap: 20,
|
|
817
869
|
...(isHorizontalView && {
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
870
|
+
height: '100%',
|
|
871
|
+
minWidth: formWidth,
|
|
872
|
+
maxWidth: formWidth,
|
|
873
|
+
width: formWidth,
|
|
821
874
|
}),
|
|
822
875
|
...(windowWidth < 1200 && {
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
876
|
+
width: formWidth,
|
|
877
|
+
paddingTop: modalPadding,
|
|
878
|
+
paddingBottom: modalPadding,
|
|
879
|
+
}),
|
|
880
|
+
}, 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) => {
|
|
881
|
+
handleChange(e.target.value, 'dashboardName');
|
|
882
|
+
await updateDashboardFilters(e.target.value);
|
|
883
|
+
}, options: dashboardOptions.map((elem) => ({
|
|
884
|
+
label: elem.label,
|
|
885
|
+
value: elem.label,
|
|
886
|
+
})), 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'),
|
|
887
|
+
// filter out metric for all pivots
|
|
888
|
+
// filter out bar and pie for row and column pivot
|
|
889
|
+
options: getChartTypeOptions(formData), width: 200 }) })] }), _jsxs("div", { style: {
|
|
835
890
|
display: 'flex',
|
|
836
891
|
flexDirection: 'column',
|
|
837
|
-
gap:
|
|
838
|
-
marginTop: 6,
|
|
892
|
+
gap: 6,
|
|
839
893
|
}, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
|
|
840
894
|
maxWidth: 200,
|
|
841
895
|
// marginTop: 6,
|
|
842
896
|
display: 'flex',
|
|
843
897
|
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: {
|
|
898
|
+
}, 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
899
|
pivot: formData.pivot,
|
|
850
900
|
rows: selectedPivotTable?.rows,
|
|
851
901
|
columns: selectedPivotTable?.columns,
|
|
@@ -856,127 +906,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
856
906
|
setPivotColumnField(formData.pivot?.columnField);
|
|
857
907
|
setPivotValueField(formData.pivot?.valueField);
|
|
858
908
|
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 }) }) }))] })] }),
|
|
909
|
+
setPivotPopUpTitle('Edit pivot');
|
|
910
|
+
}, 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
911
|
display: 'flex',
|
|
862
912
|
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
|
|
913
|
+
}, 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
914
|
? getPivotMetricOptions(formData.pivot)
|
|
871
915
|
: fieldOptions.map((elem) => ({
|
|
872
916
|
label: elem.field,
|
|
873
917
|
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 &&
|
|
918
|
+
})), 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
919
|
isDateField(formData.pivot.rowFieldType)
|
|
878
920
|
? 'pivot_date'
|
|
879
921
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
880
922
|
isDateField(formData.pivot.rowFieldType)
|
|
881
923
|
? [{ 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: {
|
|
924
|
+
: 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
|
|
925
|
+
? formData.pivot.valueField || 'count'
|
|
926
|
+
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
927
|
+
? [
|
|
928
|
+
{
|
|
929
|
+
label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
|
|
930
|
+
value: formData.pivot.valueField ||
|
|
931
|
+
'count',
|
|
932
|
+
},
|
|
933
|
+
]
|
|
934
|
+
: fieldOptions
|
|
935
|
+
.filter((elem) => {
|
|
936
|
+
return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
|
|
937
|
+
})
|
|
938
|
+
.map((elem) => ({
|
|
939
|
+
label: elem.field,
|
|
940
|
+
value: elem.field,
|
|
941
|
+
})), 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
|
|
942
|
+
? NUMBER_OPTIONS.find((option) => {
|
|
943
|
+
return (option.value === yAxisField.format);
|
|
944
|
+
})
|
|
945
|
+
? // @ts-ignore
|
|
946
|
+
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
947
|
+
: ''
|
|
948
|
+
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
949
|
+
? NUMBER_OPTIONS
|
|
950
|
+
: 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
951
|
display: 'flex',
|
|
917
952
|
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: {
|
|
953
|
+
}, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
954
|
+
selectedPivotTable &&
|
|
955
|
+
selectedPivotTable.columns &&
|
|
956
|
+
formData.chartType === 'table'
|
|
957
|
+
? // THIS CASE IF FOR PIVOT TABLES ONLY
|
|
958
|
+
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) => ({
|
|
959
|
+
label: elem.label,
|
|
960
|
+
value: elem.label,
|
|
961
|
+
})), 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:
|
|
962
|
+
// The first index use rowField for the rest of them use value fields
|
|
963
|
+
formData.pivot &&
|
|
964
|
+
column.field === formData.pivot.rowField
|
|
965
|
+
? formData.pivot &&
|
|
966
|
+
isDateField(formData.pivot.rowFieldType)
|
|
967
|
+
? 'pivot_date'
|
|
968
|
+
: 'string'
|
|
969
|
+
: formData.pivot?.valueFieldType ||
|
|
970
|
+
'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
|
|
971
|
+
? isDateField(formData.pivot.rowFieldType)
|
|
972
|
+
? [{ label: 'date', value: 'pivot_date' }]
|
|
973
|
+
: [{ label: 'string', value: 'string' }]
|
|
974
|
+
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
975
|
+
: 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) => ({
|
|
976
|
+
label: elem.field,
|
|
977
|
+
value: elem.field,
|
|
978
|
+
})), 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: !(
|
|
979
|
+
// hide when pivoted and chartType === 'table'
|
|
980
|
+
(formData.pivot &&
|
|
981
|
+
selectedPivotTable &&
|
|
982
|
+
selectedPivotTable.columns &&
|
|
983
|
+
formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
|
|
958
984
|
display: 'flex',
|
|
959
985
|
flexDirection: 'column',
|
|
960
986
|
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: {
|
|
987
|
+
}, 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) => ({
|
|
988
|
+
label: elem.name,
|
|
989
|
+
value: elem.name,
|
|
990
|
+
})), 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
|
|
991
|
+
?.find((elem) => elem.name === formData.dateField?.table)
|
|
992
|
+
?.columns?.map((elem) => ({
|
|
993
|
+
label: elem.name,
|
|
994
|
+
value: elem.name,
|
|
995
|
+
})) || [], width: 200 }) })] })] })), showAccessControlOptions && (_jsxs("div", { style: {
|
|
975
996
|
display: 'flex',
|
|
976
997
|
flexDirection: 'column',
|
|
977
998
|
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: {
|
|
999
|
+
}, 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
1000
|
display: 'flex',
|
|
981
1001
|
flexDirection: 'row',
|
|
982
1002
|
justifyContent: 'flex-end',
|
|
@@ -1060,7 +1080,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
|
|
|
1060
1080
|
padding: '20px',
|
|
1061
1081
|
boxSizing: 'border-box',
|
|
1062
1082
|
overflow: 'scroll',
|
|
1063
|
-
}, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("
|
|
1083
|
+
}, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("div", { style: {
|
|
1064
1084
|
display: 'flex',
|
|
1065
1085
|
flexDirection: 'row',
|
|
1066
1086
|
gap: '12px',
|