@quillsql/react 2.13.40 → 2.13.41
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 +5 -1
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +51 -28
- package/dist/cjs/ChartBuilder.d.ts +13 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +342 -138
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +11 -1
- package/dist/cjs/Context.d.ts +16 -4
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +57 -38
- package/dist/cjs/Dashboard.d.ts +6 -3
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +70 -28
- package/dist/cjs/QuillProvider.d.ts +4 -8
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.d.ts +1 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +117 -45
- package/dist/cjs/SQLEditor.d.ts +7 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +53 -9
- package/dist/cjs/Table.d.ts +21 -1
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +30 -192
- package/dist/cjs/components/Chart/BarChart.d.ts +5 -1
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +4 -3
- package/dist/cjs/components/Chart/CustomReferenceLine.d.ts +2 -0
- package/dist/cjs/components/Chart/CustomReferenceLine.d.ts.map +1 -0
- package/dist/cjs/components/Chart/CustomReferenceLine.js +26 -0
- package/dist/cjs/components/Chart/GaugeChart.d.ts +11 -0
- package/dist/cjs/components/Chart/GaugeChart.d.ts.map +1 -0
- package/dist/cjs/components/Chart/GaugeChart.js +198 -0
- package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/InternalChart.js +14 -11
- package/dist/cjs/components/Chart/LineChart.d.ts +5 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +4 -3
- package/dist/cjs/components/Chart/MapChart.d.ts +36 -0
- package/dist/cjs/components/Chart/MapChart.d.ts.map +1 -0
- package/dist/cjs/components/Chart/MapChart.js +548 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +114 -42
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +57 -54
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +5 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +5 -4
- package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +12 -11
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +2 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +13 -13
- package/dist/cjs/components/ReportBuilder/FilterStack.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/FilterStack.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterStack.js +4 -4
- package/dist/cjs/components/ReportBuilder/convert.d.ts +2 -0
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +28 -7
- 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 +15 -2
- package/dist/cjs/components/UiComponents.d.ts +4 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +31 -5
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +11 -9
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +18 -4
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +16 -3
- package/dist/cjs/hooks/useReport.d.ts.map +1 -1
- package/dist/cjs/hooks/useReport.js +1 -7
- package/dist/cjs/hooks/useVirtualTables.d.ts +6 -2
- package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
- package/dist/cjs/hooks/useVirtualTables.js +5 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +6 -7
- package/dist/cjs/models/Filter.d.ts +20 -13
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +161 -87
- package/dist/cjs/models/Report.d.ts +12 -1
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/models/Schema.d.ts +12 -1
- package/dist/cjs/models/Schema.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +22 -22
- package/dist/cjs/utils/astProcessing.d.ts +2 -2
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +25 -6
- package/dist/cjs/utils/axisFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/axisFormatter.js +25 -0
- package/dist/cjs/utils/color.d.ts +159 -0
- package/dist/cjs/utils/color.d.ts.map +1 -1
- package/dist/cjs/utils/color.js +14 -5
- package/dist/cjs/utils/columnProcessing.js +3 -3
- package/dist/cjs/utils/constants.d.ts +1 -0
- package/dist/cjs/utils/constants.d.ts.map +1 -1
- package/dist/cjs/utils/constants.js +2 -1
- package/dist/cjs/utils/dashboard.d.ts +13 -3
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +73 -16
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +3 -1
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +9 -9
- package/dist/cjs/utils/getDomain.d.ts +4 -1
- package/dist/cjs/utils/getDomain.d.ts.map +1 -1
- package/dist/cjs/utils/getDomain.js +11 -1
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +5 -5
- package/dist/cjs/utils/queryConstructor.d.ts +1 -1
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +71 -43
- package/dist/cjs/utils/report.d.ts +23 -5
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +28 -8
- package/dist/cjs/utils/schema.d.ts +26 -3
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +75 -43
- package/dist/cjs/utils/tableProcessing.d.ts +10 -3
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +4 -6
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/textProcessing.js +0 -1
- package/dist/esm/Chart.d.ts +5 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +52 -29
- package/dist/esm/ChartBuilder.d.ts +13 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +347 -143
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +11 -1
- package/dist/esm/Context.d.ts +16 -4
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +59 -40
- package/dist/esm/Dashboard.d.ts +6 -3
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +71 -29
- package/dist/esm/QuillProvider.d.ts +4 -8
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.d.ts +1 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +119 -47
- package/dist/esm/SQLEditor.d.ts +7 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +54 -10
- package/dist/esm/Table.d.ts +21 -1
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +34 -196
- package/dist/esm/components/Chart/BarChart.d.ts +5 -1
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +5 -4
- package/dist/esm/components/Chart/CustomReferenceLine.d.ts +2 -0
- package/dist/esm/components/Chart/CustomReferenceLine.d.ts.map +1 -0
- package/dist/esm/components/Chart/CustomReferenceLine.js +23 -0
- package/dist/esm/components/Chart/GaugeChart.d.ts +11 -0
- package/dist/esm/components/Chart/GaugeChart.d.ts.map +1 -0
- package/dist/esm/components/Chart/GaugeChart.js +195 -0
- package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/InternalChart.js +14 -11
- package/dist/esm/components/Chart/LineChart.d.ts +5 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +5 -4
- package/dist/esm/components/Chart/MapChart.d.ts +36 -0
- package/dist/esm/components/Chart/MapChart.d.ts.map +1 -0
- package/dist/esm/components/Chart/MapChart.js +541 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +114 -42
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +57 -54
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +5 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +5 -4
- package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +12 -11
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +14 -14
- package/dist/esm/components/ReportBuilder/FilterStack.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/FilterStack.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterStack.js +4 -4
- package/dist/esm/components/ReportBuilder/convert.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +26 -7
- 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 +15 -2
- package/dist/esm/components/UiComponents.d.ts +4 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +29 -4
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +11 -9
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +19 -5
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +16 -3
- package/dist/esm/hooks/useReport.d.ts.map +1 -1
- package/dist/esm/hooks/useReport.js +1 -7
- package/dist/esm/hooks/useVirtualTables.d.ts +6 -2
- package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
- package/dist/esm/hooks/useVirtualTables.js +6 -3
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +6 -7
- package/dist/esm/models/Filter.d.ts +20 -13
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +160 -86
- package/dist/esm/models/Report.d.ts +12 -1
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/models/Schema.d.ts +12 -1
- package/dist/esm/models/Schema.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +23 -23
- package/dist/esm/utils/astProcessing.d.ts +2 -2
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +25 -6
- package/dist/esm/utils/axisFormatter.d.ts.map +1 -1
- package/dist/esm/utils/axisFormatter.js +25 -0
- package/dist/esm/utils/color.d.ts +159 -0
- package/dist/esm/utils/color.d.ts.map +1 -1
- package/dist/esm/utils/color.js +8 -2
- package/dist/esm/utils/columnProcessing.js +3 -3
- package/dist/esm/utils/constants.d.ts +1 -0
- package/dist/esm/utils/constants.d.ts.map +1 -1
- package/dist/esm/utils/constants.js +1 -0
- package/dist/esm/utils/dashboard.d.ts +13 -3
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +73 -16
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +3 -1
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +10 -10
- package/dist/esm/utils/getDomain.d.ts +4 -1
- package/dist/esm/utils/getDomain.d.ts.map +1 -1
- package/dist/esm/utils/getDomain.js +11 -1
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +5 -5
- package/dist/esm/utils/queryConstructor.d.ts +1 -1
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +71 -43
- package/dist/esm/utils/report.d.ts +23 -5
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +29 -9
- package/dist/esm/utils/schema.d.ts +26 -3
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +74 -43
- package/dist/esm/utils/tableProcessing.d.ts +10 -3
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +4 -6
- package/dist/esm/utils/textProcessing.d.ts.map +1 -1
- package/dist/esm/utils/textProcessing.js +0 -1
- package/package.json +8 -3
package/dist/esm/ChartBuilder.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
|
|
3
3
|
import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, ReportFiltersContext, ReportsContext, SchemaDataContext, TenantContext, ThemeContext, } from './Context';
|
|
4
4
|
import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
|
|
5
5
|
import { PivotCard } from './internals/ReportBuilder/PivotList';
|
|
6
|
-
import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, } from './components/UiComponents';
|
|
6
|
+
import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillToolTip, QuillChartBuilderCheckboxComponent, } from './components/UiComponents';
|
|
7
7
|
import { removeDoubleQuotes, snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
|
|
8
8
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
9
9
|
import { TEMP_REPORT_ID, } from './models/Report';
|
|
10
10
|
import { QuillCard } from './components/QuillCard';
|
|
11
|
-
import { quillFormat } from './utils/valueFormatter';
|
|
12
|
-
import { convertFieldTypeToJSType, isStringType, } from './utils/columnProcessing';
|
|
11
|
+
import { NUMBER_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
12
|
+
import { convertFieldTypeToJSType, isDateType, isNumberType, isStringType, } from './utils/columnProcessing';
|
|
13
13
|
import { getSelectFromAST, getTablesHelper } from './utils/astProcessing';
|
|
14
14
|
import { validateReport } from './utils/validation';
|
|
15
15
|
import { QuillChartErrorWithAction } from './components/Chart/ChartError';
|
|
@@ -25,9 +25,9 @@ import { getDateBucketFromRange } from './utils/dates';
|
|
|
25
25
|
import { QuillMultiSelectComponentWithCombo as MultiSelectComponent } from './components/QuillMultiSelectWithCombo';
|
|
26
26
|
import { useQuillCloud } from './utils/dataFetcher';
|
|
27
27
|
import { QuillMultiSelectSectionList } from './components/QuillMultiSelectSectionList';
|
|
28
|
-
import { ALL_TENANTS, SINGLE_TENANT } from './utils/constants';
|
|
28
|
+
import { ALL_TENANTS, REFERENCE_LINE, SINGLE_TENANT } from './utils/constants';
|
|
29
29
|
import { disambiguatedValueField } from './utils/pivotConstructor';
|
|
30
|
-
const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
|
|
30
|
+
const CHART_TYPES = ['column', 'line', 'table', 'metric', 'gauge', 'bar', 'pie', 'US map', 'World map'];
|
|
31
31
|
const CHART_TO_LABELS = {
|
|
32
32
|
column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
33
33
|
line: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
@@ -35,8 +35,17 @@ const CHART_TO_LABELS = {
|
|
|
35
35
|
metric: { xAxisLabel: 'Value' },
|
|
36
36
|
bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
37
37
|
pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
|
|
38
|
+
'US map': { xAxisLabel: 'State', yAxisLabel: 'Value' },
|
|
39
|
+
'World map': { xAxisLabel: 'Country', yAxisLabel: 'Value' },
|
|
40
|
+
gauge: { xAxisLabel: 'Value' },
|
|
38
41
|
};
|
|
39
|
-
function getPivotMetricOptions(pivot) {
|
|
42
|
+
function getPivotMetricOptions(pivot, selectedPivotTable, chartType) {
|
|
43
|
+
if (['metric', 'gauge'].includes(chartType) && selectedPivotTable) {
|
|
44
|
+
return selectedPivotTable.columns.map((elem) => ({
|
|
45
|
+
label: elem.field === pivot?.rowField ? `Pivot Row (${elem.field})` : elem.field,
|
|
46
|
+
value: elem.field,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
40
49
|
if (!pivot.rowField) {
|
|
41
50
|
const valueField = disambiguatedValueField(pivot);
|
|
42
51
|
return [
|
|
@@ -75,17 +84,18 @@ export function createInitialFormData(columns) {
|
|
|
75
84
|
chartType: firstNumberColumn ? 'line' : 'table',
|
|
76
85
|
pivot: null,
|
|
77
86
|
template: true,
|
|
87
|
+
referenceLines: [],
|
|
78
88
|
};
|
|
79
89
|
return formEmptyState;
|
|
80
90
|
}
|
|
81
91
|
function getChartTypeOptions(formData, dashboard) {
|
|
82
92
|
let viableCharts = CHART_TYPES;
|
|
83
93
|
if (dashboard && dashboard.dateFilter && dashboard.dateFilter.comparison) {
|
|
84
|
-
viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'bar', 'pie'].includes(chart));
|
|
94
|
+
viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'gauge', 'bar', 'pie', 'US map', 'World map'].includes(chart));
|
|
85
95
|
}
|
|
86
96
|
if (formData.pivot && !formData.pivot.rowField) {
|
|
87
97
|
return viableCharts
|
|
88
|
-
.filter((elem) =>
|
|
98
|
+
.filter((elem) => ['table', 'metric', 'gauge'].includes(elem))
|
|
89
99
|
.map((elem) => ({
|
|
90
100
|
label: elem,
|
|
91
101
|
value: elem,
|
|
@@ -93,14 +103,13 @@ function getChartTypeOptions(formData, dashboard) {
|
|
|
93
103
|
}
|
|
94
104
|
else {
|
|
95
105
|
return viableCharts
|
|
96
|
-
.filter((elem) => !((formData.pivot &&
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
(elem === 'bar' || elem === 'pie'))))
|
|
106
|
+
.filter((elem) => !((formData.pivot &&
|
|
107
|
+
formData.pivot.columnField &&
|
|
108
|
+
(elem === 'bar' || elem === 'pie' || elem === 'US map' || elem === 'World map'))))
|
|
100
109
|
.map((elem) => ({ label: elem, value: elem }));
|
|
101
110
|
}
|
|
102
111
|
}
|
|
103
|
-
function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = []) {
|
|
112
|
+
function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = [], referenceLineQueryResults) {
|
|
104
113
|
const newReport = convertInternalReportToReport(mergeComparisonRange({
|
|
105
114
|
...formData,
|
|
106
115
|
dashboardName: formData.dashboardName || '',
|
|
@@ -120,6 +129,14 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
|
|
|
120
129
|
pivotColumns: selectedPivotTable?.columns ?? undefined,
|
|
121
130
|
pivotRows: selectedPivotTable?.rows ?? undefined,
|
|
122
131
|
columnInternal: report?.columnInternal ?? [],
|
|
132
|
+
referenceLines: formData.referenceLines?.map((elem) => ({
|
|
133
|
+
label: elem.label,
|
|
134
|
+
query: elem.label === REFERENCE_LINE ? [Number(elem.y1) || 0, Number(elem.y2) || 0] : elem.label,
|
|
135
|
+
})) || [],
|
|
136
|
+
referenceLineYValues: formData.referenceLines?.map((elem, index) => ({
|
|
137
|
+
label: elem.label,
|
|
138
|
+
query: elem.label === REFERENCE_LINE ? [Number(elem.y1) || 0, Number(elem.y2) || 0] : referenceLineQueryResults?.[index],
|
|
139
|
+
})) || [],
|
|
123
140
|
}), filtersApplied);
|
|
124
141
|
return newReport;
|
|
125
142
|
}
|
|
@@ -155,7 +172,7 @@ const DATE_OPTIONS = [
|
|
|
155
172
|
{ value: 'MMM_dd_hh:mm_ap_pm', label: 'day and time' },
|
|
156
173
|
{ value: 'hh_ap_pm', label: 'hour' },
|
|
157
174
|
];
|
|
158
|
-
const
|
|
175
|
+
const ALL_FORMAT_OPTIONS = [
|
|
159
176
|
...NUMBER_OPTIONS,
|
|
160
177
|
...DATE_OPTIONS,
|
|
161
178
|
{ value: 'string', label: 'string' },
|
|
@@ -238,7 +255,7 @@ export function ChartBuilderWithModal(props) {
|
|
|
238
255
|
*/
|
|
239
256
|
export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent,
|
|
240
257
|
// MultiSelectComponent = QuillMultiSelectComponentWithCombo,
|
|
241
|
-
ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
|
|
258
|
+
ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, CheckboxComponent = QuillChartBuilderCheckboxComponent, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
|
|
242
259
|
// isLoading,
|
|
243
260
|
onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
244
261
|
const [client] = useContext(ClientContext);
|
|
@@ -264,14 +281,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
264
281
|
const inputRef = useRef(null);
|
|
265
282
|
const selectRef = useRef(null);
|
|
266
283
|
const processColumns = (columns) => {
|
|
267
|
-
if (schemaData.
|
|
284
|
+
if (schemaData.schemaWithCustomFields) {
|
|
268
285
|
const newProcessedColumns = columns?.map((col) => {
|
|
269
286
|
if (col.jsType) {
|
|
270
287
|
return col;
|
|
271
288
|
}
|
|
272
289
|
const newCol = { ...col };
|
|
273
290
|
let foundColumn;
|
|
274
|
-
schemaData.
|
|
291
|
+
schemaData.schemaWithCustomFields.forEach((table) => {
|
|
275
292
|
if (table.columns) {
|
|
276
293
|
const matchedColumn = table.columns.find((c) => c.field === col.field);
|
|
277
294
|
if (matchedColumn) {
|
|
@@ -356,6 +373,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
356
373
|
const [isEdittingPivot, setIsEdittingPivot] = useState(false);
|
|
357
374
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
358
375
|
const [tableName, setTableName] = useState(undefined);
|
|
376
|
+
const [includeCustomFields, setIncludeCustomFields] = useState(report
|
|
377
|
+
? !!report.includeCustomFields
|
|
378
|
+
: !!client?.featureFlags?.customFieldsEnabled);
|
|
359
379
|
const selectedTable = schemaData.schema?.find((t) => t.displayName === tableName);
|
|
360
380
|
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
361
381
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -378,11 +398,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
378
398
|
const [recommendedPivots, setRecommendedPivots] = useState(rp);
|
|
379
399
|
const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
|
|
380
400
|
const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
|
|
381
|
-
const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
|
|
401
|
+
const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
|
|
402
|
+
{
|
|
382
403
|
valueField: report?.pivot?.valueField,
|
|
383
404
|
valueField2: report?.pivot?.valueField2,
|
|
384
|
-
aggregationType: report?.pivot?.aggregationType
|
|
385
|
-
}
|
|
405
|
+
aggregationType: report?.pivot?.aggregationType,
|
|
406
|
+
},
|
|
407
|
+
]);
|
|
386
408
|
const baseProcessing = {
|
|
387
409
|
page: report?.pagination ?? {
|
|
388
410
|
page: 0,
|
|
@@ -397,6 +419,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
397
419
|
const [allTables, setAllTables] = useState([]);
|
|
398
420
|
const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
|
|
399
421
|
const [referencedColumns, setReferencedColumns] = useState({});
|
|
422
|
+
const [referencedColumnsWithoutStar, setReferencedColumnsWithoutStar] = useState({});
|
|
400
423
|
const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
|
|
401
424
|
const canonicalFilterMap = useMemo(() => {
|
|
402
425
|
return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
|
|
@@ -409,7 +432,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
409
432
|
}
|
|
410
433
|
acc[filter.label] =
|
|
411
434
|
!!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
|
|
412
|
-
!!schemaData.
|
|
435
|
+
!!schemaData.schemaWithCustomFields
|
|
413
436
|
?.find((table) => {
|
|
414
437
|
return (table.displayName === (filterMap[filter.label] ?? filter).table);
|
|
415
438
|
})
|
|
@@ -453,6 +476,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
453
476
|
pivot: null,
|
|
454
477
|
dateField: defaultDateField,
|
|
455
478
|
template: true,
|
|
479
|
+
referenceLines: [],
|
|
456
480
|
};
|
|
457
481
|
const updateDashboardFilters = async (dashboardName) => {
|
|
458
482
|
if (dashboardConfig && dashboardConfig[dashboardName]) {
|
|
@@ -493,8 +517,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
493
517
|
const pivotFormData = (pivot) => {
|
|
494
518
|
const yAxisField = pivot.columnField ?? disambiguatedValueField(pivot) ?? '';
|
|
495
519
|
const yAxisLabel = report?.yAxisFields && report?.yAxisFields?.length > 0
|
|
496
|
-
? report.yAxisFields[0]?.label ?? ''
|
|
497
|
-
: disambiguatedValueField(pivot) ?? '';
|
|
520
|
+
? (report.yAxisFields[0]?.label ?? '')
|
|
521
|
+
: (disambiguatedValueField(pivot) ?? '');
|
|
498
522
|
// date labels for pivots should be treated like strings since they are
|
|
499
523
|
const yAxisIsDate = pivot.columnField
|
|
500
524
|
? isDateField(pivot.columnFieldType ?? '')
|
|
@@ -503,12 +527,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
503
527
|
const result = {
|
|
504
528
|
pivot,
|
|
505
529
|
chartType: chartType,
|
|
506
|
-
xAxisField: pivot.rowField
|
|
507
|
-
|
|
530
|
+
xAxisField: pivot.rowField
|
|
531
|
+
? pivot.rowField
|
|
532
|
+
: disambiguatedValueField(pivot),
|
|
533
|
+
xAxisFormat: isDateType(pivot.rowFieldType ?? '')
|
|
508
534
|
? 'string'
|
|
509
|
-
:
|
|
510
|
-
|
|
511
|
-
'
|
|
535
|
+
: isNumberType(pivot.rowFieldType ?? '')
|
|
536
|
+
? 'whole_number'
|
|
537
|
+
: 'string',
|
|
512
538
|
xAxisLabel: report?.xAxisLabel || pivot.rowField,
|
|
513
539
|
yAxisFields: [
|
|
514
540
|
{
|
|
@@ -517,43 +543,66 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
517
543
|
format: yAxisIsDate
|
|
518
544
|
? 'string'
|
|
519
545
|
: report?.yAxisFields && report?.yAxisFields?.length > 0
|
|
520
|
-
? report?.yAxisFields[0]?.format ?? 'whole_number'
|
|
521
|
-
: report?.columns.find((col) => col.field === disambiguatedValueField(pivot))
|
|
522
|
-
?.format ?? 'whole_number',
|
|
546
|
+
? (report?.yAxisFields[0]?.format ?? 'whole_number')
|
|
547
|
+
: (report?.columns.find((col) => col.field === disambiguatedValueField(pivot))?.format ?? 'whole_number'),
|
|
523
548
|
},
|
|
524
549
|
],
|
|
525
550
|
};
|
|
526
551
|
return result;
|
|
527
552
|
};
|
|
528
|
-
const getReferencedTables = async (client, sqlQuery, dbTables) => {
|
|
553
|
+
const getReferencedTables = async (client, sqlQuery, dbTables, skipStar) => {
|
|
529
554
|
const resp = await getDataFromCloud(client, `astify`, {
|
|
530
555
|
query: sqlQuery,
|
|
531
556
|
publicKey: client.publicKey,
|
|
532
557
|
useNewNodeSql: true,
|
|
533
558
|
});
|
|
534
559
|
if (resp.success === false) {
|
|
535
|
-
return getTablesHelper(getSelectFromAST({}), dbTables);
|
|
560
|
+
return getTablesHelper(getSelectFromAST({}), dbTables, skipStar);
|
|
536
561
|
}
|
|
537
|
-
return getTablesHelper(getSelectFromAST(resp.ast), dbTables);
|
|
562
|
+
return getTablesHelper(getSelectFromAST(resp.ast), dbTables, skipStar);
|
|
538
563
|
};
|
|
539
564
|
const formFormDataFromReport = (report) => {
|
|
540
|
-
let pivotData = {};
|
|
565
|
+
// let pivotData = {};
|
|
541
566
|
let dateField = defaultDateField;
|
|
542
|
-
if (report?.pivot) {
|
|
543
|
-
|
|
544
|
-
}
|
|
567
|
+
// if (report?.pivot) {
|
|
568
|
+
// pivotData = pivotFormData(report.pivot);
|
|
569
|
+
// }
|
|
545
570
|
if (report) {
|
|
546
571
|
dateField = report.dateField || defaultDateField;
|
|
547
572
|
}
|
|
548
573
|
return {
|
|
549
574
|
...formEmptyState,
|
|
550
575
|
...report,
|
|
551
|
-
...pivotData,
|
|
552
|
-
...(report?.dashboardName && { dashboardName: report?.dashboardName }),
|
|
576
|
+
// ...pivotData,
|
|
553
577
|
dateField: dateField,
|
|
578
|
+
referenceLines: report?.referenceLines ? report.referenceLines?.map(({ label, query }) => {
|
|
579
|
+
if (typeof query === 'string') {
|
|
580
|
+
return { label, y1: undefined, y2: undefined };
|
|
581
|
+
}
|
|
582
|
+
return {
|
|
583
|
+
label,
|
|
584
|
+
y1: query[0],
|
|
585
|
+
y2: query[1],
|
|
586
|
+
};
|
|
587
|
+
}) : [],
|
|
554
588
|
};
|
|
555
589
|
};
|
|
556
590
|
const [formData, setFormData] = useState(formFormDataFromReport(report));
|
|
591
|
+
const referenceLineQueryResults = useMemo(() => {
|
|
592
|
+
return formData?.referenceLines?.map((line) => {
|
|
593
|
+
if (line.label === REFERENCE_LINE) {
|
|
594
|
+
return [Number(line.y1) || 0, Number(line.y2) || 0];
|
|
595
|
+
}
|
|
596
|
+
// line.label is a field
|
|
597
|
+
// Get the first and last row of the field
|
|
598
|
+
const field = formData.columns.find((col) => col.field === line.label);
|
|
599
|
+
if (!field) {
|
|
600
|
+
return [0, 0];
|
|
601
|
+
}
|
|
602
|
+
// return [Number(rows[0]?.[field.field]) || 0, Number(rows[rows.length - 1]?.[field.field]) || 0];
|
|
603
|
+
return (pivotData?.rows ? pivotData.rows : rows).map((row) => Number(row[field.field]) || 0);
|
|
604
|
+
});
|
|
605
|
+
}, [formData?.referenceLines]);
|
|
557
606
|
const currentDashboard = useMemo(() => {
|
|
558
607
|
return dashboardConfig[formData.dashboardName ?? report?.dashboardName ?? '']?.config;
|
|
559
608
|
}, [dashboardConfig, formData.dashboardName, report?.dashboardName]);
|
|
@@ -561,6 +610,19 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
561
610
|
return (currentDashboard?.tenantKeys?.map((tenantKey) => client?.allTenantTypes?.find((t) => t.tenantField === tenantKey)) ?? []);
|
|
562
611
|
}, [client?.allTenantTypes, currentDashboard?.tenantKeys]);
|
|
563
612
|
const dashboardOwner = currentDashboardTenants?.[0];
|
|
613
|
+
const currentTenantAsFormFlags = useMemo(() => {
|
|
614
|
+
if (!tenants || !tenants.length) {
|
|
615
|
+
return undefined;
|
|
616
|
+
}
|
|
617
|
+
const tenantField = typeof tenants[0] !== 'object'
|
|
618
|
+
? dashboardOwner?.name
|
|
619
|
+
: tenants[0]?.tenantField;
|
|
620
|
+
if (!tenantField) {
|
|
621
|
+
return undefined;
|
|
622
|
+
}
|
|
623
|
+
const tenantIds = typeof tenants[0] !== 'object' ? tenants : tenants[0]?.tenantIds;
|
|
624
|
+
return { [tenantField]: tenantIds };
|
|
625
|
+
}, [tenants, dashboardOwner]);
|
|
564
626
|
const invalidColumns = useMemo(() => {
|
|
565
627
|
if (!rows || !rows.length) {
|
|
566
628
|
return [];
|
|
@@ -575,6 +637,62 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
575
637
|
const data = formFormDataFromReport(report);
|
|
576
638
|
return getChartTypeOptions(data, dashboardConfig[data.dashboardName || '']);
|
|
577
639
|
})());
|
|
640
|
+
const reportContainsCustomFields = useMemo(() => {
|
|
641
|
+
// Check whether report query contains custom fields
|
|
642
|
+
const customFieldsMap = schemaData.customFields;
|
|
643
|
+
const reportQueryContainsCustomFields = allTables.some((table) => {
|
|
644
|
+
const tableColumns = referencedColumnsWithoutStar[table] ?? [];
|
|
645
|
+
const customFieldColumns = customFieldsMap?.[table] ?? [];
|
|
646
|
+
return tableColumns.some((column) => customFieldColumns.some((field) => field.field === column));
|
|
647
|
+
});
|
|
648
|
+
return reportQueryContainsCustomFields;
|
|
649
|
+
}, [allTables, referencedColumnsWithoutStar]);
|
|
650
|
+
const chartBuilderFormDataContainsCustomFields = useMemo(() => {
|
|
651
|
+
const customFields = allTables
|
|
652
|
+
.map((table) => schemaData.customFields?.[table] ?? [])
|
|
653
|
+
.flat();
|
|
654
|
+
const customFieldsMap = schemaData.customFields;
|
|
655
|
+
const pivotContainsCustomFields = customFields.some((field) => field.field === formData.pivot?.columnField ||
|
|
656
|
+
field.field === formData.pivot?.rowField ||
|
|
657
|
+
field.field === formData.pivot?.valueField);
|
|
658
|
+
const xAxisFieldContainsCustomFields = customFields.some((field) => field.field === formData.xAxisField);
|
|
659
|
+
const yAxisFieldsContainsCustomFields = formData.yAxisFields.some((yAxisField) => {
|
|
660
|
+
return customFields.some((field) => field.field === yAxisField.field);
|
|
661
|
+
});
|
|
662
|
+
const dateFieldContainsCustomFields = customFields.some((field) => field.field === formData.dateField?.field);
|
|
663
|
+
const canonicalFilterMapContainsCustomFields = Object.values(canonicalFilterMap).some((filter) => {
|
|
664
|
+
return customFieldsMap?.[filter.table || '']?.some((field) => field.field === filter.field);
|
|
665
|
+
});
|
|
666
|
+
return (pivotContainsCustomFields ||
|
|
667
|
+
xAxisFieldContainsCustomFields ||
|
|
668
|
+
yAxisFieldsContainsCustomFields ||
|
|
669
|
+
dateFieldContainsCustomFields ||
|
|
670
|
+
canonicalFilterMapContainsCustomFields);
|
|
671
|
+
}, [
|
|
672
|
+
allTables,
|
|
673
|
+
formData.pivot,
|
|
674
|
+
formData.xAxisField,
|
|
675
|
+
formData.yAxisFields,
|
|
676
|
+
formData.dateField,
|
|
677
|
+
canonicalFilterMap,
|
|
678
|
+
]);
|
|
679
|
+
const customFieldsInTabularColumns = useMemo(() => {
|
|
680
|
+
const customFields = allTables
|
|
681
|
+
.map((table) => schemaData.customFields?.[table] ?? [])
|
|
682
|
+
.flat();
|
|
683
|
+
return formData.columns.some((col) => {
|
|
684
|
+
return customFields.some((field) => field.field === col.field);
|
|
685
|
+
});
|
|
686
|
+
}, [allTables, formData.columns]);
|
|
687
|
+
const containsCustomFields = useMemo(() => {
|
|
688
|
+
return (reportContainsCustomFields ||
|
|
689
|
+
customFieldsInTabularColumns ||
|
|
690
|
+
chartBuilderFormDataContainsCustomFields);
|
|
691
|
+
}, [
|
|
692
|
+
reportContainsCustomFields,
|
|
693
|
+
customFieldsInTabularColumns,
|
|
694
|
+
chartBuilderFormDataContainsCustomFields,
|
|
695
|
+
]);
|
|
578
696
|
useEffect(() => {
|
|
579
697
|
if (!loadingFormData && triggeredEditChart) {
|
|
580
698
|
editChart();
|
|
@@ -612,12 +730,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
612
730
|
const curDashboard = await updateDashboardFilters(dashboardName);
|
|
613
731
|
setDashboardOptions(dashboardOptions);
|
|
614
732
|
curFormData.dashboardName = dashboardName;
|
|
615
|
-
const curSchemaData = schemaData.
|
|
733
|
+
const curSchemaData = schemaData.schemaWithCustomFields;
|
|
616
734
|
if (!query) {
|
|
617
735
|
setLoadingFormData(false);
|
|
618
736
|
return;
|
|
619
737
|
}
|
|
620
738
|
const result = await getReferencedTables(client, query, curSchemaData);
|
|
739
|
+
const referencedTablesWithoutStar = await getReferencedTables(client, query, curSchemaData, true);
|
|
621
740
|
setDateFieldOptions(result.dateFields);
|
|
622
741
|
if (result.dateFields[0] && result.dateFields[0].columns[0]) {
|
|
623
742
|
setDefaultDateField({
|
|
@@ -641,6 +760,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
641
760
|
acc[table.name] = table.columns.map((col) => col.field);
|
|
642
761
|
return acc;
|
|
643
762
|
}, {});
|
|
763
|
+
const referencedColumnsWithoutStar = referencedTablesWithoutStar.referencedTablesAndColumns.reduce((acc, table) => {
|
|
764
|
+
acc[table.name] = table.columns.map((col) => col.field);
|
|
765
|
+
return acc;
|
|
766
|
+
}, {});
|
|
767
|
+
setReferencedColumnsWithoutStar(referencedColumnsWithoutStar);
|
|
644
768
|
setReferencedColumns(referencedColumns);
|
|
645
769
|
setTableName(result.dateFields[0]?.name);
|
|
646
770
|
const dateField = {
|
|
@@ -698,12 +822,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
698
822
|
};
|
|
699
823
|
}, [selectedPivotTable, formData.pivot]);
|
|
700
824
|
const chartData = useMemo(() => {
|
|
701
|
-
const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters);
|
|
825
|
+
const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters, referenceLineQueryResults);
|
|
702
826
|
return {
|
|
703
827
|
...data,
|
|
704
828
|
filterMap: canonicalFilterMap,
|
|
705
829
|
};
|
|
706
830
|
}, [formData, selectedPivotTable, report, rows, rowCount]);
|
|
831
|
+
const xAxisFormatOptions = useMemo(() => {
|
|
832
|
+
return chartData?.chartType === 'gauge'
|
|
833
|
+
? [
|
|
834
|
+
{ value: 'whole_number', label: 'whole number' },
|
|
835
|
+
{ value: 'two_decimal_places', label: 'two decimal places' },
|
|
836
|
+
{ value: 'percent', label: 'percentage' },
|
|
837
|
+
] : ALL_FORMAT_OPTIONS;
|
|
838
|
+
}, [chartData?.chartType]);
|
|
707
839
|
const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
|
|
708
840
|
const dashboardFilters = filtersEnabled
|
|
709
841
|
? (overrideFilters ?? currentDashboardFilters)
|
|
@@ -752,11 +884,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
752
884
|
if (selectedPivotTable &&
|
|
753
885
|
selectedPivotTable.columns &&
|
|
754
886
|
formData.chartType === 'table') {
|
|
755
|
-
console.log('selectedPivotTable', selectedPivotTable);
|
|
756
887
|
const columns = selectedPivotTable.columns;
|
|
757
888
|
columns.forEach((col, index) => {
|
|
758
889
|
// ADD THE RIGHT FIELD TYPE FOR THE VALUE COLUMNS
|
|
759
|
-
if (
|
|
890
|
+
if (['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '') &&
|
|
760
891
|
index !== 0) {
|
|
761
892
|
col.format = 'two_decimal_places';
|
|
762
893
|
}
|
|
@@ -874,7 +1005,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
874
1005
|
fetchRowCount(processing, overrideFilters);
|
|
875
1006
|
if (formData.pivot) {
|
|
876
1007
|
try {
|
|
877
|
-
const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ??
|
|
1008
|
+
const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ?? {}, overrideFilters, destinationDashboard);
|
|
878
1009
|
fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
|
|
879
1010
|
}
|
|
880
1011
|
catch (e) {
|
|
@@ -1027,7 +1158,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1027
1158
|
else if (field === 'dateField' &&
|
|
1028
1159
|
subfield === 'table' &&
|
|
1029
1160
|
!formData.dateField?.field) {
|
|
1030
|
-
const field = schemaData.
|
|
1161
|
+
const field = schemaData.schemaWithCustomFields?.find((elem) => elem.name === value)?.columns?.[0]?.field;
|
|
1031
1162
|
updatedForm.dateField = {
|
|
1032
1163
|
// @ts-ignore
|
|
1033
1164
|
...updatedForm[field],
|
|
@@ -1045,6 +1176,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1045
1176
|
// For simple fields
|
|
1046
1177
|
updatedForm = { ...updatedForm, [fieldName]: value };
|
|
1047
1178
|
}
|
|
1179
|
+
if (fieldName === 'chartType') {
|
|
1180
|
+
if (value === 'metric') {
|
|
1181
|
+
updatedForm.xAxisFormat = 'whole_number';
|
|
1182
|
+
}
|
|
1183
|
+
else if (value === 'gauge') {
|
|
1184
|
+
updatedForm.xAxisFormat = 'percent';
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1048
1187
|
let dashboardName = updatedForm.dashboardName;
|
|
1049
1188
|
if (fieldName === 'dashboardName') {
|
|
1050
1189
|
dashboardName = value;
|
|
@@ -1105,7 +1244,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1105
1244
|
if (fieldName === 'columns') {
|
|
1106
1245
|
setFormData({
|
|
1107
1246
|
...formData,
|
|
1108
|
-
columns: [
|
|
1247
|
+
columns: [
|
|
1248
|
+
...formData.columns,
|
|
1249
|
+
{ label: '', field: '', format: 'string' },
|
|
1250
|
+
],
|
|
1109
1251
|
});
|
|
1110
1252
|
}
|
|
1111
1253
|
else if (fieldName === 'yAxisFields') {
|
|
@@ -1113,7 +1255,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1113
1255
|
...formData,
|
|
1114
1256
|
yAxisFields: [
|
|
1115
1257
|
...formData.yAxisFields,
|
|
1116
|
-
{ label: '', field: '', format: '
|
|
1258
|
+
{ label: '', field: '', format: 'string' },
|
|
1117
1259
|
],
|
|
1118
1260
|
});
|
|
1119
1261
|
}
|
|
@@ -1131,6 +1273,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1131
1273
|
},
|
|
1132
1274
|
});
|
|
1133
1275
|
}
|
|
1276
|
+
else if (fieldName === 'referenceLines') {
|
|
1277
|
+
setFormData({
|
|
1278
|
+
...formData,
|
|
1279
|
+
referenceLines: [
|
|
1280
|
+
...formData.referenceLines,
|
|
1281
|
+
{ label: '', y1: undefined, y2: undefined },
|
|
1282
|
+
],
|
|
1283
|
+
});
|
|
1284
|
+
}
|
|
1134
1285
|
};
|
|
1135
1286
|
const handleRemoveField = (fieldName, index) => {
|
|
1136
1287
|
if (fieldName === 'pivot') {
|
|
@@ -1185,24 +1336,33 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1185
1336
|
pivot: formData.pivot,
|
|
1186
1337
|
referencedTables: allTables,
|
|
1187
1338
|
referencedColumns,
|
|
1339
|
+
includeCustomFields: includeCustomFields || containsCustomFields,
|
|
1188
1340
|
template: tenants
|
|
1189
1341
|
? undefined
|
|
1190
1342
|
: report && !isAdmin && formData.template
|
|
1191
1343
|
? false
|
|
1192
1344
|
: formData.template,
|
|
1193
|
-
reportFlags:
|
|
1194
|
-
?
|
|
1195
|
-
|
|
1196
|
-
.
|
|
1197
|
-
|
|
1198
|
-
key,
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1345
|
+
reportFlags: containsCustomFields
|
|
1346
|
+
? currentTenantAsFormFlags
|
|
1347
|
+
: formFlags
|
|
1348
|
+
? Object.fromEntries(Object.entries(formFlags)
|
|
1349
|
+
.filter(([, value]) => value.length > 0)
|
|
1350
|
+
.map(([key, value]) => {
|
|
1351
|
+
return [
|
|
1352
|
+
key,
|
|
1353
|
+
Object.keys(allTenantMap).length > 1 &&
|
|
1354
|
+
allTenantMap[key]?.length === value.length
|
|
1355
|
+
? ALL_TENANTS
|
|
1356
|
+
: value,
|
|
1357
|
+
];
|
|
1358
|
+
}))
|
|
1359
|
+
: undefined,
|
|
1360
|
+
referenceLines: formData.referenceLines.map((line) => {
|
|
1361
|
+
return {
|
|
1362
|
+
label: line.label,
|
|
1363
|
+
query: line.label === REFERENCE_LINE ? [Number(line.y1 ?? 0) || 0, Number(line.y2 ?? 0) || 0] : ''
|
|
1364
|
+
};
|
|
1365
|
+
}),
|
|
1206
1366
|
};
|
|
1207
1367
|
const resp = await saveReport({
|
|
1208
1368
|
report: { ...newReport, rows: undefined, pivotRows: undefined }, // stop including rows in request
|
|
@@ -1281,7 +1441,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1281
1441
|
// formData.chartType === 'metric'
|
|
1282
1442
|
// ? 100
|
|
1283
1443
|
// : `calc(${filtersEnabled ? 50 : 70}%)`,
|
|
1284
|
-
...(isHorizontalView && { flexGrow: formData.chartType
|
|
1444
|
+
...(isHorizontalView && { flexGrow: !['table'].includes(formData.chartType) ? 1 : 0 }),
|
|
1285
1445
|
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen }))),
|
|
1286
1446
|
// Make sure to display non-pivoted table when using pivot chart
|
|
1287
1447
|
(isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsxs("div", { style: {
|
|
@@ -1298,8 +1458,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1298
1458
|
onFiltersEnabledChanged(hide);
|
|
1299
1459
|
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1300
1460
|
width: '100%',
|
|
1301
|
-
height: formData.chartType === 'table'
|
|
1302
|
-
|
|
1461
|
+
height: formData.chartType === 'table'
|
|
1462
|
+
? 200
|
|
1463
|
+
: formData.chartType === 'metric'
|
|
1464
|
+
? 300
|
|
1465
|
+
: formData.chartType === 'US map' || formData.chartType === 'World map'
|
|
1466
|
+
? 'fit-content'
|
|
1467
|
+
: 500,
|
|
1468
|
+
flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
|
|
1303
1469
|
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
|
|
1304
1470
|
onPageChange(page);
|
|
1305
1471
|
setCurrentPage(page);
|
|
@@ -1333,8 +1499,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1333
1499
|
onFiltersEnabledChanged(hide);
|
|
1334
1500
|
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1335
1501
|
width: '100%',
|
|
1336
|
-
height: formData.chartType === 'table'
|
|
1337
|
-
|
|
1502
|
+
height: formData.chartType === 'table'
|
|
1503
|
+
? 200
|
|
1504
|
+
: formData.chartType === 'metric'
|
|
1505
|
+
? 300
|
|
1506
|
+
: formData.chartType === 'US map' || formData.chartType === 'World map'
|
|
1507
|
+
? 'fit-content'
|
|
1508
|
+
: 500,
|
|
1509
|
+
flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
|
|
1338
1510
|
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(TextInputComponent
|
|
1339
1511
|
// {...autofocusRefProp}
|
|
1340
1512
|
, {
|
|
@@ -1345,10 +1517,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1345
1517
|
}, options: dashboardOptions.map((elem) => ({
|
|
1346
1518
|
label: elem.label,
|
|
1347
1519
|
value: elem.label,
|
|
1348
|
-
})), 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'),
|
|
1349
|
-
// filter out metric for all pivots
|
|
1350
|
-
// filter out bar and pie for row and column pivot
|
|
1351
|
-
options: chartTypes, width: 200 }) })] }), _jsxs("div", { style: {
|
|
1520
|
+
})), 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'), options: chartTypes, width: 200 }) })] }), _jsxs("div", { style: {
|
|
1352
1521
|
display: 'flex',
|
|
1353
1522
|
flexDirection: 'column',
|
|
1354
1523
|
gap: 6,
|
|
@@ -1364,33 +1533,40 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1364
1533
|
setShowPivotPopover(true);
|
|
1365
1534
|
setPivotRowField(formData.pivot?.rowField);
|
|
1366
1535
|
setPivotColumnField(formData.pivot?.columnField);
|
|
1367
|
-
setPivotAggregations(formData.pivot?.aggregations ?? [
|
|
1536
|
+
setPivotAggregations(formData.pivot?.aggregations ?? [
|
|
1537
|
+
{
|
|
1368
1538
|
valueField: formData.pivot?.valueField,
|
|
1369
1539
|
aggregationType: formData.pivot?.aggregationType,
|
|
1370
1540
|
valueField2: formData.pivot?.valueField2,
|
|
1371
|
-
}
|
|
1541
|
+
},
|
|
1542
|
+
]);
|
|
1372
1543
|
setPivotPopUpTitle('Edit pivot');
|
|
1373
1544
|
}, 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: {
|
|
1374
1545
|
display: 'flex',
|
|
1375
1546
|
flexDirection: 'column',
|
|
1376
1547
|
}, 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
|
|
1377
|
-
? getPivotMetricOptions(formData.pivot)
|
|
1548
|
+
? getPivotMetricOptions(formData.pivot, selectedPivotTable, formData.chartType)
|
|
1378
1549
|
: columns.map((elem) => ({
|
|
1379
1550
|
label: elem.field,
|
|
1380
1551
|
value: elem.field,
|
|
1381
1552
|
})), 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 &&
|
|
1382
|
-
isDateField(formData.
|
|
1383
|
-
? '
|
|
1553
|
+
isDateField(formData.xAxisField ?? '')
|
|
1554
|
+
? 'string'
|
|
1384
1555
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
1385
|
-
isDateField(formData.
|
|
1386
|
-
? [{ value: '
|
|
1387
|
-
:
|
|
1388
|
-
? formData.pivot.aggregations?.length
|
|
1556
|
+
isDateField(formData.xAxisField ?? '')
|
|
1557
|
+
? [{ value: 'string', label: 'date' }]
|
|
1558
|
+
: xAxisFormatOptions, width: 200, hideEmptyOption: true })] })] })), 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
|
|
1559
|
+
? formData.pivot.aggregations?.length
|
|
1560
|
+
? (disambiguatedValueField(formData.pivot) ?? 'count')
|
|
1561
|
+
: 'count'
|
|
1389
1562
|
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
1390
1563
|
? [
|
|
1391
1564
|
{
|
|
1392
|
-
label: `Pivot Column (${formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count'})`,
|
|
1393
|
-
value: formData.pivot.aggregations
|
|
1565
|
+
label: `Pivot Column (${formData.pivot.aggregations?.length ? (disambiguatedValueField(formData.pivot) ?? 'count') : 'count'})`,
|
|
1566
|
+
value: formData.pivot.aggregations
|
|
1567
|
+
?.length
|
|
1568
|
+
? (disambiguatedValueField(formData.pivot) ?? 'count')
|
|
1569
|
+
: 'count',
|
|
1394
1570
|
},
|
|
1395
1571
|
]
|
|
1396
1572
|
: columns
|
|
@@ -1401,12 +1577,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1401
1577
|
label: elem.field,
|
|
1402
1578
|
value: elem.field,
|
|
1403
1579
|
})), 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
|
|
1404
|
-
? NUMBER_OPTIONS.find((option) => {
|
|
1580
|
+
? (NUMBER_OPTIONS.find((option) => {
|
|
1405
1581
|
return (option.value === yAxisField.format);
|
|
1406
|
-
})?.value ?? NUMBER_OPTIONS[0].value
|
|
1582
|
+
})?.value ?? NUMBER_OPTIONS[0].value)
|
|
1407
1583
|
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
1408
1584
|
? NUMBER_OPTIONS
|
|
1409
|
-
:
|
|
1585
|
+
: ALL_FORMAT_OPTIONS, width: 200, hideEmptyOption: true }), !formData.pivot && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), !formData.pivot && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] })), client?.featureFlags?.['referenceLines'] && (chartData.chartType === 'line' || chartData.chartType === 'column') && _jsxs("div", { children: [_jsx(SubHeaderComponent, { label: 'Reference Lines' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.referenceLines?.map((refLine, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { width: 200, value: refLine.label, onChange: (e) => handleChange(e.target.value, 'referenceLines.label', index),
|
|
1586
|
+
// only include numeric columns
|
|
1587
|
+
options: [{
|
|
1588
|
+
label: 'Custom Values',
|
|
1589
|
+
value: REFERENCE_LINE
|
|
1590
|
+
}].concat((selectedPivotTable?.columns ? selectedPivotTable.columns : columns).filter((c) => NUMBER_FORMAT_TYPES.includes(c.format)).map((elem) => ({
|
|
1591
|
+
label: elem.field,
|
|
1592
|
+
value: elem.field,
|
|
1593
|
+
}))) }), refLine.label === REFERENCE_LINE && (_jsxs(_Fragment, { children: [_jsx(TextInputComponent, { id: "chart-builder-ref-line-y1", width: 200, value: refLine.y1?.toString() ?? '', placeholder: "Start value", onChange: (e) => handleChange(e.target.value, 'referenceLines.y1', index) }), _jsx(TextInputComponent, { id: "chart-builder-ref-line-y2", width: 200, value: refLine.y2?.toString() ?? '', placeholder: "End value", onChange: (e) => handleChange(e.target.value, 'referenceLines.y2', index) })] })), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('referenceLines', index) }) })] }, 'referenceLine' + index))), _jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('referenceLines'), label: "Add line +" }) })] })] })] })), windowWidth < 1200 && (_jsx("div", { style: {
|
|
1410
1594
|
width: '100%',
|
|
1411
1595
|
height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
|
|
1412
1596
|
flexGrow: 1,
|
|
@@ -1439,14 +1623,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1439
1623
|
column.field === formData.pivot.rowField
|
|
1440
1624
|
? formData.pivot &&
|
|
1441
1625
|
isDateField(formData.pivot.rowFieldType || '')
|
|
1442
|
-
? '
|
|
1626
|
+
? 'string'
|
|
1443
1627
|
: 'string'
|
|
1444
1628
|
: formData.pivot?.aggregationType ===
|
|
1445
1629
|
'percentage'
|
|
1446
1630
|
? 'percent'
|
|
1447
1631
|
: 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
|
|
1448
1632
|
? isDateField(formData.pivot.rowFieldType || '')
|
|
1449
|
-
? [{ label: 'date', value: '
|
|
1633
|
+
? [{ label: 'date', value: 'string' }]
|
|
1450
1634
|
: [{ label: 'string', value: 'string' }]
|
|
1451
1635
|
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
1452
1636
|
: formData.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: rows[0]
|
|
@@ -1457,12 +1641,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1457
1641
|
: columns.map((elem) => ({
|
|
1458
1642
|
label: elem.field,
|
|
1459
1643
|
value: elem.field,
|
|
1460
|
-
})), 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:
|
|
1644
|
+
})), 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: ALL_FORMAT_OPTIONS, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), _jsx("div", { children: !(
|
|
1461
1645
|
// hide when pivoted and chartType === 'table'
|
|
1462
1646
|
(formData.pivot &&
|
|
1463
1647
|
selectedPivotTable &&
|
|
1464
1648
|
selectedPivotTable.columns &&
|
|
1465
|
-
formData.chartType === 'table')) && (
|
|
1649
|
+
formData.chartType === 'table')) && (_jsxs("div", { style: {
|
|
1650
|
+
display: 'flex',
|
|
1651
|
+
flexDirection: 'row',
|
|
1652
|
+
gap: 10,
|
|
1653
|
+
}, children: [_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), isAdmin &&
|
|
1654
|
+
client?.featureFlags?.customFieldsEnabled && (_jsx(CheckboxComponent, { isChecked: containsCustomFields || includeCustomFields, label: "Include Custom Fields", onChange: () => setIncludeCustomFields((prev) => !prev), disabled: containsCustomFields }))] })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
|
|
1466
1655
|
display: 'flex',
|
|
1467
1656
|
flexDirection: 'column',
|
|
1468
1657
|
gap: 12,
|
|
@@ -1476,54 +1665,61 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1476
1665
|
width: 'fit-content',
|
|
1477
1666
|
gap: 12,
|
|
1478
1667
|
marginBottom: 8,
|
|
1479
|
-
}, children: [
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
:
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
:
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1668
|
+
}, children: [_jsx(QuillToolTip, { text: 'Tenant access is restricted to current tenant with direct custom field reference.', enabled: containsCustomFields, textStyle: {
|
|
1669
|
+
maxWidth: '200px',
|
|
1670
|
+
whiteSpace: 'normal',
|
|
1671
|
+
}, children: _jsxs("div", { style: {
|
|
1672
|
+
outline: '1px solid #E7E7E7',
|
|
1673
|
+
borderRadius: 6,
|
|
1674
|
+
padding: 4,
|
|
1675
|
+
display: 'flex',
|
|
1676
|
+
flexDirection: 'row',
|
|
1677
|
+
marginLeft: 2,
|
|
1678
|
+
backgroundColor: '#FCFCFC',
|
|
1679
|
+
height: 38,
|
|
1680
|
+
width: 'fit-content',
|
|
1681
|
+
}, children: [_jsx("button", { onClick: () => {
|
|
1682
|
+
if (!containsCustomFields) {
|
|
1683
|
+
setCustomTenantAccess(false);
|
|
1684
|
+
setFormFlags(undefined);
|
|
1685
|
+
}
|
|
1686
|
+
}, style: {
|
|
1687
|
+
width: 95,
|
|
1688
|
+
outline: !(customTenantAccess || containsCustomFields)
|
|
1689
|
+
? '1px solid #E7E7E7'
|
|
1690
|
+
: undefined,
|
|
1691
|
+
backgroundColor: !(customTenantAccess || containsCustomFields)
|
|
1692
|
+
? 'white'
|
|
1693
|
+
: undefined,
|
|
1694
|
+
// Center text vertically and horizontally
|
|
1695
|
+
display: 'flex',
|
|
1696
|
+
justifyContent: 'center',
|
|
1697
|
+
alignItems: 'center',
|
|
1698
|
+
borderRadius: 6,
|
|
1699
|
+
fontSize: 14,
|
|
1700
|
+
fontWeight: 500,
|
|
1701
|
+
userSelect: 'none',
|
|
1702
|
+
}, children: "Global" }), _jsx("button", { onClick: () => {
|
|
1703
|
+
setCustomTenantAccess(true);
|
|
1704
|
+
}, style: {
|
|
1705
|
+
width: 95,
|
|
1706
|
+
outline: customTenantAccess || containsCustomFields
|
|
1707
|
+
? '1px solid #E7E7E7'
|
|
1708
|
+
: undefined,
|
|
1709
|
+
backgroundColor: customTenantAccess || containsCustomFields
|
|
1710
|
+
? 'white'
|
|
1711
|
+
: undefined,
|
|
1712
|
+
// Center text vertically and horizontally
|
|
1713
|
+
display: 'flex',
|
|
1714
|
+
justifyContent: 'center',
|
|
1715
|
+
alignItems: 'center',
|
|
1716
|
+
borderRadius: 6,
|
|
1717
|
+
fontSize: 14,
|
|
1718
|
+
fontWeight: 500,
|
|
1719
|
+
userSelect: 'none',
|
|
1720
|
+
}, children: "Custom" })] }) }), client?.allTenantTypes?.length === 1 ? (_jsx(MultiSelectComponent, { disabled: containsCustomFields, value: containsCustomFields
|
|
1721
|
+
? (currentTenantAsFormFlags?.[dashboardOwner.tenantField] ?? []) // Even though value requires string[], turns out flags can be numbers
|
|
1722
|
+
: (formFlags?.[dashboardOwner.tenantField] ?? []), onChange: (e) => setFormFlags({
|
|
1527
1723
|
...formFlags,
|
|
1528
1724
|
[dashboardOwner.tenantField]: e.target
|
|
1529
1725
|
.value,
|
|
@@ -1540,7 +1736,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1540
1736
|
})) ?? []), width: 200, emptyLabel: dashboardOwner.scope === 'database'
|
|
1541
1737
|
? 'No flags supplied'
|
|
1542
1738
|
: undefined, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
|
|
1543
|
-
display: customTenantAccess
|
|
1739
|
+
display: customTenantAccess || containsCustomFields
|
|
1740
|
+
? 'inline'
|
|
1741
|
+
: 'none',
|
|
1544
1742
|
marginTop: -1,
|
|
1545
1743
|
marginBottom: -4,
|
|
1546
1744
|
} })) : (_jsx(QuillMultiSelectSectionList, { value: formFlags ?? {}, onChange: (e) => setFormFlags(e.target.value), options: allTenantMap, sectionHeaderMap: client?.allTenantTypes?.reduce((acc, tenantType) => {
|
|
@@ -1551,7 +1749,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1551
1749
|
acc[tenantType.tenantField] = tenantType.name;
|
|
1552
1750
|
return acc;
|
|
1553
1751
|
}, {}) ?? {}, width: 200, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
|
|
1554
|
-
display: customTenantAccess
|
|
1752
|
+
display: customTenantAccess || containsCustomFields
|
|
1753
|
+
? 'inline'
|
|
1754
|
+
: 'none',
|
|
1555
1755
|
marginTop: -1,
|
|
1556
1756
|
marginBottom: -4,
|
|
1557
1757
|
}, owner: dashboardOwner.tenantField }))] }) })] })), specificDashboardFilters.length > 0 && isAdmin && (_jsxs("div", { style: {
|
|
@@ -1596,7 +1796,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1596
1796
|
...filterMap,
|
|
1597
1797
|
[filter.label]: {
|
|
1598
1798
|
table: e.target.value,
|
|
1599
|
-
field: schemaData.
|
|
1799
|
+
field: schemaData.schemaWithCustomFields
|
|
1600
1800
|
.find((t) => t.name == e.target.value)
|
|
1601
1801
|
?.columns.find((elem) => elem.field ===
|
|
1602
1802
|
(filterMap[filter.label]?.field ??
|
|
@@ -1617,7 +1817,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1617
1817
|
filter.table,
|
|
1618
1818
|
field: e.target.value,
|
|
1619
1819
|
},
|
|
1620
|
-
}), options: schemaData.
|
|
1820
|
+
}), options: schemaData.schemaWithCustomFields
|
|
1621
1821
|
.find((t) => t.name ==
|
|
1622
1822
|
(filterMap[filter.label]?.table ??
|
|
1623
1823
|
filter.table) &&
|
|
@@ -1647,8 +1847,12 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1647
1847
|
justifyContent: 'space-between',
|
|
1648
1848
|
alignItems: 'center',
|
|
1649
1849
|
gap: 6,
|
|
1650
|
-
}, children: [!!filterIssues?.length &&
|
|
1651
|
-
|
|
1850
|
+
}, children: [!!filterIssues?.length && (_jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashbord - Report issues', containerStyle: { height: '100%' } })), _jsxs("div", { style: {
|
|
1851
|
+
display: 'flex',
|
|
1852
|
+
flexDirection: 'row',
|
|
1853
|
+
gap: 10,
|
|
1854
|
+
backgroundColor: 'white',
|
|
1855
|
+
}, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1652
1856
|
setIsOpen(false);
|
|
1653
1857
|
onDiscardChanges && onDiscardChanges();
|
|
1654
1858
|
}, label: 'Discard changes' }), _jsx(ButtonComponent, { onClick: () => {
|