@quillsql/react 2.13.40 → 2.13.42
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 +30 -3
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +483 -182
- 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 +95 -46
- package/dist/cjs/Dashboard.d.ts +6 -3
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +69 -28
- package/dist/cjs/QuillProvider.d.ts +4 -8
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.d.ts +2 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +190 -48
- package/dist/cjs/SQLEditor.d.ts +8 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +94 -10
- 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 +5 -2
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +34 -7
- 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/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +7 -8
- package/dist/cjs/models/Columns.d.ts +1 -0
- package/dist/cjs/models/Columns.d.ts.map +1 -1
- 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 +14 -3
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +79 -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 +9 -6
- 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 +83 -49
- 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 +36 -14
- package/dist/cjs/utils/schema.d.ts +28 -3
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +79 -43
- package/dist/cjs/utils/tableProcessing.d.ts +12 -3
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +36 -8
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/textProcessing.js +0 -1
- package/dist/cjs/utils/valueFormatter.d.ts +1 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +55 -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 +30 -3
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +487 -187
- 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 +97 -48
- package/dist/esm/Dashboard.d.ts +6 -3
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +70 -29
- package/dist/esm/QuillProvider.d.ts +4 -8
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.d.ts +2 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +192 -50
- package/dist/esm/SQLEditor.d.ts +8 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +95 -11
- 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 +5 -2
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +32 -6
- 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/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +7 -8
- package/dist/esm/models/Columns.d.ts +1 -0
- package/dist/esm/models/Columns.d.ts.map +1 -1
- 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 +14 -3
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +80 -17
- 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 +9 -6
- 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 +83 -49
- 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 +38 -16
- package/dist/esm/utils/schema.d.ts +28 -3
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +78 -43
- package/dist/esm/utils/tableProcessing.d.ts +12 -3
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +36 -8
- package/dist/esm/utils/textProcessing.d.ts.map +1 -1
- package/dist/esm/utils/textProcessing.js +0 -1
- package/dist/esm/utils/valueFormatter.d.ts +1 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +53 -0
- package/package.json +10 -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 { quillAutoFormat, 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,19 @@ 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 = [
|
|
30
|
+
const CHART_TYPES = [
|
|
31
|
+
'column',
|
|
32
|
+
'line',
|
|
33
|
+
'table',
|
|
34
|
+
'metric',
|
|
35
|
+
'gauge',
|
|
36
|
+
'bar',
|
|
37
|
+
'pie',
|
|
38
|
+
'US map',
|
|
39
|
+
'World map',
|
|
40
|
+
];
|
|
31
41
|
const CHART_TO_LABELS = {
|
|
32
42
|
column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
33
43
|
line: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
@@ -35,8 +45,19 @@ const CHART_TO_LABELS = {
|
|
|
35
45
|
metric: { xAxisLabel: 'Value' },
|
|
36
46
|
bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
|
|
37
47
|
pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
|
|
48
|
+
'US map': { xAxisLabel: 'State', yAxisLabel: 'Value' },
|
|
49
|
+
'World map': { xAxisLabel: 'Country', yAxisLabel: 'Value' },
|
|
50
|
+
gauge: { xAxisLabel: 'Value' },
|
|
38
51
|
};
|
|
39
|
-
function getPivotMetricOptions(pivot) {
|
|
52
|
+
function getPivotMetricOptions(pivot, selectedPivotTable, chartType) {
|
|
53
|
+
if (['metric', 'gauge'].includes(chartType) && selectedPivotTable) {
|
|
54
|
+
return selectedPivotTable.columns.map((elem) => ({
|
|
55
|
+
label: elem.field === pivot?.rowField
|
|
56
|
+
? `Pivot Row (${elem.field})`
|
|
57
|
+
: elem.field,
|
|
58
|
+
value: elem.field,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
40
61
|
if (!pivot.rowField) {
|
|
41
62
|
const valueField = disambiguatedValueField(pivot);
|
|
42
63
|
return [
|
|
@@ -75,17 +96,26 @@ export function createInitialFormData(columns) {
|
|
|
75
96
|
chartType: firstNumberColumn ? 'line' : 'table',
|
|
76
97
|
pivot: null,
|
|
77
98
|
template: true,
|
|
99
|
+
referenceLines: [],
|
|
78
100
|
};
|
|
79
101
|
return formEmptyState;
|
|
80
102
|
}
|
|
81
103
|
function getChartTypeOptions(formData, dashboard) {
|
|
82
104
|
let viableCharts = CHART_TYPES;
|
|
83
105
|
if (dashboard && dashboard.dateFilter && dashboard.dateFilter.comparison) {
|
|
84
|
-
viableCharts = viableCharts.filter((chart) => ![
|
|
106
|
+
viableCharts = viableCharts.filter((chart) => ![
|
|
107
|
+
'table',
|
|
108
|
+
'metric',
|
|
109
|
+
'gauge',
|
|
110
|
+
'bar',
|
|
111
|
+
'pie',
|
|
112
|
+
'US map',
|
|
113
|
+
'World map',
|
|
114
|
+
].includes(chart));
|
|
85
115
|
}
|
|
86
116
|
if (formData.pivot && !formData.pivot.rowField) {
|
|
87
117
|
return viableCharts
|
|
88
|
-
.filter((elem) =>
|
|
118
|
+
.filter((elem) => ['table', 'metric', 'gauge'].includes(elem))
|
|
89
119
|
.map((elem) => ({
|
|
90
120
|
label: elem,
|
|
91
121
|
value: elem,
|
|
@@ -93,14 +123,16 @@ function getChartTypeOptions(formData, dashboard) {
|
|
|
93
123
|
}
|
|
94
124
|
else {
|
|
95
125
|
return viableCharts
|
|
96
|
-
.filter((elem) => !(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
126
|
+
.filter((elem) => !(formData.pivot &&
|
|
127
|
+
formData.pivot.columnField &&
|
|
128
|
+
(elem === 'bar' ||
|
|
129
|
+
elem === 'pie' ||
|
|
130
|
+
elem === 'US map' ||
|
|
131
|
+
elem === 'World map')))
|
|
100
132
|
.map((elem) => ({ label: elem, value: elem }));
|
|
101
133
|
}
|
|
102
134
|
}
|
|
103
|
-
function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = []) {
|
|
135
|
+
export function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = [], referenceLineQueryResults) {
|
|
104
136
|
const newReport = convertInternalReportToReport(mergeComparisonRange({
|
|
105
137
|
...formData,
|
|
106
138
|
dashboardName: formData.dashboardName || '',
|
|
@@ -120,6 +152,18 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
|
|
|
120
152
|
pivotColumns: selectedPivotTable?.columns ?? undefined,
|
|
121
153
|
pivotRows: selectedPivotTable?.rows ?? undefined,
|
|
122
154
|
columnInternal: report?.columnInternal ?? [],
|
|
155
|
+
referenceLines: formData.referenceLines?.map((elem) => ({
|
|
156
|
+
label: elem.label,
|
|
157
|
+
query: elem.label === REFERENCE_LINE
|
|
158
|
+
? [Number(elem.y1) || 0, Number(elem.y2) || 0]
|
|
159
|
+
: elem.label,
|
|
160
|
+
})) || [],
|
|
161
|
+
referenceLineYValues: formData.referenceLines?.map((elem, index) => ({
|
|
162
|
+
label: elem.label,
|
|
163
|
+
query: elem.label === REFERENCE_LINE
|
|
164
|
+
? [Number(elem.y1) || 0, Number(elem.y2) || 0]
|
|
165
|
+
: referenceLineQueryResults?.[index],
|
|
166
|
+
})) || [],
|
|
123
167
|
}), filtersApplied);
|
|
124
168
|
return newReport;
|
|
125
169
|
}
|
|
@@ -155,7 +199,7 @@ const DATE_OPTIONS = [
|
|
|
155
199
|
{ value: 'MMM_dd_hh:mm_ap_pm', label: 'day and time' },
|
|
156
200
|
{ value: 'hh_ap_pm', label: 'hour' },
|
|
157
201
|
];
|
|
158
|
-
const
|
|
202
|
+
const ALL_FORMAT_OPTIONS = [
|
|
159
203
|
...NUMBER_OPTIONS,
|
|
160
204
|
...DATE_OPTIONS,
|
|
161
205
|
{ value: 'string', label: 'string' },
|
|
@@ -238,9 +282,9 @@ export function ChartBuilderWithModal(props) {
|
|
|
238
282
|
*/
|
|
239
283
|
export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent,
|
|
240
284
|
// 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,
|
|
285
|
+
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, hidePivotForm = false, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, hideTableView = false, hideChartView = false, hideChartType = false, hideDiscardChanges = false, filtersEnabled, onFiltersEnabledChanged,
|
|
242
286
|
// isLoading,
|
|
243
|
-
onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
287
|
+
destinationDashboard, onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
244
288
|
const [client] = useContext(ClientContext);
|
|
245
289
|
const [theme] = useContext(ThemeContext);
|
|
246
290
|
const [schemaData] = useContext(SchemaDataContext);
|
|
@@ -264,14 +308,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
264
308
|
const inputRef = useRef(null);
|
|
265
309
|
const selectRef = useRef(null);
|
|
266
310
|
const processColumns = (columns) => {
|
|
267
|
-
if (schemaData.
|
|
311
|
+
if (schemaData.schemaWithCustomFields) {
|
|
268
312
|
const newProcessedColumns = columns?.map((col) => {
|
|
269
313
|
if (col.jsType) {
|
|
270
314
|
return col;
|
|
271
315
|
}
|
|
272
316
|
const newCol = { ...col };
|
|
273
317
|
let foundColumn;
|
|
274
|
-
schemaData.
|
|
318
|
+
schemaData.schemaWithCustomFields.forEach((table) => {
|
|
275
319
|
if (table.columns) {
|
|
276
320
|
const matchedColumn = table.columns.find((c) => c.field === col.field);
|
|
277
321
|
if (matchedColumn) {
|
|
@@ -356,6 +400,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
356
400
|
const [isEdittingPivot, setIsEdittingPivot] = useState(false);
|
|
357
401
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
358
402
|
const [tableName, setTableName] = useState(undefined);
|
|
403
|
+
const [includeCustomFields, setIncludeCustomFields] = useState(report
|
|
404
|
+
? !!report.includeCustomFields
|
|
405
|
+
: !!client?.featureFlags?.customFieldsEnabled);
|
|
359
406
|
const selectedTable = schemaData.schema?.find((t) => t.displayName === tableName);
|
|
360
407
|
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
361
408
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -370,7 +417,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
370
417
|
}
|
|
371
418
|
: undefined;
|
|
372
419
|
const columns = report?.columnInternal ?? [];
|
|
373
|
-
const
|
|
420
|
+
const destinationDashboardName = destinationDashboard || report?.dashboardName;
|
|
374
421
|
const query = report?.queryString;
|
|
375
422
|
const [loadingFormData, setLoadingFormData] = useState(false);
|
|
376
423
|
const [triggeredEditChart, setTriggeredEditChart] = useState(false);
|
|
@@ -378,11 +425,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
378
425
|
const [recommendedPivots, setRecommendedPivots] = useState(rp);
|
|
379
426
|
const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
|
|
380
427
|
const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
|
|
381
|
-
const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
|
|
428
|
+
const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
|
|
429
|
+
{
|
|
382
430
|
valueField: report?.pivot?.valueField,
|
|
383
431
|
valueField2: report?.pivot?.valueField2,
|
|
384
|
-
aggregationType: report?.pivot?.aggregationType
|
|
385
|
-
}
|
|
432
|
+
aggregationType: report?.pivot?.aggregationType,
|
|
433
|
+
},
|
|
434
|
+
]);
|
|
386
435
|
const baseProcessing = {
|
|
387
436
|
page: report?.pagination ?? {
|
|
388
437
|
page: 0,
|
|
@@ -397,6 +446,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
397
446
|
const [allTables, setAllTables] = useState([]);
|
|
398
447
|
const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
|
|
399
448
|
const [referencedColumns, setReferencedColumns] = useState({});
|
|
449
|
+
const [referencedColumnsWithoutStar, setReferencedColumnsWithoutStar] = useState({});
|
|
400
450
|
const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
|
|
401
451
|
const canonicalFilterMap = useMemo(() => {
|
|
402
452
|
return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
|
|
@@ -409,7 +459,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
409
459
|
}
|
|
410
460
|
acc[filter.label] =
|
|
411
461
|
!!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
|
|
412
|
-
!!schemaData.
|
|
462
|
+
!!schemaData.schemaWithCustomFields
|
|
413
463
|
?.find((table) => {
|
|
414
464
|
return (table.displayName === (filterMap[filter.label] ?? filter).table);
|
|
415
465
|
})
|
|
@@ -453,6 +503,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
453
503
|
pivot: null,
|
|
454
504
|
dateField: defaultDateField,
|
|
455
505
|
template: true,
|
|
506
|
+
referenceLines: [],
|
|
456
507
|
};
|
|
457
508
|
const updateDashboardFilters = async (dashboardName) => {
|
|
458
509
|
if (dashboardConfig && dashboardConfig[dashboardName]) {
|
|
@@ -493,8 +544,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
493
544
|
const pivotFormData = (pivot) => {
|
|
494
545
|
const yAxisField = pivot.columnField ?? disambiguatedValueField(pivot) ?? '';
|
|
495
546
|
const yAxisLabel = report?.yAxisFields && report?.yAxisFields?.length > 0
|
|
496
|
-
? report.yAxisFields[0]?.label ?? ''
|
|
497
|
-
: disambiguatedValueField(pivot) ?? '';
|
|
547
|
+
? (report.yAxisFields[0]?.label ?? '')
|
|
548
|
+
: (disambiguatedValueField(pivot) ?? '');
|
|
498
549
|
// date labels for pivots should be treated like strings since they are
|
|
499
550
|
const yAxisIsDate = pivot.columnField
|
|
500
551
|
? isDateField(pivot.columnFieldType ?? '')
|
|
@@ -503,12 +554,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
503
554
|
const result = {
|
|
504
555
|
pivot,
|
|
505
556
|
chartType: chartType,
|
|
506
|
-
xAxisField: pivot.rowField
|
|
507
|
-
|
|
557
|
+
xAxisField: pivot.rowField
|
|
558
|
+
? pivot.rowField
|
|
559
|
+
: disambiguatedValueField(pivot),
|
|
560
|
+
xAxisFormat: isDateType(pivot.rowFieldType ?? '')
|
|
508
561
|
? 'string'
|
|
509
|
-
:
|
|
510
|
-
|
|
511
|
-
'
|
|
562
|
+
: isNumberType(pivot.rowFieldType ?? '')
|
|
563
|
+
? 'whole_number'
|
|
564
|
+
: 'string',
|
|
512
565
|
xAxisLabel: report?.xAxisLabel || pivot.rowField,
|
|
513
566
|
yAxisFields: [
|
|
514
567
|
{
|
|
@@ -517,43 +570,71 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
517
570
|
format: yAxisIsDate
|
|
518
571
|
? 'string'
|
|
519
572
|
: 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',
|
|
573
|
+
? (report?.yAxisFields[0]?.format ?? 'whole_number')
|
|
574
|
+
: (report?.columns.find((col) => col.field === disambiguatedValueField(pivot))?.format ?? 'whole_number'),
|
|
523
575
|
},
|
|
524
576
|
],
|
|
525
577
|
};
|
|
526
578
|
return result;
|
|
527
579
|
};
|
|
528
|
-
const getReferencedTables = async (client, sqlQuery, dbTables) => {
|
|
580
|
+
const getReferencedTables = async (client, sqlQuery, dbTables, skipStar) => {
|
|
529
581
|
const resp = await getDataFromCloud(client, `astify`, {
|
|
530
582
|
query: sqlQuery,
|
|
531
583
|
publicKey: client.publicKey,
|
|
532
584
|
useNewNodeSql: true,
|
|
533
585
|
});
|
|
534
586
|
if (resp.success === false) {
|
|
535
|
-
return getTablesHelper(getSelectFromAST({}), dbTables);
|
|
587
|
+
return getTablesHelper(getSelectFromAST({}), dbTables, skipStar);
|
|
536
588
|
}
|
|
537
|
-
return getTablesHelper(getSelectFromAST(resp.ast), dbTables);
|
|
589
|
+
return getTablesHelper(getSelectFromAST(resp.ast), dbTables, skipStar);
|
|
538
590
|
};
|
|
539
591
|
const formFormDataFromReport = (report) => {
|
|
540
|
-
let pivotData = {};
|
|
592
|
+
// let pivotData = {};
|
|
541
593
|
let dateField = defaultDateField;
|
|
542
|
-
if (report?.pivot) {
|
|
543
|
-
|
|
544
|
-
}
|
|
594
|
+
// if (report?.pivot) {
|
|
595
|
+
// pivotData = pivotFormData(report.pivot);
|
|
596
|
+
// }
|
|
545
597
|
if (report) {
|
|
546
598
|
dateField = report.dateField || defaultDateField;
|
|
547
599
|
}
|
|
548
600
|
return {
|
|
549
601
|
...formEmptyState,
|
|
550
602
|
...report,
|
|
551
|
-
...pivotData,
|
|
552
|
-
...(report?.dashboardName && { dashboardName: report?.dashboardName }),
|
|
603
|
+
// ...pivotData,
|
|
553
604
|
dateField: dateField,
|
|
605
|
+
referenceLines: report?.referenceLines
|
|
606
|
+
? report.referenceLines?.map(({ label, query }) => {
|
|
607
|
+
if (typeof query === 'string') {
|
|
608
|
+
return { label, y1: undefined, y2: undefined };
|
|
609
|
+
}
|
|
610
|
+
return {
|
|
611
|
+
label,
|
|
612
|
+
y1: query[0],
|
|
613
|
+
y2: query[1],
|
|
614
|
+
};
|
|
615
|
+
})
|
|
616
|
+
: [],
|
|
554
617
|
};
|
|
555
618
|
};
|
|
556
619
|
const [formData, setFormData] = useState(formFormDataFromReport(report));
|
|
620
|
+
const reportCustomFields = useMemo(() => {
|
|
621
|
+
return (report?.columnsWithCustomFields?.filter((col) => !report?.columns?.some((c) => col.field === c.field)) ?? []);
|
|
622
|
+
}, [report?.columnsWithCustomFields, report?.columns]);
|
|
623
|
+
const referenceLineQueryResults = useMemo(() => {
|
|
624
|
+
return formData?.referenceLines?.map((line) => {
|
|
625
|
+
if (line.label === REFERENCE_LINE) {
|
|
626
|
+
return [Number(line.y1) || 0, Number(line.y2) || 0];
|
|
627
|
+
}
|
|
628
|
+
// line.label is a field
|
|
629
|
+
// Get the first and last row of the field
|
|
630
|
+
const field = formData.columns.find((col) => col.field === line.label);
|
|
631
|
+
if (!field) {
|
|
632
|
+
return [0, 0];
|
|
633
|
+
}
|
|
634
|
+
// return [Number(rows[0]?.[field.field]) || 0, Number(rows[rows.length - 1]?.[field.field]) || 0];
|
|
635
|
+
return (pivotData?.rows ? pivotData.rows : rows).map((row) => Number(row[field.field]) || 0);
|
|
636
|
+
});
|
|
637
|
+
}, [formData?.referenceLines]);
|
|
557
638
|
const currentDashboard = useMemo(() => {
|
|
558
639
|
return dashboardConfig[formData.dashboardName ?? report?.dashboardName ?? '']?.config;
|
|
559
640
|
}, [dashboardConfig, formData.dashboardName, report?.dashboardName]);
|
|
@@ -561,6 +642,19 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
561
642
|
return (currentDashboard?.tenantKeys?.map((tenantKey) => client?.allTenantTypes?.find((t) => t.tenantField === tenantKey)) ?? []);
|
|
562
643
|
}, [client?.allTenantTypes, currentDashboard?.tenantKeys]);
|
|
563
644
|
const dashboardOwner = currentDashboardTenants?.[0];
|
|
645
|
+
const currentTenantAsFormFlags = useMemo(() => {
|
|
646
|
+
if (!tenants || !tenants.length) {
|
|
647
|
+
return undefined;
|
|
648
|
+
}
|
|
649
|
+
const tenantField = typeof tenants[0] !== 'object'
|
|
650
|
+
? dashboardOwner?.name
|
|
651
|
+
: tenants[0]?.tenantField;
|
|
652
|
+
if (!tenantField) {
|
|
653
|
+
return undefined;
|
|
654
|
+
}
|
|
655
|
+
const tenantIds = typeof tenants[0] !== 'object' ? tenants : tenants[0]?.tenantIds;
|
|
656
|
+
return { [tenantField]: tenantIds };
|
|
657
|
+
}, [tenants, dashboardOwner]);
|
|
564
658
|
const invalidColumns = useMemo(() => {
|
|
565
659
|
if (!rows || !rows.length) {
|
|
566
660
|
return [];
|
|
@@ -575,6 +669,62 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
575
669
|
const data = formFormDataFromReport(report);
|
|
576
670
|
return getChartTypeOptions(data, dashboardConfig[data.dashboardName || '']);
|
|
577
671
|
})());
|
|
672
|
+
const reportContainsCustomFields = useMemo(() => {
|
|
673
|
+
// Check whether report query contains custom fields
|
|
674
|
+
const customFieldsMap = schemaData.customFields;
|
|
675
|
+
const reportQueryContainsCustomFields = allTables.some((table) => {
|
|
676
|
+
const tableColumns = referencedColumnsWithoutStar[table] ?? [];
|
|
677
|
+
const customFieldColumns = customFieldsMap?.[table] ?? [];
|
|
678
|
+
return tableColumns.some((column) => customFieldColumns.some((field) => field.field === column));
|
|
679
|
+
});
|
|
680
|
+
return reportQueryContainsCustomFields;
|
|
681
|
+
}, [allTables, referencedColumnsWithoutStar]);
|
|
682
|
+
const chartBuilderFormDataContainsCustomFields = useMemo(() => {
|
|
683
|
+
const customFields = allTables
|
|
684
|
+
.map((table) => schemaData.customFields?.[table] ?? [])
|
|
685
|
+
.flat();
|
|
686
|
+
const customFieldsMap = schemaData.customFields;
|
|
687
|
+
const pivotContainsCustomFields = customFields.some((field) => field.field === formData.pivot?.columnField ||
|
|
688
|
+
field.field === formData.pivot?.rowField ||
|
|
689
|
+
field.field === formData.pivot?.valueField);
|
|
690
|
+
const xAxisFieldContainsCustomFields = customFields.some((field) => field.field === formData.xAxisField);
|
|
691
|
+
const yAxisFieldsContainsCustomFields = formData.yAxisFields.some((yAxisField) => {
|
|
692
|
+
return customFields.some((field) => field.field === yAxisField.field);
|
|
693
|
+
});
|
|
694
|
+
const dateFieldContainsCustomFields = customFields.some((field) => field.field === formData.dateField?.field);
|
|
695
|
+
const canonicalFilterMapContainsCustomFields = Object.values(canonicalFilterMap).some((filter) => {
|
|
696
|
+
return customFieldsMap?.[filter.table || '']?.some((field) => field.field === filter.field);
|
|
697
|
+
});
|
|
698
|
+
return (pivotContainsCustomFields ||
|
|
699
|
+
xAxisFieldContainsCustomFields ||
|
|
700
|
+
yAxisFieldsContainsCustomFields ||
|
|
701
|
+
dateFieldContainsCustomFields ||
|
|
702
|
+
canonicalFilterMapContainsCustomFields);
|
|
703
|
+
}, [
|
|
704
|
+
allTables,
|
|
705
|
+
formData.pivot,
|
|
706
|
+
formData.xAxisField,
|
|
707
|
+
formData.yAxisFields,
|
|
708
|
+
formData.dateField,
|
|
709
|
+
canonicalFilterMap,
|
|
710
|
+
]);
|
|
711
|
+
const customFieldsInTabularColumns = useMemo(() => {
|
|
712
|
+
const customFields = allTables
|
|
713
|
+
.map((table) => schemaData.customFields?.[table] ?? [])
|
|
714
|
+
.flat();
|
|
715
|
+
return formData.columns.some((col) => {
|
|
716
|
+
return customFields.some((field) => field.field === col.field);
|
|
717
|
+
});
|
|
718
|
+
}, [allTables, formData.columns]);
|
|
719
|
+
const containsCustomFields = useMemo(() => {
|
|
720
|
+
return (reportContainsCustomFields ||
|
|
721
|
+
customFieldsInTabularColumns ||
|
|
722
|
+
chartBuilderFormDataContainsCustomFields);
|
|
723
|
+
}, [
|
|
724
|
+
reportContainsCustomFields,
|
|
725
|
+
customFieldsInTabularColumns,
|
|
726
|
+
chartBuilderFormDataContainsCustomFields,
|
|
727
|
+
]);
|
|
578
728
|
useEffect(() => {
|
|
579
729
|
if (!loadingFormData && triggeredEditChart) {
|
|
580
730
|
editChart();
|
|
@@ -600,24 +750,25 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
600
750
|
{ label: 'New - Dashboard', value: 'New - Dashboard' },
|
|
601
751
|
];
|
|
602
752
|
}
|
|
603
|
-
if (
|
|
753
|
+
if (destinationDashboardName) {
|
|
604
754
|
dashboardOptions = [
|
|
605
|
-
{ label:
|
|
755
|
+
{ label: destinationDashboardName, value: destinationDashboardName },
|
|
606
756
|
];
|
|
607
757
|
}
|
|
608
758
|
let dashboardName = report?.dashboardName ?? dashboardOptions[0]?.label ?? '';
|
|
609
|
-
if (
|
|
610
|
-
dashboardName =
|
|
759
|
+
if (destinationDashboardName) {
|
|
760
|
+
dashboardName = destinationDashboardName;
|
|
611
761
|
}
|
|
612
762
|
const curDashboard = await updateDashboardFilters(dashboardName);
|
|
613
763
|
setDashboardOptions(dashboardOptions);
|
|
614
764
|
curFormData.dashboardName = dashboardName;
|
|
615
|
-
const curSchemaData = schemaData.
|
|
765
|
+
const curSchemaData = schemaData.schemaWithCustomFields;
|
|
616
766
|
if (!query) {
|
|
617
767
|
setLoadingFormData(false);
|
|
618
768
|
return;
|
|
619
769
|
}
|
|
620
770
|
const result = await getReferencedTables(client, query, curSchemaData);
|
|
771
|
+
const referencedTablesWithoutStar = await getReferencedTables(client, query, curSchemaData, true);
|
|
621
772
|
setDateFieldOptions(result.dateFields);
|
|
622
773
|
if (result.dateFields[0] && result.dateFields[0].columns[0]) {
|
|
623
774
|
setDefaultDateField({
|
|
@@ -641,6 +792,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
641
792
|
acc[table.name] = table.columns.map((col) => col.field);
|
|
642
793
|
return acc;
|
|
643
794
|
}, {});
|
|
795
|
+
const referencedColumnsWithoutStar = referencedTablesWithoutStar.referencedTablesAndColumns.reduce((acc, table) => {
|
|
796
|
+
acc[table.name] = table.columns.map((col) => col.field);
|
|
797
|
+
return acc;
|
|
798
|
+
}, {});
|
|
799
|
+
setReferencedColumnsWithoutStar(referencedColumnsWithoutStar);
|
|
644
800
|
setReferencedColumns(referencedColumns);
|
|
645
801
|
setTableName(result.dateFields[0]?.name);
|
|
646
802
|
const dateField = {
|
|
@@ -698,12 +854,21 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
698
854
|
};
|
|
699
855
|
}, [selectedPivotTable, formData.pivot]);
|
|
700
856
|
const chartData = useMemo(() => {
|
|
701
|
-
const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters);
|
|
857
|
+
const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters, referenceLineQueryResults);
|
|
702
858
|
return {
|
|
703
859
|
...data,
|
|
704
860
|
filterMap: canonicalFilterMap,
|
|
705
861
|
};
|
|
706
862
|
}, [formData, selectedPivotTable, report, rows, rowCount]);
|
|
863
|
+
const xAxisFormatOptions = useMemo(() => {
|
|
864
|
+
return chartData?.chartType === 'gauge'
|
|
865
|
+
? [
|
|
866
|
+
{ value: 'whole_number', label: 'whole number' },
|
|
867
|
+
{ value: 'two_decimal_places', label: 'two decimal places' },
|
|
868
|
+
{ value: 'percent', label: 'percentage' },
|
|
869
|
+
]
|
|
870
|
+
: ALL_FORMAT_OPTIONS;
|
|
871
|
+
}, [chartData?.chartType]);
|
|
707
872
|
const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
|
|
708
873
|
const dashboardFilters = filtersEnabled
|
|
709
874
|
? (overrideFilters ?? currentDashboardFilters)
|
|
@@ -731,7 +896,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
731
896
|
: undefined,
|
|
732
897
|
client,
|
|
733
898
|
uniqueValues,
|
|
734
|
-
dashboardName:
|
|
899
|
+
dashboardName: destinationDashboardName,
|
|
735
900
|
tenants,
|
|
736
901
|
additionalProcessing: baseProcessing,
|
|
737
902
|
});
|
|
@@ -752,11 +917,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
752
917
|
if (selectedPivotTable &&
|
|
753
918
|
selectedPivotTable.columns &&
|
|
754
919
|
formData.chartType === 'table') {
|
|
755
|
-
console.log('selectedPivotTable', selectedPivotTable);
|
|
756
920
|
const columns = selectedPivotTable.columns;
|
|
757
921
|
columns.forEach((col, index) => {
|
|
758
922
|
// ADD THE RIGHT FIELD TYPE FOR THE VALUE COLUMNS
|
|
759
|
-
if (
|
|
923
|
+
if (['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '') &&
|
|
760
924
|
index !== 0) {
|
|
761
925
|
col.format = 'two_decimal_places';
|
|
762
926
|
}
|
|
@@ -777,12 +941,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
777
941
|
if (!rows)
|
|
778
942
|
return [];
|
|
779
943
|
return rows.map((row) => {
|
|
780
|
-
|
|
944
|
+
const columns = formData.includeCustomFields && !containsCustomFields
|
|
945
|
+
? formData.columns.concat(reportCustomFields)
|
|
946
|
+
: formData.columns;
|
|
947
|
+
return columns.reduce((formattedRow, column) => {
|
|
781
948
|
// Apply the format function to each field in the row
|
|
782
|
-
const formattedValue =
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
949
|
+
const formattedValue = column.inferFormat
|
|
950
|
+
? quillAutoFormat(row[column.field])
|
|
951
|
+
: quillFormat({
|
|
952
|
+
value: row[column.field],
|
|
953
|
+
format: column.format,
|
|
954
|
+
});
|
|
786
955
|
formattedRow[column.field] = formattedValue;
|
|
787
956
|
return formattedRow;
|
|
788
957
|
}, {});
|
|
@@ -813,7 +982,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
813
982
|
rowsOnly: false,
|
|
814
983
|
rowCountOnly: true,
|
|
815
984
|
filterMap: canonicalFilterMap,
|
|
816
|
-
dashboardName:
|
|
985
|
+
dashboardName: destinationDashboardName,
|
|
817
986
|
});
|
|
818
987
|
if (tableInfo.rowCount !== undefined) {
|
|
819
988
|
setRowCount(tableInfo.rowCount);
|
|
@@ -865,7 +1034,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
865
1034
|
rowsOnly: true,
|
|
866
1035
|
rowCountOnly: false,
|
|
867
1036
|
filterMap: canonicalFilterMap,
|
|
868
|
-
dashboardName:
|
|
1037
|
+
dashboardName: destinationDashboardName,
|
|
869
1038
|
});
|
|
870
1039
|
setCurrentProcessing(processing);
|
|
871
1040
|
setRows(tableInfo.rows);
|
|
@@ -874,7 +1043,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
874
1043
|
fetchRowCount(processing, overrideFilters);
|
|
875
1044
|
if (formData.pivot) {
|
|
876
1045
|
try {
|
|
877
|
-
const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ??
|
|
1046
|
+
const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ?? {}, overrideFilters, destinationDashboardName);
|
|
878
1047
|
fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
|
|
879
1048
|
}
|
|
880
1049
|
catch (e) {
|
|
@@ -941,7 +1110,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
941
1110
|
rowsOnly: false,
|
|
942
1111
|
rowCountOnly: false,
|
|
943
1112
|
filterMap: canonicalFilterMap,
|
|
944
|
-
dashboardName:
|
|
1113
|
+
dashboardName: destinationDashboardName,
|
|
945
1114
|
pivot: isPivotTable ? report.pivot : undefined,
|
|
946
1115
|
getPivotRowCount: false,
|
|
947
1116
|
});
|
|
@@ -989,8 +1158,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
989
1158
|
else if (index !== undefined) {
|
|
990
1159
|
// For dynamic array fields
|
|
991
1160
|
const [field, subfield] = fieldName.split('.');
|
|
1161
|
+
let newLabel = undefined;
|
|
1162
|
+
if (field === 'columns' && subfield === 'field') {
|
|
1163
|
+
if (!formData['columns'][index]?.label) {
|
|
1164
|
+
newLabel = snakeAndCamelCaseToTitleCase(value);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
992
1167
|
// @ts-ignore
|
|
993
|
-
const updatedArray = formData[field].map((item, i) => i === index
|
|
1168
|
+
const updatedArray = formData[field].map((item, i) => i === index
|
|
1169
|
+
? {
|
|
1170
|
+
...item,
|
|
1171
|
+
label: newLabel ? newLabel : item.label,
|
|
1172
|
+
[subfield]: value,
|
|
1173
|
+
}
|
|
1174
|
+
: item);
|
|
994
1175
|
updatedForm = { ...formData, [field]: updatedArray };
|
|
995
1176
|
setFormData(updatedForm);
|
|
996
1177
|
setChartTypes(getChartTypeOptions(updatedForm, dashboardConfig[updatedForm.dashboardName ?? '']));
|
|
@@ -1027,7 +1208,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1027
1208
|
else if (field === 'dateField' &&
|
|
1028
1209
|
subfield === 'table' &&
|
|
1029
1210
|
!formData.dateField?.field) {
|
|
1030
|
-
const field = schemaData.
|
|
1211
|
+
const field = schemaData.schemaWithCustomFields?.find((elem) => elem.name === value)?.columns?.[0]?.field;
|
|
1031
1212
|
updatedForm.dateField = {
|
|
1032
1213
|
// @ts-ignore
|
|
1033
1214
|
...updatedForm[field],
|
|
@@ -1045,6 +1226,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1045
1226
|
// For simple fields
|
|
1046
1227
|
updatedForm = { ...updatedForm, [fieldName]: value };
|
|
1047
1228
|
}
|
|
1229
|
+
if (fieldName === 'chartType') {
|
|
1230
|
+
if (value === 'metric') {
|
|
1231
|
+
updatedForm.xAxisFormat = 'whole_number';
|
|
1232
|
+
}
|
|
1233
|
+
else if (value === 'gauge') {
|
|
1234
|
+
updatedForm.xAxisFormat = 'percent';
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1048
1237
|
let dashboardName = updatedForm.dashboardName;
|
|
1049
1238
|
if (fieldName === 'dashboardName') {
|
|
1050
1239
|
dashboardName = value;
|
|
@@ -1096,6 +1285,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1096
1285
|
...formData,
|
|
1097
1286
|
dashboardName: formData.dashboardName,
|
|
1098
1287
|
pivot: null,
|
|
1288
|
+
chartType: formEmptyState.chartType,
|
|
1289
|
+
xAxisField: formEmptyState.xAxisField,
|
|
1290
|
+
xAxisFormat: formEmptyState.xAxisFormat,
|
|
1291
|
+
xAxisLabel: formEmptyState.xAxisLabel,
|
|
1292
|
+
yAxisFields: formEmptyState.yAxisFields,
|
|
1099
1293
|
});
|
|
1100
1294
|
// maybe validate
|
|
1101
1295
|
setSelectedPivotTable(undefined);
|
|
@@ -1105,7 +1299,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1105
1299
|
if (fieldName === 'columns') {
|
|
1106
1300
|
setFormData({
|
|
1107
1301
|
...formData,
|
|
1108
|
-
columns: [
|
|
1302
|
+
columns: [
|
|
1303
|
+
...formData.columns,
|
|
1304
|
+
{ label: '', field: '', format: 'string' },
|
|
1305
|
+
],
|
|
1109
1306
|
});
|
|
1110
1307
|
}
|
|
1111
1308
|
else if (fieldName === 'yAxisFields') {
|
|
@@ -1113,7 +1310,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1113
1310
|
...formData,
|
|
1114
1311
|
yAxisFields: [
|
|
1115
1312
|
...formData.yAxisFields,
|
|
1116
|
-
{ label: '', field: '', format: '
|
|
1313
|
+
{ label: '', field: '', format: 'string' },
|
|
1117
1314
|
],
|
|
1118
1315
|
});
|
|
1119
1316
|
}
|
|
@@ -1131,6 +1328,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1131
1328
|
},
|
|
1132
1329
|
});
|
|
1133
1330
|
}
|
|
1331
|
+
else if (fieldName === 'referenceLines') {
|
|
1332
|
+
setFormData({
|
|
1333
|
+
...formData,
|
|
1334
|
+
referenceLines: [
|
|
1335
|
+
...formData.referenceLines,
|
|
1336
|
+
{ label: '', y1: undefined, y2: undefined },
|
|
1337
|
+
],
|
|
1338
|
+
});
|
|
1339
|
+
}
|
|
1134
1340
|
};
|
|
1135
1341
|
const handleRemoveField = (fieldName, index) => {
|
|
1136
1342
|
if (fieldName === 'pivot') {
|
|
@@ -1178,31 +1384,40 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1178
1384
|
...(formData.dateField?.table
|
|
1179
1385
|
? {}
|
|
1180
1386
|
: { dateField: { ...defaultDateField } }),
|
|
1181
|
-
|
|
1182
|
-
? {}
|
|
1183
|
-
: { dashboardName: report?.dashboardName }),
|
|
1387
|
+
dashboardName: destinationDashboardName,
|
|
1184
1388
|
query: report?.queryString ?? '',
|
|
1185
1389
|
pivot: formData.pivot,
|
|
1186
1390
|
referencedTables: allTables,
|
|
1187
1391
|
referencedColumns,
|
|
1392
|
+
includeCustomFields: includeCustomFields || containsCustomFields,
|
|
1188
1393
|
template: tenants
|
|
1189
1394
|
? undefined
|
|
1190
1395
|
: report && !isAdmin && formData.template
|
|
1191
1396
|
? false
|
|
1192
1397
|
: formData.template,
|
|
1193
|
-
reportFlags:
|
|
1194
|
-
?
|
|
1195
|
-
|
|
1196
|
-
.
|
|
1197
|
-
|
|
1198
|
-
key,
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1398
|
+
reportFlags: containsCustomFields
|
|
1399
|
+
? currentTenantAsFormFlags
|
|
1400
|
+
: formFlags
|
|
1401
|
+
? Object.fromEntries(Object.entries(formFlags)
|
|
1402
|
+
.filter(([, value]) => value.length > 0)
|
|
1403
|
+
.map(([key, value]) => {
|
|
1404
|
+
return [
|
|
1405
|
+
key,
|
|
1406
|
+
Object.keys(allTenantMap).length > 1 &&
|
|
1407
|
+
allTenantMap[key]?.length === value.length
|
|
1408
|
+
? ALL_TENANTS
|
|
1409
|
+
: value,
|
|
1410
|
+
];
|
|
1411
|
+
}))
|
|
1412
|
+
: undefined,
|
|
1413
|
+
referenceLines: formData.referenceLines.map((line) => {
|
|
1414
|
+
return {
|
|
1415
|
+
label: line.label,
|
|
1416
|
+
query: line.label === REFERENCE_LINE
|
|
1417
|
+
? [Number(line.y1 ?? 0) || 0, Number(line.y2 ?? 0) || 0]
|
|
1418
|
+
: '',
|
|
1419
|
+
};
|
|
1420
|
+
}),
|
|
1206
1421
|
};
|
|
1207
1422
|
const resp = await saveReport({
|
|
1208
1423
|
report: { ...newReport, rows: undefined, pivotRows: undefined }, // stop including rows in request
|
|
@@ -1262,15 +1477,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1262
1477
|
gap: '20px',
|
|
1263
1478
|
flexDirection: isHorizontalView ? 'row' : 'column',
|
|
1264
1479
|
boxSizing: 'border-box',
|
|
1265
|
-
}, children: [_jsxs("div", { style: {
|
|
1480
|
+
}, children: [hideChartView ? null : (_jsxs("div", { style: {
|
|
1266
1481
|
display: 'flex',
|
|
1267
1482
|
flexDirection: 'column',
|
|
1268
1483
|
gap: isOpen ? 16 : 20,
|
|
1269
1484
|
overflowY: 'scroll',
|
|
1270
1485
|
height: isHorizontalView || !isOpen ? '100%' : 800,
|
|
1271
1486
|
...(isHorizontalView && {
|
|
1272
|
-
flexGrow: 1,
|
|
1273
|
-
|
|
1487
|
+
// flexGrow: 1,
|
|
1488
|
+
width: !isOpen
|
|
1489
|
+
? '100%'
|
|
1490
|
+
: `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
|
|
1274
1491
|
}),
|
|
1275
1492
|
...(!isHorizontalView && isOpen && { width: formWidth }),
|
|
1276
1493
|
}, children: [!isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth > 1200)) && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
@@ -1281,10 +1498,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1281
1498
|
// formData.chartType === 'metric'
|
|
1282
1499
|
// ? 100
|
|
1283
1500
|
// : `calc(${filtersEnabled ? 50 : 70}%)`,
|
|
1284
|
-
...(isHorizontalView && {
|
|
1501
|
+
...(isHorizontalView && {
|
|
1502
|
+
flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
|
|
1503
|
+
}),
|
|
1285
1504
|
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen }))),
|
|
1286
1505
|
// Make sure to display non-pivoted table when using pivot chart
|
|
1287
|
-
|
|
1506
|
+
!hideChartView &&
|
|
1507
|
+
(isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsxs("div", { style: {
|
|
1288
1508
|
width: '100%',
|
|
1289
1509
|
// height:
|
|
1290
1510
|
// isHorizontalView || !isOpen
|
|
@@ -1298,21 +1518,29 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1298
1518
|
onFiltersEnabledChanged(hide);
|
|
1299
1519
|
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1300
1520
|
width: '100%',
|
|
1301
|
-
height: formData.chartType === 'table'
|
|
1521
|
+
height: formData.chartType === 'table'
|
|
1522
|
+
? 200
|
|
1523
|
+
: formData.chartType === 'metric'
|
|
1524
|
+
? 300
|
|
1525
|
+
: 500,
|
|
1302
1526
|
flexGrow: formData.chartType !== 'table' ? 1 : 0,
|
|
1303
|
-
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns:
|
|
1527
|
+
}, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), hideTableView ? null : formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: includeCustomFields && !containsCustomFields
|
|
1528
|
+
? formData.columns.concat(reportCustomFields)
|
|
1529
|
+
: formData.columns, onPageChange: (page) => {
|
|
1304
1530
|
onPageChange(page);
|
|
1305
1531
|
setCurrentPage(page);
|
|
1306
1532
|
}, onSortChange: (sort) => {
|
|
1307
1533
|
onSortChange && onSortChange(sort);
|
|
1308
|
-
}, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1534
|
+
}, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort, hideLabels: false })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1309
1535
|
? selectedPivotTable.columns
|
|
1310
|
-
:
|
|
1536
|
+
: includeCustomFields && !containsCustomFields
|
|
1537
|
+
? formData.columns.concat(reportCustomFields)
|
|
1538
|
+
: formData.columns, onPageChange: (page) => {
|
|
1311
1539
|
onPageChange(page, true);
|
|
1312
1540
|
setCurrentPage(page);
|
|
1313
1541
|
}, onSortChange: (sort) => {
|
|
1314
1542
|
onSortChange && onSortChange(sort, true);
|
|
1315
|
-
}, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort }))] }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1543
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false }))] }))] })), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
|
|
1316
1544
|
display: 'flex',
|
|
1317
1545
|
flexDirection: 'column',
|
|
1318
1546
|
gap: 20,
|
|
@@ -1328,27 +1556,35 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1328
1556
|
paddingTop: modalPadding,
|
|
1329
1557
|
paddingBottom: modalPadding,
|
|
1330
1558
|
}),
|
|
1331
|
-
}, children: [_jsxs(FormContainer, { children: [
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1559
|
+
}, children: [_jsxs(FormContainer, { children: [hideChartView
|
|
1560
|
+
? null
|
|
1561
|
+
: (formData.pivot || formData.chartType !== 'table') &&
|
|
1562
|
+
windowWidth < 1200 && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
|
|
1563
|
+
onFiltersEnabledChanged(hide);
|
|
1564
|
+
}, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
|
|
1565
|
+
width: '100%',
|
|
1566
|
+
height: formData.chartType === 'table'
|
|
1567
|
+
? 200
|
|
1568
|
+
: formData.chartType === 'metric'
|
|
1569
|
+
? 300
|
|
1570
|
+
: formData.chartType === 'US map' ||
|
|
1571
|
+
formData.chartType === 'World map'
|
|
1572
|
+
? 'fit-content'
|
|
1573
|
+
: 500,
|
|
1574
|
+
flexGrow: !['table'].includes(formData.chartType)
|
|
1575
|
+
? 1
|
|
1576
|
+
: 0,
|
|
1577
|
+
}, 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
1578
|
// {...autofocusRefProp}
|
|
1340
1579
|
, {
|
|
1341
1580
|
// {...autofocusRefProp}
|
|
1342
|
-
id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !
|
|
1581
|
+
id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboardName && (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
|
|
1343
1582
|
handleChange(e.target.value, 'dashboardName');
|
|
1344
1583
|
await updateDashboardFilters(e.target.value);
|
|
1345
1584
|
}, options: dashboardOptions.map((elem) => ({
|
|
1346
1585
|
label: elem.label,
|
|
1347
1586
|
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: {
|
|
1587
|
+
})), width: 200 }) })), hideChartType ? (_jsx("div", { style: { 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 }) }))] }), hidePivotForm ? null : (_jsxs("div", { style: {
|
|
1352
1588
|
display: 'flex',
|
|
1353
1589
|
flexDirection: 'column',
|
|
1354
1590
|
gap: 6,
|
|
@@ -1364,33 +1600,43 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1364
1600
|
setShowPivotPopover(true);
|
|
1365
1601
|
setPivotRowField(formData.pivot?.rowField);
|
|
1366
1602
|
setPivotColumnField(formData.pivot?.columnField);
|
|
1367
|
-
setPivotAggregations(formData.pivot?.aggregations ?? [
|
|
1603
|
+
setPivotAggregations(formData.pivot?.aggregations ?? [
|
|
1604
|
+
{
|
|
1368
1605
|
valueField: formData.pivot?.valueField,
|
|
1369
1606
|
aggregationType: formData.pivot?.aggregationType,
|
|
1370
1607
|
valueField2: formData.pivot?.valueField2,
|
|
1371
|
-
}
|
|
1608
|
+
},
|
|
1609
|
+
]);
|
|
1372
1610
|
setPivotPopUpTitle('Edit pivot');
|
|
1373
|
-
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] })
|
|
1611
|
+
}, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] })), !hideChartView &&
|
|
1612
|
+
(formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
|
|
1374
1613
|
display: 'flex',
|
|
1375
1614
|
flexDirection: 'column',
|
|
1376
|
-
}, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ??
|
|
1377
|
-
|
|
1615
|
+
}, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ??
|
|
1616
|
+
'' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
|
|
1617
|
+
? getPivotMetricOptions(formData.pivot, selectedPivotTable, formData.chartType)
|
|
1378
1618
|
: columns.map((elem) => ({
|
|
1379
1619
|
label: elem.field,
|
|
1380
1620
|
value: elem.field,
|
|
1381
1621
|
})), 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
|
-
? '
|
|
1622
|
+
isDateField(formData.xAxisField ?? '')
|
|
1623
|
+
? 'string'
|
|
1384
1624
|
: formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
|
|
1385
|
-
isDateField(formData.
|
|
1386
|
-
? [{ value: '
|
|
1387
|
-
:
|
|
1388
|
-
|
|
1625
|
+
isDateField(formData.xAxisField ?? '')
|
|
1626
|
+
? [{ value: 'string', label: 'date' }]
|
|
1627
|
+
: xAxisFormatOptions, width: 200, hideEmptyOption: true })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ??
|
|
1628
|
+
'' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
|
|
1629
|
+
? formData.pivot.aggregations?.length
|
|
1630
|
+
? (disambiguatedValueField(formData.pivot) ?? 'count')
|
|
1631
|
+
: 'count'
|
|
1389
1632
|
: yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
|
|
1390
1633
|
? [
|
|
1391
1634
|
{
|
|
1392
|
-
label: `Pivot Column (${formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count'})`,
|
|
1393
|
-
value: formData.pivot.aggregations
|
|
1635
|
+
label: `Pivot Column (${formData.pivot.aggregations?.length ? (disambiguatedValueField(formData.pivot) ?? 'count') : 'count'})`,
|
|
1636
|
+
value: formData.pivot.aggregations
|
|
1637
|
+
?.length
|
|
1638
|
+
? (disambiguatedValueField(formData.pivot) ?? 'count')
|
|
1639
|
+
: 'count',
|
|
1394
1640
|
},
|
|
1395
1641
|
]
|
|
1396
1642
|
: columns
|
|
@@ -1401,28 +1647,52 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1401
1647
|
label: elem.field,
|
|
1402
1648
|
value: elem.field,
|
|
1403
1649
|
})), 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) => {
|
|
1650
|
+
? (NUMBER_OPTIONS.find((option) => {
|
|
1405
1651
|
return (option.value === yAxisField.format);
|
|
1406
|
-
})?.value ?? NUMBER_OPTIONS[0].value
|
|
1652
|
+
})?.value ?? NUMBER_OPTIONS[0].value)
|
|
1407
1653
|
: yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
|
|
1408
1654
|
? NUMBER_OPTIONS
|
|
1409
|
-
:
|
|
1655
|
+
: 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'] &&
|
|
1656
|
+
(chartData.chartType === 'line' ||
|
|
1657
|
+
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),
|
|
1658
|
+
// only include numeric columns
|
|
1659
|
+
options: [
|
|
1660
|
+
{
|
|
1661
|
+
label: 'Custom Values',
|
|
1662
|
+
value: REFERENCE_LINE,
|
|
1663
|
+
},
|
|
1664
|
+
].concat((selectedPivotTable?.columns
|
|
1665
|
+
? selectedPivotTable.columns
|
|
1666
|
+
: columns)
|
|
1667
|
+
.filter((c) => NUMBER_FORMAT_TYPES.includes(c.format))
|
|
1668
|
+
.map((elem) => ({
|
|
1669
|
+
label: elem.field,
|
|
1670
|
+
value: elem.field,
|
|
1671
|
+
}))) }), 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
1672
|
width: '100%',
|
|
1411
1673
|
height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
|
|
1412
1674
|
flexGrow: 1,
|
|
1413
|
-
}, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns:
|
|
1675
|
+
}, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: includeCustomFields && !containsCustomFields
|
|
1676
|
+
? formData.columns.concat(reportCustomFields)
|
|
1677
|
+
: formData.columns, onPageChange: (page) => {
|
|
1414
1678
|
onPageChange(page);
|
|
1415
1679
|
setCurrentPage(page);
|
|
1416
1680
|
}, onSortChange: (sort) => {
|
|
1417
1681
|
onSortChange && onSortChange(sort);
|
|
1418
|
-
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1682
|
+
}, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
|
|
1419
1683
|
? selectedPivotTable.columns
|
|
1420
|
-
:
|
|
1684
|
+
: includeCustomFields && !containsCustomFields
|
|
1685
|
+
? formData.columns.concat(reportCustomFields)
|
|
1686
|
+
: formData.columns, onPageChange: (page) => {
|
|
1421
1687
|
onPageChange(page, true);
|
|
1422
1688
|
setCurrentPage(page);
|
|
1423
1689
|
}, onSortChange: (sort) => {
|
|
1424
1690
|
onSortChange && onSortChange(sort, true);
|
|
1425
|
-
}, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), (showTableFormatOptions || isAdmin) && (_jsxs("div", {
|
|
1691
|
+
}, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false })) })), (showTableFormatOptions || isAdmin) && (_jsxs("div", { style: {
|
|
1692
|
+
display: 'flex',
|
|
1693
|
+
flexDirection: 'column',
|
|
1694
|
+
gap: 6,
|
|
1695
|
+
}, children: [_jsxs("div", { style: {
|
|
1426
1696
|
display: 'flex',
|
|
1427
1697
|
flexDirection: 'column',
|
|
1428
1698
|
}, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
|
|
@@ -1439,14 +1709,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1439
1709
|
column.field === formData.pivot.rowField
|
|
1440
1710
|
? formData.pivot &&
|
|
1441
1711
|
isDateField(formData.pivot.rowFieldType || '')
|
|
1442
|
-
? '
|
|
1712
|
+
? 'string'
|
|
1443
1713
|
: 'string'
|
|
1444
1714
|
: formData.pivot?.aggregationType ===
|
|
1445
1715
|
'percentage'
|
|
1446
1716
|
? 'percent'
|
|
1447
1717
|
: 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
|
|
1448
1718
|
? isDateField(formData.pivot.rowFieldType || '')
|
|
1449
|
-
? [{ label: 'date', value: '
|
|
1719
|
+
? [{ label: 'date', value: 'string' }]
|
|
1450
1720
|
: [{ label: 'string', value: 'string' }]
|
|
1451
1721
|
: [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
|
|
1452
1722
|
: 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 +1727,24 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1457
1727
|
: columns.map((elem) => ({
|
|
1458
1728
|
label: elem.field,
|
|
1459
1729
|
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:
|
|
1730
|
+
})), 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
1731
|
// hide when pivoted and chartType === 'table'
|
|
1462
1732
|
(formData.pivot &&
|
|
1463
1733
|
selectedPivotTable &&
|
|
1464
1734
|
selectedPivotTable.columns &&
|
|
1465
|
-
formData.chartType === 'table')) && (
|
|
1735
|
+
formData.chartType === 'table')) && (_jsxs("div", { style: {
|
|
1736
|
+
display: 'flex',
|
|
1737
|
+
flexDirection: 'row',
|
|
1738
|
+
gap: 10,
|
|
1739
|
+
}, children: [_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), isAdmin &&
|
|
1740
|
+
client?.featureFlags?.customFieldsEnabled && (_jsx(QuillToolTip, { text: "Custom field directly referenced in report", enabled: containsCustomFields, textStyle: {
|
|
1741
|
+
maxWidth: '200px',
|
|
1742
|
+
whiteSpace: 'normal',
|
|
1743
|
+
}, children: _jsx(CheckboxComponent, { isChecked: containsCustomFields || includeCustomFields, label: "Include Custom Fields", onChange: () => setIncludeCustomFields((prev) => !prev), disabled: containsCustomFields, containerStyle: {
|
|
1744
|
+
height: containsCustomFields
|
|
1745
|
+
? '100%' // required when wrapped with QuillToolTip
|
|
1746
|
+
: undefined,
|
|
1747
|
+
} }) }))] })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
|
|
1466
1748
|
display: 'flex',
|
|
1467
1749
|
flexDirection: 'column',
|
|
1468
1750
|
gap: 12,
|
|
@@ -1476,54 +1758,61 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1476
1758
|
width: 'fit-content',
|
|
1477
1759
|
gap: 12,
|
|
1478
1760
|
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
|
-
|
|
1761
|
+
}, children: [_jsx(QuillToolTip, { text: 'Tenant access is restricted to current tenant with direct custom field reference.', enabled: containsCustomFields, textStyle: {
|
|
1762
|
+
maxWidth: '200px',
|
|
1763
|
+
whiteSpace: 'normal',
|
|
1764
|
+
}, children: _jsxs("div", { style: {
|
|
1765
|
+
outline: '1px solid #E7E7E7',
|
|
1766
|
+
borderRadius: 6,
|
|
1767
|
+
padding: 4,
|
|
1768
|
+
display: 'flex',
|
|
1769
|
+
flexDirection: 'row',
|
|
1770
|
+
marginLeft: 2,
|
|
1771
|
+
backgroundColor: '#FCFCFC',
|
|
1772
|
+
height: 38,
|
|
1773
|
+
width: 'fit-content',
|
|
1774
|
+
}, children: [_jsx("button", { onClick: () => {
|
|
1775
|
+
if (!containsCustomFields) {
|
|
1776
|
+
setCustomTenantAccess(false);
|
|
1777
|
+
setFormFlags(undefined);
|
|
1778
|
+
}
|
|
1779
|
+
}, style: {
|
|
1780
|
+
width: 95,
|
|
1781
|
+
outline: !(customTenantAccess || containsCustomFields)
|
|
1782
|
+
? '1px solid #E7E7E7'
|
|
1783
|
+
: undefined,
|
|
1784
|
+
backgroundColor: !(customTenantAccess || containsCustomFields)
|
|
1785
|
+
? 'white'
|
|
1786
|
+
: undefined,
|
|
1787
|
+
// Center text vertically and horizontally
|
|
1788
|
+
display: 'flex',
|
|
1789
|
+
justifyContent: 'center',
|
|
1790
|
+
alignItems: 'center',
|
|
1791
|
+
borderRadius: 6,
|
|
1792
|
+
fontSize: 14,
|
|
1793
|
+
fontWeight: 500,
|
|
1794
|
+
userSelect: 'none',
|
|
1795
|
+
}, children: "Global" }), _jsx("button", { onClick: () => {
|
|
1796
|
+
setCustomTenantAccess(true);
|
|
1797
|
+
}, style: {
|
|
1798
|
+
width: 95,
|
|
1799
|
+
outline: customTenantAccess || containsCustomFields
|
|
1800
|
+
? '1px solid #E7E7E7'
|
|
1801
|
+
: undefined,
|
|
1802
|
+
backgroundColor: customTenantAccess || containsCustomFields
|
|
1803
|
+
? 'white'
|
|
1804
|
+
: undefined,
|
|
1805
|
+
// Center text vertically and horizontally
|
|
1806
|
+
display: 'flex',
|
|
1807
|
+
justifyContent: 'center',
|
|
1808
|
+
alignItems: 'center',
|
|
1809
|
+
borderRadius: 6,
|
|
1810
|
+
fontSize: 14,
|
|
1811
|
+
fontWeight: 500,
|
|
1812
|
+
userSelect: 'none',
|
|
1813
|
+
}, children: "Custom" })] }) }), client?.allTenantTypes?.length === 1 ? (_jsx(MultiSelectComponent, { disabled: containsCustomFields, value: containsCustomFields
|
|
1814
|
+
? (currentTenantAsFormFlags?.[dashboardOwner.tenantField] ?? []) // Even though value requires string[], turns out flags can be numbers
|
|
1815
|
+
: (formFlags?.[dashboardOwner.tenantField] ?? []), onChange: (e) => setFormFlags({
|
|
1527
1816
|
...formFlags,
|
|
1528
1817
|
[dashboardOwner.tenantField]: e.target
|
|
1529
1818
|
.value,
|
|
@@ -1540,7 +1829,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1540
1829
|
})) ?? []), width: 200, emptyLabel: dashboardOwner.scope === 'database'
|
|
1541
1830
|
? 'No flags supplied'
|
|
1542
1831
|
: undefined, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
|
|
1543
|
-
display: customTenantAccess
|
|
1832
|
+
display: customTenantAccess || containsCustomFields
|
|
1833
|
+
? 'inline'
|
|
1834
|
+
: 'none',
|
|
1544
1835
|
marginTop: -1,
|
|
1545
1836
|
marginBottom: -4,
|
|
1546
1837
|
} })) : (_jsx(QuillMultiSelectSectionList, { value: formFlags ?? {}, onChange: (e) => setFormFlags(e.target.value), options: allTenantMap, sectionHeaderMap: client?.allTenantTypes?.reduce((acc, tenantType) => {
|
|
@@ -1551,7 +1842,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1551
1842
|
acc[tenantType.tenantField] = tenantType.name;
|
|
1552
1843
|
return acc;
|
|
1553
1844
|
}, {}) ?? {}, width: 200, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
|
|
1554
|
-
display: customTenantAccess
|
|
1845
|
+
display: customTenantAccess || containsCustomFields
|
|
1846
|
+
? 'inline'
|
|
1847
|
+
: 'none',
|
|
1555
1848
|
marginTop: -1,
|
|
1556
1849
|
marginBottom: -4,
|
|
1557
1850
|
}, owner: dashboardOwner.tenantField }))] }) })] })), specificDashboardFilters.length > 0 && isAdmin && (_jsxs("div", { style: {
|
|
@@ -1560,7 +1853,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1560
1853
|
gap: 6,
|
|
1561
1854
|
}, children: [_jsx(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
|
|
1562
1855
|
formData.dateField &&
|
|
1563
|
-
dashboardConfig[formData.dashboardName ??
|
|
1856
|
+
dashboardConfig[formData.dashboardName ?? destinationDashboardName ?? '']?.config.dateFilter?.label && (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.dateFilter.' +
|
|
1564
1857
|
(dashboardConfig[formData.dashboardName ?? '']
|
|
1565
1858
|
?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
|
|
1566
1859
|
?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
|
|
@@ -1585,18 +1878,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1585
1878
|
.map((filter, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
|
|
1586
1879
|
!(isAdmin &&
|
|
1587
1880
|
formData.dateField &&
|
|
1588
|
-
dashboardConfig[formData.dashboardName ?? '']
|
|
1881
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1882
|
+
?.config.dateFilter?.label)
|
|
1589
1883
|
? 'Filter'
|
|
1590
1884
|
: '', disabled: true }), _jsx(SelectComponent, { label: index === 0 &&
|
|
1591
1885
|
!(isAdmin &&
|
|
1592
1886
|
formData.dateField &&
|
|
1593
|
-
dashboardConfig[formData.dashboardName ?? '']
|
|
1887
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1888
|
+
?.config.dateFilter?.label)
|
|
1594
1889
|
? 'Virtual Table'
|
|
1595
1890
|
: '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
|
|
1596
1891
|
...filterMap,
|
|
1597
1892
|
[filter.label]: {
|
|
1598
1893
|
table: e.target.value,
|
|
1599
|
-
field: schemaData.
|
|
1894
|
+
field: schemaData.schemaWithCustomFields
|
|
1600
1895
|
.find((t) => t.name == e.target.value)
|
|
1601
1896
|
?.columns.find((elem) => elem.field ===
|
|
1602
1897
|
(filterMap[filter.label]?.field ??
|
|
@@ -1608,7 +1903,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1608
1903
|
})), width: 200 }), _jsx(SelectComponent, { label: index === 0 &&
|
|
1609
1904
|
!(isAdmin &&
|
|
1610
1905
|
formData.dateField &&
|
|
1611
|
-
dashboardConfig[formData.dashboardName ?? '']
|
|
1906
|
+
dashboardConfig[formData.dashboardName ?? '']
|
|
1907
|
+
?.config.dateFilter?.label)
|
|
1612
1908
|
? 'Field'
|
|
1613
1909
|
: '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
|
|
1614
1910
|
...filterMap,
|
|
@@ -1617,7 +1913,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1617
1913
|
filter.table,
|
|
1618
1914
|
field: e.target.value,
|
|
1619
1915
|
},
|
|
1620
|
-
}), options: schemaData.
|
|
1916
|
+
}), options: schemaData.schemaWithCustomFields
|
|
1621
1917
|
.find((t) => t.name ==
|
|
1622
1918
|
(filterMap[filter.label]?.table ??
|
|
1623
1919
|
filter.table) &&
|
|
@@ -1647,11 +1943,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
|
|
|
1647
1943
|
justifyContent: 'space-between',
|
|
1648
1944
|
alignItems: 'center',
|
|
1649
1945
|
gap: 6,
|
|
1650
|
-
}, children: [!!filterIssues?.length &&
|
|
1651
|
-
|
|
1946
|
+
}, children: [!!filterIssues?.length && (_jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashboard - Report issues', containerStyle: { height: '100%' } })), _jsxs("div", { style: {
|
|
1947
|
+
display: 'flex',
|
|
1948
|
+
flexDirection: 'row',
|
|
1949
|
+
gap: 10,
|
|
1950
|
+
backgroundColor: 'white',
|
|
1951
|
+
}, children: [hideDiscardChanges ? null : (_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1652
1952
|
setIsOpen(false);
|
|
1653
1953
|
onDiscardChanges && onDiscardChanges();
|
|
1654
|
-
}, label: 'Discard changes' }), _jsx(ButtonComponent, { onClick: () => {
|
|
1954
|
+
}, label: 'Discard changes' })), _jsx(ButtonComponent, { onClick: () => {
|
|
1655
1955
|
if (loadingFormData) {
|
|
1656
1956
|
setTriggeredEditChart(true);
|
|
1657
1957
|
}
|