|
1 | 1 | import { ConfigSubSection } from 'components/experimental/ConfigSection'; |
2 | 2 | import allLabels from './labelsV2'; |
3 | | -import React, { ChangeEvent, useState } from 'react'; |
| 3 | +import React, { ChangeEvent, useMemo, useState } from 'react'; |
4 | 4 | import { |
5 | 5 | DataSourcePluginOptionsEditorProps, |
6 | 6 | onUpdateDatasourceJsonDataOption, |
7 | 7 | onUpdateDatasourceJsonDataOptionChecked, |
8 | 8 | } from '@grafana/data'; |
9 | | -import { AliasTableEntry, CHConfig, CHCustomSetting, CHLogsConfig, CHSecureConfig, CHTracesConfig } from 'types/config'; |
| 9 | +import { |
| 10 | + AliasTableEntry, |
| 11 | + CHConfig, |
| 12 | + CHCustomSetting, |
| 13 | + CHLogsConfig, |
| 14 | + CHSecureConfig, |
| 15 | + CHTracesConfig, |
| 16 | + defaultCHAdditionalSettingsConfig, |
| 17 | +} from 'types/config'; |
10 | 18 | import { AliasTableConfig } from 'components/configEditor/AliasTableConfig'; |
11 | 19 | import { DefaultDatabaseTableConfig } from 'components/configEditor/DefaultDatabaseTableConfig'; |
12 | 20 | import { LogsConfig } from 'components/configEditor/LogsConfig'; |
@@ -52,69 +60,6 @@ export const AdditionalSettingsSection = (props: Props) => { |
52 | 60 | useConfigDefaults(options, onOptionsChange); |
53 | 61 |
|
54 | 62 | const [customSettings, setCustomSettings] = useState(jsonData.customSettings || []); |
55 | | - const ADDITIONAL_SETTINGS_DEFAULTS = { |
56 | | - defaultDatabase: jsonData.defaultDatabase, |
57 | | - defaultTable: jsonData.defaultTable, |
58 | | - connMaxLifetime: jsonData.connMaxLifetime, |
59 | | - dialTimeout: jsonData.dialTimeout, |
60 | | - maxIdleConns: jsonData.maxIdleConns, |
61 | | - maxOpenConns: jsonData.maxOpenConns, |
62 | | - queryTimeout: jsonData.queryTimeout, |
63 | | - validateSql: jsonData.validateSql, |
64 | | - logs: { |
65 | | - defaultDatabase: jsonData.logs?.defaultDatabase, |
66 | | - defaultTable: jsonData.logs?.defaultTable !== 'otel_logs' ? jsonData.logs?.defaultTable : undefined, |
67 | | - otelEnabled: jsonData.logs?.otelEnabled, |
68 | | - otelVersion: jsonData.logs?.otelVersion !== 'latest' ? jsonData.logs?.otelVersion : undefined, |
69 | | - timeColumn: jsonData.logs?.timeColumn, |
70 | | - levelColumn: jsonData.logs?.levelColumn, |
71 | | - messageColumn: jsonData.logs?.messageColumn, |
72 | | - selectContextColumns: jsonData.logs?.selectContextColumns, |
73 | | - contextColumns: |
74 | | - jsonData.logs?.contextColumns && jsonData.logs?.contextColumns.length > 0 |
75 | | - ? jsonData.logs?.contextColumns |
76 | | - : undefined, |
77 | | - }, |
78 | | - traces: { |
79 | | - defaultDatabase: jsonData.traces?.defaultDatabase, |
80 | | - defaultTable: jsonData.traces?.defaultTable !== 'otel_traces' ? jsonData.logs?.defaultTable : undefined, |
81 | | - otelEnabled: jsonData.traces?.otelEnabled, |
82 | | - otelVersion: jsonData.traces?.otelVersion !== 'latest' ? jsonData.logs?.otelVersion : undefined, |
83 | | - traceIdColumn: jsonData.traces?.traceIdColumn, |
84 | | - spanIdColumn: jsonData.traces?.spanIdColumn, |
85 | | - operationNameColumn: jsonData.traces?.operationNameColumn, |
86 | | - parentSpanIdColumn: jsonData.traces?.parentSpanIdColumn, |
87 | | - serviceNameColumn: jsonData.traces?.serviceNameColumn, |
88 | | - durationColumn: jsonData.traces?.durationColumn, |
89 | | - startTimeColumn: jsonData.traces?.startTimeColumn, |
90 | | - tagsColumn: jsonData.traces?.tagsColumn, |
91 | | - serviceTagsColumn: jsonData.traces?.serviceTagsColumn, |
92 | | - kindColumn: jsonData.traces?.kindColumn, |
93 | | - statusCodeColumn: jsonData.traces?.statusCodeColumn, |
94 | | - statusMessageColumn: jsonData.traces?.statusMessageColumn, |
95 | | - stateColumn: jsonData.traces?.stateColumn, |
96 | | - instrumentationLibraryNameColumn: jsonData.traces?.instrumentationLibraryNameColumn, |
97 | | - instrumentationLibraryVersionColumn: jsonData.traces?.instrumentationLibraryVersionColumn, |
98 | | - flattenNested: jsonData.traces?.flattenNested, |
99 | | - traceEventsColumnPrefix: jsonData.traces?.traceEventsColumnPrefix, |
100 | | - traceLinksColumnPrefix: jsonData.traces?.traceLinksColumnPrefix, |
101 | | - }, |
102 | | - aliasTables: jsonData.aliasTables && jsonData.aliasTables.length > 0 ? jsonData.aliasTables : undefined, |
103 | | - enableRowLimit: jsonData.enableRowLimit, |
104 | | - enableSecureSocksProxy: jsonData.enableSecureSocksProxy, |
105 | | - }; |
106 | | - |
107 | | - const hasDefinedValue = (obj: any): boolean => { |
108 | | - if (obj == null) { |
109 | | - return false; |
110 | | - } |
111 | | - if (typeof obj !== 'object') { |
112 | | - return obj !== '' && obj !== undefined && obj !== null; |
113 | | - } |
114 | | - return Object.values(obj).some((v) => hasDefinedValue(v)); |
115 | | - }; |
116 | | - |
117 | | - const shouldBeOpen = hasDefinedValue(ADDITIONAL_SETTINGS_DEFAULTS); |
118 | 63 |
|
119 | 64 | const onLogsConfigChange = (key: keyof CHLogsConfig, value: string | boolean | string[]) => { |
120 | 65 | onOptionsChange({ |
@@ -173,6 +118,50 @@ export const AdditionalSettingsSection = (props: Props) => { |
173 | 118 | }); |
174 | 119 | }; |
175 | 120 |
|
| 121 | + const shallowSettingsCompare = (currentSettings: any, defaultSettings: any): boolean => { |
| 122 | + // needed for dealing with proxy object from currentSettings |
| 123 | + currentSettings = Object.assign({}, currentSettings); |
| 124 | + |
| 125 | + const currentSettingsKeys = Object.keys(currentSettings); |
| 126 | + const defaultSettingsKeys = Object.keys(defaultSettings); |
| 127 | + |
| 128 | + if (currentSettingsKeys.length !== defaultSettingsKeys.length) { |
| 129 | + return false; |
| 130 | + } |
| 131 | + |
| 132 | + for (const key of currentSettingsKeys) { |
| 133 | + if (!defaultSettingsKeys.includes(key)) { |
| 134 | + return false; |
| 135 | + } |
| 136 | + if (currentSettings[key].length === 0 && defaultSettings[key].length === 0) { |
| 137 | + continue; |
| 138 | + } |
| 139 | + if (currentSettings[key] !== defaultSettings[key]) { |
| 140 | + return false; |
| 141 | + } |
| 142 | + } |
| 143 | + return true; |
| 144 | + }; |
| 145 | + |
| 146 | + const shouldBeOpen = useMemo(() => { |
| 147 | + return ( |
| 148 | + jsonData.defaultDatabase || |
| 149 | + jsonData.defaultTable || |
| 150 | + jsonData.connMaxLifetime || |
| 151 | + jsonData.dialTimeout || |
| 152 | + jsonData.maxIdleConns || |
| 153 | + jsonData.maxOpenConns || |
| 154 | + jsonData.queryTimeout || |
| 155 | + jsonData.validateSql || |
| 156 | + !shallowSettingsCompare(jsonData.logs, defaultCHAdditionalSettingsConfig.logs) || |
| 157 | + !shallowSettingsCompare(jsonData.traces, defaultCHAdditionalSettingsConfig.traces) || |
| 158 | + (jsonData.aliasTables && jsonData.aliasTables.length > 0) || |
| 159 | + jsonData.enableRowLimit || |
| 160 | + jsonData.enableSecureSocksProxy || |
| 161 | + customSettings.length > 0 |
| 162 | + ); |
| 163 | + }, [jsonData, customSettings]); |
| 164 | + |
176 | 165 | return ( |
177 | 166 | <Box |
178 | 167 | borderStyle="solid" |
@@ -296,7 +285,7 @@ export const AdditionalSettingsSection = (props: Props) => { |
296 | 285 | <Field label={labels.secureSocksProxy.label} description={labels.secureSocksProxy.tooltip}> |
297 | 286 | <Switch |
298 | 287 | value={jsonData.enableSecureSocksProxy || false} |
299 | | - onChange={(e) => onUpdateDatasourceJsonDataOption(props, 'enableSecureSocksProxy')(e)} |
| 288 | + onChange={(e) => onUpdateDatasourceJsonDataOptionChecked(props, 'enableSecureSocksProxy')(e)} |
300 | 289 | /> |
301 | 290 | </Field> |
302 | 291 | )} |
|
0 commit comments