@quillsql/react 2.11.21 → 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 +235 -201
- package/dist/cjs/ChartEditor.d.ts +49 -2
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +9 -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 +59 -2
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +979 -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 +237 -203
- package/dist/esm/ChartEditor.d.ts +49 -2
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +10 -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 +59 -2
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +981 -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';
|
|
@@ -171,7 +171,13 @@ export function ChartBuilderWithModal(props) {
|
|
|
171
171
|
const Modal = props.ModalComponent ?? MemoizedModal;
|
|
172
172
|
useEffect(() => {
|
|
173
173
|
function handleResize() {
|
|
174
|
-
|
|
174
|
+
const screenSize = window.innerWidth;
|
|
175
|
+
if (screenSize >= 1200) {
|
|
176
|
+
setModalWidth(window.innerWidth - 80);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
setModalWidth(undefined); // use dynamic width of contents
|
|
180
|
+
}
|
|
175
181
|
setModalHeight(window.innerHeight - 80);
|
|
176
182
|
}
|
|
177
183
|
handleResize();
|
|
@@ -180,7 +186,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
180
186
|
window.removeEventListener('resize', handleResize);
|
|
181
187
|
};
|
|
182
188
|
}, []);
|
|
183
|
-
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',
|
|
184
190
|
// For isHorizontalView, use full viewport size minus 80px for padding,
|
|
185
191
|
// otherwise use the default layout method of the modal (contents).
|
|
186
192
|
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
|
|
@@ -209,14 +215,17 @@ export function ChartBuilderWithModal(props) {
|
|
|
209
215
|
* ### Chart Builder API
|
|
210
216
|
* @see https://docs.quillsql.com/components/chart-builder
|
|
211
217
|
*/
|
|
212
|
-
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, }) {
|
|
213
219
|
const dateRange = dr || [null, null, null];
|
|
214
220
|
const [client] = useContext(ClientContext);
|
|
215
221
|
const [theme] = useContext(ThemeContext);
|
|
216
222
|
const [schema, setSchema] = useContext(SchemaContext);
|
|
217
223
|
const [windowWidth, setWindowWidth] = useState(1200);
|
|
218
224
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
219
|
-
const [
|
|
225
|
+
const [pivotCardWidth, setPivotCardWidth] = useState(665);
|
|
226
|
+
const [formWidth, setFormWidth] = useState(665);
|
|
227
|
+
const inputRef = useRef(null);
|
|
228
|
+
const selectRef = useRef(null);
|
|
220
229
|
const { dispatch } = useContext(DashboardContext);
|
|
221
230
|
const fields = fieldsProp?.map((field) => ({
|
|
222
231
|
field: field.name,
|
|
@@ -226,9 +235,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
226
235
|
})) || [];
|
|
227
236
|
const parentRef = useRef(null);
|
|
228
237
|
const deleteRef = useRef(null);
|
|
229
|
-
const pivotCardContainer = useRef(null);
|
|
230
238
|
const modalPadding = 20;
|
|
231
|
-
const deleteButtonMargin = -
|
|
239
|
+
const deleteButtonMargin = -12;
|
|
232
240
|
useEffect(() => {
|
|
233
241
|
const handleResize = () => setWindowWidth(window.innerWidth);
|
|
234
242
|
handleResize();
|
|
@@ -238,56 +246,51 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
238
246
|
};
|
|
239
247
|
}, []);
|
|
240
248
|
useEffect(() => {
|
|
241
|
-
const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ?? 'auto';
|
|
242
249
|
const handleResize = () => {
|
|
243
|
-
|
|
244
|
-
|
|
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);
|
|
245
265
|
}
|
|
246
266
|
};
|
|
247
267
|
handleResize();
|
|
248
|
-
|
|
249
|
-
return () => {
|
|
250
|
-
window.removeEventListener('resize', handleResize);
|
|
251
|
-
};
|
|
252
|
-
}, [pivotCardContainer]);
|
|
253
|
-
// get schema
|
|
268
|
+
}, [isOpen]);
|
|
254
269
|
useEffect(() => {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}),
|
|
272
|
-
});
|
|
273
|
-
const results = await response.json();
|
|
274
|
-
if (isSubscribed) {
|
|
275
|
-
if (results.data?.data) {
|
|
276
|
-
setSchema(results.data.data.tables);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
setSchema(results.data.tables);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
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);
|
|
282
286
|
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
+
};
|
|
288
|
+
handleResize();
|
|
289
|
+
window.addEventListener('resize', handleResize);
|
|
287
290
|
return () => {
|
|
288
|
-
|
|
291
|
+
window.removeEventListener('resize', handleResize);
|
|
289
292
|
};
|
|
290
|
-
}, [
|
|
293
|
+
}, []);
|
|
291
294
|
// get dashboards
|
|
292
295
|
const [dashboardOptions, setDashboardOptions] = useState([]);
|
|
293
296
|
const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || dashboardItem?.dashboardName || '');
|
|
@@ -303,17 +306,18 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
303
306
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
304
307
|
const [tableName, setTableName] = useState(undefined);
|
|
305
308
|
const selectedTable = schema?.find((t) => t.displayName === tableName);
|
|
306
|
-
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add
|
|
309
|
+
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
307
310
|
const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
|
|
308
311
|
const [recommendedPivots, setRecommendedPivots] = useState(rp);
|
|
309
|
-
const [pivotRowField, setPivotRowField] = useState(
|
|
310
|
-
const [pivotColumnField, setPivotColumnField] = useState(
|
|
311
|
-
const [pivotValueField, setPivotValueField] = useState(
|
|
312
|
-
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);
|
|
313
316
|
// initial state is the fields array passed in, but can eventually be changed to be the pivot fields
|
|
314
317
|
const [fieldOptions, setFieldOptions] = useState(fields);
|
|
315
318
|
const [dateFieldOptions, setDateFieldOptions] = useState([]);
|
|
316
319
|
const [allTables, setAllTables] = useState([]);
|
|
320
|
+
const [uniqueValues, setUniqueValues] = useState(undefined);
|
|
317
321
|
const [defaultDateField, setDefaultDateField] = useState({
|
|
318
322
|
table: dateFieldOptions[0]?.name || '',
|
|
319
323
|
field: dateFieldOptions[0]?.columns[0]?.name || '',
|
|
@@ -341,7 +345,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
341
345
|
template: false,
|
|
342
346
|
};
|
|
343
347
|
const updateDashboardFilters = async (dashboardName) => {
|
|
344
|
-
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
348
|
+
const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
|
|
345
349
|
if (queryEndpoint) {
|
|
346
350
|
const response = await fetch(queryEndpoint, {
|
|
347
351
|
method: 'POST',
|
|
@@ -351,7 +355,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
351
355
|
},
|
|
352
356
|
body: JSON.stringify({
|
|
353
357
|
metadata: {
|
|
354
|
-
orgId: '*',
|
|
358
|
+
orgId: customerId || '*',
|
|
355
359
|
task: 'config',
|
|
356
360
|
name: dashboardName,
|
|
357
361
|
clientId: publicKey,
|
|
@@ -368,10 +372,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
368
372
|
};
|
|
369
373
|
const pivotFormData = (pivot) => {
|
|
370
374
|
const yAxisField = pivot.columnField || pivot.valueField;
|
|
375
|
+
const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
|
|
376
|
+
? dashboardItem.yAxisFields[0].label
|
|
377
|
+
: pivot.valueField;
|
|
371
378
|
// date labels for pivots should be treated like strings since they are
|
|
372
379
|
// formatted in generatePivotTable
|
|
373
380
|
const yAxisIsDate = pivot.columnField
|
|
374
|
-
? isDateField(pivot.columnFieldType)
|
|
381
|
+
? isDateField(pivot.columnFieldType || '')
|
|
375
382
|
: false;
|
|
376
383
|
const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
|
|
377
384
|
return {
|
|
@@ -382,21 +389,28 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
382
389
|
? 'string'
|
|
383
390
|
: columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
384
391
|
'whole_number',
|
|
385
|
-
xAxisLabel:
|
|
392
|
+
xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
|
|
386
393
|
yAxisFields: [
|
|
387
394
|
{
|
|
388
395
|
field: yAxisField,
|
|
389
|
-
label:
|
|
396
|
+
label: yAxisLabel,
|
|
390
397
|
format: yAxisIsDate
|
|
391
398
|
? 'string'
|
|
392
|
-
:
|
|
393
|
-
|
|
399
|
+
: dashboardItem?.yAxisFields?.length > 0
|
|
400
|
+
? dashboardItem?.yAxisFields[0].format
|
|
401
|
+
: columns.find((col) => col.field === pivot.valueField)?.format ||
|
|
402
|
+
'whole_number',
|
|
394
403
|
},
|
|
395
404
|
],
|
|
396
405
|
};
|
|
397
406
|
};
|
|
398
407
|
const [formData, setFormData] = useState(pivot
|
|
399
|
-
? {
|
|
408
|
+
? {
|
|
409
|
+
...formEmptyState,
|
|
410
|
+
...dashboardItem,
|
|
411
|
+
...pivotFormData(pivot),
|
|
412
|
+
...(destinationDashboard && { dashboardName: destinationDashboard }),
|
|
413
|
+
}
|
|
400
414
|
: dashboardItem || formEmptyState);
|
|
401
415
|
useEffect(() => {
|
|
402
416
|
async function getFormData() {
|
|
@@ -405,27 +419,46 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
405
419
|
const dashboardOptions = resp.dashboardNames
|
|
406
420
|
.filter((elem) => elem !== null)
|
|
407
421
|
.map((key) => ({ label: key, value: key }));
|
|
408
|
-
await updateDashboardFilters(dashboardItem
|
|
422
|
+
await updateDashboardFilters(destinationDashboard ?? dashboardItem
|
|
409
423
|
? dashboardItem.dashboardName
|
|
410
424
|
: dashboardOptions[0]?.label);
|
|
411
425
|
setDashboardOptions(dashboardOptions);
|
|
412
|
-
const dashboardName = dashboardItem
|
|
426
|
+
const dashboardName = destinationDashboard ?? dashboardItem
|
|
413
427
|
? dashboardItem?.dashboardName
|
|
414
428
|
: dashboardOptions[0]?.label;
|
|
415
429
|
curFormData.dashboardName = dashboardName;
|
|
416
|
-
setDefaultDashboardName(dashboardItem
|
|
430
|
+
setDefaultDashboardName(destinationDashboard ?? dashboardItem
|
|
417
431
|
? dashboardItem?.dashboardName
|
|
418
432
|
: dashboardOptions[0]?.label);
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
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
|
+
}
|
|
425
458
|
if (!query) {
|
|
426
459
|
return;
|
|
427
460
|
}
|
|
428
|
-
const result = await getReferencedTables(client, query,
|
|
461
|
+
const result = await getReferencedTables(client, query, schemaData, true);
|
|
429
462
|
setDateFieldOptions(result);
|
|
430
463
|
if (result[0] && result[0].columns[0]) {
|
|
431
464
|
setDefaultDateField({
|
|
@@ -433,7 +466,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
433
466
|
field: result[0].columns[0].name,
|
|
434
467
|
});
|
|
435
468
|
}
|
|
436
|
-
const allReferencedFields = await getReferencedTables(client, query,
|
|
469
|
+
const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
|
|
437
470
|
setAllTables(allReferencedFields.map((table) => table.name));
|
|
438
471
|
setTableName(result[0]?.name);
|
|
439
472
|
const dateField = {
|
|
@@ -445,6 +478,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
445
478
|
curFormData.dateField = dateField;
|
|
446
479
|
setFormData({
|
|
447
480
|
...curFormData,
|
|
481
|
+
dashboardName: dashboardItem
|
|
482
|
+
? dashboardItem?.dashboardName
|
|
483
|
+
: dashboardOptions[0]?.label,
|
|
448
484
|
});
|
|
449
485
|
}
|
|
450
486
|
getFormData();
|
|
@@ -486,6 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
486
522
|
});
|
|
487
523
|
}
|
|
488
524
|
else {
|
|
525
|
+
if (!rows)
|
|
526
|
+
return [];
|
|
489
527
|
return rows.map((row) => {
|
|
490
528
|
return formData.columns.reduce((formattedRow, column) => {
|
|
491
529
|
// Apply the format function to each field in the row
|
|
@@ -582,16 +620,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
582
620
|
}
|
|
583
621
|
};
|
|
584
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;
|
|
585
632
|
setFormData((formData) => ({
|
|
586
633
|
...formData,
|
|
587
|
-
...
|
|
634
|
+
...newPivotFormData,
|
|
635
|
+
...(keepOldChartType && { chartType: formData.chartType }),
|
|
588
636
|
}));
|
|
589
637
|
};
|
|
590
638
|
const handleDeletePivot = () => {
|
|
591
639
|
if (!formData.pivot) {
|
|
592
640
|
return;
|
|
593
641
|
}
|
|
594
|
-
setFormData({
|
|
642
|
+
setFormData({
|
|
643
|
+
...formEmptyState,
|
|
644
|
+
dashboardName: formData.dashboardName,
|
|
645
|
+
pivot: null,
|
|
646
|
+
});
|
|
595
647
|
};
|
|
596
648
|
const handleAddField = (fieldName) => {
|
|
597
649
|
if (fieldName === 'columns') {
|
|
@@ -752,7 +804,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
752
804
|
setIsOpen(false);
|
|
753
805
|
setIsSubmitting(false);
|
|
754
806
|
if (onAddToDashboardComplete) {
|
|
755
|
-
onAddToDashboardComplete(
|
|
807
|
+
onAddToDashboardComplete({
|
|
808
|
+
...resp,
|
|
809
|
+
rows,
|
|
810
|
+
fieldOptions,
|
|
811
|
+
filtersApplied: dashboardFilters,
|
|
812
|
+
});
|
|
756
813
|
}
|
|
757
814
|
};
|
|
758
815
|
// Prevent horizontal view on small screens.
|
|
@@ -779,56 +836,63 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
779
836
|
display: 'flex',
|
|
780
837
|
flexDirection: 'column',
|
|
781
838
|
gap: '20px',
|
|
839
|
+
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
782
840
|
...(isHorizontalView && {
|
|
783
841
|
flexGrow: 1,
|
|
784
|
-
maxWidth: !isOpen ? '100%' :
|
|
842
|
+
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
785
843
|
}),
|
|
786
|
-
|
|
844
|
+
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
845
|
+
}, children: [((!isHorizontalView && windowWidth >= 1200) ||
|
|
846
|
+
formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
787
847
|
width: '100%',
|
|
788
848
|
height: formData.chartType === 'metric'
|
|
789
849
|
? 100
|
|
790
|
-
: isHorizontalView
|
|
850
|
+
: isHorizontalView || !isOpen
|
|
791
851
|
? 'calc(50% - 10px)'
|
|
792
852
|
: 400,
|
|
793
853
|
...(isHorizontalView && { flexGrow: 1 }),
|
|
794
854
|
} })),
|
|
795
855
|
// Make sure to display non-pivoted table when using pivot chart
|
|
796
|
-
isHorizontalView && (_jsx("div", { style: {
|
|
856
|
+
(isHorizontalView || windowWidth < 1200) && (_jsx("div", { style: {
|
|
797
857
|
width: '100%',
|
|
798
|
-
height: 'calc(50% - 10px)',
|
|
858
|
+
height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
|
|
799
859
|
flexGrow: 1,
|
|
800
860
|
}, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
801
861
|
? selectedPivotTable.columns
|
|
802
862
|
: formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
803
863
|
display: 'flex',
|
|
804
864
|
flexDirection: 'column',
|
|
805
|
-
|
|
865
|
+
gap: 20,
|
|
806
866
|
...(isHorizontalView && {
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
867
|
+
height: '100%',
|
|
868
|
+
minWidth: formWidth,
|
|
869
|
+
maxWidth: formWidth,
|
|
870
|
+
width: formWidth,
|
|
811
871
|
}),
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
872
|
+
...(windowWidth < 1200 && {
|
|
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: {
|
|
822
887
|
display: 'flex',
|
|
823
888
|
flexDirection: 'column',
|
|
824
|
-
gap:
|
|
825
|
-
marginTop: 6,
|
|
889
|
+
gap: 6,
|
|
826
890
|
}, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
|
|
827
891
|
maxWidth: 200,
|
|
828
892
|
// marginTop: 6,
|
|
829
893
|
display: 'flex',
|
|
830
894
|
flexDirection: 'column',
|
|
831
|
-
}, 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", {
|
|
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: {
|
|
832
896
|
pivot: formData.pivot,
|
|
833
897
|
rows: selectedPivotTable?.rows,
|
|
834
898
|
columns: selectedPivotTable?.columns,
|
|
@@ -839,127 +903,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
|
|
|
839
903
|
setPivotColumnField(formData.pivot?.columnField);
|
|
840
904
|
setPivotValueField(formData.pivot?.valueField);
|
|
841
905
|
setPivotAggregation(formData.pivot?.aggregationType);
|
|
842
|
-
setPivotPopUpTitle('Edit
|
|
843
|
-
}, 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: {
|
|
844
908
|
display: 'flex',
|
|
845
909
|
flexDirection: 'column',
|
|
846
|
-
|
|
847
|
-
marginTop: 6,
|
|
848
|
-
}, 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: {
|
|
849
|
-
display: 'flex',
|
|
850
|
-
flexDirection: 'row',
|
|
851
|
-
gap: 12,
|
|
852
|
-
}, 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
|
|
853
911
|
? getPivotMetricOptions(formData.pivot)
|
|
854
912
|
: fieldOptions.map((elem) => ({
|
|
855
913
|
label: elem.field,
|
|
856
914
|
value: elem.field,
|
|
857
|
-
})), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
|
|
858
|
-
? formData.pivot.rowField
|
|
859
|
-
: 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 &&
|
|
860
916
|
isDateField(formData.pivot.rowFieldType)
|
|
861
917
|
? 'pivot_date'
|
|
862
918
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
863
919
|
isDateField(formData.pivot.rowFieldType)
|
|
864
920
|
? [{ value: 'pivot_date', label: 'date' }]
|
|
865
|
-
: formatOptions, width: 200 })] }
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
.
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
})
|
|
893
|
-
? // @ts-ignore
|
|
894
|
-
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
895
|
-
: 'whole_number'
|
|
896
|
-
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
897
|
-
? NUMBER_OPTIONS
|
|
898
|
-
: 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", {})] })), isHorizontalView && (_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: {
|
|
899
948
|
display: 'flex',
|
|
900
949
|
flexDirection: 'column',
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
933
|
-
: formData.columns.map((column, index) => (_jsxs("div", { style: {
|
|
934
|
-
display: 'flex',
|
|
935
|
-
flexDirection: 'row',
|
|
936
|
-
gap: 12,
|
|
937
|
-
}, children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
|
|
938
|
-
label: elem.field,
|
|
939
|
-
value: elem.field,
|
|
940
|
-
})), 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: {
|
|
941
981
|
display: 'flex',
|
|
942
982
|
flexDirection: 'column',
|
|
943
983
|
gap: 6,
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
?.find((elem) => elem.name === formData.dateField?.table)
|
|
954
|
-
?.columns?.map((elem) => ({
|
|
955
|
-
label: elem.name,
|
|
956
|
-
value: elem.name,
|
|
957
|
-
})) || [], 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: {
|
|
958
993
|
display: 'flex',
|
|
959
994
|
flexDirection: 'column',
|
|
960
995
|
gap: 12,
|
|
961
|
-
|
|
962
|
-
}, 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: {
|
|
963
997
|
display: 'flex',
|
|
964
998
|
flexDirection: 'row',
|
|
965
999
|
justifyContent: 'flex-end',
|
|
@@ -1043,7 +1077,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
|
|
|
1043
1077
|
padding: '20px',
|
|
1044
1078
|
boxSizing: 'border-box',
|
|
1045
1079
|
overflow: 'scroll',
|
|
1046
|
-
}, 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: {
|
|
1047
1081
|
display: 'flex',
|
|
1048
1082
|
flexDirection: 'row',
|
|
1049
1083
|
gap: '12px',
|