@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/cjs/ChartBuilder.js
CHANGED
|
@@ -182,7 +182,7 @@ function ChartBuilderWithModal(props) {
|
|
|
182
182
|
setModalWidth(window.innerWidth - 80);
|
|
183
183
|
}
|
|
184
184
|
else {
|
|
185
|
-
setModalWidth(
|
|
185
|
+
setModalWidth(undefined); // use dynamic width of contents
|
|
186
186
|
}
|
|
187
187
|
setModalHeight(window.innerHeight - 80);
|
|
188
188
|
}
|
|
@@ -192,7 +192,7 @@ function ChartBuilderWithModal(props) {
|
|
|
192
192
|
window.removeEventListener('resize', handleResize);
|
|
193
193
|
};
|
|
194
194
|
}, []);
|
|
195
|
-
return ((0, jsx_runtime_1.jsx)("div", { ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
195
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: { height: '100%' }, ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
|
|
196
196
|
// For isHorizontalView, use full viewport size minus 80px for padding,
|
|
197
197
|
// otherwise use the default layout method of the modal (contents).
|
|
198
198
|
width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }) }));
|
|
@@ -222,14 +222,17 @@ exports.ChartBuilderWithModal = ChartBuilderWithModal;
|
|
|
222
222
|
* ### Chart Builder API
|
|
223
223
|
* @see https://docs.quillsql.com/components/chart-builder
|
|
224
224
|
*/
|
|
225
|
-
function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent, 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, }) {
|
|
225
|
+
function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.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, }) {
|
|
226
226
|
const dateRange = dr || [null, null, null];
|
|
227
227
|
const [client] = (0, react_1.useContext)(Context_1.ClientContext);
|
|
228
228
|
const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
|
|
229
229
|
const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
|
|
230
230
|
const [windowWidth, setWindowWidth] = (0, react_1.useState)(1200);
|
|
231
231
|
const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
|
|
232
|
-
const [
|
|
232
|
+
const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(665);
|
|
233
|
+
const [formWidth, setFormWidth] = (0, react_1.useState)(665);
|
|
234
|
+
const inputRef = (0, react_1.useRef)(null);
|
|
235
|
+
const selectRef = (0, react_1.useRef)(null);
|
|
233
236
|
const { dispatch } = (0, react_1.useContext)(Context_1.DashboardContext);
|
|
234
237
|
const fields = fieldsProp?.map((field) => ({
|
|
235
238
|
field: field.name,
|
|
@@ -239,9 +242,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
239
242
|
})) || [];
|
|
240
243
|
const parentRef = (0, react_1.useRef)(null);
|
|
241
244
|
const deleteRef = (0, react_1.useRef)(null);
|
|
242
|
-
const pivotCardContainer = (0, react_1.useRef)(null);
|
|
243
245
|
const modalPadding = 20;
|
|
244
|
-
const deleteButtonMargin = -
|
|
246
|
+
const deleteButtonMargin = -12;
|
|
245
247
|
(0, react_1.useEffect)(() => {
|
|
246
248
|
const handleResize = () => setWindowWidth(window.innerWidth);
|
|
247
249
|
handleResize();
|
|
@@ -251,58 +253,51 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
251
253
|
};
|
|
252
254
|
}, []);
|
|
253
255
|
(0, react_1.useEffect)(() => {
|
|
254
|
-
const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ??
|
|
255
|
-
240 - 40 ??
|
|
256
|
-
'calc(100% - 40px)';
|
|
257
256
|
const handleResize = () => {
|
|
258
|
-
|
|
259
|
-
|
|
257
|
+
// The pivot card should be the same width as the row of inputs
|
|
258
|
+
// above it (an input, two selects, plus the gaps between them).
|
|
259
|
+
if (inputRef.current && selectRef.current) {
|
|
260
|
+
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
261
|
+
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
262
|
+
const selectWidth = selectSize.width;
|
|
263
|
+
const showDash = showDashboardDropdown && !destinationDashboard;
|
|
264
|
+
const spaceBetween = selectSize.left - inputSize.right;
|
|
265
|
+
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
266
|
+
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
267
|
+
setPivotCardWidth(width);
|
|
268
|
+
// Calculate the form width by adding the width of the delete button
|
|
269
|
+
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
270
|
+
const deleteWidth = deleteSize?.width ?? 0;
|
|
271
|
+
setFormWidth(width + deleteWidth);
|
|
260
272
|
}
|
|
261
273
|
};
|
|
262
274
|
handleResize();
|
|
263
|
-
|
|
264
|
-
return () => {
|
|
265
|
-
window.removeEventListener('resize', handleResize);
|
|
266
|
-
};
|
|
267
|
-
}, [pivotCardContainer]);
|
|
268
|
-
// get schema
|
|
275
|
+
}, [isOpen]);
|
|
269
276
|
(0, react_1.useEffect)(() => {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}),
|
|
287
|
-
});
|
|
288
|
-
const results = await response.json();
|
|
289
|
-
if (isSubscribed) {
|
|
290
|
-
if (results.data?.data) {
|
|
291
|
-
setSchema(results.data.data.tables);
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
setSchema(results.data.tables);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
277
|
+
const handleResize = () => {
|
|
278
|
+
// The pivot card should be the same width as the row of inputs
|
|
279
|
+
// above it (an input, two selects, plus the gaps between them).
|
|
280
|
+
if (inputRef.current && selectRef.current) {
|
|
281
|
+
const inputSize = inputRef.current?.getBoundingClientRect();
|
|
282
|
+
const selectSize = selectRef.current?.getBoundingClientRect();
|
|
283
|
+
const selectWidth = selectSize.width;
|
|
284
|
+
const showDash = showDashboardDropdown && !destinationDashboard;
|
|
285
|
+
const spaceBetween = selectSize.left - inputSize.right;
|
|
286
|
+
const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
|
|
287
|
+
const width = inputSize.width + 2 * gap + 2 * selectWidth;
|
|
288
|
+
setPivotCardWidth(width);
|
|
289
|
+
// Calculate the form width by adding the width of the delete button
|
|
290
|
+
const deleteSize = deleteRef.current?.getBoundingClientRect();
|
|
291
|
+
const deleteWidth = deleteSize?.width ?? 0;
|
|
292
|
+
setFormWidth(width + deleteWidth);
|
|
297
293
|
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
}
|
|
294
|
+
};
|
|
295
|
+
handleResize();
|
|
296
|
+
window.addEventListener('resize', handleResize);
|
|
302
297
|
return () => {
|
|
303
|
-
|
|
298
|
+
window.removeEventListener('resize', handleResize);
|
|
304
299
|
};
|
|
305
|
-
}, [
|
|
300
|
+
}, []);
|
|
306
301
|
// get dashboards
|
|
307
302
|
const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
|
|
308
303
|
const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard || dashboardItem?.dashboardName || '');
|
|
@@ -318,17 +313,18 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
318
313
|
const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
|
|
319
314
|
const [tableName, setTableName] = (0, react_1.useState)(undefined);
|
|
320
315
|
const selectedTable = schema?.find((t) => t.displayName === tableName);
|
|
321
|
-
const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add
|
|
316
|
+
const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
|
|
322
317
|
const [createdPivots, setCreatedPivots] = (0, react_1.useState)(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
|
|
323
318
|
const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)(rp);
|
|
324
|
-
const [pivotRowField, setPivotRowField] = (0, react_1.useState)(
|
|
325
|
-
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(
|
|
326
|
-
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(
|
|
327
|
-
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(
|
|
319
|
+
const [pivotRowField, setPivotRowField] = (0, react_1.useState)(pivot?.rowField);
|
|
320
|
+
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(pivot?.columnField);
|
|
321
|
+
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(pivot?.valueField);
|
|
322
|
+
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(pivot?.aggregationType);
|
|
328
323
|
// initial state is the fields array passed in, but can eventually be changed to be the pivot fields
|
|
329
324
|
const [fieldOptions, setFieldOptions] = (0, react_1.useState)(fields);
|
|
330
325
|
const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
|
|
331
326
|
const [allTables, setAllTables] = (0, react_1.useState)([]);
|
|
327
|
+
const [uniqueValues, setUniqueValues] = (0, react_1.useState)(undefined);
|
|
332
328
|
const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
|
|
333
329
|
table: dateFieldOptions[0]?.name || '',
|
|
334
330
|
field: dateFieldOptions[0]?.columns[0]?.name || '',
|
|
@@ -356,7 +352,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
356
352
|
template: false,
|
|
357
353
|
};
|
|
358
354
|
const updateDashboardFilters = async (dashboardName) => {
|
|
359
|
-
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
355
|
+
const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
|
|
360
356
|
if (queryEndpoint) {
|
|
361
357
|
const response = await fetch(queryEndpoint, {
|
|
362
358
|
method: 'POST',
|
|
@@ -366,7 +362,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
366
362
|
},
|
|
367
363
|
body: JSON.stringify({
|
|
368
364
|
metadata: {
|
|
369
|
-
orgId: '*',
|
|
365
|
+
orgId: customerId || '*',
|
|
370
366
|
task: 'config',
|
|
371
367
|
name: dashboardName,
|
|
372
368
|
clientId: publicKey,
|
|
@@ -383,10 +379,13 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
383
379
|
};
|
|
384
380
|
const pivotFormData = (pivot) => {
|
|
385
381
|
const yAxisField = pivot.columnField || pivot.valueField;
|
|
382
|
+
const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
|
|
383
|
+
? dashboardItem.yAxisFields[0].label
|
|
384
|
+
: pivot.valueField;
|
|
386
385
|
// date labels for pivots should be treated like strings since they are
|
|
387
386
|
// formatted in generatePivotTable
|
|
388
387
|
const yAxisIsDate = pivot.columnField
|
|
389
|
-
? (0, PivotModal_1.isDateField)(pivot.columnFieldType)
|
|
388
|
+
? (0, PivotModal_1.isDateField)(pivot.columnFieldType || '')
|
|
390
389
|
: false;
|
|
391
390
|
const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
|
|
392
391
|
return {
|
|
@@ -397,21 +396,28 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
397
396
|
? 'string'
|
|
398
397
|
: columns.find((col) => col.field === pivot.rowField)?.format ||
|
|
399
398
|
'whole_number',
|
|
400
|
-
xAxisLabel:
|
|
399
|
+
xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
|
|
401
400
|
yAxisFields: [
|
|
402
401
|
{
|
|
403
402
|
field: yAxisField,
|
|
404
|
-
label:
|
|
403
|
+
label: yAxisLabel,
|
|
405
404
|
format: yAxisIsDate
|
|
406
405
|
? 'string'
|
|
407
|
-
:
|
|
408
|
-
|
|
406
|
+
: dashboardItem?.yAxisFields?.length > 0
|
|
407
|
+
? dashboardItem?.yAxisFields[0].format
|
|
408
|
+
: columns.find((col) => col.field === pivot.valueField)?.format ||
|
|
409
|
+
'whole_number',
|
|
409
410
|
},
|
|
410
411
|
],
|
|
411
412
|
};
|
|
412
413
|
};
|
|
413
414
|
const [formData, setFormData] = (0, react_1.useState)(pivot
|
|
414
|
-
? {
|
|
415
|
+
? {
|
|
416
|
+
...formEmptyState,
|
|
417
|
+
...dashboardItem,
|
|
418
|
+
...pivotFormData(pivot),
|
|
419
|
+
...(destinationDashboard && { dashboardName: destinationDashboard }),
|
|
420
|
+
}
|
|
415
421
|
: dashboardItem || formEmptyState);
|
|
416
422
|
(0, react_1.useEffect)(() => {
|
|
417
423
|
async function getFormData() {
|
|
@@ -420,27 +426,49 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
420
426
|
const dashboardOptions = resp.dashboardNames
|
|
421
427
|
.filter((elem) => elem !== null)
|
|
422
428
|
.map((key) => ({ label: key, value: key }));
|
|
423
|
-
await updateDashboardFilters(
|
|
424
|
-
|
|
425
|
-
|
|
429
|
+
await updateDashboardFilters(destinationDashboard ??
|
|
430
|
+
(dashboardItem
|
|
431
|
+
? dashboardItem?.dashboardName
|
|
432
|
+
: dashboardOptions[0]?.label));
|
|
426
433
|
setDashboardOptions(dashboardOptions);
|
|
427
|
-
const dashboardName =
|
|
428
|
-
|
|
429
|
-
|
|
434
|
+
const dashboardName = destinationDashboard ??
|
|
435
|
+
(dashboardItem
|
|
436
|
+
? dashboardItem?.dashboardName
|
|
437
|
+
: dashboardOptions[0]?.label);
|
|
430
438
|
curFormData.dashboardName = dashboardName;
|
|
431
|
-
setDefaultDashboardName(
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
439
|
+
setDefaultDashboardName(destinationDashboard ??
|
|
440
|
+
(dashboardItem
|
|
441
|
+
? dashboardItem?.dashboardName
|
|
442
|
+
: dashboardOptions[0]?.label));
|
|
443
|
+
const { queryEndpoint, queryHeaders, publicKey } = client;
|
|
444
|
+
const response = await fetch(`${queryEndpoint}`, {
|
|
445
|
+
method: 'POST',
|
|
446
|
+
headers: {
|
|
447
|
+
...queryHeaders,
|
|
448
|
+
'Content-Type': 'application/json',
|
|
449
|
+
},
|
|
450
|
+
body: JSON.stringify({
|
|
451
|
+
metadata: {
|
|
452
|
+
clientId: publicKey,
|
|
453
|
+
publicKey: publicKey,
|
|
454
|
+
task: 'schema',
|
|
455
|
+
},
|
|
456
|
+
}),
|
|
457
|
+
});
|
|
458
|
+
const schemaInfo = await response.json();
|
|
459
|
+
let schemaData = schemaInfo.data?.data;
|
|
460
|
+
if (schemaInfo.data?.data) {
|
|
461
|
+
schemaData = schemaInfo.data.data.tables;
|
|
462
|
+
setSchema(schemaInfo.data.data.tables);
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
schemaData = schemaInfo.data.tables;
|
|
466
|
+
setSchema(schemaInfo.data.tables);
|
|
467
|
+
}
|
|
440
468
|
if (!query) {
|
|
441
469
|
return;
|
|
442
470
|
}
|
|
443
|
-
const result = await getReferencedTables(client, query,
|
|
471
|
+
const result = await getReferencedTables(client, query, schemaData, true);
|
|
444
472
|
setDateFieldOptions(result);
|
|
445
473
|
if (result[0] && result[0].columns[0]) {
|
|
446
474
|
setDefaultDateField({
|
|
@@ -448,7 +476,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
448
476
|
field: result[0].columns[0].name,
|
|
449
477
|
});
|
|
450
478
|
}
|
|
451
|
-
const allReferencedFields = await getReferencedTables(client, query,
|
|
479
|
+
const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
|
|
452
480
|
setAllTables(allReferencedFields.map((table) => table.name));
|
|
453
481
|
setTableName(result[0]?.name);
|
|
454
482
|
const dateField = {
|
|
@@ -460,6 +488,9 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
460
488
|
curFormData.dateField = dateField;
|
|
461
489
|
setFormData({
|
|
462
490
|
...curFormData,
|
|
491
|
+
dashboardName: dashboardItem
|
|
492
|
+
? dashboardItem?.dashboardName
|
|
493
|
+
: dashboardOptions[0]?.label,
|
|
463
494
|
});
|
|
464
495
|
}
|
|
465
496
|
getFormData();
|
|
@@ -501,6 +532,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
501
532
|
});
|
|
502
533
|
}
|
|
503
534
|
else {
|
|
535
|
+
if (!rows)
|
|
536
|
+
return [];
|
|
504
537
|
return rows.map((row) => {
|
|
505
538
|
return formData.columns.reduce((formattedRow, column) => {
|
|
506
539
|
// Apply the format function to each field in the row
|
|
@@ -597,16 +630,30 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
597
630
|
}
|
|
598
631
|
};
|
|
599
632
|
const handleAddPivot = (pivot) => {
|
|
633
|
+
const newPivotFormData = pivotFormData(pivot);
|
|
634
|
+
// Only keep the old chart type if the shapes of the pivots are the same
|
|
635
|
+
// since the valid chart types for some pivots might have changed (eg. going
|
|
636
|
+
// from a 1D pivot to a 2D pivot would make bar lists not an option).
|
|
637
|
+
// They don't have to have the same value, just same 'truthiness'.
|
|
638
|
+
const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
|
|
639
|
+
Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
|
|
640
|
+
const isNewChartType = formData.chartType !== newPivotFormData.chartType;
|
|
641
|
+
const keepOldChartType = isNewChartType && isPivotSameShape;
|
|
600
642
|
setFormData((formData) => ({
|
|
601
643
|
...formData,
|
|
602
|
-
...
|
|
644
|
+
...newPivotFormData,
|
|
645
|
+
...(keepOldChartType && { chartType: formData.chartType }),
|
|
603
646
|
}));
|
|
604
647
|
};
|
|
605
648
|
const handleDeletePivot = () => {
|
|
606
649
|
if (!formData.pivot) {
|
|
607
650
|
return;
|
|
608
651
|
}
|
|
609
|
-
setFormData({
|
|
652
|
+
setFormData({
|
|
653
|
+
...formEmptyState,
|
|
654
|
+
dashboardName: formData.dashboardName,
|
|
655
|
+
pivot: null,
|
|
656
|
+
});
|
|
610
657
|
};
|
|
611
658
|
const handleAddField = (fieldName) => {
|
|
612
659
|
if (fieldName === 'columns') {
|
|
@@ -767,7 +814,12 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
767
814
|
setIsOpen(false);
|
|
768
815
|
setIsSubmitting(false);
|
|
769
816
|
if (onAddToDashboardComplete) {
|
|
770
|
-
onAddToDashboardComplete(
|
|
817
|
+
onAddToDashboardComplete({
|
|
818
|
+
...resp,
|
|
819
|
+
rows,
|
|
820
|
+
fieldOptions,
|
|
821
|
+
filtersApplied: dashboardFilters,
|
|
822
|
+
});
|
|
771
823
|
}
|
|
772
824
|
};
|
|
773
825
|
// Prevent horizontal view on small screens.
|
|
@@ -794,13 +846,14 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
794
846
|
display: 'flex',
|
|
795
847
|
flexDirection: 'column',
|
|
796
848
|
gap: '20px',
|
|
797
|
-
height: '100%',
|
|
849
|
+
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
798
850
|
...(isHorizontalView && {
|
|
799
851
|
flexGrow: 1,
|
|
800
|
-
maxWidth: !isOpen ? '100%' :
|
|
852
|
+
maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
801
853
|
}),
|
|
854
|
+
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
802
855
|
}, children: [((!isHorizontalView && windowWidth >= 1200) ||
|
|
803
|
-
formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
|
|
856
|
+
formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
|
|
804
857
|
width: '100%',
|
|
805
858
|
height: formData.chartType === 'metric'
|
|
806
859
|
? 100
|
|
@@ -819,40 +872,37 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
819
872
|
: formData.columns })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
820
873
|
display: 'flex',
|
|
821
874
|
flexDirection: 'column',
|
|
822
|
-
height: '100%',
|
|
823
875
|
gap: 20,
|
|
824
876
|
...(isHorizontalView && {
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
877
|
+
height: '100%',
|
|
878
|
+
minWidth: formWidth,
|
|
879
|
+
maxWidth: formWidth,
|
|
880
|
+
width: formWidth,
|
|
828
881
|
}),
|
|
829
882
|
...(windowWidth < 1200 && {
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
883
|
+
width: formWidth,
|
|
884
|
+
paddingTop: modalPadding,
|
|
885
|
+
paddingBottom: modalPadding,
|
|
886
|
+
}),
|
|
887
|
+
}, children: [(0, jsx_runtime_1.jsxs)(FormContainer, { children: [(0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboard && ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
|
|
888
|
+
handleChange(e.target.value, 'dashboardName');
|
|
889
|
+
await updateDashboardFilters(e.target.value);
|
|
890
|
+
}, options: dashboardOptions.map((elem) => ({
|
|
891
|
+
label: elem.label,
|
|
892
|
+
value: elem.label,
|
|
893
|
+
})), width: 200 }) })), (0, jsx_runtime_1.jsx)("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
|
|
894
|
+
// filter out metric for all pivots
|
|
895
|
+
// filter out bar and pie for row and column pivot
|
|
896
|
+
options: getChartTypeOptions(formData), width: 200 }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
842
897
|
display: 'flex',
|
|
843
898
|
flexDirection: 'column',
|
|
844
|
-
gap:
|
|
845
|
-
marginTop: 6,
|
|
899
|
+
gap: 6,
|
|
846
900
|
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsxs)("div", { style: { fontFamily: theme?.fontFamily }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
|
|
847
901
|
maxWidth: 200,
|
|
848
902
|
// marginTop: 6,
|
|
849
903
|
display: 'flex',
|
|
850
904
|
flexDirection: 'column',
|
|
851
|
-
}, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", {
|
|
852
|
-
width: !isHorizontalView
|
|
853
|
-
? divWidth
|
|
854
|
-
: 'calc(100% - 40px)',
|
|
855
|
-
}, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
|
|
905
|
+
}, children: (0, jsx_runtime_1.jsx)(PivotModal_1.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 && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
|
|
856
906
|
pivot: formData.pivot,
|
|
857
907
|
rows: selectedPivotTable?.rows,
|
|
858
908
|
columns: selectedPivotTable?.columns,
|
|
@@ -863,127 +913,97 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
|
|
|
863
913
|
setPivotColumnField(formData.pivot?.columnField);
|
|
864
914
|
setPivotValueField(formData.pivot?.valueField);
|
|
865
915
|
setPivotAggregation(formData.pivot?.aggregationType);
|
|
866
|
-
setPivotPopUpTitle('Edit
|
|
867
|
-
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (
|
|
916
|
+
setPivotPopUpTitle('Edit pivot');
|
|
917
|
+
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
868
918
|
display: 'flex',
|
|
869
919
|
flexDirection: 'column',
|
|
870
|
-
|
|
871
|
-
marginTop: 6,
|
|
872
|
-
}, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
873
|
-
display: 'flex',
|
|
874
|
-
flexDirection: 'row',
|
|
875
|
-
gap: 12,
|
|
876
|
-
}, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
920
|
+
}, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
877
921
|
? getPivotMetricOptions(formData.pivot)
|
|
878
922
|
: fieldOptions.map((elem) => ({
|
|
879
923
|
label: elem.field,
|
|
880
924
|
value: elem.field,
|
|
881
|
-
})), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
|
|
882
|
-
? formData.pivot.rowField
|
|
883
|
-
: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot &&
|
|
925
|
+
})), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot &&
|
|
884
926
|
(0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
|
|
885
927
|
? 'pivot_date'
|
|
886
928
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
887
929
|
(0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
|
|
888
930
|
? [{ value: 'pivot_date', label: 'date' }]
|
|
889
|
-
: formatOptions, width: 200 })] }
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
.
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
})
|
|
917
|
-
? // @ts-ignore
|
|
918
|
-
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
919
|
-
: 'whole_number'
|
|
920
|
-
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
921
|
-
? NUMBER_OPTIONS
|
|
922
|
-
: formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), (0, jsx_runtime_1.jsx)("br", {})] })), showTableFormatOptions && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
|
|
931
|
+
: formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
|
|
932
|
+
? formData.pivot.valueField || 'count'
|
|
933
|
+
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
934
|
+
? [
|
|
935
|
+
{
|
|
936
|
+
label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
|
|
937
|
+
value: formData.pivot.valueField ||
|
|
938
|
+
'count',
|
|
939
|
+
},
|
|
940
|
+
]
|
|
941
|
+
: fieldOptions
|
|
942
|
+
.filter((elem) => {
|
|
943
|
+
return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
|
|
944
|
+
})
|
|
945
|
+
.map((elem) => ({
|
|
946
|
+
label: elem.field,
|
|
947
|
+
value: elem.field,
|
|
948
|
+
})), width: 200 }), (0, jsx_runtime_1.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) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
|
|
949
|
+
? NUMBER_OPTIONS.find((option) => {
|
|
950
|
+
return (option.value === yAxisField.format);
|
|
951
|
+
})
|
|
952
|
+
? // @ts-ignore
|
|
953
|
+
NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
|
|
954
|
+
: ''
|
|
955
|
+
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
956
|
+
? NUMBER_OPTIONS
|
|
957
|
+
: formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
|
|
923
958
|
display: 'flex',
|
|
924
959
|
flexDirection: 'column',
|
|
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
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
957
|
-
: formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
958
|
-
display: 'flex',
|
|
959
|
-
flexDirection: 'row',
|
|
960
|
-
gap: 12,
|
|
961
|
-
}, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
|
|
962
|
-
label: elem.field,
|
|
963
|
-
value: elem.field,
|
|
964
|
-
})), width: 200 }), (0, jsx_runtime_1.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) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {})] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
960
|
+
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
961
|
+
selectedPivotTable &&
|
|
962
|
+
selectedPivotTable.columns &&
|
|
963
|
+
formData.chartType === 'table'
|
|
964
|
+
? // THIS CASE IF FOR PIVOT TABLES ONLY
|
|
965
|
+
selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
|
|
966
|
+
label: elem.label,
|
|
967
|
+
value: elem.label,
|
|
968
|
+
})), width: 200 }), (0, jsx_runtime_1.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) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value:
|
|
969
|
+
// The first index use rowField for the rest of them use value fields
|
|
970
|
+
formData.pivot &&
|
|
971
|
+
column.field === formData.pivot.rowField
|
|
972
|
+
? formData.pivot &&
|
|
973
|
+
(0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
|
|
974
|
+
? 'pivot_date'
|
|
975
|
+
: 'string'
|
|
976
|
+
: formData.pivot?.valueFieldType ||
|
|
977
|
+
'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
|
|
978
|
+
? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
|
|
979
|
+
? [{ label: 'date', value: 'pivot_date' }]
|
|
980
|
+
: [{ label: 'string', value: 'string' }]
|
|
981
|
+
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
982
|
+
: formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: columns.map((elem) => ({
|
|
983
|
+
label: elem.field,
|
|
984
|
+
value: elem.field,
|
|
985
|
+
})), width: 200 }), (0, jsx_runtime_1.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) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), (0, jsx_runtime_1.jsx)("div", { children: !(
|
|
986
|
+
// hide when pivoted and chartType === 'table'
|
|
987
|
+
(formData.pivot &&
|
|
988
|
+
selectedPivotTable &&
|
|
989
|
+
selectedPivotTable.columns &&
|
|
990
|
+
formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
965
991
|
display: 'flex',
|
|
966
992
|
flexDirection: 'column',
|
|
967
993
|
gap: 6,
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
?.find((elem) => elem.name === formData.dateField?.table)
|
|
978
|
-
?.columns?.map((elem) => ({
|
|
979
|
-
label: elem.name,
|
|
980
|
-
value: elem.name,
|
|
981
|
-
})) || [], width: 200 })] })] }), (0, jsx_runtime_1.jsx)("br", {})] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
994
|
+
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Date field" }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
|
|
995
|
+
label: elem.name,
|
|
996
|
+
value: elem.name,
|
|
997
|
+
})), width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Field", value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
|
|
998
|
+
?.find((elem) => elem.name === formData.dateField?.table)
|
|
999
|
+
?.columns?.map((elem) => ({
|
|
1000
|
+
label: elem.name,
|
|
1001
|
+
value: elem.name,
|
|
1002
|
+
})) || [], width: 200 }) })] })] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
982
1003
|
display: 'flex',
|
|
983
1004
|
flexDirection: 'column',
|
|
984
1005
|
gap: 12,
|
|
985
|
-
|
|
986
|
-
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
1006
|
+
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template || !organizationName, theme: theme, organizationName: organizationName })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
987
1007
|
display: 'flex',
|
|
988
1008
|
flexDirection: 'row',
|
|
989
1009
|
justifyContent: 'flex-end',
|
|
@@ -1068,7 +1088,7 @@ function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent = UiCo
|
|
|
1068
1088
|
padding: '20px',
|
|
1069
1089
|
boxSizing: 'border-box',
|
|
1070
1090
|
overflow: 'scroll',
|
|
1071
|
-
}, children: [issues.map((issue, index) => ((0, jsx_runtime_1.jsx)("span", { style: { paddingTop: '10px' }, children: issue }, issue))), (0, jsx_runtime_1.jsx)("
|
|
1091
|
+
}, children: [issues.map((issue, index) => ((0, jsx_runtime_1.jsx)("span", { style: { paddingTop: '10px' }, children: issue }, issue))), (0, jsx_runtime_1.jsx)("div", { style: {
|
|
1072
1092
|
display: 'flex',
|
|
1073
1093
|
flexDirection: 'row',
|
|
1074
1094
|
gap: '12px',
|